@jingyi0605/codingns4dsh 0.2.1-beta.5 → 0.2.1-beta.6

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 (301) hide show
  1. package/README.en.md +112 -161
  2. package/README.md +106 -263
  3. package/assets/provider-icons/doubao.png +0 -0
  4. package/data/build/dist/client/avatar/catalog-panel.d.ts +1 -1
  5. package/data/build/dist/client/avatar/catalog-panel.d.ts.map +1 -1
  6. package/data/build/dist/client/avatar/catalog-panel.js +13 -11
  7. package/data/build/dist/client/avatar/catalog-panel.js.map +1 -1
  8. package/data/build/dist/client/avatar/engine.d.ts.map +1 -1
  9. package/data/build/dist/client/avatar/engine.js +26 -7
  10. package/data/build/dist/client/avatar/engine.js.map +1 -1
  11. package/data/build/dist/client/avatar/manager.d.ts.map +1 -1
  12. package/data/build/dist/client/avatar/manager.js +5 -1
  13. package/data/build/dist/client/avatar/manager.js.map +1 -1
  14. package/data/build/dist/client/avatar/slot.d.ts.map +1 -1
  15. package/data/build/dist/client/avatar/slot.js +4 -1
  16. package/data/build/dist/client/avatar/slot.js.map +1 -1
  17. package/data/build/dist/client/bundle.js +49155 -99509
  18. package/data/build/dist/client/bundle.js.map +1 -1
  19. package/data/build/dist/client/cli-catalog.d.ts +2 -0
  20. package/data/build/dist/client/cli-catalog.d.ts.map +1 -1
  21. package/data/build/dist/client/cli-catalog.js +8 -0
  22. package/data/build/dist/client/cli-catalog.js.map +1 -1
  23. package/data/build/dist/client/cli-slots.js +2 -2
  24. package/data/build/dist/client/cli-slots.js.map +1 -1
  25. package/data/build/dist/client/client.assistant-configuration-view.js +4526 -0
  26. package/data/build/dist/client/client.assistant-configuration-view.js.map +1 -0
  27. package/data/build/dist/client/client.assistant-debug-workbench.js +764 -0
  28. package/data/build/dist/client/client.assistant-debug-workbench.js.map +1 -0
  29. package/data/build/dist/client/client.assistant-prompt-editor.js +76 -0
  30. package/data/build/dist/client/client.assistant-prompt-editor.js.map +1 -0
  31. package/data/build/dist/client/client.assistant-prompts.js +44 -0
  32. package/data/build/dist/client/client.assistant-prompts.js.map +1 -0
  33. package/data/build/dist/client/client.assistant-voice-sessions.js +144 -0
  34. package/data/build/dist/client/client.assistant-voice-sessions.js.map +1 -0
  35. package/data/build/dist/client/client.assistant-workbench.js +2929 -0
  36. package/data/build/dist/client/client.assistant-workbench.js.map +1 -0
  37. package/data/build/dist/client/client.delegate-command.js +1315 -0
  38. package/data/build/dist/client/client.delegate-command.js.map +1 -0
  39. package/data/build/dist/client/client.editor-engine.js +32486 -0
  40. package/data/build/dist/client/client.editor-engine.js.map +1 -0
  41. package/data/build/dist/client/client.manager.js +3454 -0
  42. package/data/build/dist/client/client.manager.js.map +1 -0
  43. package/data/build/dist/client/client.model-catalog-cache.js +543 -0
  44. package/data/build/dist/client/client.model-catalog-cache.js.map +1 -0
  45. package/data/build/dist/client/client.native-workspace-store.js +689 -0
  46. package/data/build/dist/client/client.native-workspace-store.js.map +1 -0
  47. package/data/build/dist/client/client.primitives-adapter.js +333 -0
  48. package/data/build/dist/client/client.primitives-adapter.js.map +1 -0
  49. package/data/build/dist/client/client.react-dom.js +7286 -0
  50. package/data/build/dist/client/client.react-dom.js.map +1 -0
  51. package/data/build/dist/client/client.rolldown-runtime.js +59 -0
  52. package/data/build/dist/client/client.theme.js +386 -0
  53. package/data/build/dist/client/client.theme.js.map +1 -0
  54. package/data/build/dist/client/client.transport.js +3323 -0
  55. package/data/build/dist/client/client.transport.js.map +1 -0
  56. package/data/build/dist/client/client.xterm-engine.js +13064 -0
  57. package/data/build/dist/client/client.xterm-engine.js.map +1 -0
  58. package/data/build/dist/client/editor-engine.d.ts +4 -0
  59. package/data/build/dist/client/editor-engine.d.ts.map +1 -0
  60. package/data/build/dist/client/editor-engine.js +50 -0
  61. package/data/build/dist/client/editor-engine.js.map +1 -0
  62. package/data/build/dist/client/engine-loader.d.ts +5 -0
  63. package/data/build/dist/client/engine-loader.d.ts.map +1 -0
  64. package/data/build/dist/client/engine-loader.js +35 -0
  65. package/data/build/dist/client/engine-loader.js.map +1 -0
  66. package/data/build/dist/client/features/assistant-configuration-loader.d.ts +14 -0
  67. package/data/build/dist/client/features/assistant-configuration-loader.d.ts.map +1 -0
  68. package/data/build/dist/client/features/assistant-configuration-loader.js +13 -0
  69. package/data/build/dist/client/features/assistant-configuration-loader.js.map +1 -0
  70. package/data/build/dist/client/features/assistant-configuration-session.d.ts.map +1 -1
  71. package/data/build/dist/client/features/assistant-configuration-session.js +13 -4
  72. package/data/build/dist/client/features/assistant-configuration-session.js.map +1 -1
  73. package/data/build/dist/client/features/assistant-configuration-view.d.ts +66 -0
  74. package/data/build/dist/client/features/assistant-configuration-view.d.ts.map +1 -0
  75. package/data/build/dist/client/features/assistant-configuration-view.js +133 -0
  76. package/data/build/dist/client/features/assistant-configuration-view.js.map +1 -0
  77. package/data/build/dist/client/features/assistant-debug-workbench.d.ts +4 -11
  78. package/data/build/dist/client/features/assistant-debug-workbench.d.ts.map +1 -1
  79. package/data/build/dist/client/features/assistant-debug-workbench.js +41 -68
  80. package/data/build/dist/client/features/assistant-debug-workbench.js.map +1 -1
  81. package/data/build/dist/client/features/assistant-display-store.d.ts +57 -0
  82. package/data/build/dist/client/features/assistant-display-store.d.ts.map +1 -0
  83. package/data/build/dist/client/features/assistant-display-store.js +189 -0
  84. package/data/build/dist/client/features/assistant-display-store.js.map +1 -0
  85. package/data/build/dist/client/features/assistant-prompt-editor.d.ts +12 -0
  86. package/data/build/dist/client/features/assistant-prompt-editor.d.ts.map +1 -0
  87. package/data/build/dist/client/features/assistant-prompt-editor.js +14 -0
  88. package/data/build/dist/client/features/assistant-prompt-editor.js.map +1 -0
  89. package/data/build/dist/client/features/assistant-view-loader.d.ts +17 -0
  90. package/data/build/dist/client/features/assistant-view-loader.d.ts.map +1 -0
  91. package/data/build/dist/client/features/assistant-view-loader.js +49 -0
  92. package/data/build/dist/client/features/assistant-view-loader.js.map +1 -0
  93. package/data/build/dist/client/features/assistant-workbench.d.ts +1 -60
  94. package/data/build/dist/client/features/assistant-workbench.d.ts.map +1 -1
  95. package/data/build/dist/client/features/assistant-workbench.js +41 -169
  96. package/data/build/dist/client/features/assistant-workbench.js.map +1 -1
  97. package/data/build/dist/client/features/cli-adapters.js +3 -7
  98. package/data/build/dist/client/features/cli-adapters.js.map +1 -1
  99. package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -1
  100. package/data/build/dist/client/features/global-voice-assistant.js +21 -20
  101. package/data/build/dist/client/features/global-voice-assistant.js.map +1 -1
  102. package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
  103. package/data/build/dist/client/features/peer-host.js +14 -25
  104. package/data/build/dist/client/features/peer-host.js.map +1 -1
  105. package/data/build/dist/client/file-management-dom.d.ts +3 -1
  106. package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
  107. package/data/build/dist/client/file-management-dom.js +85 -79
  108. package/data/build/dist/client/file-management-dom.js.map +1 -1
  109. package/data/build/dist/client/locales/assistantAvatar.d.ts +1 -1
  110. package/data/build/dist/client/locales/assistantAvatar.js +2 -2
  111. package/data/build/dist/client/locales/assistantAvatar.js.map +1 -1
  112. package/data/build/dist/client/locales/fileWorkspace.d.ts.map +1 -1
  113. package/data/build/dist/client/locales/fileWorkspace.js +2 -0
  114. package/data/build/dist/client/locales/fileWorkspace.js.map +1 -1
  115. package/data/build/dist/client/peer-host-management-api.d.ts +2 -2
  116. package/data/build/dist/client/peer-host-management-api.d.ts.map +1 -1
  117. package/data/build/dist/client/peer-host-management-api.js +8 -5
  118. package/data/build/dist/client/peer-host-management-api.js.map +1 -1
  119. package/data/build/dist/client/provider-icon-assets.js +5 -39
  120. package/data/build/dist/client/provider-icon-assets.js.map +1 -1
  121. package/data/build/dist/client/provider-icon-bridge.d.ts +6 -0
  122. package/data/build/dist/client/provider-icon-bridge.d.ts.map +1 -0
  123. package/data/build/dist/client/provider-icon-bridge.js +65 -0
  124. package/data/build/dist/client/provider-icon-bridge.js.map +1 -0
  125. package/data/build/dist/client/provider-icons.d.ts +1 -0
  126. package/data/build/dist/client/provider-icons.d.ts.map +1 -1
  127. package/data/build/dist/client/provider-icons.js +2 -1
  128. package/data/build/dist/client/provider-icons.js.map +1 -1
  129. package/data/build/dist/client/remote-web-context.d.ts +2 -0
  130. package/data/build/dist/client/remote-web-context.d.ts.map +1 -1
  131. package/data/build/dist/client/remote-web-context.js +50 -2
  132. package/data/build/dist/client/remote-web-context.js.map +1 -1
  133. package/data/build/dist/client/serial-polling.d.ts +3 -1
  134. package/data/build/dist/client/serial-polling.d.ts.map +1 -1
  135. package/data/build/dist/client/serial-polling.js +10 -3
  136. package/data/build/dist/client/serial-polling.js.map +1 -1
  137. package/data/build/dist/client/settings-section.js +8 -2
  138. package/data/build/dist/client/settings-section.js.map +1 -1
  139. package/data/build/dist/client/terminal/xterm-engine.d.ts +4 -0
  140. package/data/build/dist/client/terminal/xterm-engine.d.ts.map +1 -0
  141. package/data/build/dist/client/terminal/xterm-engine.js +5 -0
  142. package/data/build/dist/client/terminal/xterm-engine.js.map +1 -0
  143. package/data/build/dist/client/terminal/xterm-view.d.ts.map +1 -1
  144. package/data/build/dist/client/terminal/xterm-view.js +33 -25
  145. package/data/build/dist/client/terminal/xterm-view.js.map +1 -1
  146. package/data/build/dist/host/avatar/temporary-previews.d.ts +3 -1
  147. package/data/build/dist/host/avatar/temporary-previews.d.ts.map +1 -1
  148. package/data/build/dist/host/avatar/temporary-previews.js +7 -2
  149. package/data/build/dist/host/avatar/temporary-previews.js.map +1 -1
  150. package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts.map +1 -1
  151. package/data/build/dist/host/cli-adapters/antigravity-driver.js +2 -2
  152. package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
  153. package/data/build/dist/host/cli-adapters/binary-detection.d.ts +19 -0
  154. package/data/build/dist/host/cli-adapters/binary-detection.d.ts.map +1 -0
  155. package/data/build/dist/host/cli-adapters/binary-detection.js +71 -0
  156. package/data/build/dist/host/cli-adapters/binary-detection.js.map +1 -0
  157. package/data/build/dist/host/cli-adapters/claude-driver.d.ts +2 -0
  158. package/data/build/dist/host/cli-adapters/claude-driver.d.ts.map +1 -1
  159. package/data/build/dist/host/cli-adapters/claude-driver.js +4 -0
  160. package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
  161. package/data/build/dist/host/cli-adapters/claude-model-options.d.ts.map +1 -1
  162. package/data/build/dist/host/cli-adapters/claude-model-options.js +2 -1
  163. package/data/build/dist/host/cli-adapters/claude-model-options.js.map +1 -1
  164. package/data/build/dist/host/cli-adapters/claude-process.d.ts +7 -0
  165. package/data/build/dist/host/cli-adapters/claude-process.d.ts.map +1 -0
  166. package/data/build/dist/host/cli-adapters/claude-process.js +59 -0
  167. package/data/build/dist/host/cli-adapters/claude-process.js.map +1 -0
  168. package/data/build/dist/host/cli-adapters/codebuddy-driver.d.ts +3 -0
  169. package/data/build/dist/host/cli-adapters/codebuddy-driver.d.ts.map +1 -1
  170. package/data/build/dist/host/cli-adapters/codebuddy-driver.js +18 -5
  171. package/data/build/dist/host/cli-adapters/codebuddy-driver.js.map +1 -1
  172. package/data/build/dist/host/cli-adapters/command-code-driver.d.ts +0 -1
  173. package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
  174. package/data/build/dist/host/cli-adapters/command-code-driver.js +6 -29
  175. package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
  176. package/data/build/dist/host/cli-adapters/doubao-app.d.ts +27 -0
  177. package/data/build/dist/host/cli-adapters/doubao-app.d.ts.map +1 -0
  178. package/data/build/dist/host/cli-adapters/doubao-app.js +110 -0
  179. package/data/build/dist/host/cli-adapters/doubao-app.js.map +1 -0
  180. package/data/build/dist/host/cli-adapters/doubao-artifact-store.d.ts +16 -0
  181. package/data/build/dist/host/cli-adapters/doubao-artifact-store.d.ts.map +1 -0
  182. package/data/build/dist/host/cli-adapters/doubao-artifact-store.js +142 -0
  183. package/data/build/dist/host/cli-adapters/doubao-artifact-store.js.map +1 -0
  184. package/data/build/dist/host/cli-adapters/doubao-artifacts.d.ts +16 -0
  185. package/data/build/dist/host/cli-adapters/doubao-artifacts.d.ts.map +1 -0
  186. package/data/build/dist/host/cli-adapters/doubao-artifacts.js +34 -0
  187. package/data/build/dist/host/cli-adapters/doubao-artifacts.js.map +1 -0
  188. package/data/build/dist/host/cli-adapters/doubao-cdp.d.ts +49 -0
  189. package/data/build/dist/host/cli-adapters/doubao-cdp.d.ts.map +1 -0
  190. package/data/build/dist/host/cli-adapters/doubao-cdp.js +177 -0
  191. package/data/build/dist/host/cli-adapters/doubao-cdp.js.map +1 -0
  192. package/data/build/dist/host/cli-adapters/doubao-driver.d.ts +33 -0
  193. package/data/build/dist/host/cli-adapters/doubao-driver.d.ts.map +1 -0
  194. package/data/build/dist/host/cli-adapters/doubao-driver.js +291 -0
  195. package/data/build/dist/host/cli-adapters/doubao-driver.js.map +1 -0
  196. package/data/build/dist/host/cli-adapters/doubao-events.d.ts +21 -0
  197. package/data/build/dist/host/cli-adapters/doubao-events.d.ts.map +1 -0
  198. package/data/build/dist/host/cli-adapters/doubao-events.js +126 -0
  199. package/data/build/dist/host/cli-adapters/doubao-events.js.map +1 -0
  200. package/data/build/dist/host/cli-adapters/doubao-runtime.d.ts +6 -0
  201. package/data/build/dist/host/cli-adapters/doubao-runtime.d.ts.map +1 -0
  202. package/data/build/dist/host/cli-adapters/doubao-runtime.js +176 -0
  203. package/data/build/dist/host/cli-adapters/doubao-runtime.js.map +1 -0
  204. package/data/build/dist/host/cli-adapters/doubao-tools.d.ts +8 -0
  205. package/data/build/dist/host/cli-adapters/doubao-tools.d.ts.map +1 -0
  206. package/data/build/dist/host/cli-adapters/doubao-tools.js +139 -0
  207. package/data/build/dist/host/cli-adapters/doubao-tools.js.map +1 -0
  208. package/data/build/dist/host/cli-adapters/driver.d.ts +3 -2
  209. package/data/build/dist/host/cli-adapters/driver.d.ts.map +1 -1
  210. package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
  211. package/data/build/dist/host/cli-adapters/feature.js +2 -0
  212. package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
  213. package/data/build/dist/host/cli-adapters/json-rpc-process.d.ts.map +1 -1
  214. package/data/build/dist/host/cli-adapters/json-rpc-process.js +3 -1
  215. package/data/build/dist/host/cli-adapters/json-rpc-process.js.map +1 -1
  216. package/data/build/dist/host/cli-adapters/legacy-session-adapter.d.ts.map +1 -1
  217. package/data/build/dist/host/cli-adapters/legacy-session-adapter.js +1 -0
  218. package/data/build/dist/host/cli-adapters/legacy-session-adapter.js.map +1 -1
  219. package/data/build/dist/host/cli-adapters/model-catalog.d.ts +2 -0
  220. package/data/build/dist/host/cli-adapters/model-catalog.d.ts.map +1 -1
  221. package/data/build/dist/host/cli-adapters/model-catalog.js +10 -0
  222. package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
  223. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +1 -0
  224. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
  225. package/data/build/dist/host/cli-adapters/opencode-driver.js +9 -28
  226. package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
  227. package/data/build/dist/host/cli-adapters/process-utils.d.ts +4 -2
  228. package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
  229. package/data/build/dist/host/cli-adapters/process-utils.js +64 -11
  230. package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
  231. package/data/build/dist/host/cli-adapters/qoder-driver.d.ts.map +1 -1
  232. package/data/build/dist/host/cli-adapters/qoder-driver.js +13 -33
  233. package/data/build/dist/host/cli-adapters/qoder-driver.js.map +1 -1
  234. package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
  235. package/data/build/dist/host/cli-adapters/registry.js +31 -4
  236. package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
  237. package/data/build/dist/host/cli-adapters/rpc-driver-utils.d.ts +2 -11
  238. package/data/build/dist/host/cli-adapters/rpc-driver-utils.d.ts.map +1 -1
  239. package/data/build/dist/host/cli-adapters/rpc-driver-utils.js +1 -28
  240. package/data/build/dist/host/cli-adapters/rpc-driver-utils.js.map +1 -1
  241. package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts +3 -3
  242. package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts.map +1 -1
  243. package/data/build/dist/host/cli-adapters/standard-stream-driver.js +12 -37
  244. package/data/build/dist/host/cli-adapters/standard-stream-driver.js.map +1 -1
  245. package/data/build/dist/host/cli-adapters/windows-command-environment.d.ts +12 -0
  246. package/data/build/dist/host/cli-adapters/windows-command-environment.d.ts.map +1 -0
  247. package/data/build/dist/host/cli-adapters/windows-command-environment.js +53 -0
  248. package/data/build/dist/host/cli-adapters/windows-command-environment.js.map +1 -0
  249. package/data/build/dist/host/features/assistant-avatar-runtime.d.ts.map +1 -1
  250. package/data/build/dist/host/features/assistant-avatar-runtime.js +23 -14
  251. package/data/build/dist/host/features/assistant-avatar-runtime.js.map +1 -1
  252. package/data/build/dist/host/features/assistant-background.d.ts +44 -0
  253. package/data/build/dist/host/features/assistant-background.d.ts.map +1 -0
  254. package/data/build/dist/host/features/assistant-background.js +116 -0
  255. package/data/build/dist/host/features/assistant-background.js.map +1 -0
  256. package/data/build/dist/host/features/assistant-index-updates.d.ts +5 -0
  257. package/data/build/dist/host/features/assistant-index-updates.d.ts.map +1 -1
  258. package/data/build/dist/host/features/assistant-index-updates.js +29 -6
  259. package/data/build/dist/host/features/assistant-index-updates.js.map +1 -1
  260. package/data/build/dist/host/features/assistant-source-cache.d.ts +2 -2
  261. package/data/build/dist/host/features/assistant-source-cache.d.ts.map +1 -1
  262. package/data/build/dist/host/features/assistant-source-cache.js +4 -2
  263. package/data/build/dist/host/features/assistant-source-cache.js.map +1 -1
  264. package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
  265. package/data/build/dist/host/features/global-voice-rpc.js +269 -110
  266. package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
  267. package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
  268. package/data/build/dist/host/features/peer-host.js +61 -21
  269. package/data/build/dist/host/features/peer-host.js.map +1 -1
  270. package/data/build/dist/host/features/types.d.ts +6 -4
  271. package/data/build/dist/host/features/types.d.ts.map +1 -1
  272. package/data/build/dist/host/index.d.ts.map +1 -1
  273. package/data/build/dist/host/index.js +29 -19
  274. package/data/build/dist/host/index.js.map +1 -1
  275. package/data/build/dist/host/provider-icon-assets.d.ts +5 -0
  276. package/data/build/dist/host/provider-icon-assets.d.ts.map +1 -0
  277. package/data/build/dist/host/provider-icon-assets.js +61 -0
  278. package/data/build/dist/host/provider-icon-assets.js.map +1 -0
  279. package/data/build/dist/host/rpc.js +1 -1
  280. package/data/build/dist/host/rpc.js.map +1 -1
  281. package/data/build/dist/host/session-migration-repair.d.ts +4 -0
  282. package/data/build/dist/host/session-migration-repair.d.ts.map +1 -1
  283. package/data/build/dist/host/session-migration-repair.js +75 -2
  284. package/data/build/dist/host/session-migration-repair.js.map +1 -1
  285. package/data/build/dist/shared/assistant-avatar-engine.d.ts +2 -0
  286. package/data/build/dist/shared/assistant-avatar-engine.d.ts.map +1 -1
  287. package/data/build/dist/shared/assistant-avatar-engine.js +11 -1
  288. package/data/build/dist/shared/assistant-avatar-engine.js.map +1 -1
  289. package/data/build/dist/shared/contracts/cli-adapter.d.ts +3 -0
  290. package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
  291. package/data/build/dist/shared/contracts/version.d.ts +1 -1
  292. package/data/build/dist/shared/contracts/version.js +1 -1
  293. package/data/build/dist/shared/provider-icon-resources.d.ts +4 -0
  294. package/data/build/dist/shared/provider-icon-resources.d.ts.map +1 -0
  295. package/data/build/dist/shared/provider-icon-resources.js +24 -0
  296. package/data/build/dist/shared/provider-icon-resources.js.map +1 -0
  297. package/package.json +2 -2
  298. package/profile/README.md +2 -2
  299. package/profile/package.json +2 -2
  300. package/profile/version.json +1 -1
  301. package/version.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.assistant-workbench.js","names":["CODINGNS_RPC_CHANNEL","useId","createElement","dshThemeColor","createElement","dshThemeColor","useRef","resolveAssistantControlIcon","dshSettingsButtonStyle","useId","dshSettingsPrimaryButtonStyle","getAssistantAvatarRegistry","AssistantAvatarPortraitService","assistantAvatarPortraitOverrideStore","getAssistantAvatarManager","AssistantAvatarManager","getGlobalVoiceAdapter","registerGlobalVoiceAdapter","getAssistantAvatarPortraitService","CODINGNS_RPC_CHANNEL","sameSettingsValue","hasAssistantAvatarConsent","codingNsTranslator","readAssistantTtsSettings","validateAssistantTtsParameters","MOSS_BUILTIN_VOICES","root","createElement","dshThemeColor","createElement","dshThemeColor","AssistantAvatarPortrait","Fragment","getGlobalVoiceAdapter","useState","useRef","useId","voiceSessionDuration","createElement","dshThemeColor","dshSettingsFieldStyle","AssistantAvatarSlot","resolveAssistantAvatarState","dshSettingsButtonStyle","voiceSessionMessageCount","createAssistantViewLoader","createElement","AssistantLoadedView","createAssistantViewLoader","readAssistantTtsSettings","readAssistantProfile","normalizeAssistantAppearance","listAssistantAvatars","BUILTIN_ASSISTANT_AVATAR","readAssistantPersonality","useCodingNsTranslator","useState","DEFAULT_ASSISTANT_SETTINGS","useMemo","useSyncExternalStore","useRef","useCallback","CODINGNS_RPC_CHANNEL","readNativeWorkspaceSnapshot","readNativeWorkspaceListStore","resolveAssistantAvatarState","createElement","dshSettingsPrimaryButtonStyle","dshSettingsButtonStyle","dshThemeColor","AssistantAvatarSlot","selectedAssistantAvatar","dshSettingsHelpStyle","AssistantLoadedView","assistantConversationTimeline"],"sources":["../../../../src/shared/voice-models.ts","../../../../src/client/assistant-settings-styles.ts","../../../../src/client/features/assistant-display-store.ts","../../../../src/client/features/assistant-configuration-tabs.ts","../../../../src/shared/assistant-attachments.ts","../../../../src/shared/assistant-commands.ts","../../../../src/client/features/assistant-composer-input.ts","../../../../src/client/features/assistant-workbench-controls.ts","../../../../src/client/features/assistant-configuration-session.ts","../../../../src/shared/assistant-message-timeline.ts","../../../../src/client/features/assistant-record-style.ts","../../../../src/client/features/assistant-conversation-message.ts","../../../../src/client/features/assistant-realtime-call.ts","../../../../src/client/features/assistant-configuration-loader.ts","../../../../src/client/features/assistant-workbench.ts"],"sourcesContent":["/**\n * 面向普通用户展示的实时语音模型目录。\n *\n * 目录只包含流式 ASR 所需的文件。VAD、TTS 以及离线识别模型不属于当前\n * 全局实时对话初始化流程,因此不能出现在用户的模型选择器中。\n */\nexport interface AssistantVoiceModelFile {\n readonly setting: 'asrEncoder' | 'asrDecoder' | 'asrJoiner' | 'asrTokens'\n readonly name: string\n}\n\nexport interface AssistantVoiceModel {\n readonly id: string\n readonly label: string\n readonly description: string\n readonly repository: string\n readonly files: readonly AssistantVoiceModelFile[]\n}\n\nexport type AssistantVoiceModelPaths = Readonly<Record<AssistantVoiceModelFile['setting'], string>>\n\n/** 文件存在、通过模型验证、被选为当前模型是三个独立事实。 */\nexport interface AssistantVoiceModelStatus {\n readonly modelId: string\n readonly state: 'missing' | 'partial' | 'downloaded'\n readonly current: boolean\n readonly totalBytes: number\n readonly files: readonly {\n readonly name: string\n readonly path: string\n readonly bytes: number\n readonly partialBytes: number\n readonly present: boolean\n }[]\n readonly validation: {\n readonly state: 'unchecked' | 'passed' | 'failed'\n readonly checkedAt: number | null\n readonly error: string | null\n }\n}\n\nexport interface AssistantVoiceModelsSnapshot {\n readonly models: readonly AssistantVoiceModelStatus[]\n readonly currentModelId: string | null\n readonly runtimeRunning: boolean\n readonly runtimeReady: boolean\n readonly operation: { readonly modelId: string; readonly kind: 'setup' | 'verify' | 'repair' } | null\n}\n\n/** 下载量只属于当前文件;总大小未知时不能用文件数量伪造字节百分比。 */\nexport interface AssistantVoiceModelProgress {\n readonly modelId: string\n readonly phase: 'checking' | 'downloading' | 'verifying' | 'initializing' | 'completed'\n readonly fileName: string | null\n /** 当前文件的序号从 1 开始;尚未检查文件时为 0。 */\n readonly fileIndex: number\n readonly fileCount: number\n readonly downloadedBytes: number\n readonly totalBytes: number | null\n}\n\nconst STREAMING_FILES: readonly AssistantVoiceModelFile[] = [\n { setting: 'asrEncoder', name: 'encoder-epoch-99-avg-1.int8.onnx' },\n { setting: 'asrDecoder', name: 'decoder-epoch-99-avg-1.int8.onnx' },\n { setting: 'asrJoiner', name: 'joiner-epoch-99-avg-1.int8.onnx' },\n { setting: 'asrTokens', name: 'tokens.txt' },\n]\n\n/** 编程交流默认识别中英混合语句;显式保存的模型选择继续保留。 */\nexport const DEFAULT_VOICE_MODEL_ID = 'sherpa-onnx-streaming-zh-en'\n\n/** 只暴露支持实时输入的推荐模型;模型地址由 Host 根据此白名单解析。 */\nexport const ASSISTANT_VOICE_MODEL_CATALOG: readonly AssistantVoiceModel[] = [\n {\n id: DEFAULT_VOICE_MODEL_ID,\n label: '中英双语实时模型(默认)',\n description: '本地运行,约 200 MB,同时识别中文和英文,适合编程交流。',\n repository: 'csukuangfj/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20',\n files: STREAMING_FILES,\n },\n {\n id: 'sherpa-onnx-streaming-zh-large-2025-06-30',\n label: '中文 Zipformer Large(2025-06-30)',\n description: '本地中文实时识别,模型文件约 168 MB。',\n repository: 'csukuangfj/sherpa-onnx-streaming-zipformer-zh-int8-2025-06-30',\n files: [\n { setting: 'asrEncoder', name: 'encoder.int8.onnx' },\n // Large 发布包的 decoder 是浮点模型,不能套用旧模型的 int8 文件名。\n { setting: 'asrDecoder', name: 'decoder.onnx' },\n { setting: 'asrJoiner', name: 'joiner.int8.onnx' },\n { setting: 'asrTokens', name: 'tokens.txt' },\n ],\n },\n {\n id: 'sherpa-onnx-streaming-zh-14m',\n label: '中文轻量实时模型(14M)',\n description: '本地运行,约 27 MB,适合中文语音对话。',\n repository: 'csukuangfj/sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23',\n files: STREAMING_FILES,\n },\n]\n\nexport function findAssistantVoiceModel(modelId: string): AssistantVoiceModel | undefined {\n return ASSISTANT_VOICE_MODEL_CATALOG.find((model) => model.id === modelId)\n}\n","import type { CSSProperties } from 'react'\n\n/** 助理各页共用选项排版,避免开关、许可复选框和字段标签分别继承宿主字号。 */\nexport const assistantSettingTextStyle: CSSProperties = { fontSize: 13, fontWeight: 400, lineHeight: 1.5 }\nexport const assistantSettingFieldStyle: CSSProperties = { ...assistantSettingTextStyle, display: 'grid', gap: 6, minWidth: 0 }\nexport const assistantSettingCheckboxStyle: CSSProperties = { ...assistantSettingTextStyle, display: 'flex', alignItems: 'start', gap: 8 }\nexport const assistantSettingSwitchStyle: CSSProperties = { ...assistantSettingTextStyle, display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }\n","import type { AssistantChatRun, AssistantDebugSnapshot, AssistantLifecycleSnapshot } from '../../shared/contracts/assistant.js'\nimport { CODINGNS_RPC_CHANNEL } from '../../shared/contracts/transport.js'\nimport type { CodingNsRpcClient } from './types.js'\n\nexport interface AssistantStatusSnapshot {\n readonly revision: number\n readonly capturedAt: number | null\n readonly indexState: AssistantDebugSnapshot['indexState']\n readonly indexedAt: number | null\n readonly workspaces: AssistantDebugSnapshot['workspaces']\n}\ninterface DisplaySnapshot<T> { readonly value?: T; readonly error?: unknown }\ninterface RefreshOptions { readonly force?: boolean; readonly afterPending?: boolean; readonly maxAgeMs?: number }\n\n/** 展示专用快照:按完成时间串行调度,隐藏暂停;绝不承载通话心跳或后台租约。 */\nexport class AssistantDisplayResource<T> {\n private snapshot: DisplaySnapshot<T> = {}\n private readonly listeners = new Set<() => void>()\n private timer: ReturnType<typeof setTimeout> | undefined\n private pending: Promise<T | undefined> | undefined\n private queued: Promise<T | undefined> | undefined\n private controller: AbortController | undefined\n private failures = 0\n private updatedAt = 0\n private forceNext = false\n private generation = 0\n private readonly dom: Document | undefined\n\n constructor(private readonly read: (signal: AbortSignal, force: boolean) => Promise<T>,\n private readonly interval: (value: T | undefined) => number,\n dom?: Document) { this.dom = dom ?? (typeof document === 'undefined' ? undefined : document) }\n\n readonly getSnapshot = (): DisplaySnapshot<T> => this.snapshot\n get observed(): boolean { return this.listeners.size > 0 }\n get active(): boolean { return this.observed || this.pending !== undefined }\n readonly subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n if (this.listeners.size === 1) { this.dom?.addEventListener('visibilitychange', this.visible); this.visible() }\n return () => {\n this.listeners.delete(listener)\n if (this.listeners.size !== 0) return\n this.generation++; this.forceNext = false\n clearTimeout(this.timer); this.controller?.abort()\n this.dom?.removeEventListener('visibilitychange', this.visible)\n }\n }\n private readonly visible = (): void => {\n clearTimeout(this.timer)\n if (this.dom?.visibilityState === 'hidden') { this.controller?.abort(); return }\n void this.refresh({ afterPending: this.controller?.signal.aborted === true })\n }\n refresh(options: RefreshOptions = {}): Promise<T | undefined> {\n this.forceNext ||= options.force === true\n if (this.dom?.visibilityState === 'hidden') return Promise.resolve(this.snapshot.value)\n if (this.pending) {\n if (options.afterPending || options.force) {\n const generation = this.generation\n this.queued ??= this.pending.then(() => { this.queued = undefined; return generation === this.generation ? this.refresh() : this.snapshot.value })\n return this.queued\n }\n return this.pending\n }\n if (!this.forceNext && options.maxAgeMs && this.snapshot.error === undefined && this.snapshot.value !== undefined && Date.now() - this.updatedAt < options.maxAgeMs) return Promise.resolve(this.snapshot.value)\n clearTimeout(this.timer)\n const controller = new AbortController(); this.controller = controller\n const signal = AbortSignal.any([controller.signal, AbortSignal.timeout(10_000)])\n const force = this.forceNext; this.forceNext = false\n // 即便旧 Host 忽略 signal,也不让迟到快照写回已经隐藏或解绑的界面。\n this.pending = abortable(() => this.read(signal, force), signal).then((value) => {\n signal.throwIfAborted()\n this.failures = 0; this.updatedAt = Date.now(); this.snapshot = { value }; this.emit()\n return value\n }).catch((error: unknown) => {\n if (!controller.signal.aborted) { this.failures++; this.snapshot = { ...this.snapshot, error }; this.emit() }\n return undefined\n }).finally(() => {\n this.pending = undefined\n if (!this.listeners.size || this.dom?.visibilityState === 'hidden') return\n const delay = Math.min(this.interval(this.snapshot.value) * 2 ** Math.min(this.failures, 4), 60_000)\n this.timer = setTimeout(() => { void this.refresh() }, delay)\n })\n return this.pending\n }\n private emit(): void { for (const listener of this.listeners) listener() }\n}\n\n/** 取消时结束等待;底层 Promise 仍由处理器接住,避免迟到拒绝成为未处理异常。 */\nfunction abortable<T>(read: () => Promise<T>, signal: AbortSignal): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const aborted = (): void => reject(signal.reason)\n if (signal.aborted) { aborted(); return }\n signal.addEventListener('abort', aborted, { once: true })\n void Promise.resolve().then(() => { signal.throwIfAborted(); return read() }).then(resolve, reject)\n .finally(() => signal.removeEventListener('abort', aborted))\n })\n}\n\nconst stores = new WeakMap<CodingNsRpcClient, Map<string, AssistantDisplayStore>>()\nconst legacyStatus = new WeakSet<CodingNsRpcClient>()\nexport function assistantDisplayScope(ids: readonly string[]): string { return JSON.stringify([...new Set(ids)].sort()) }\nexport function getAssistantDisplayStore(rpc: CodingNsRpcClient, scope: string): AssistantDisplayStore {\n let scopes = stores.get(rpc)\n if (!scopes) { scopes = new Map(); stores.set(rpc, scopes) }\n let store = scopes.get(scope)\n if (!store) { store = new AssistantDisplayStore(rpc); scopes.set(scope, store) }\n // 反复改管理范围不能永久保留所有完整调试快照。保留最近八个范围,\n // 被界面订阅或仍在读取的实例不回收,避免拆成两个并行请求所有者。\n scopes.delete(scope); scopes.set(scope, store)\n for (const [key, cached] of scopes) {\n if (scopes.size <= 8) break\n if (key !== scope && !cached.active) scopes.delete(key)\n }\n return store\n}\n\nexport class AssistantDisplayStore {\n private readonly chats = new Map<string, AssistantDisplayResource<AssistantChatRun>>()\n readonly status: AssistantDisplayResource<AssistantStatusSnapshot>\n readonly debug: AssistantDisplayResource<AssistantDebugSnapshot>\n readonly lifecycle: AssistantDisplayResource<AssistantLifecycleSnapshot>\n get active(): boolean { return this.status.active || this.debug.active || this.lifecycle.active || [...this.chats.values()].some((resource) => resource.active) }\n constructor(private readonly rpc: CodingNsRpcClient, dom?: Document) {\n this.debug = new AssistantDisplayResource((signal, force) => this.call('assistant/debug', force ? { refresh: true } : {}, signal),\n () => legacyStatus.has(rpc) ? 30_000 : 3_000, dom)\n this.status = new AssistantDisplayResource(async (signal, force) => {\n if (!legacyStatus.has(rpc)) {\n try { return await this.call<AssistantStatusSnapshot>('assistant/status', {}, signal) }\n catch (error) { if (!unknownStatus(error)) throw error; legacyStatus.add(rpc) }\n }\n // 旧 Host 只探测一次未知接口;所有降级读取共用 debug 的缓存与在途请求。\n const value = await this.debug.refresh({ maxAgeMs: 30_000, ...(force ? { force: true } : {}) })\n if (!value) throw this.debug.getSnapshot().error ?? new Error('Assistant debug snapshot unavailable')\n return { revision: value.index?.generation ?? 0, capturedAt: value.capturedAt, indexState: value.indexState, indexedAt: value.indexedAt, workspaces: value.workspaces }\n }, () => legacyStatus.has(rpc) ? 30_000 : 3_000, dom)\n this.lifecycle = new AssistantDisplayResource((signal) => this.call('assistant/lifecycle/read', {}, signal),\n (value) => value?.conversation.active?.state === 'running' || value?.conversation.voiceSessions?.some((session) => session.endedAt === null) ? 600 : 1500, dom)\n }\n chat(requestId: string): AssistantDisplayResource<AssistantChatRun> {\n for (const [id, cached] of this.chats) if (id !== requestId && !cached.observed) this.chats.delete(id)\n let resource = this.chats.get(requestId)\n if (!resource) {\n resource = new AssistantDisplayResource((signal) => this.call('assistant/chat/read', { requestId }, signal), () => 600)\n this.chats.set(requestId, resource)\n }\n return resource\n }\n private async call<T>(endpoint: string, payload: unknown, signal: AbortSignal): Promise<T> {\n const result = await this.rpc.call(CODINGNS_RPC_CHANNEL, endpoint, payload, signal)\n if (!result.ok) throw Object.assign(new Error(result.error.message), { code: result.error.code })\n return result.value as T\n }\n}\nfunction unknownStatus(error: unknown): boolean {\n const code = (error as { code?: string })?.code ?? ''\n const message = error instanceof Error ? error.message : String(error)\n return /UNKNOWN_(?:ACTION|ENDPOINT|METHOD)|METHOD_NOT_FOUND|RPC_NOT_FOUND|UNSUPPORTED_ACTION/iu.test(code)\n || /(?:unknown|unsupported|not found).*(?:status|action|endpoint)|(?:未知|不支持|未注册).*(?:status|操作|动作|接口)/iu.test(message)\n}\n","import { createElement, useId } from 'react'\nimport type { KeyboardEvent, ReactElement, ReactNode } from 'react'\nimport type { CodingNsTranslator } from '../locale.js'\nimport { dshThemeColor } from '../theme.js'\n\nconst tabs = [\n { id: 'basic', label: 'awb.tab.basic' }, { id: 'appearance', label: 'awb.tab.appearance' },\n { id: 'voice', label: 'awb.tab.voice' }, { id: 'more', label: 'awb.more' },\n] as const\nexport type AssistantConfigurationTab = typeof tabs[number]['id']\n\n/** 延迟挂载尚未访问的页,访问后保留实例,避免切换丢失资源表单或中断安装。 */\nexport function AssistantConfigurationTabs({ active, visited, panels, preview, t, onChange }: {\n readonly active: AssistantConfigurationTab\n readonly visited: readonly AssistantConfigurationTab[]\n readonly panels: Readonly<Record<AssistantConfigurationTab, ReactNode>>\n readonly preview: ReactNode\n readonly t: CodingNsTranslator\n readonly onChange: (tab: AssistantConfigurationTab) => void\n}): ReactElement {\n const id = useId()\n return createElement('div', { 'data-codingns-configuration-tabs': true, style: { display: 'grid', gap: 11, minWidth: 0 } },\n createElement(AssistantConfigurationTabBar, { id, active, t, onChange }),\n createElement('div', { style: { display: 'flex', flexWrap: 'wrap', alignItems: 'stretch', gap: 22, minWidth: 0 } },\n createElement('div', { style: { flex: '1 1 330px', minWidth: 0 } },\n ...tabs.map((tab) => createElement('section', {\n key: tab.id, id: `${id}-panel-${tab.id}`, role: 'tabpanel', 'aria-labelledby': `${id}-tab-${tab.id}`,\n hidden: tab.id !== active, tabIndex: 0, 'data-codingns-configuration-page': tab.id,\n style: { display: tab.id === active ? 'grid' : 'none', gap: 11, minWidth: 0 },\n }, tab.id === active || visited.includes(tab.id) ? panels[tab.id] : null))),\n // 更多设置使用全宽;预览实例保留,来回切换不重新加载所选形象。\n createElement('div', { hidden: active === 'more', 'data-codingns-configuration-preview': true,\n style: { display: active === 'more' ? 'none' : 'flex', flex: '1 1 290px', minWidth: 0 } }, preview)))\n}\n\n/** 标签可用方向键、Home 和 End 切换,只有当前标签进入顺序焦点。 */\nexport function AssistantConfigurationTabBar({ id, active, t, onChange }: {\n readonly id: string; readonly active: AssistantConfigurationTab; readonly t: CodingNsTranslator\n readonly onChange: (tab: AssistantConfigurationTab) => void\n}): ReactElement {\n const navigate = (event: KeyboardEvent<HTMLButtonElement>, index: number): void => {\n let next: number\n if (event.key === 'ArrowRight') next = (index + 1) % tabs.length\n else if (event.key === 'ArrowLeft') next = (index + tabs.length - 1) % tabs.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = tabs.length - 1\n else return\n event.preventDefault()\n onChange(tabs[next]!.id)\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[next]?.focus()\n }\n return createElement('div', { role: 'tablist', 'aria-label': t('awb.configure'),\n style: { position: 'sticky', top: 0, zIndex: 2, display: 'flex', gap: 4, padding: 4, borderRadius: 12,\n background: dshThemeColor.cardBackground, border: `1px solid ${dshThemeColor.border}`, overflowX: 'auto', minWidth: 0 } },\n ...tabs.map((tab, index) => createElement('button', { key: tab.id, type: 'button', role: 'tab', id: `${id}-tab-${tab.id}`,\n 'aria-controls': `${id}-panel-${tab.id}`, 'aria-selected': active === tab.id, tabIndex: active === tab.id ? 0 : -1,\n onClick: () => onChange(tab.id), onKeyDown: (event: KeyboardEvent<HTMLButtonElement>) => navigate(event, index),\n style: { flex: '1 0 auto', minHeight: 36, border: 0, borderRadius: 8, padding: '7px 12px', whiteSpace: 'nowrap', cursor: 'pointer',\n font: 'inherit', fontSize: 13, fontWeight: active === tab.id ? 600 : 400,\n color: active === tab.id ? dshThemeColor.labelPrimary : dshThemeColor.labelSecondary,\n background: active === tab.id ? dshThemeColor.pageBackground : 'transparent',\n boxShadow: active === tab.id ? dshThemeColor.subtleShadow : 'none' },\n }, t(tab.label))))\n}\n","/** 上传只携带字节,不能由浏览器指定 Host 文件路径或已有附件引用。 */\nexport interface AssistantAttachmentUpload { readonly name: string; readonly mediaType: string; readonly data: string }\nexport interface AssistantAttachmentReference {\n readonly attachmentId: string; readonly name?: string; readonly bytes: number\n readonly mediaType?: string; readonly width?: number; readonly height?: number\n}\nexport interface AssistantAttachment { readonly type: 'image' | 'file'; readonly attachment: AssistantAttachmentReference }\nexport const ASSISTANT_ATTACHMENT_MAX_FILES = 6\nexport const ASSISTANT_ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024\nexport const ASSISTANT_ATTACHMENT_MAX_TOTAL_BYTES = 20 * 1024 * 1024\nexport const ASSISTANT_IMAGE_MEDIA_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'] as const\n\n/** 在解码和写入前限制 JSON 上传的体积,所有真实图片校验仍交给 DSH。 */\nexport function readAssistantAttachmentUploads(value: unknown): readonly AssistantAttachmentUpload[] {\n if (value === undefined) return []\n if (!Array.isArray(value) || value.length > ASSISTANT_ATTACHMENT_MAX_FILES) throw new Error('助理附件数量无效,最多 6 个')\n let total = 0\n return value.map((item) => {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string' || !item.name.trim() || item.name.length > 200\n || /[\\\\/\\x00-\\x1f]/u.test(item.name) || typeof item.mediaType !== 'string' || item.mediaType.length > 120\n || typeof item.data !== 'string' || item.data.length > Math.ceil(ASSISTANT_ATTACHMENT_MAX_BYTES / 3) * 4) throw new Error('助理附件无效或超过 10 MiB')\n if (item.data.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/u.test(item.data)) throw new Error('助理附件编码无效')\n const bytes = item.data.length / 4 * 3 - (item.data.endsWith('==') ? 2 : item.data.endsWith('=') ? 1 : 0)\n if (bytes > ASSISTANT_ATTACHMENT_MAX_BYTES || (total += bytes) > ASSISTANT_ATTACHMENT_MAX_TOTAL_BYTES) throw new Error('助理附件总大小超过 20 MiB')\n if (item.mediaType.startsWith('image/') && !ASSISTANT_IMAGE_MEDIA_TYPES.some((type) => type === item.mediaType)) throw new Error('图片仅支持 PNG、JPEG、WebP 和 GIF')\n return { name: item.name.trim(), mediaType: item.mediaType, data: item.data }\n })\n}\n\n/** 持久记录只保留宿主生成的引用,不保存上传编码或可执行路径。 */\nexport function readAssistantAttachments(value: unknown): readonly AssistantAttachment[] {\n if (value === undefined) return []\n if (!Array.isArray(value) || value.length > ASSISTANT_ATTACHMENT_MAX_FILES) throw new Error('助理附件引用无效')\n for (const item of value) {\n const ref = item?.attachment\n if (!['image', 'file'].includes(item?.type) || ref === null || typeof ref !== 'object'\n || typeof ref.attachmentId !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(ref.attachmentId)\n || !Number.isSafeInteger(ref.bytes) || ref.bytes < 0 || ref.bytes > ASSISTANT_ATTACHMENT_MAX_BYTES\n || ref.name !== undefined && (typeof ref.name !== 'string' || ref.name.length > 200 || /[\\\\/\\x00-\\x1f]/u.test(ref.name))\n || item.type === 'image' && (!ASSISTANT_IMAGE_MEDIA_TYPES.some((type) => type === ref.mediaType)\n || !Number.isSafeInteger(ref.width) || ref.width < 1 || !Number.isSafeInteger(ref.height) || ref.height < 1)) throw new Error('助理附件引用无效')\n }\n return structuredClone(value) as AssistantAttachment[]\n}\n","/** 清理指令是固定的协议标识,中文别名不随界面语言变化。 */\nexport const ASSISTANT_CLEAR_COMMANDS: readonly string[] = ['/clear', '/清理', '/reset', '/重置']\n","import { ASSISTANT_ATTACHMENT_MAX_FILES, ASSISTANT_ATTACHMENT_MAX_BYTES, ASSISTANT_ATTACHMENT_MAX_TOTAL_BYTES,\n ASSISTANT_IMAGE_MEDIA_TYPES, type AssistantAttachmentUpload } from '../../shared/assistant-attachments.js'\nimport { ASSISTANT_CLEAR_COMMANDS } from '../../shared/assistant-commands.js'\n\n/** 只匹配完整指令,避免把路径、带参数文本或普通问题误当成破坏性操作。 */\nexport function readAssistantComposerCommand(text: string): 'clear' | undefined {\n return ASSISTANT_CLEAR_COMMANDS.includes(text.trim().toLowerCase()) ? 'clear' : undefined\n}\nexport function isAssistantClearCommandSuggestion(text: string): boolean {\n const prefix = text.trim().toLowerCase()\n return prefix.startsWith('/') && ASSISTANT_CLEAR_COMMANDS.some((command) => command.startsWith(prefix))\n}\n\n/** 先归零再测量,删除内容也能缩回单行;超过视口上限后仅内部滚动。 */\nexport function resizeAssistantComposerTextarea(input: HTMLTextAreaElement): void {\n const style = input.ownerDocument.defaultView?.getComputedStyle(input)\n const minimum = Number.parseFloat(style?.minHeight ?? '') || 38\n const maximum = Number.parseFloat(style?.maxHeight ?? '') || 120\n input.style.height = '0px'\n const height = input.scrollHeight\n input.style.height = `${Math.min(maximum, Math.max(minimum, height))}px`\n input.style.overflowY = height > maximum ? 'auto' : 'hidden'\n}\n\nexport function validateAssistantFiles(files: readonly File[]): void {\n if (files.length > ASSISTANT_ATTACHMENT_MAX_FILES) throw new Error('awb.attachments.countError')\n if (files.some((file) => file.size > ASSISTANT_ATTACHMENT_MAX_BYTES) || files.reduce((sum, file) => sum + file.size, 0) > ASSISTANT_ATTACHMENT_MAX_TOTAL_BYTES) throw new Error('awb.attachments.sizeError')\n if (files.some((file) => file.type.startsWith('image/') && !ASSISTANT_IMAGE_MEDIA_TYPES.some((type) => type === file.type))) throw new Error('awb.attachments.typeError')\n}\n/** 附件在点击发送时才编码;选择、删除或取消草稿不会在 Host 留下文件。 */\nexport async function encodeAssistantFiles(files: readonly File[]): Promise<readonly AssistantAttachmentUpload[]> {\n validateAssistantFiles(files)\n return await Promise.all(files.map(async (file) => {\n const bytes = new Uint8Array(await file.arrayBuffer())\n let binary = ''\n for (let offset = 0; offset < bytes.length; offset += 8192) binary += String.fromCharCode(...bytes.subarray(offset, offset + 8192))\n return { name: file.name, mediaType: file.type, data: btoa(binary) }\n }))\n}\n","import { createElement, useEffect, useId, useRef } from 'react'\nimport type { CSSProperties, ReactElement } from 'react'\nimport { resolveAssistantControlIcon, type AssistantControlIcon } from '../../dsh-capabilities/client/primitives-adapter.js'\nimport type { AssistantDebugSnapshot } from '../../shared/contracts/assistant.js'\nimport type { CodingNsTranslator } from '../locale.js'\nimport { dshSettingsButtonStyle, dshSettingsPrimaryButtonStyle, dshThemeColor } from '../theme.js'\nimport { resizeAssistantComposerTextarea, isAssistantClearCommandSuggestion } from './assistant-composer-input.js'\n\nexport type AssistantWorkbenchStatus = 'thinking' | 'updating' | 'idle' | 'working'\nexport type AssistantMaintenanceConfirmation = 'clear' | 'reset-first' | 'reset-final'\n\n/** 活动状态优先;只有正在构建索引才显示认知更新,等待或缺少结果不代表正在执行。 */\nexport function resolveAssistantWorkbenchStatus({ running, working, voiceActive, voiceState, hasProjects, indexState }: {\n readonly running: boolean; readonly working: boolean; readonly voiceActive: boolean; readonly voiceState?: string | undefined\n readonly hasProjects: boolean; readonly indexState: AssistantDebugSnapshot['indexState'] | undefined\n}): AssistantWorkbenchStatus {\n if (running || voiceActive && voiceState === 'thinking') return 'thinking'\n if (working || voiceActive) return 'working'\n if (hasProjects && indexState === 'building') return 'updating'\n return 'idle'\n}\n\nexport function AssistantStatusBadge({ status, t }: { readonly status: AssistantWorkbenchStatus; readonly t: CodingNsTranslator }): ReactElement {\n return createElement('span', { role: 'status', 'aria-live': 'polite', 'data-codingns-assistant-status': status,\n style: { display: 'inline-flex', alignItems: 'center', gap: 5, padding: '3px 8px', borderRadius: 999,\n fontSize: 11, lineHeight: 1.4, whiteSpace: 'nowrap', color: status === 'idle' ? dshThemeColor.labelSecondary : dshThemeColor.accent,\n background: dshThemeColor.surfaceSubtle, border: `1px solid ${dshThemeColor.border}`, flexShrink: 0 } },\n createElement('span', { 'aria-hidden': true, style: { width: 5, height: 5, borderRadius: '50%', background: 'currentColor' } }), t(`awb.state.${status}`))\n}\n\n/** 一行圆角输入栏;长消息有限度增长,停止、语音和发送均有可访问的按钮名称。 */\ninterface AssistantComposerProps {\n readonly t: CodingNsTranslator; readonly value: string; readonly disabled: boolean\n readonly onChange: (value: string) => void; readonly onSend: () => void; readonly label?: 'awb.send'\n readonly running?: boolean; readonly stopping?: boolean; readonly onStop?: () => void\n readonly voiceActive?: boolean; readonly voiceDisabled?: boolean; readonly onVoice?: () => void\n readonly files?: readonly File[]; readonly onFiles?: (files: readonly File[]) => void; readonly onRemoveFile?: (index: number) => void\n}\nexport function AssistantComposer(props: AssistantComposerProps): ReactElement {\n const textarea = useRef<HTMLTextAreaElement>(null)\n const picker = useRef<HTMLInputElement>(null)\n useEffect(() => { if (textarea.current !== null) resizeAssistantComposerTextarea(textarea.current) }, [props.value, props.disabled])\n useEffect(() => {\n const input = textarea.current\n if (input === null) return undefined\n const resize = (): void => resizeAssistantComposerTextarea(input)\n let width = input.clientWidth\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => {\n if (input.clientWidth !== width) { width = input.clientWidth; resize() }\n })\n observer?.observe(input)\n window.addEventListener('resize', resize); window.visualViewport?.addEventListener('resize', resize)\n return () => { observer?.disconnect(); window.removeEventListener('resize', resize); window.visualViewport?.removeEventListener('resize', resize) }\n }, [])\n return createElement('div', null,\n createElement(AssistantControlsStyle),\n createElement('input', { ref: picker, type: 'file', multiple: true, hidden: true, 'aria-label': props.t('awb.attachments.add'),\n onChange: (event: { currentTarget: HTMLInputElement }) => { const files = Array.from(event.currentTarget.files ?? []); event.currentTarget.value = ''; if (!props.disabled) props.onFiles?.(files) } }),\n createElement(AssistantComposerView, { ...props, textareaRef: textarea,\n onAttach: props.onFiles === undefined ? undefined : () => picker.current?.click() }))\n}\n\n/** 事件与布局保持独立,自动高度和文件选择器只由外层绑定浏览器生命周期。 */\nexport function AssistantComposerView({ t, value, disabled, onChange, onSend, label = 'awb.send', running = false, stopping = false, onStop,\n voiceActive = false, voiceDisabled = true, onVoice, files = [], onRemoveFile, onFiles, onAttach, textareaRef }: AssistantComposerProps & {\n readonly onAttach?: (() => void) | undefined; readonly textareaRef?: React.RefObject<HTMLTextAreaElement>\n }): ReactElement {\n const send = (): void => { if (!disabled && !running && (value.trim() || files.length > 0)) onSend() }\n const voiceLabel = t(voiceActive ? 'voice.dialog.stop' : 'voice.dialog.start')\n const sendDisabled = running ? stopping || onStop === undefined : disabled || !value.trim() && files.length === 0\n return createElement('form', { 'data-codingns-assistant-composer': true,\n style: { display: 'flex', flexDirection: 'column', gap: 8, padding: '10px 12px', borderRadius: 30,\n border: `1px solid ${dshThemeColor.border}`, background: dshThemeColor.surfaceSubtle, minWidth: 0, outline: 'none', boxShadow: 'none' },\n onSubmit: (event: { preventDefault(): void }) => { event.preventDefault(); send() } },\n files.length === 0 ? null : createElement('div', { 'data-codingns-assistant-attachments': true, style: { display: 'flex', flexWrap: 'wrap', gap: 6, padding: '4px 8px', maxHeight: 100, overflowY: 'auto' } },\n ...files.map((file, index) => createElement('span', { key: `${index}:${file.name}`, style: { display: 'inline-flex', alignItems: 'center', gap: 4, maxWidth: '100%', padding: '3px 8px', borderRadius: 10, background: dshThemeColor.buttonBackground, border: `1px solid ${dshThemeColor.border}`, fontSize: 12 } },\n createElement('span', { title: file.name, style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, file.name),\n createElement(AssistantIconButton, { icon: 'close', label: t('awb.attachments.remove', { name: file.name }), disabled,\n size: 24, onClick: () => onRemoveFile?.(index) })))),\n createElement('div', { style: { display: 'flex', alignItems: 'flex-end', gap: 8, minWidth: 0 } },\n onAttach === undefined ? null : createElement(AssistantIconButton, { icon: 'add', label: t('awb.attachments.add'), disabled, size: 38, onClick: onAttach }),\n createElement('textarea', { ref: textareaRef, value, disabled, maxLength: 8000, rows: 1, 'aria-label': t('awb.placeholder'), placeholder: t('awb.placeholder'),\n style: { flex: '1 1 auto', width: '100%', minWidth: 0, minHeight: 38, maxHeight: 'min(120px, 20dvh)', padding: '9px 0', boxSizing: 'border-box',\n resize: 'none', overflowY: 'hidden', border: 0, outline: 'none', boxShadow: 'none', borderRadius: 0, background: 'transparent', color: dshThemeColor.labelPrimary, font: 'inherit', fontSize: 14, lineHeight: '20px' },\n onChange: (event: { currentTarget: { value: string } }) => onChange(event.currentTarget.value),\n onInput: (event: { currentTarget: HTMLTextAreaElement }) => resizeAssistantComposerTextarea(event.currentTarget),\n onPaste: (event: { clipboardData: DataTransfer; preventDefault(): void }) => {\n if (!disabled && onFiles !== undefined && event.clipboardData.files.length > 0) { event.preventDefault(); onFiles(Array.from(event.clipboardData.files)) }\n },\n onKeyDown: (event: { key: string; shiftKey: boolean; nativeEvent: { isComposing: boolean }; preventDefault(): void }) => {\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) { event.preventDefault(); send() }\n } }),\n onVoice === undefined ? null : createElement('button', { type: 'button', disabled: voiceDisabled, 'aria-label': voiceLabel, className: 'codingns-assistant-icon-button',\n 'aria-pressed': voiceActive, title: voiceDisabled && !voiceActive ? t('awb.voiceUnavailable') : voiceLabel,\n style: { ...iconButtonStyle, color: voiceActive ? dshThemeColor.accent : dshThemeColor.labelPrimary,\n opacity: voiceDisabled ? 0.4 : 1, cursor: voiceDisabled ? 'default' : 'pointer' },\n onClick: () => { if (!voiceDisabled) onVoice() } }, createElement(resolveAssistantControlIcon('phone'), { size: 20 })),\n createElement('button', { type: running ? 'button' : 'submit', 'aria-label': t(running ? 'awb.stop' : label), title: t(running ? 'awb.stop' : label),\n disabled: sendDisabled,\n onClick: running ? () => { if (!stopping) onStop?.() } : undefined,\n style: { ...iconButtonStyle, color: dshThemeColor.switchThumb, background: dshThemeColor.accent,\n opacity: sendDisabled ? 0.4 : 1, cursor: sendDisabled ? 'default' : 'pointer' } }, createElement(resolveAssistantControlIcon(running ? 'stop' : 'send'), { size: 20 }))),\n !isAssistantClearCommandSuggestion(value) ? null : createElement('button', { type: 'button', disabled,\n 'data-codingns-assistant-command': 'clear', style: { ...dshSettingsButtonStyle, textAlign: 'left', margin: '0 6px 2px', border: 0, borderRadius: 10 },\n onClick: () => { if (!disabled) onChange('/clear') } }, createElement('strong', { style: { marginRight: 8 } }, '/clear'), t('awb.command.clear')))\n}\n\nexport function AssistantIconButton({ icon, label, disabled = false, size = 32, onClick }: {\n readonly icon: AssistantControlIcon; readonly label: string; readonly disabled?: boolean; readonly size?: number; readonly onClick: () => void\n}): ReactElement {\n return createElement('button', { type: 'button', disabled, title: label, 'aria-label': label, className: 'codingns-assistant-icon-button',\n style: { ...iconButtonStyle, width: size, height: size, borderRadius: size === 38 ? '50%' : 8, color: dshThemeColor.labelSecondary,\n opacity: disabled ? 0.4 : 1, cursor: disabled ? 'default' : 'pointer' },\n onClick: () => { if (!disabled) onClick() } }, createElement(resolveAssistantControlIcon(icon), { size: size < 30 ? 14 : 20 }))\n}\n\n/** 第一轮重置确认只推进阶段,第二轮才允许执行,清理仍只需一次确认。 */\nexport function confirmAssistantMaintenance(stage: AssistantMaintenanceConfirmation, next: (stage: AssistantMaintenanceConfirmation) => void,\n execute: (action: 'clear' | 'reset') => void): void {\n if (stage === 'reset-first') next('reset-final')\n else execute(stage === 'clear' ? 'clear' : 'reset')\n}\n\nexport function AssistantMaintenanceDialog(props: {\n readonly stage: AssistantMaintenanceConfirmation; readonly t: CodingNsTranslator; readonly disabled: boolean; readonly error?: string\n readonly onConfirm: () => void; readonly onCancel: () => void\n}): ReactElement {\n const ref = useRef<HTMLDialogElement>(null)\n const id = useId()\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null\n const dialog = ref.current\n dialog?.showModal()\n return () => { if (dialog?.open) dialog.close(); if (opener?.isConnected) opener.focus() }\n }, [])\n return createElement('dialog', { ref, 'aria-labelledby': id, 'data-codingns-assistant-confirmation': props.stage,\n onCancel: (event: { preventDefault(): void }) => { event.preventDefault(); if (!props.disabled) props.onCancel() },\n onKeyDown: (event: { key: string; preventDefault(): void; stopPropagation(): void }) => {\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); if (!props.disabled) props.onCancel() }\n }, style: { padding: 11, borderRadius: 16, maxWidth: 'min(440px, calc(100vw - 32px))', maxHeight: 'calc(100dvh - 32px)',\n margin: 'auto', boxSizing: 'border-box', overflowY: 'auto', background: dshThemeColor.pageBackground, color: dshThemeColor.labelPrimary,\n border: `1px solid ${dshThemeColor.border}`, boxShadow: dshThemeColor.prominentShadow } },\n createElement('strong', { id, style: { fontSize: 17 } }, props.t(props.stage === 'clear' ? 'awb.clear' : props.stage === 'reset-first' ? 'awb.reset' : 'awb.resetFinalTitle')),\n createElement(AssistantMaintenanceConfirmationView, props))\n}\n\nexport function AssistantMaintenanceConfirmationView({ stage, t, disabled, error, onConfirm, onCancel }: {\n readonly stage: AssistantMaintenanceConfirmation; readonly t: CodingNsTranslator; readonly disabled: boolean; readonly error?: string\n readonly onConfirm: () => void; readonly onCancel: () => void\n}): ReactElement {\n return createElement('div', { style: { display: 'grid', gap: 16, marginTop: 14, fontSize: 13, lineHeight: 1.6 } },\n createElement('p', { style: { margin: 0, color: dshThemeColor.labelSecondary } }, t(stage === 'clear' ? 'awb.clearConfirm' : stage === 'reset-first' ? 'awb.resetConfirm' : 'awb.resetFinalConfirm')),\n !error ? null : createElement('p', { role: 'alert', style: { margin: 0, color: dshThemeColor.error, overflowWrap: 'anywhere' } }, error),\n createElement('div', { style: { display: 'flex', gap: 8, justifyContent: 'flex-end' } },\n createElement('button', { type: 'button', autoFocus: true, disabled, style: dshSettingsButtonStyle,\n onClick: () => { if (!disabled) onCancel() } }, t('awb.cancel')),\n createElement('button', { type: 'button', disabled, style: dshSettingsPrimaryButtonStyle,\n onClick: () => { if (!disabled) onConfirm() } }, t(stage === 'reset-first' ? 'awb.resetContinue' : stage === 'reset-final' ? 'awb.resetFinalAction' : 'awb.confirm'))))\n}\n\nconst iconButtonStyle: CSSProperties = { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,\n width: 38, height: 38, padding: 0, border: 0, borderRadius: '50%', background: 'transparent', cursor: 'pointer' }\n\n/** 创建与配置页也复用标题按钮的悬停样式,不依赖对话输入栏挂载。 */\nexport function AssistantControlsStyle(): ReactElement { return createElement('style', null, assistantComposerCss) }\n\n// 仅覆盖助理输入框的焦点样式;按钮仍保留宿主键盘焦点提示。\nconst assistantComposerCss = `\n[data-codingns-assistant-composer] textarea,[data-codingns-assistant-composer] textarea:focus,[data-codingns-assistant-composer] textarea:focus-visible{outline:none!important;box-shadow:none!important;border:0!important;resize:none!important}\n.codingns-assistant-icon-button:not(:disabled):hover{background:var(--dsw-alias-interactive-bg-hover)!important}\n.codingns-assistant-icon-button:not(:disabled):active{background:var(--dsw-alias-interactive-bg-active)!important}\n`\n","import type { CodingNsSettings } from '../../shared/contracts/config.js'\nimport type { CodingNsSettingsOperation, CodingNsSettingsSnapshot, CodingNsSettingsStore } from '../../dsh-capabilities/settings-store.js'\nimport { sameSettingsValue } from '../../dsh-capabilities/settings-store.js'\nimport { readAssistantTtsSettings, MOSS_BUILTIN_VOICES, validateAssistantTtsParameters } from '../../shared/assistant-tts.js'\nimport type { AssistantTtsSnapshot } from '../../shared/assistant-tts.js'\nimport type { CodingNsClientServices, CodingNsRpcResult } from './types.js'\nimport { getGlobalVoiceAdapter, registerGlobalVoiceAdapter } from '../global-voice-runtime-registry.js'\nimport { getAssistantAvatarRegistry, bindAssistantAvatarRegistry } from '../avatar/registry.js'\nimport { getAssistantAvatarManager, bindAssistantAvatarManager, AssistantAvatarManager } from '../avatar/manager.js'\nimport { AssistantAvatarPortraitService, assistantAvatarPortraitOverrideStore, bindAssistantAvatarPortraitService, getAssistantAvatarPortraitService } from '../avatar/portrait-service.js'\nimport type { AssistantAvatarPreview } from '../avatar/preview-store.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRenderer } from '../avatar/registry.js'\nimport { CODINGNS_RPC_CHANNEL } from '../../shared/contracts/transport.js'\nimport { hasAssistantAvatarConsent } from '../../shared/assistant-avatar-catalog.js'\nimport { findAssistantVoiceModel } from '../../shared/voice-models.js'\nimport { codingNsTranslator } from '../locale.js'\n\ntype ConfigurationSnapshot = CodingNsSettingsSnapshot<CodingNsSettings> & { readonly preparing: boolean }\nconst resourceActions = new Set(['assistant/tts/setup', 'assistant/tts/import', 'assistant/voice/setup', 'assistant/voice/initialize', 'avatar/install', 'avatar/installCatalog', 'avatar/installEngine'])\n\n/** 配置窗口的唯一草稿存储;普通写入只修改内存,正式运行仍读原服务。 */\nexport class AssistantConfigurationSession implements CodingNsSettingsStore<CodingNsSettings> {\n readonly services: CodingNsClientServices\n private snapshot: ConfigurationSnapshot\n private readonly listeners = new Set<() => void>()\n private readonly changes = new Map<string, CodingNsSettingsOperation>()\n private readonly portraits = new Map<string, { model: AssistantAvatarModel; renderer: AssistantAvatarRenderer | undefined; preview: AssistantAvatarPreview }>()\n private readonly portraitValues = new Map<string, AssistantAvatarPreview>()\n private readonly removedPortraits = new Set<string>()\n private readonly removals = new Map<string, { endpoint: string; payload: unknown }>()\n private readonly devices = new Map<'input' | 'output', string>()\n private releaseAdapter: (() => void) | undefined\n private preparationSupport: Promise<boolean> | undefined\n private preparations = 0\n private lifetime = new AbortController()\n private localRevision = 0\n\n constructor(private readonly original: CodingNsClientServices) {\n this.snapshot = { ...original.settings.getSnapshot(), value: structuredClone(original.settings.getSnapshot().value), revision: this.localRevision, preparing: false }\n this.services = { ...original, configurationDraft: true, settings: this, rpc: { call: (channel, endpoint, payload, signal) => this.call(channel, endpoint, payload, signal) } }\n bindAssistantAvatarRegistry(this.services, getAssistantAvatarRegistry(original))\n const overrides = {\n read: async (key: string, signal?: AbortSignal) => this.portraitValues.get(key) ?? await assistantAvatarPortraitOverrideStore.read(key, signal),\n write: async (key: string, id: string, _surface: unknown, preview: AssistantAvatarPreview, signal?: AbortSignal) => {\n signal?.throwIfAborted()\n const model = getAssistantAvatarManager(this.services).list().find((item) => item.id === id)\n if (model === undefined) return false\n this.portraitValues.set(key, preview)\n this.portraits.set(key, { model, renderer: getAssistantAvatarRegistry(this.services).get(model.surfaces?.dialog?.renderer ?? model.renderer), preview })\n return true\n },\n removeModel: async (id: string) => { this.removedPortraits.add(id); for (const [key, item] of this.portraits) if (item.model.id === id) { this.portraits.delete(key); this.portraitValues.delete(key) } },\n }\n bindAssistantAvatarPortraitService(this.services, new AssistantAvatarPortraitService(undefined, undefined, undefined, undefined, undefined, overrides))\n bindAssistantAvatarManager(this.services, new AssistantAvatarManager(this, getAssistantAvatarManager(original).adapters, undefined, undefined, this.services.rpc,\n (id) => { this.removedPortraits.add(id) }))\n const adapter = getGlobalVoiceAdapter(original)\n if (adapter !== undefined) this.releaseAdapter = registerGlobalVoiceAdapter(this.services, new Proxy(adapter, { get: (target, key) => {\n if (key === 'selectInputDevice' || key === 'selectOutputDevice') return async (id: string) => { this.requireWritable(); this.devices.set(key === 'selectInputDevice' ? 'input' : 'output', id) }\n if (key === 'inputDeviceId' || key === 'outputDeviceId') return this.devices.get(key === 'inputDeviceId' ? 'input' : 'output') ?? Reflect.get(target, key)\n const value = Reflect.get(target, key); return typeof value === 'function' ? value.bind(target) : value\n } }))\n }\n readonly getSnapshot = (): ConfigurationSnapshot => this.snapshot\n readonly subscribe = (listener: () => void): (() => void) => { this.listeners.add(listener); return () => this.listeners.delete(listener) }\n /** 权威快照变化仅更新未编辑字段,后台状态刷新不能抹掉模型等草稿。 */\n sync(): void {\n const fresh = this.original.settings.getSnapshot()\n let value = structuredClone(fresh.value)\n if (value !== undefined) for (const operation of this.changes.values()) value = apply(value, operation)\n this.publish({ ...fresh, value, revision: this.localRevision })\n }\n reset(): void {\n this.lifetime.abort(); this.lifetime = new AbortController(); this.preparationSupport = undefined\n this.changes.clear(); this.portraits.clear(); this.portraitValues.clear(); this.removedPortraits.clear(); this.removals.clear(); this.devices.clear()\n getAssistantAvatarPortraitService(this.services).dispose()\n this.localRevision++; this.sync()\n }\n async mutate(operations: readonly CodingNsSettingsOperation[], expectedRevision?: number): Promise<boolean> {\n this.requireWritable()\n if (expectedRevision !== undefined && expectedRevision !== this.localRevision) throw new Error('settings namespace \"assistant-draft\" changed since it was read (expected revision)')\n for (const operation of operations) {\n if (operation.path[0] !== 'assistant' || operation.path.length < 2 || operation.path.length > 4\n || operation.path.some((key) => !/^[A-Za-z][A-Za-z0-9_-]*$/u.test(key) || ['constructor', 'prototype'].includes(key))) throw new Error('配置草稿只允许修改助理字段')\n }\n let value = this.snapshot.value!\n for (const operation of operations) {\n value = apply(value, operation)\n const path = operation.path.join('.')\n // 父字段替换覆盖更早的子字段;重新编辑的字段排到末尾,刷新时按真实顺序重放。\n for (const key of this.changes.keys()) if (key === path || key.startsWith(path + '.')) this.changes.delete(key)\n this.changes.set(path, structuredClone(operation))\n }\n this.localRevision++; this.publish({ ...this.snapshot, value, revision: this.localRevision }); return true\n }\n async set(field: string, value: unknown): Promise<boolean> { return this.mutate([{ op: 'set', path: field.split('.'), value }]) }\n async unset(field: string): Promise<boolean> { return this.mutate([{ op: 'unset', path: field.split('.') }]) }\n async load(): Promise<void> { this.sync() }\n async reload(): Promise<void> { await this.original.settings.reload?.(); this.sync() }\n /** 身份字段由生命周期接口校验,其余字段同一请求合并保存。 */\n configurationPatch(): readonly CodingNsSettingsOperation[] {\n return [...this.changes.values()].filter((operation) => ['appearance', 'voice', 'tts', 'prompts'].includes(operation.path[1]!))\n .map((operation) => ({ ...operation, path: operation.path.slice(1) }))\n }\n async commitLocal(signal: AbortSignal): Promise<void> {\n for (const item of this.portraits.values()) await getAssistantAvatarPortraitService(this.original).setPortrait(item.model, item.renderer, item.preview, signal)\n const adapter = getGlobalVoiceAdapter(this.original)\n for (const [direction, id] of this.devices) { signal.throwIfAborted(); await (direction === 'input' ? adapter?.selectInputDevice(id) : adapter?.selectOutputDevice(id)) }\n for (const id of this.removedPortraits) getAssistantAvatarPortraitService(this.original).removeModel(id)\n for (const { endpoint, payload } of this.removals.values()) {\n const result = await this.original.rpc.call(CODINGNS_RPC_CHANNEL, endpoint, payload, signal)\n if (!result.ok) throw new Error(result.error.message)\n }\n }\n dispose(): void { this.lifetime.abort(); this.releaseAdapter?.(); getAssistantAvatarPortraitService(this.services).dispose(); this.listeners.clear() }\n private requireWritable(): void {\n if (!this.original.settings.getSnapshot().writable || !this.snapshot.writable || this.snapshot.status !== 'ready' || this.snapshot.value === undefined) throw new Error('当前助理配置不可写')\n }\n private publish(next: CodingNsSettingsSnapshot<CodingNsSettings>): void {\n const snapshot = { ...next, preparing: this.preparations > 0 }\n if (sameSettingsValue(this.snapshot, snapshot)) return\n this.snapshot = snapshot; for (const listener of this.listeners) listener()\n }\n private async call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<CodingNsRpcResult> {\n // 关闭后的租约释放仍必须发送,不能被草稿取消信号挡住。\n if (endpoint === 'avatar/releasePreview') return this.original.rpc.call(channel, endpoint, payload, signal)\n const ownedSignal = AbortSignal.any([this.lifetime.signal, ...(signal === undefined ? [] : [signal])])\n const preparing = resourceActions.has(endpoint)\n if (preparing) { this.preparations++; this.publish(this.snapshot) }\n try { return await this.dispatch(channel, endpoint, payload, ownedSignal) }\n finally { if (preparing) { this.preparations--; this.publish(this.snapshot) } }\n }\n private async dispatch(channel: string, endpoint: string, payload: unknown, signal: AbortSignal): Promise<CodingNsRpcResult> {\n signal?.throwIfAborted()\n const value = payload as Record<string, any> | undefined\n // 引擎安装同样属于资源准备:安装期间禁止保存,关闭窗口会取消请求。\n if (endpoint === 'avatar/installEngine') this.requireWritable()\n // 调试窗口的模型选择只用于显式测试,不提前改变正式索引的模型。\n if (endpoint === 'assistant/index/configure') return { ok: true, value: { configured: true } }\n // 当前窗口的同意立即用于浏览与准备素材,协议和形象选择仍随整份配置保存。\n if (['avatar/catalog', 'avatar/previewCatalog', 'avatar/keepPreview', 'avatar/installCatalog'].includes(endpoint)) {\n const thirdPartyConsent = this.snapshot.value?.assistant.appearance?.thirdPartyConsent\n if (!hasAssistantAvatarConsent(thirdPartyConsent)) return { ok: false, error: {\n code: 'CODINGNS_AVATAR_CONSENT_REQUIRED', message: codingNsTranslator(this.original.locale)('avatar.thirdPartyConsentRequired'),\n } }\n payload = { ...value, thirdPartyConsent }\n }\n if (endpoint === 'avatar/remove') { this.requireWritable(); this.removals.set(endpoint + ':' + String(value?.id), { endpoint, payload }); return { ok: true, value: undefined } }\n if (['assistant/tts/select', 'assistant/tts/configure', 'assistant/tts/remove'].includes(endpoint)) {\n const tts = readAssistantTtsSettings(this.snapshot.value!.assistant.tts)\n const next = endpoint.endsWith('/configure') ? { ...tts, parameters: validateAssistantTtsParameters(value?.parameters, tts.parameters) }\n : endpoint.endsWith('/remove') ? { ...tts, voices: tts.voices.filter((voice) => voice.id !== value?.id), selectedId: tts.selectedId === value?.id ? 'moss:Junhao' : tts.selectedId }\n : { ...tts, selectedId: value?.id ?? tts.selectedId, backend: value?.backend === 'browser' ? 'browser' as const : 'moss-onnx' as const }\n await this.set('assistant.tts', next)\n return this.call(channel, 'assistant/tts/catalog', {}, signal)\n }\n const preparing = ['assistant/tts/setup', 'assistant/tts/import', 'assistant/voice/setup', 'assistant/voice/initialize'].includes(endpoint)\n if (preparing) {\n this.requireWritable()\n // 旧 Host 可能忽略 prepareOnly,先确认能力,不能静默退回立即启用。\n this.preparationSupport ??= this.original.rpc.call(channel, 'assistant/configuration/capabilities', {}, signal)\n .then((response) => response.ok && (response.value as { prepareOnly?: boolean })?.prepareOnly === true)\n if (!await this.preparationSupport) {\n const t = codingNsTranslator(this.original.locale)\n return { ok: false, error: { code: 'UNSUPPORTED', message: t('awb.preparationUnsupported') } }\n }\n signal?.throwIfAborted()\n }\n const preparedModelId = endpoint === 'assistant/voice/initialize' ? findAssistantVoiceModel(this.snapshot.value!.assistant.voice.modelId ?? '')?.id : undefined\n const result = await this.original.rpc.call(channel, endpoint, preparing ? { ...value, ...(preparedModelId === undefined ? {} : { modelId: preparedModelId }), prepareOnly: true } : payload, signal)\n signal.throwIfAborted()\n if (!result.ok) return result\n if (preparing) {\n const prepared = result.value as any\n if (endpoint === 'assistant/voice/setup' && prepared.voice !== undefined) await this.set('assistant.voice', prepared.voice)\n if (endpoint === 'assistant/voice/initialize') {\n if (prepared.voice !== undefined) await this.set('assistant.voice', prepared.voice)\n await this.set('assistant.tts', { ...readAssistantTtsSettings(this.snapshot.value!.assistant.tts), backend: 'moss-onnx' })\n }\n if (endpoint === 'assistant/tts/setup') await this.set('assistant.tts', { ...readAssistantTtsSettings(this.snapshot.value!.assistant.tts), backend: 'moss-onnx' })\n if (endpoint === 'assistant/tts/import') {\n const current = readAssistantTtsSettings(this.snapshot.value!.assistant.tts), incoming = (prepared as AssistantTtsSnapshot).settings\n const voices = new Map([...current.voices, ...incoming.voices].map((voice) => [voice.id, voice]))\n await this.set('assistant.tts', { ...current, ...incoming, voices: [...voices.values()] })\n }\n }\n if (endpoint.startsWith('assistant/tts/') && (result.value as any)?.settings !== undefined) {\n const raw = this.snapshot.value!.assistant.tts\n const settings = { ...readAssistantTtsSettings(raw), ...(raw?.parameters === undefined ? {} : { parameters: raw.parameters }) }\n return { ok: true, value: { ...(result.value as AssistantTtsSnapshot), settings, voices: [...MOSS_BUILTIN_VOICES, ...settings.voices] } }\n }\n if (endpoint === 'assistant/voice/initialization' || endpoint === 'assistant/voice/initialize') {\n const snapshot = result.value as any, settings = readAssistantTtsSettings(this.snapshot.value!.assistant.tts), voice = this.snapshot.value!.assistant.voice\n const model = findAssistantVoiceModel(voice.modelId ?? '')\n return { ok: true, value: { ...snapshot, modelId: voice.modelId || snapshot.modelId, modelLabel: model?.label ?? snapshot.modelLabel,\n ready: voice.initialized && snapshot.tts.status.ready && settings.backend === 'moss-onnx',\n tts: { ...snapshot.tts, settings, voices: [...MOSS_BUILTIN_VOICES, ...settings.voices] } } }\n }\n return result\n }\n}\nfunction apply(value: CodingNsSettings, operation: CodingNsSettingsOperation): CodingNsSettings {\n const next = structuredClone(value), path = operation.path, root = next as unknown as Record<string, any>\n let target = root\n for (const key of path.slice(0, -1)) target = target[key] ??= {}\n if (operation.op === 'unset') delete target[path.at(-1)!]\n else target[path.at(-1)!] = structuredClone(operation.value)\n return next\n}\n","import type { AssistantToolCall } from './contracts/assistant.js'\n\nexport type AssistantMessagePart =\n | { readonly kind: 'text'; readonly key: string; readonly text: string }\n | { readonly kind: 'tool'; readonly key: string; readonly call: AssistantToolCall }\n\n/** 按首次执行位置穿插工具,状态更新不会改变位置;不改写原始正文或播报内容。 */\nexport function assistantMessageTimeline(text: string, calls: readonly AssistantToolCall[] = []): readonly AssistantMessagePart[] {\n // 旧记录没有正文位置,放在所属回复前;不能从完成时间推断并伪造历史顺序。\n const position = (call: AssistantToolCall): number => Number.isSafeInteger(call.textOffset) && call.textOffset! >= 0\n ? Math.min(call.textOffset!, text.length) : 0\n const ordered = [...calls].sort((left, right) => position(left) - position(right))\n const parts: AssistantMessagePart[] = []\n let offset = 0\n let textKey = 'text-start'\n for (const call of ordered) {\n const next = position(call)\n if (next > offset) parts.push({ kind: 'text', key: textKey, text: text.slice(offset, next) })\n parts.push({ kind: 'tool', key: `tool-${call.id}`, call })\n offset = next; textKey = `text-after-${call.id}`\n }\n if (offset < text.length) parts.push({ kind: 'text', key: textKey, text: text.slice(offset) })\n return parts\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport { dshThemeColor } from '../theme.js'\n\n/** 工具记录和通话记录共享交互反馈,选择器只作用于这两类组件。 */\nexport function AssistantRecordStyle(): ReactElement {\n return createElement('style', null, recordCss)\n}\n\nexport function AssistantRecordChevron(): ReactElement {\n return createElement('svg', { className: 'codingns-assistant-record-chevron', width: 14, height: 14, viewBox: '0 0 24 24',\n fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true,\n style: { flexShrink: 0, color: dshThemeColor.labelTertiary } }, createElement('path', { d: 'm9 5 7 7-7 7' }))\n}\n\n// 仅在原生弹窗打开时启用纵向布局,保留关闭状态下浏览器默认的隐藏行为。\nconst recordCss = `\n.codingns-assistant-tool-summary{list-style:none;cursor:pointer;border-radius:9px}\n.codingns-assistant-tool-summary::-webkit-details-marker{display:none}\n.codingns-assistant-tool-summary:hover,.codingns-assistant-record-button:hover{background:${dshThemeColor.hoverBackground}!important}\n.codingns-assistant-tool-summary:active,.codingns-assistant-record-button:active{background:${dshThemeColor.activeBackground}!important}\n.codingns-assistant-tool-summary:focus-visible,.codingns-assistant-record-button:focus-visible{outline:2px solid ${dshThemeColor.accent};outline-offset:2px}\n.codingns-assistant-tool-details[open]>.codingns-assistant-tool-summary{border-radius:9px 9px 0 0}\n.codingns-assistant-tool-details[open] .codingns-assistant-tool-name{white-space:normal!important;overflow-wrap:anywhere}\n.codingns-assistant-tool-details[open]>.codingns-assistant-tool-summary .codingns-assistant-record-chevron{transform:rotate(90deg)}\n.codingns-assistant-voice-dialog[open]{display:flex;flex-direction:column}\n.codingns-assistant-voice-dialog::backdrop{background:${dshThemeColor.overlay}}\n`\n","import { createElement, Fragment } from 'react'\nimport type { ReactElement } from 'react'\nimport type { AssistantConversationMessage, AssistantToolCall } from '../../shared/contracts/assistant.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { AssistantAvatarPortrait } from '../avatar/portrait.js'\nimport type { CodingNsTranslator } from '../locale.js'\nimport { dshThemeColor } from '../theme.js'\nimport type { CodingNsClientServices } from './types.js'\nimport { assistantMessageTimeline } from '../../shared/assistant-message-timeline.js'\nimport { AssistantRecordChevron, AssistantRecordStyle } from './assistant-record-style.js'\n\n/** 聊天和语音详情共用消息样式与静态头像,方向只由所在视图指定。 */\nexport function AssistantConversationMessageView({ message, name, t, services, model, side, streaming = false }: {\n readonly message: Pick<AssistantConversationMessage, 'role' | 'text' | 'attachments' | 'interrupted' | 'toolCalls'>\n readonly name: string; readonly t: CodingNsTranslator\n readonly services?: CodingNsClientServices | undefined; readonly model?: AssistantAvatarModel | undefined\n readonly side?: 'left' | 'right'; readonly streaming?: boolean\n}): ReactElement {\n return createElement('article', { 'data-codingns-assistant-message': message.role,\n ...(side === undefined ? {} : { 'data-codingns-message-side': side }), ...(streaming ? { role: 'status' } : {}),\n style: { padding: '11px 14px', borderRadius: 10, background: message.role === 'user' ? dshThemeColor.surfaceSubtle : 'transparent',\n justifySelf: side === 'left' ? 'start' : side === 'right' || message.role === 'user' ? 'end' : 'stretch',\n maxWidth: side === undefined ? '100%' : '88%', minWidth: 0, boxSizing: 'border-box', fontSize: 14, lineHeight: 1.65, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' } },\n createElement('div', { style: { display: 'flex', alignItems: 'center', justifyContent: side === 'right' ? 'flex-end' : 'flex-start', gap: 7, marginBottom: 5 } },\n message.role !== 'assistant' || services === undefined || model === undefined ? null : createElement(AssistantAvatarPortrait, { services, model }),\n createElement('small', { style: { color: dshThemeColor.labelSecondary } }, message.role === 'user' ? t('voice.dialog.user') : name,\n message.interrupted ? ' · ' + t('awb.call.interrupted') : '')),\n createElement(AssistantMessageContentView, { text: message.text, calls: message.role === 'assistant' ? message.toolCalls : undefined, t }),\n message.attachments?.length ? createElement('div', { 'data-codingns-assistant-message-attachments': true, style: { display: 'flex', flexWrap: 'wrap', gap: 6, marginTop: 8 } },\n ...message.attachments.map((item) => createElement('span', { key: item.attachment.attachmentId, title: item.attachment.name,\n style: { fontSize: 12, padding: '3px 8px', borderRadius: 8, border: `1px solid ${dshThemeColor.border}` } }, item.attachment.name || t('awb.attachments.unnamed')))) : null)\n}\n\n/** 文字聊天、实时字幕与通话历史共用同一时间线,不额外生成工具汇总区。 */\nexport function AssistantMessageContentView({ text, calls, t }: {\n readonly text: string; readonly calls?: readonly AssistantToolCall[] | undefined; readonly t: CodingNsTranslator\n}): ReactElement {\n return createElement(Fragment, null, ...assistantMessageTimeline(text, calls).map((part) => part.kind === 'tool'\n ? createElement(AssistantToolCallsView, { key: part.key, calls: [part.call], t })\n : createElement('div', { key: part.key, 'data-codingns-assistant-text': true,\n style: { whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' } }, part.text)))\n}\n\n/** 工具信息单独展示,不拼入消息正文,字幕与语音合成都只使用原始 text。 */\nexport function AssistantToolCallsView({ calls, t }: { readonly calls?: readonly AssistantToolCall[] | undefined; readonly t: CodingNsTranslator }): ReactElement | null {\n if (!calls?.length) return null\n return createElement('div', { 'data-codingns-assistant-tools': true,\n style: { display: 'grid', gap: 6, marginBlock: 6, textAlign: 'left', whiteSpace: 'normal', minWidth: 0 } },\n createElement(AssistantRecordStyle), ...calls.map((call) => createElement(AssistantToolCallView, { key: call.id, call, t })))\n}\n\n/** 整个标题栏就是展开入口;实时状态更新不替换 details,保留用户的展开状态。 */\nfunction AssistantToolCallView({ call, t }: { readonly call: AssistantToolCall; readonly t: CodingNsTranslator }): ReactElement {\n const label = t(call.kind === 'web-search' ? 'awb.call.webSearch' : call.kind === 'attachment' ? 'awb.call.attachment' : 'awb.call.workspace')\n const status = t(`awb.call.tool.${call.state}`)\n const color = call.state === 'failed' ? dshThemeColor.error : call.state === 'completed' ? dshThemeColor.success\n : call.state === 'running' ? dshThemeColor.accent : dshThemeColor.labelSecondary\n const startedAt = new Date(call.startedAt)\n return createElement('article', { 'data-codingns-assistant-tool': call.name, 'data-state': call.state,\n style: { borderRadius: 10, border: `1px solid ${dshThemeColor.border}`, background: dshThemeColor.surfaceSubtle,\n color: dshThemeColor.labelPrimary, fontSize: 12, lineHeight: 1.4, minWidth: 0 } },\n createElement('details', { className: 'codingns-assistant-tool-details' },\n createElement('summary', { className: 'codingns-assistant-tool-summary', title: t('awb.call.toolDetails'),\n 'aria-label': `${label} · ${call.name} · ${status} · ${t('awb.call.toolDetails')}`,\n style: { display: 'flex', alignItems: 'center', gap: 8, padding: '8px 10px', minWidth: 0 } },\n createElement('span', { style: { display: 'grid', placeItems: 'center', flexShrink: 0, width: 28, height: 28, borderRadius: 8,\n color, background: `color-mix(in srgb, ${color} 9%, transparent)` } }, createElement(AssistantToolIcon, { kind: call.kind })),\n createElement('span', { style: { flex: '1 1 auto', minWidth: 0, display: 'grid', gap: 1 } },\n createElement('strong', { style: { fontSize: 12, fontWeight: 600 } }, label),\n createElement('span', { className: 'codingns-assistant-tool-name', title: call.name, style: { color: dshThemeColor.labelSecondary, fontFamily: dshThemeColor.codeFont,\n fontSize: 11, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, call.name)),\n createElement('span', { style: { display: 'grid', justifyItems: 'end', gap: 3, flexShrink: 0 } },\n createElement('span', { role: 'status', style: { display: 'inline-flex', alignItems: 'center', gap: 4, color,\n padding: '1px 6px', borderRadius: 5, background: `color-mix(in srgb, ${color} 9%, transparent)`, fontSize: 11, whiteSpace: 'nowrap' } },\n createElement('span', { 'aria-hidden': true, style: { width: 4, height: 4, borderRadius: '50%', background: 'currentColor' } }), status),\n createElement('time', { dateTime: Number.isNaN(startedAt.valueOf()) ? undefined : startedAt.toISOString(), title: startedAt.toLocaleString(),\n style: { color: dshThemeColor.labelTertiary, fontSize: 10, fontVariantNumeric: 'tabular-nums', whiteSpace: 'nowrap' } },\n startedAt.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }))),\n createElement(AssistantRecordChevron)),\n createElement('div', { style: { display: 'grid', gap: 8, padding: '9px 10px 10px', borderTop: `1px solid ${dshThemeColor.border}`, minWidth: 0 } },\n ...[[t('awb.call.arguments'), call.arguments], [t('awb.call.result'), call.result]].map(([heading, value]) => createElement('div', { key: heading, style: { minWidth: 0 } },\n createElement('small', { style: { color: dshThemeColor.labelSecondary, fontSize: 11, fontWeight: 500 } }, heading),\n createElement('pre', { tabIndex: 0, 'aria-label': heading, style: { margin: '4px 0 0', padding: '6px 8px', borderRadius: 6,\n background: dshThemeColor.cardBackground, maxHeight: 160, overflowY: 'auto', overscrollBehavior: 'contain', scrollbarWidth: 'thin',\n whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', fontFamily: dshThemeColor.codeFont, fontSize: 11, lineHeight: 1.5 } }, value || '—'))))))\n}\n\nfunction AssistantToolIcon({ kind }: { readonly kind: AssistantToolCall['kind'] }): ReactElement {\n const path = kind === 'web-search' ? 'M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0ZM3 12h18M12 3a17 17 0 0 1 0 18 17 17 0 0 1 0-18Z'\n : kind === 'attachment' ? 'M14 3H6v18h12V7l-4-4Zm0 0v5h4M9 12h6m-6 4h6'\n : 'M3 6h7l2 2h9v12H3V6Zm0 4h18'\n return createElement('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.7,\n strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true }, createElement('path', { d: path }))\n}\n","import { createElement, useEffect, useId, useRef, useState } from 'react'\nimport type { CSSProperties, ReactElement, ReactNode } from 'react'\nimport type { AssistantToolCall, AssistantVoiceSession } from '../../shared/contracts/assistant.js'\nimport { voiceSessionDuration, voiceSessionMessageCount } from '../../shared/assistant-voice-sessions.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { resolveAssistantAvatarState } from '../../shared/assistant-avatar.js'\nimport type { CodingNsTranslator } from '../locale.js'\nimport { getGlobalVoiceAdapter } from '../global-voice-runtime-registry.js'\nimport { dshSettingsButtonStyle, dshSettingsFieldStyle, dshThemeColor } from '../theme.js'\nimport { AssistantAvatarSlot } from '../avatar/slot.js'\nimport type { CodingNsClientServices } from './types.js'\nimport { AssistantConversationMessageView, AssistantMessageContentView } from './assistant-conversation-message.js'\nimport { AssistantRecordChevron, AssistantRecordStyle } from './assistant-record-style.js'\n\ninterface RealtimeCallProps {\n readonly services: CodingNsClientServices; readonly name: string; readonly model: AssistantAvatarModel\n readonly t: CodingNsTranslator; readonly session?: AssistantVoiceSession | undefined\n readonly pending: boolean; readonly state?: string | undefined\n readonly minimized?: boolean | undefined; readonly startedAt?: number | undefined; readonly onMinimize?: (() => void) | undefined\n readonly userText: string; readonly assistantText: string; readonly onHangup: () => void | Promise<void>\n readonly toolCalls?: readonly AssistantToolCall[] | undefined\n}\n\n/** 通话页只控制当前 Client 的采集和播放设备,不重新初始化模型或申请第二份租约。 */\nexport function AssistantRealtimeCall(props: RealtimeCallProps): ReactElement {\n const adapter = getGlobalVoiceAdapter(props.services)\n const [microphoneMuted, setMicrophoneMuted] = useState(adapter?.isMicrophoneMuted ?? false)\n const [speakerMuted, setSpeakerMuted] = useState(adapter?.isSpeakerMuted ?? false)\n const [speakersOpen, setSpeakersOpen] = useState(false)\n const [devices, setDevices] = useState<readonly { deviceId: string; label: string }[]>([])\n const [outputId, setOutputId] = useState(adapter?.outputDeviceId ?? '')\n const [devicePending, setDevicePending] = useState(false)\n const [error, setError] = useState('')\n const [now, setNow] = useState(Date.now)\n const startedAt = useRef(Date.now())\n const menuId = useId()\n useEffect(() => {\n if (props.minimized) return undefined\n setNow(Date.now())\n const timer = setInterval(() => setNow(Date.now()), 1000)\n return () => clearInterval(timer)\n }, [props.minimized])\n useEffect(() => {\n if (!speakersOpen || !adapter?.outputDeviceSupported) return undefined\n let active = true\n void adapter.enumerateOutputDevices().then((items) => { if (active) setDevices(items) }).catch((cause) => { if (active) setError(String(cause)) })\n return () => { active = false }\n }, [adapter, speakersOpen])\n const duration = voiceSessionDuration(props.startedAt === undefined ? props.session ?? { startedAt: startedAt.current, endedAt: null }\n : { startedAt: props.startedAt, endedAt: null }, now)\n const menu = !speakersOpen ? null : createElement('div', { id: menuId, role: 'group', 'aria-label': props.t('awb.call.speakerSettings'),\n style: { display: 'grid', gap: 12, position: 'absolute', bottom: 86, left: '50%', transform: 'translateX(-50%)', zIndex: 2,\n width: 'min(300px, calc(100vw - 80px))', padding: 16, boxSizing: 'border-box', borderRadius: 14,\n border: `1px solid ${dshThemeColor.border}`, background: dshThemeColor.menuBackground, boxShadow: dshThemeColor.prominentShadow },\n onKeyDown: (event: { key: string; preventDefault(): void; stopPropagation(): void }) => { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); setSpeakersOpen(false) } } },\n createElement('label', { style: { display: 'flex', alignItems: 'center', gap: 9, fontSize: 13 } },\n createElement('input', { type: 'checkbox', checked: !speakerMuted, disabled: adapter?.setSpeakerMuted === undefined,\n onChange: () => { const muted = !speakerMuted; adapter?.setSpeakerMuted?.(muted); setSpeakerMuted(muted) } }), props.t('awb.call.playSound')),\n createElement('label', { style: { display: 'grid', gap: 6, fontSize: 12 } }, props.t('awb.call.outputDevice'),\n createElement('select', { value: adapter?.outputDeviceSupported ? outputId : '', disabled: !adapter?.outputDeviceSupported || devicePending,\n style: { ...dshSettingsFieldStyle, width: '100%', minWidth: 0 }, onChange: (event: { currentTarget: { value: string } }) => {\n const id = event.currentTarget.value; setDevicePending(true); setError('')\n void adapter?.selectOutputDevice(id).then(() => setOutputId(id)).catch((cause) => setError(String(cause))).finally(() => setDevicePending(false))\n } }, createElement('option', { value: '' }, props.t('awb.call.defaultSpeaker')),\n adapter?.outputDeviceSupported && outputId && !devices.some((device) => device.deviceId === outputId) ? createElement('option', { value: outputId }, props.t('awb.call.speaker')) : null,\n ...devices.filter((device) => device.deviceId !== '').map((device) => createElement('option', { key: device.deviceId, value: device.deviceId }, device.label || props.t('awb.call.speaker'))))),\n error ? createElement('div', { role: 'alert', style: { fontSize: 12, color: dshThemeColor.error, overflowWrap: 'anywhere' } }, error) : null)\n return createElement(AssistantRealtimeCallView, { ...props, duration, microphoneMuted, speakerMuted,\n microphoneAvailable: adapter?.setMicrophoneMuted !== undefined,\n // 隐藏窗口时卸载动画形象,避免与悬浮形象同时消耗渲染资源;音频运行时不受影响。\n avatar: props.minimized ? null : createElement(AssistantAvatarSlot, { services: props.services, model: props.model, state: resolveAssistantAvatarState(props.state, props.pending), surface: 'dialog', size: 256, showDiagnostics: false }),\n onMicrophone: () => { const muted = !microphoneMuted; adapter?.setMicrophoneMuted?.(muted); setMicrophoneMuted(muted) },\n onSpeaker: () => setSpeakersOpen((open) => !open), speakersOpen, menuId, menu })\n}\n\n/** 纯展示层可独立渲染明暗主题与移动端,不需要真实音频设备。 */\nexport function AssistantRealtimeCallView({ name, t, state, pending, duration, minimized = false, microphoneMuted, speakerMuted, microphoneAvailable = true,\n userText, assistantText, toolCalls, avatar, onMicrophone, onSpeaker, onHangup, onMinimize, speakersOpen = false, menuId, menu }: {\n readonly name: string; readonly t: CodingNsTranslator; readonly state?: string | undefined; readonly pending: boolean; readonly duration: string\n readonly minimized?: boolean | undefined\n readonly microphoneMuted: boolean; readonly speakerMuted: boolean; readonly microphoneAvailable?: boolean\n readonly userText: string; readonly assistantText: string; readonly avatar: ReactNode\n readonly toolCalls?: readonly AssistantToolCall[] | undefined\n readonly onMicrophone: () => void; readonly onSpeaker: () => void; readonly onHangup: () => void | Promise<void>\n readonly onMinimize?: (() => void) | undefined\n readonly speakersOpen?: boolean; readonly menuId?: string | undefined; readonly menu?: ReactNode\n}): ReactElement {\n const captions = useRef<HTMLDivElement>(null)\n const followCaptions = useRef(true)\n const toolState = toolCalls?.map((call) => `${call.id}:${call.state}`).join('|')\n // 默认跟随流式追加;用户向上回看时保留位置,不再把前文强制滚走。\n useEffect(() => {\n if (minimized) return\n const element = captions.current\n if (assistantText === '') followCaptions.current = true\n if (element !== null && followCaptions.current) element.scrollTop = element.scrollHeight\n }, [userText, assistantText, toolState, minimized])\n const status = pending ? state === 'disabled' ? 'ending' : 'connecting' : microphoneMuted ? 'muted' : state === 'speaking' ? 'speaking' : state === 'thinking' ? 'thinking' : 'listening'\n const control = (kind: 'speaker' | 'microphone' | 'hangup', label: string, action: () => void, pressed?: boolean): ReactElement => createElement('div', { style: { display: 'grid', justifyItems: 'center', gap: 8 } },\n createElement('button', { type: 'button', 'aria-label': label, title: label, 'aria-pressed': pressed,\n ...(kind === 'speaker' ? { 'aria-expanded': speakersOpen, 'aria-controls': menuId } : {}), disabled: kind === 'microphone' && (pending || !microphoneAvailable),\n onClick: action, style: { ...dshSettingsButtonStyle, display: 'grid', placeItems: 'center', width: 58, height: 58, padding: 0, borderRadius: '50%',\n ...(kind === 'hangup' ? { background: '#e64949', color: '#fff', borderColor: '#e64949' } : pressed ? { background: dshThemeColor.labelPrimary, color: dshThemeColor.pageBackground } : {}) } },\n createElement(CallIcon, { kind, muted: pressed === true })),\n createElement('span', { style: { fontSize: 12, color: dshThemeColor.labelSecondary } }, kind === 'microphone' ? t(microphoneMuted ? 'awb.call.unmute' : 'awb.call.microphone') : t(`awb.call.${kind}`)))\n return createElement('div', { 'data-codingns-realtime-call': true, style: { display: 'flex', flexDirection: 'column', flex: '1 1 auto', minHeight: 0, textAlign: 'center', padding: 11, gap: 10 } },\n createElement('style', null, '.codingns-call-halo{position:absolute;inset:10%;border-radius:50%;background:radial-gradient(circle,color-mix(in srgb,var(--dsw-alias-button-info-fill,#1677ff) 14%,transparent),transparent 70%);animation:codingns-call-breathe 3s ease-in-out infinite}.codingns-call-caption{overflow-wrap:anywhere;white-space:pre-wrap}[data-codingns-call-avatar] img{height:auto!important;max-height:32dvh;object-fit:contain}[data-codingns-call-avatar] canvas,[data-codingns-call-avatar] video{max-width:100%;max-height:32dvh;object-fit:contain}@keyframes codingns-call-breathe{50%{transform:scale(1.12);opacity:.6}}@media(prefers-reduced-motion:reduce){.codingns-call-halo{animation:none}}'),\n createElement('div', { style: { position: 'relative', paddingInline: onMinimize ? 44 : 0, minHeight: 40, display: 'grid', gap: 4 } },\n createElement('strong', { style: { fontSize: 18, overflowWrap: 'anywhere' } }, name),\n createElement('span', { style: { fontSize: 12, color: dshThemeColor.labelTertiary, fontVariantNumeric: 'tabular-nums' } }, t('awb.call.title'), ' · ', duration),\n onMinimize ? createElement('button', { type: 'button', 'aria-label': t('awb.call.minimize'), title: t('awb.call.minimize'), onClick: onMinimize,\n style: { ...dshSettingsButtonStyle, position: 'absolute', right: 0, top: 0, width: 40, height: 40, display: 'grid', placeItems: 'center', padding: 0, borderRadius: 12 } },\n createElement('svg', { width: 22, height: 22, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', 'aria-hidden': true }, createElement('path', { d: 'M5 15h14M9 6l3 3 3-3' }))) : null),\n createElement('div', { style: { display: 'grid', placeItems: 'center', flex: '1 1 auto', minHeight: 'min(160px, 24dvh)', position: 'relative' } },\n createElement('div', { className: 'codingns-call-halo', 'aria-hidden': true }), createElement('div', { 'data-codingns-call-avatar': true, style: { position: 'relative', width: 'min(256px, 32dvh, 100%)', maxWidth: '100%', maxHeight: '32dvh', overflow: 'hidden', display: 'grid', placeItems: 'center' } }, avatar)),\n createElement('div', { role: 'status', style: { fontSize: 13, color: dshThemeColor.labelSecondary } }, t(`awb.call.${status}`)),\n createElement('div', { ref: captions, 'data-codingns-call-captions': true, 'aria-label': t('awb.call.caption'), tabIndex: 0,\n onScroll: (event: { currentTarget: HTMLDivElement }) => { const element = event.currentTarget; followCaptions.current = element.scrollHeight - element.scrollTop - element.clientHeight <= 24 },\n style: { minHeight: 90, maxHeight: 'min(280px, 35dvh)', overflowY: 'auto', overscrollBehavior: 'contain', scrollbarWidth: 'thin', display: 'flex', flexDirection: 'column', gap: 8, flexShrink: 0 } },\n userText && !microphoneMuted ? createElement('p', { className: 'codingns-call-caption', style: { margin: 0, flexShrink: 0, fontSize: 13, lineHeight: 1.6, color: dshThemeColor.labelTertiary } }, userText) : null,\n createElement('div', { 'aria-live': 'polite', style: { flexShrink: 0, display: 'grid', gap: 8, fontSize: 16, lineHeight: 1.65, color: assistantText ? dshThemeColor.labelPrimary : dshThemeColor.labelTertiary } },\n assistantText || toolCalls?.length ? createElement(AssistantMessageContentView, { text: assistantText, calls: toolCalls, t }) : !userText ? t('awb.call.waiting') : '')),\n createElement('div', { style: { display: 'flex', justifyContent: 'center', gap: 'clamp(20px, 6vw, 44px)', padding: '12px 0 4px', position: 'relative' } }, menu,\n control('speaker', t('awb.call.speakerSettings'), onSpeaker, speakerMuted),\n control('microphone', t(microphoneMuted ? 'awb.call.unmute' : 'awb.call.microphone'), onMicrophone, microphoneMuted),\n control('hangup', t('awb.call.hangup'), () => { void onHangup() })))\n}\n\nfunction CallIcon({ kind, muted = false, size = 24 }: { readonly kind: 'speaker' | 'microphone' | 'hangup'; readonly muted?: boolean; readonly size?: number }): ReactElement {\n const path = kind === 'speaker' ? 'M11 5 6 9H3v6h3l5 4V5Zm4 3a5 5 0 0 1 0 8m3-11a9 9 0 0 1 0 14' : kind === 'microphone'\n ? 'M9 5a3 3 0 0 1 6 0v6a3 3 0 0 1-6 0V5Zm-3 5v1a6 6 0 0 0 12 0v-1M12 17v4m-4 0h8'\n : 'M3 14v3h4v-3l2-1a15 15 0 0 1 6 0l2 1v3h4v-3c-2-5-16-5-18 0Z'\n return createElement('svg', { width: size, height: size, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true },\n createElement('path', { d: path }), muted ? createElement('path', { d: 'M3 3 21 21' }) : null)\n}\n\ninterface VoiceSessionDisplayProps {\n readonly session: AssistantVoiceSession; readonly t: CodingNsTranslator; readonly name: string\n readonly services?: CodingNsClientServices | undefined; readonly model?: AssistantAvatarModel | undefined\n}\n\nexport function AssistantVoiceSessionCard({ session, t, name, services, model }: VoiceSessionDisplayProps): ReactElement {\n const [open, setOpen] = useState(false)\n const startedAt = new Date(session.startedAt)\n return createElement('div', { 'data-codingns-voice-session-card': session.id },\n createElement(AssistantRecordStyle),\n createElement('button', { type: 'button', className: 'codingns-assistant-record-button', 'aria-haspopup': 'dialog', onClick: () => setOpen(true),\n style: { ...dshSettingsButtonStyle, textAlign: 'left', width: '100%', display: 'flex', alignItems: 'center', gap: 10,\n padding: '10px 12px', borderRadius: 10, background: dshThemeColor.surfaceSubtle, minWidth: 0 } },\n createElement('span', { style: { display: 'grid', placeItems: 'center', width: 32, height: 32, borderRadius: 9, flexShrink: 0,\n background: `color-mix(in srgb, ${dshThemeColor.accent} 9%, transparent)`, color: dshThemeColor.accent } }, createElement(CallIcon, { kind: 'speaker', size: 18 })),\n createElement('span', { style: { flex: '1 1 auto', display: 'grid', gap: 3, minWidth: 0 } },\n createElement('strong', { style: { fontSize: 13, fontWeight: 600 } }, t('awb.call.record')),\n createElement('span', { style: { fontSize: 11, color: dshThemeColor.labelSecondary, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } },\n t('awb.call.count', { count: voiceSessionMessageCount(session) }), ' · ',\n createElement('time', { dateTime: Number.isNaN(startedAt.valueOf()) ? undefined : startedAt.toISOString(), title: startedAt.toLocaleString() },\n startedAt.toLocaleString([], { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false })))),\n createElement('span', { title: t('awb.call.duration'), 'aria-label': `${t('awb.call.duration')} ${voiceSessionDuration(session)}`,\n style: { padding: '3px 7px', borderRadius: 6, background: dshThemeColor.cardBackground, color: dshThemeColor.labelSecondary,\n fontSize: 11, fontVariantNumeric: 'tabular-nums', whiteSpace: 'nowrap', flexShrink: 0 } }, voiceSessionDuration(session)),\n createElement(AssistantRecordChevron)),\n open ? createElement(VoiceSessionModal, { session, t, name, services, model, onClose: () => setOpen(false) }) : null)\n}\n\nfunction VoiceSessionModal({ onClose, ...props }: VoiceSessionDisplayProps & { readonly onClose: () => void }): ReactElement {\n const dialog = useRef<HTMLDialogElement>(null)\n const titleId = useId()\n useEffect(() => { dialog.current?.showModal(); return () => dialog.current?.close() }, [])\n return createElement('dialog', { ref: dialog, className: 'codingns-assistant-voice-dialog', 'aria-labelledby': titleId, onCancel: (event: { preventDefault(): void; stopPropagation(): void }) => { event.preventDefault(); event.stopPropagation(); onClose() },\n onKeyDown: (event: { key: string; preventDefault(): void; stopPropagation(): void }) => { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); onClose() } },\n style: { width: 'min(680px, calc(100vw - 24px))', maxHeight: 'calc(100dvh - 24px)', boxSizing: 'border-box', padding: 11, borderRadius: 12, border: `1px solid ${dshThemeColor.border}`,\n background: dshThemeColor.pageBackground, color: dshThemeColor.labelPrimary, boxShadow: dshThemeColor.prominentShadow, overflow: 'hidden' } },\n createElement(AssistantRecordStyle),\n createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 10, marginBottom: 12, flexShrink: 0 } },\n createElement('strong', { id: titleId, style: { flex: 1, fontSize: 14 } }, props.t('awb.call.details')),\n createElement('button', { type: 'button', className: 'codingns-assistant-record-button', autoFocus: true, onClick: onClose,\n title: props.t('awb.close'), 'aria-label': props.t('awb.close'),\n style: { ...dshSettingsButtonStyle, width: 32, height: 32, minHeight: 32, padding: 0, border: 0, borderRadius: 8,\n display: 'grid', placeItems: 'center', flexShrink: 0, color: dshThemeColor.labelSecondary } },\n createElement('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8,\n strokeLinecap: 'round', 'aria-hidden': true }, createElement('path', { d: 'm6 6 12 12M6 18 18 6' })))),\n // 标题与关闭按钮留在滚动区外;记录容器可收缩,长对话只在内部滚动。\n createElement('div', { style: { flex: '1 1 auto', minHeight: 0, overflowY: 'auto', overscrollBehavior: 'contain', scrollbarWidth: 'thin' } },\n createElement(AssistantVoiceSessionDetailsView, props)))\n}\n\nexport function AssistantVoiceSessionDetailsView({ session, t, name, services, model }: VoiceSessionDisplayProps): ReactElement {\n const date = (value: number | null): string => value === null ? '—' : new Date(value).toLocaleString()\n const statistic: CSSProperties = { display: 'inline-flex', alignItems: 'center', padding: '2px 7px', borderRadius: 5,\n background: dshThemeColor.cardBackground, color: dshThemeColor.labelPrimary, fontSize: 11, fontVariantNumeric: 'tabular-nums' }\n return createElement('div', { style: { display: 'grid', gap: 8, minWidth: 0 } },\n createElement('div', { style: { padding: '10px 12px', borderRadius: 9, background: dshThemeColor.surfaceSubtle,\n display: 'grid', gap: 8, color: dshThemeColor.labelSecondary, fontSize: 11, lineHeight: 1.5, minWidth: 0 } },\n createElement('div', { style: { display: 'flex', flexWrap: 'wrap', gap: 6 } },\n createElement('span', { style: statistic }, t('awb.call.count', { count: voiceSessionMessageCount(session) })),\n createElement('span', { style: statistic }, t('awb.call.duration'), ' ', voiceSessionDuration(session))),\n createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 200px), 1fr))', gap: '4px 16px', minWidth: 0 } },\n ...([[t('awb.call.startedAt'), session.startedAt], [t('awb.call.endedAt'), session.endedAt]] as const).map(([label, value]) =>\n createElement('span', { key: label, style: { overflowWrap: 'anywhere' } }, label, ' ',\n createElement('span', { style: { color: dshThemeColor.labelPrimary, fontVariantNumeric: 'tabular-nums' } }, date(value)))))),\n session.messages.length === 0 ? createElement('p', { style: { margin: '8px 0', fontSize: 13, color: dshThemeColor.labelSecondary } }, t('awb.call.noMessages')) : null,\n ...session.messages.map((message) => createElement(AssistantConversationMessageView, { key: message.id, message, name, t, services, model,\n side: message.role === 'user' ? 'right' : 'left' })))\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport { AssistantLoadedView, createAssistantViewLoader } from './assistant-view-loader.js'\n\n// 两个配置入口共用模块缓存,草稿实例仍由工作台持有,切页不重新注册任何服务。\nconst configuration = createAssistantViewLoader(() => import('./assistant-configuration-view.js'))\nexport const assistantConfigurationFieldsLoader = createAssistantViewLoader(async () => (await configuration.load()).AssistantConfigurationFields)\nexport const assistantConfigurationPageLoader = createAssistantViewLoader(async () => (await configuration.load()).AssistantConfigurationPage)\nexport function AssistantConfigurationFields(props: Parameters<typeof import('./assistant-configuration-view.js')['AssistantConfigurationFields']>[0]): ReactElement {\n return createElement(AssistantLoadedView<typeof props>, { loader: assistantConfigurationFieldsLoader, viewProps: props, t: props.t })\n}\nexport function AssistantConfigurationPage(props: Parameters<typeof import('./assistant-configuration-view.js')['AssistantConfigurationPage']>[0]): ReactElement {\n return createElement(AssistantLoadedView<typeof props>, { loader: assistantConfigurationPageLoader, viewProps: props, t: props.t })\n}\n","import { createElement, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { CSSProperties, ReactElement } from 'react'\nimport type { AssistantChatCatalog, AssistantChatRun, AssistantConversationSnapshot, AssistantDebugSnapshot, AssistantLifecycleSnapshot } from '../../shared/contracts/assistant.js'\nimport { DEFAULT_ASSISTANT_SETTINGS, type AssistantSettings } from '../../shared/contracts/config.js'\nimport { readAssistantProfile, readAssistantPersonality } from '../../shared/assistant-lifecycle.js'\nimport { BUILTIN_ASSISTANT_AVATAR, listAssistantAvatars, normalizeAssistantAppearance, resolveAssistantAvatarState, selectedAssistantAvatar } from '../../shared/assistant-avatar.js'\nimport { readAssistantTtsSettings, type AssistantTtsSnapshot } from '../../shared/assistant-tts.js'\nimport { CODINGNS_RPC_CHANNEL } from '../../shared/contracts/transport.js'\nimport { useCodingNsTranslator, type CodingNsTranslator } from '../locale.js'\nimport { readNativeWorkspaceListStore, readNativeWorkspaceSnapshot, type NativeWorkspaceRecord } from '../native-workspace-store.js'\nimport { dshSettingsButtonStyle, dshSettingsPrimaryButtonStyle, dshSettingsHelpStyle, dshThemeColor } from '../theme.js'\nimport { AssistantAvatarSlot } from '../avatar/slot.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarCatalogEntry } from '../../shared/assistant-avatar-catalog.js'\nimport { AssistantConfigurationTabs, type AssistantConfigurationTab } from './assistant-configuration-tabs.js'\nimport { assistantSettingTextStyle } from '../assistant-settings-styles.js'\nimport type { CodingNsClientServices } from './types.js'\nimport { AssistantComposer, AssistantControlsStyle, AssistantIconButton, AssistantMaintenanceDialog, AssistantStatusBadge, confirmAssistantMaintenance, resolveAssistantWorkbenchStatus } from './assistant-workbench-controls.js'\nimport type { AssistantMaintenanceConfirmation } from './assistant-workbench-controls.js'\nimport { readAssistantComposerCommand, validateAssistantFiles, encodeAssistantFiles } from './assistant-composer-input.js'\nimport { AssistantConfigurationSession } from './assistant-configuration-session.js'\nimport { AssistantRealtimeCall, AssistantVoiceSessionCard } from './assistant-realtime-call.js'\nimport { AssistantConversationMessageView } from './assistant-conversation-message.js'\nimport { assistantConversationTimeline } from '../../shared/assistant-voice-sessions.js'\nimport { AssistantConfigurationFields, AssistantConfigurationPage } from './assistant-configuration-loader.js'\nimport { AssistantLoadedView, createAssistantViewLoader } from './assistant-view-loader.js'\nimport { assistantDisplayScope, getAssistantDisplayStore, type AssistantStatusSnapshot } from './assistant-display-store.js'\nexport { AssistantComposer } from './assistant-workbench-controls.js'\n\nconst debugLoader = createAssistantViewLoader(async () => (await import('./assistant-debug-workbench.js')).AssistantDebugDialog)\n\nexport interface AssistantDraft {\n readonly name: string\n readonly modelKey: string\n readonly personality: string\n readonly managedWorkspaceIds: readonly string[]\n readonly avatarId: string\n readonly voiceId: string\n readonly ttsBackend: 'browser' | 'moss-onnx'\n}\nexport interface AssistantWorkbenchProps {\n readonly services: CodingNsClientServices\n readonly initialConfiguration?: boolean\n readonly minimized?: boolean\n readonly callStartedAt?: number | undefined\n readonly active: boolean\n readonly pending: boolean\n readonly state?: string | undefined\n readonly message?: string | undefined\n readonly partialText: string\n readonly liveUserText?: string\n readonly liveAssistantText?: string\n readonly realtimeAvailable: boolean\n readonly unavailableMessage?: string | undefined\n readonly onStart: () => void | Promise<void>\n readonly onStop: () => void | Promise<void>\n readonly onClose: () => void\n readonly onMinimize?: (() => void) | undefined\n}\nconst emptyConversation = (): AssistantConversationSnapshot => ({ revision: 0, summary: '', messages: [], pendingMessage: null, active: null, compressing: false, error: null })\nexport function readAssistantDraft(settings: AssistantSettings, mossReady?: boolean): AssistantDraft {\n const tts = readAssistantTtsSettings(settings.tts)\n const profile = readAssistantProfile(settings)\n const appearance = normalizeAssistantAppearance(settings.appearance)\n // 旧预设 ID 只用于已创建助理的兼容,不能在创建时隐式注册或下载外部角色。\n const avatarId = listAssistantAvatars(appearance, profile.initialized).some((model) => model.id === appearance.selectedId)\n ? appearance.selectedId : BUILTIN_ASSISTANT_AVATAR.id\n return { name: profile.name, personality: readAssistantPersonality(profile), modelKey: settings.model === undefined ? '' : JSON.stringify([settings.model.provider, settings.model.model]),\n managedWorkspaceIds: [...settings.managedWorkspaceIds], avatarId, voiceId: tts.selectedId,\n ttsBackend: !profile.initialized || mossReady === false ? 'browser' : tts.backend }\n}\nexport function assistantDraftPayload(draft: AssistantDraft, initializing = false, includeVoice = true): Record<string, unknown> {\n const model = draft.modelKey === '' ? null : JSON.parse(draft.modelKey) as [string, string]\n return { name: draft.name, model: model === null ? null : { provider: model[0], model: model[1] }, personality: draft.personality, avatarId: draft.avatarId,\n ...(initializing ? {} : { managedWorkspaceIds: draft.managedWorkspaceIds,\n ...(includeVoice ? { voiceId: draft.voiceId, ttsBackend: draft.ttsBackend } : {}) }) }\n}\n\n/** 一位助理、一份连续对话;配置草稿、资源管理和正式聊天各自有明确的写入边界。 */\nexport function AssistantWorkbench(props: AssistantWorkbenchProps): ReactElement {\n const { services } = props\n const t = useCodingNsTranslator(services.locale)\n const [settings, setSettings] = useState(() => services.settings.getSnapshot())\n const value = settings.value?.assistant ?? DEFAULT_ASSISTANT_SETTINGS\n const scope = assistantDisplayScope(value.managedWorkspaceIds)\n const display = useMemo(() => getAssistantDisplayStore(services.rpc, scope), [services.rpc, scope])\n const [lifecycle, setLifecycle] = useState<AssistantLifecycleSnapshot>(() => ({ profile: readAssistantProfile(value), conversation: emptyConversation() }))\n const [loaded, setLoaded] = useState(false)\n const [view, setView] = useState<'chat' | 'configuration'>(() => props.initialConfiguration || !lifecycle.profile.initialized ? 'configuration' : 'chat')\n const [configuration] = useState(() => new AssistantConfigurationSession(services))\n const configurationSnapshot = useSyncExternalStore(configuration.subscribe, configuration.getSnapshot, configuration.getSnapshot)\n const configurationValue = configurationSnapshot.value?.assistant ?? DEFAULT_ASSISTANT_SETTINGS\n const draft = { ...readAssistantDraft(configurationValue),\n name: configurationValue.profile?.name ?? readAssistantProfile(configurationValue).name,\n personality: configurationValue.profile?.personality ?? readAssistantPersonality(readAssistantProfile(configurationValue)) }\n const [catalog, setCatalog] = useState<AssistantChatCatalog>()\n const [tts, setTts] = useState<AssistantTtsSnapshot>()\n const [workspaces, setWorkspaces] = useState<readonly NativeWorkspaceRecord[]>([])\n const [indexState, setIndexState] = useState<AssistantDebugSnapshot['indexState']>()\n const [text, setText] = useState('')\n const [files, setFiles] = useState<readonly File[]>([])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [confirmation, setConfirmation] = useState<AssistantMaintenanceConfirmation>()\n const [configurationTab, setConfigurationTab] = useState<AssistantConfigurationTab>('basic')\n const [visitedTabs, setVisitedTabs] = useState<readonly AssistantConfigurationTab[]>(['basic'])\n const [debugDialog, setDebugDialog] = useState(false)\n const [catalogPreview, setCatalogPreview] = useState<AssistantAvatarCatalogEntry | undefined>()\n const [previewTarget, setPreviewTarget] = useState<HTMLDivElement | null>(null)\n const mounted = useRef(false)\n const abort = useRef<AbortController>()\n const revision = useRef(0)\n const ownedRequests = useRef(new Set<string>())\n const pendingOperation = useRef(false)\n const voiceProps = useRef(props); voiceProps.current = props\n const messagesEnd = useRef<HTMLDivElement>(null)\n const configuring = view === 'configuration' || !lifecycle.profile.initialized\n const initializing = !lifecycle.profile.initialized\n const calling = !configuring && (props.active || props.pending)\n const running = lifecycle.conversation.active?.state === 'running'\n const locked = busy || lifecycle.conversation.compressing || props.pending\n const writable = settings.writable && settings.status === 'ready'\n\n const call = useCallback(async <T,>(endpoint: string, payload: unknown = {}, signal = abort.current?.signal): Promise<T> => {\n const result = await services.rpc.call(CODINGNS_RPC_CHANNEL, endpoint, payload, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value as T\n }, [services.rpc])\n const refresh = useCallback(async (): Promise<AssistantLifecycleSnapshot | undefined> => {\n const current = revision.current\n const next = await display.lifecycle.refresh({ afterPending: true })\n if (next && mounted.current && current === revision.current && !pendingOperation.current) { setLifecycle(next); setLoaded(true) }\n return next\n }, [display])\n const cancelRequests = useCallback((): void => {\n for (const requestId of ownedRequests.current) void services.rpc.call(CODINGNS_RPC_CHANNEL, 'assistant/conversation/cancel', { requestId }).catch(() => undefined)\n ownedRequests.current.clear()\n }, [services.rpc])\n const close = useCallback((): void => { cancelRequests(); void Promise.resolve(voiceProps.current.onStop()).finally(() => voiceProps.current.onClose()) }, [cancelRequests])\n\n useEffect(() => {\n mounted.current = true; abort.current = new AbortController()\n return () => { mounted.current = false; abort.current?.abort(); cancelRequests() }\n }, [cancelRequests])\n useEffect(() => {\n if (props.minimized) return\n const changed = (): void => {\n const snapshot = display.lifecycle.getSnapshot()\n if (snapshot.error) setError(message(snapshot.error))\n else if (snapshot.value && !pendingOperation.current) { setLifecycle(snapshot.value); setLoaded(true) }\n }\n changed()\n return display.lifecycle.subscribe(changed)\n }, [display, props.minimized])\n useEffect(() => {\n const changed = (): void => {\n const next = services.settings.getSnapshot(); setSettings(next)\n configuration.sync()\n }\n changed()\n const dispose = services.settings.subscribe(changed)\n void call<AssistantChatCatalog>('assistant/chat/models').then((next) => { if (mounted.current) setCatalog(next) }).catch((cause) => { if (mounted.current) setError(message(cause)) })\n return dispose\n }, [services.settings, call, configuration])\n useEffect(() => () => configuration.dispose(), [configuration])\n useEffect(() => {\n // 创建前不读取项目目录或 MOSS 可用性;四项身份设置即可开始交流。\n if (initializing) return undefined\n let stopped = false\n const refreshResources = (): void => {\n void call<AssistantTtsSnapshot>('assistant/tts/catalog').then((next) => {\n if (stopped || !mounted.current) return\n setTts(next)\n }).catch(() => { /* 浏览器 TTS 不依赖 MOSS 目录,资源查询失败仍可创建和交流。 */ })\n }\n const nativeChanged = (): void => setWorkspaces(readNativeWorkspaceSnapshot(services.uiContext)?.items ?? [])\n refreshResources(); nativeChanged()\n const dispose = services.settings.subscribe(refreshResources)\n const disposeNative = readNativeWorkspaceListStore(services.uiContext)?.subscribe(nativeChanged)\n const changed = (): void => {\n const snapshot = display.status.getSnapshot()\n const next = snapshot.value\n if (next && !snapshot.error) {\n setIndexState(next.indexState)\n setWorkspaces(mergeWorkspaces(readNativeWorkspaceSnapshot(services.uiContext)?.items ?? [], next))\n } else {\n // 查询失败只失效状态证明,保留普通交流及索引后台任务。\n setIndexState(undefined)\n }\n }\n changed()\n const disposeStatus = props.minimized ? undefined : display.status.subscribe(changed)\n return () => { stopped = true; disposeStatus?.(); dispose(); disposeNative?.() }\n }, [initializing, services.settings, services.uiContext, call, display, props.minimized])\n useEffect(() => { if (props.initialConfiguration) { setView('configuration'); void Promise.resolve(voiceProps.current.onStop()) } }, [props.initialConfiguration])\n useEffect(() => {\n if (props.minimized || debugDialog || confirmation !== undefined) return undefined\n const escape = (event: KeyboardEvent): void => handleAssistantWorkbenchEscape(event, close)\n document.addEventListener('keydown', escape)\n return () => document.removeEventListener('keydown', escape)\n }, [props.minimized, debugDialog, confirmation, close])\n const toolState = lifecycle.conversation.active?.toolCalls?.map((call) => `${call.id}:${call.state}`).join('|')\n useEffect(() => { messagesEnd.current?.scrollIntoView?.({ block: 'nearest' }) }, [lifecycle.conversation.revision, lifecycle.conversation.active?.text, toolState, props.partialText])\n\n const run = async (operation: () => Promise<void>): Promise<void> => {\n if (pendingOperation.current) return\n pendingOperation.current = true; revision.current++; setBusy(true); setError(''); setNotice('')\n try { await operation() } catch (cause) { if (mounted.current) setError(message(cause)) }\n finally { pendingOperation.current = false; revision.current++; if (mounted.current) { setBusy(false); void refresh().catch(() => undefined) } }\n }\n const reloadSettings = async (): Promise<void> => { await (services.settings.reload?.() ?? services.settings.load?.()); if (mounted.current) setSettings(services.settings.getSnapshot()) }\n const changeDraft = (patch: Partial<AssistantDraft>): void => {\n const current = configuration.getSnapshot().value?.assistant ?? DEFAULT_ASSISTANT_SETTINGS\n const operations: import('../../dsh-capabilities/settings-store.js').CodingNsSettingsOperation[] = []\n if (patch.name !== undefined || patch.personality !== undefined) operations.push({ op: 'set', path: ['assistant', 'profile'], value: { ...readAssistantProfile(current),\n ...(patch.name === undefined ? {} : { name: patch.name }), ...(patch.personality === undefined ? {} : { personality: patch.personality }) } })\n if (patch.modelKey !== undefined) operations.push(patch.modelKey === '' ? { op: 'unset', path: ['assistant', 'model'] }\n : { op: 'set', path: ['assistant', 'model'], value: { provider: JSON.parse(patch.modelKey)[0], model: JSON.parse(patch.modelKey)[1] } })\n if (patch.managedWorkspaceIds !== undefined) operations.push({ op: 'set', path: ['assistant', 'managedWorkspaceIds'], value: [...patch.managedWorkspaceIds] })\n if (patch.avatarId !== undefined) operations.push({ op: 'set', path: ['assistant', 'appearance', 'selectedId'], value: patch.avatarId })\n if (patch.voiceId !== undefined || patch.ttsBackend !== undefined) operations.push({ op: 'set', path: ['assistant', 'tts'], value: { ...readAssistantTtsSettings(current.tts),\n ...(patch.voiceId === undefined ? {} : { selectedId: patch.voiceId }), ...(patch.ttsBackend === undefined ? {} : { backend: patch.ttsBackend }) } })\n void configuration.mutate(operations).catch((cause) => setError(message(cause)))\n }\n const resetConfigurationTabs = (): void => { setConfigurationTab('basic'); setVisitedTabs(['basic']) }\n const chooseConfigurationTab = (tab: AssistantConfigurationTab): void => {\n if (tab === configurationTab) return\n setConfirmation(undefined)\n setVisitedTabs((current) => current.includes(tab) ? current : [...current, tab]); setConfigurationTab(tab)\n }\n const addFiles = (added: readonly File[]): void => {\n try { const next = [...files, ...added]; validateAssistantFiles(next); setFiles(next); setError('') }\n catch (cause) { setError(t(message(cause))) }\n }\n // 标题按钮和斜杠指令共用确认入口,只有模态框确认后才执行清理。\n const requestClear = (): void => { setError(''); setConfirmation('clear') }\n const send = async (): Promise<void> => {\n const input = text.trim()\n if ((!input && files.length === 0) || locked || !loaded || running) return\n if (readAssistantComposerCommand(input) === 'clear') {\n if (files.length > 0) { setError(t('awb.command.attachmentsError')); return }\n requestClear(); return\n }\n await run(async () => {\n await voiceProps.current.onStop()\n const attachments = await encodeAssistantFiles(files)\n if (!mounted.current) return\n const requestId = requestKey(); ownedRequests.current.add(requestId)\n await call<AssistantChatRun>('assistant/conversation/start', { requestId, text: input || t('awb.attachments.prompt'),\n ...(attachments.length === 0 ? {} : { attachments }) })\n if (!mounted.current || !ownedRequests.current.has(requestId)) { void services.rpc.call(CODINGNS_RPC_CHANNEL, 'assistant/conversation/cancel', { requestId }); return }\n setText(''); setFiles([]); await refresh()\n })\n }\n useEffect(() => {\n const active = lifecycle.conversation.active\n if (active !== null && active.state !== 'running') ownedRequests.current.delete(active.requestId)\n }, [lifecycle.conversation.active?.requestId, lifecycle.conversation.active?.state])\n useEffect(() => { if (!props.minimized && !props.active && !props.pending) void display.lifecycle.refresh() }, [props.active, props.pending, props.minimized, display])\n\n const save = (): void => { void run(async () => {\n cancelRequests(); await voiceProps.current.onStop()\n // 所有标签页共用草稿,正式配置仅在此处一次提交;模型始终显式传给 Host。\n const savingDraft = readAssistantDraft(configuration.getSnapshot().value!.assistant)\n const next = await call<AssistantLifecycleSnapshot>('assistant/lifecycle/configure', {\n ...assistantDraftPayload(savingDraft, initializing), configurationPatch: configuration.configurationPatch(),\n })\n await configuration.commitLocal(abort.current!.signal)\n if (!mounted.current) return\n setLifecycle(next); await reloadSettings(); configuration.reset(); setView('chat'); resetConfigurationTabs()\n }) }\n const maintain = (action: 'clear' | 'reset'): void => { void run(async () => {\n cancelRequests(); await voiceProps.current.onStop()\n const next = await call<AssistantLifecycleSnapshot>(action === 'reset' ? 'assistant/lifecycle/reset' : `assistant/conversation/${action}`)\n if (!mounted.current) return\n setLifecycle(next); setConfirmation(undefined)\n setText(''); setFiles([])\n if (action === 'reset') { resetConfigurationTabs(); setView('configuration'); configuration.reset() }\n else setNotice(t('awb.cleared'))\n await reloadSettings()\n if (action === 'reset') configuration.reset()\n }) }\n const stopReply = (): void => { void run(async () => {\n await voiceProps.current.onStop()\n const requestId = lifecycle.conversation.active?.requestId\n if (requestId !== undefined) await call('assistant/conversation/cancel', { requestId })\n cancelRequests(); await refresh()\n }) }\n const switchView = (): void => {\n cancelRequests(); void Promise.resolve(voiceProps.current.onStop())\n configuration.reset(); setConfirmation(undefined)\n setView(configuring ? 'chat' : 'configuration'); resetConfigurationTabs()\n }\n const appearance = normalizeAssistantAppearance(value.appearance)\n const previewAppearance = { ...normalizeAssistantAppearance(configurationValue.appearance), selectedId: draft.avatarId }\n const avatarState = resolveAssistantAvatarState(running ? 'thinking' : props.state, props.pending)\n const button = (label: string, onClick: () => void, disabled = locked, primary = false): ReactElement => createElement('button', { type: 'button', disabled, onClick, style: primary ? dshSettingsPrimaryButtonStyle : dshSettingsButtonStyle }, label)\n const noticeText = error || lifecycle.conversation.error || (lifecycle.conversation.active?.state === 'failed' ? lifecycle.conversation.active.error : null) || props.message\n const status = resolveAssistantWorkbenchStatus({ running, working: locked, voiceActive: props.active, voiceState: props.state,\n hasProjects: value.managedWorkspaceIds.length > 0, indexState })\n const configurationPreview = createElement('div', { 'data-codingns-assistant-preview': true, style: { flex: '1 1 290px', minWidth: 0, border: `1px solid ${dshThemeColor.border}`, borderRadius: 18, background: dshThemeColor.surfaceSubtle, padding: 11, boxSizing: 'border-box', display: 'grid', alignContent: 'start', gap: 11 } },\n createElement('div', { ref: setPreviewTarget, 'data-codingns-avatar-preview-region': true },\n catalogPreview === undefined ? createElement('div', { style: avatarStyle }, createElement(AssistantAvatarSlot, { services: configuration.services, model: selectedAssistantAvatar(previewAppearance), state: avatarState, surface: 'dialog', size: 144, showDiagnostics: false }),\n createElement('strong', { style: { fontSize: 18, overflowWrap: 'anywhere', textAlign: 'center' } }, draft.name.trim() || t('awb.unnamed')),\n createElement('p', { style: { ...help, textAlign: 'center', display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden', overflowWrap: 'anywhere' } }, draft.personality.trim() || t('awb.personalityPreview'))) : null))\n const page = (tab: AssistantConfigurationTab): ReactElement => createElement(AssistantConfigurationPage, {\n tab, active: tab === configurationTab, services: configuration.services, value: configurationValue, draft, catalog, appearance: previewAppearance, tts, workspaces, t, disabled: locked || !writable || !loaded,\n onChange: changeDraft, onDebug: () => setDebugDialog(true), onError: setError,\n onReset: () => { setError(''); setConfirmation('reset-first') },\n previewTarget, onPreviewChange: setCatalogPreview,\n })\n // 收起只隐藏呈现;保留工作台、设备状态与通话记录订阅,不触发挂断或卸载。\n return createElement('div', { 'data-codingns-workbench-minimized': props.minimized === true, hidden: props.minimized,\n style: { ...backdrop, ...(props.minimized ? { display: 'none' } : {}) } },\n configuring ? createElement(AssistantControlsStyle) : null,\n createElement('section', { role: 'dialog', 'aria-modal': !props.minimized, 'aria-label': t('awb.title'), 'data-codingns-assistant-workbench': configuring ? 'configuration' : 'chat',\n style: { ...dialog, ...(!configuring ? { height: 'min(740px, calc(100dvh - 24px))', minHeight: 0 } : {}) } },\n calling ? null : createElement('header', { style: { ...row, flexShrink: 0, padding: 11, borderBottom: `1px solid ${dshThemeColor.border}` } },\n createElement('div', { style: { flex: '1 1 auto', minWidth: 0, display: 'grid', gap: 5 } },\n createElement('div', { 'data-codingns-assistant-heading': true, style: { ...row, gap: 8 } },\n createElement('strong', { style: { fontSize: 17, overflowWrap: 'anywhere' } }, initializing ? t('awb.setupTitle') : lifecycle.profile.name),\n initializing ? null : createElement(AssistantStatusBadge, { status, t })),\n initializing ? createElement('span', { style: help }, t('awb.setupSubtitle')) : null),\n !configuring && lifecycle.profile.initialized ? createElement(AssistantIconButton, { icon: 'clear', label: t('awb.clear'), onClick: requestClear, disabled: locked || !loaded }) : null,\n lifecycle.profile.initialized ? createElement(AssistantIconButton, { icon: configuring ? 'chat' : 'settings', label: t(configuring ? 'awb.chat' : 'awb.configure'), onClick: switchView, disabled: locked }) : null,\n createElement(AssistantIconButton, { icon: 'close', label: t('awb.close'), onClick: close, disabled: busy })),\n createElement('div', { 'data-codingns-assistant-scroll': true,\n // 通话页自带统一内边距,外层不重复叠加;其余页面共用 11px 留白。\n style: { flex: '1 1 auto', padding: calling ? 0 : 11, overflowY: 'auto', overscrollBehavior: 'contain', minHeight: 0, display: 'flex', flexDirection: 'column', gap: configuring ? 11 : 16 } },\n !loaded ? createElement('div', { role: 'status', style: dshSettingsHelpStyle }, t('awb.loading'), ' ', button(t('awb.retry'), () => { void refresh().catch((cause) => setError(message(cause))) })) : null,\n noticeText ? createElement('div', { role: 'alert', style: { color: dshThemeColor.error, fontSize: 13, overflowWrap: 'anywhere' } }, noticeText) : null,\n notice ? createElement('div', { role: 'status', style: dshSettingsHelpStyle }, notice) : null,\n calling ? createElement(AssistantRealtimeCall, { services, name: lifecycle.profile.name, model: selectedAssistantAvatar(appearance), t,\n minimized: props.minimized, startedAt: props.callStartedAt, onMinimize: props.onMinimize,\n session: lifecycle.conversation.voiceSessions?.find((session) => session.endedAt === null), pending: props.pending, state: props.state,\n userText: props.partialText || props.liveUserText || '', assistantText: props.liveAssistantText || '',\n toolCalls: lifecycle.conversation.pendingMessage?.source === 'voice' ? lifecycle.conversation.active?.toolCalls\n : lifecycle.conversation.voiceSessions?.find((session) => session.endedAt === null)?.messages.at(-1)?.toolCalls,\n onHangup: async () => { try { await props.onStop(); await refresh() } catch (cause) { setError(message(cause)) } } })\n : configuring ? createElement('div', { 'data-codingns-assistant-configuration': true, style: { ...assistantSettingTextStyle, display: 'grid', gap: 11, minWidth: 0 } },\n initializing ? createElement('div', { style: { display: 'flex', flexWrap: 'wrap', alignItems: 'stretch', gap: 22 } },\n createElement('div', { style: { flex: '1 1 330px', minWidth: 0 } },\n createElement(AssistantConfigurationFields, { draft, catalog, appearance: previewAppearance, initializing, services: configuration.services, t, disabled: locked || !writable || !loaded, onChange: changeDraft })),\n configurationPreview)\n : createElement(AssistantConfigurationTabs, { active: configurationTab, visited: visitedTabs, t, onChange: chooseConfigurationTab,\n panels: { basic: page('basic'), appearance: page('appearance'), voice: page('voice'), more: page('more') }, preview: configurationPreview }))\n : createElement('div', { 'data-codingns-assistant-chat': true, style: { display: 'grid', gap: 16 } },\n !appearance.dialogEnabled ? null : createElement('div', { style: avatarStyle }, createElement(AssistantAvatarSlot, { services, model: selectedAssistantAvatar(appearance), state: avatarState, surface: 'dialog', size: 120 })),\n createElement(AssistantConversationView, { conversation: lifecycle.conversation, name: lifecycle.profile.name, t, services, model: selectedAssistantAvatar(appearance) }),\n props.partialText ? createElement('div', { role: 'status', style: help }, props.partialText) : null,\n createElement('div', { ref: messagesEnd }))),\n // 配置操作位于滚动区之外,统一外边距并让长表单的保存按钮始终可见。\n calling ? null : configuring ? createElement('footer', { 'data-codingns-assistant-configuration-footer': true,\n style: { ...row, flexShrink: 0, justifyContent: initializing ? 'space-between' : 'flex-end', padding: 11,\n borderTop: `1px solid ${dshThemeColor.border}`, background: dshThemeColor.pageBackground } },\n initializing ? createElement('p', { style: { ...help, flex: '1 1 220px' } }, t('awb.setupLater')) : null,\n createElement('div', { style: row },\n initializing ? null : button(t('awb.cancel'), switchView),\n button(t(initializing ? 'awb.createStart' : 'awb.save'), save, locked || configurationSnapshot.preparing || !loaded || !writable || !draft.name.trim() || catalog === undefined || catalog.models.length === 0 || draft.modelKey === '' && catalog.default === null, true)))\n : createElement('footer', { 'data-codingns-assistant-composer-dock': true,\n style: { flexShrink: 0, padding: 11, borderTop: `1px solid ${dshThemeColor.border}`, background: dshThemeColor.pageBackground } },\n createElement(AssistantComposer, { t, value: text, disabled: locked || running || !loaded, onChange: setText, onSend: () => { void send() },\n files, onFiles: addFiles, onRemoveFile: (index) => setFiles((current) => current.filter((_, position) => position !== index)),\n running, stopping: busy, onStop: stopReply, voiceActive: props.active,\n voiceDisabled: busy || lifecycle.conversation.compressing || running || !loaded || !props.active && (props.pending || !props.realtimeAvailable),\n onVoice: () => { cancelRequests(); if (props.active) void props.onStop(); else void props.onStart() } }))),\n confirmation === undefined ? null : createElement(AssistantMaintenanceDialog, { key: confirmation, stage: confirmation, t,\n disabled: locked || !loaded || confirmation !== 'clear' && !writable, error,\n onCancel: () => setConfirmation(undefined),\n onConfirm: () => { if (!locked && loaded && (confirmation === 'clear' || writable)) confirmAssistantMaintenance(confirmation, setConfirmation, maintain) } }),\n debugDialog ? createElement(AssistantLoadedView<Parameters<typeof import('./assistant-debug-workbench.js')['AssistantDebugDialog']>[0]>, {\n loader: debugLoader, t, overlay: true, onClose: () => setDebugDialog(false),\n viewProps: { services: configuring ? configuration.services : services, displayRpc: services.rpc, onClose: () => setDebugDialog(false) } }) : null)\n}\n\n/** 正式消息以 Host 快照为准,语音识别与流式回复在同一消息流里显示。 */\nexport function AssistantConversationView({ conversation, name, t, services, model }: {\n readonly conversation: AssistantConversationSnapshot; readonly name: string; readonly t: CodingNsTranslator\n readonly services?: CodingNsClientServices; readonly model?: AssistantAvatarModel\n}): ReactElement {\n const messages = [...conversation.messages, ...(conversation.pendingMessage === null ? [] : [conversation.pendingMessage])]\n const timeline = assistantConversationTimeline(conversation)\n const active = conversation.active\n // 模型先调用工具时也展示本轮,不能等到出现第一段正文才显示搜索过程。\n const streaming = active !== null && active.state !== 'cancelled' && (active.text !== '' || Boolean(active.toolCalls?.length)) && !messages.some((message) => message.id === `${active.requestId}-assistant`)\n return createElement('div', { 'data-codingns-assistant-messages': true, style: { display: 'grid', gap: 12 } },\n conversation.summary ? createElement('details', null, createElement('summary', { style: help }, t('awb.summary')), createElement('p', { style: { ...help, whiteSpace: 'pre-wrap' } }, conversation.summary)) : null,\n timeline.length === 0 && !streaming ? createElement('p', { style: { ...help, textAlign: 'center', padding: '20px 0' } }, t('awb.empty')) : null,\n ...timeline.map((item) => {\n if (item.kind === 'voice') return createElement(AssistantVoiceSessionCard, { key: item.session.id, session: item.session, t, name, services, model })\n const message = item.message\n return createElement(AssistantConversationMessageView, { key: message.id, message, name, t, services, model })\n }),\n !streaming ? null : createElement(AssistantConversationMessageView, { key: `${active.requestId}-assistant`, streaming: true,\n message: { role: 'assistant', text: active.text, ...(active.toolCalls === undefined ? {} : { toolCalls: active.toolCalls }) }, name, t, services, model }))\n}\n\n/** 内层菜单先消费 Escape,外层窗口只处理尚未消费的关闭按键。 */\nexport function handleAssistantWorkbenchEscape(event: KeyboardEvent, onClose: () => void): void {\n if (event.key !== 'Escape' || event.defaultPrevented) return\n event.stopImmediatePropagation(); onClose()\n}\n\nfunction mergeWorkspaces(native: readonly NativeWorkspaceRecord[], debug: Pick<AssistantStatusSnapshot, 'workspaces'>): readonly NativeWorkspaceRecord[] {\n return [...native, ...debug.workspaces.filter((workspace) => !native.some((item) => item.workspaceId === workspace.workspaceId)).map((workspace) => ({ workspaceId: workspace.workspaceId, title: workspace.name, sessionIds: [] }))]\n}\nfunction message(error: unknown): string { return error instanceof Error ? error.message : String(error) }\nfunction requestKey(): string { return `assistant-${globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}` }\nconst row: CSSProperties = { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: 8 }\nconst help: CSSProperties = { ...dshSettingsHelpStyle, margin: 0 }\nconst avatarStyle: CSSProperties = { display: 'grid', gap: 8, justifyItems: 'center' }\nconst backdrop: CSSProperties = { position: 'fixed', inset: 0, zIndex: 10000, background: dshThemeColor.overlay, backdropFilter: 'blur(6px)', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 12, boxSizing: 'border-box' }\nconst dialog: CSSProperties = { display: 'flex', flexDirection: 'column', width: 'min(940px, 100%)', maxHeight: 'calc(100dvh - 24px)', minHeight: 300, background: dshThemeColor.pageBackground, color: dshThemeColor.labelPrimary, border: `1px solid ${dshThemeColor.border}`, borderRadius: 20, boxShadow: '0 24px 80px rgba(0,0,0,.24)', overflow: 'hidden' }\n"],"mappings":"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"}