@jingyi0605/codingns4dsh 0.2.1-beta.7 → 0.2.1-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.en.md +3 -3
  2. package/README.md +5 -3
  3. package/data/build/dist/client/avatar/desktop-bridge.js +1 -1
  4. package/data/build/dist/client/avatar/desktop-bridge.js.map +1 -1
  5. package/data/build/dist/client/avatar/desktop-view.d.ts +4 -2
  6. package/data/build/dist/client/avatar/desktop-view.d.ts.map +1 -1
  7. package/data/build/dist/client/avatar/desktop-view.js +25 -9
  8. package/data/build/dist/client/avatar/desktop-view.js.map +1 -1
  9. package/data/build/dist/client/avatar/floating.d.ts +5 -2
  10. package/data/build/dist/client/avatar/floating.d.ts.map +1 -1
  11. package/data/build/dist/client/avatar/floating.js +16 -5
  12. package/data/build/dist/client/avatar/floating.js.map +1 -1
  13. package/data/build/dist/client/avatar/notification-bubble.d.ts +18 -5
  14. package/data/build/dist/client/avatar/notification-bubble.d.ts.map +1 -1
  15. package/data/build/dist/client/avatar/notification-bubble.js +208 -56
  16. package/data/build/dist/client/avatar/notification-bubble.js.map +1 -1
  17. package/data/build/dist/client/avatar/notification-surface.d.ts +16 -0
  18. package/data/build/dist/client/avatar/notification-surface.d.ts.map +1 -0
  19. package/data/build/dist/client/avatar/notification-surface.js +54 -0
  20. package/data/build/dist/client/avatar/notification-surface.js.map +1 -0
  21. package/data/build/dist/client/avatar/reaction-badge.d.ts.map +1 -1
  22. package/data/build/dist/client/avatar/reaction-badge.js +11 -2
  23. package/data/build/dist/client/avatar/reaction-badge.js.map +1 -1
  24. package/data/build/dist/client/bundle.js +1131 -392
  25. package/data/build/dist/client/bundle.js.map +1 -1
  26. package/data/build/dist/client/client.assistant-notifications.js.map +1 -1
  27. package/data/build/dist/client/client.assistant-workbench.js +235 -109
  28. package/data/build/dist/client/client.assistant-workbench.js.map +1 -1
  29. package/data/build/dist/client/client.manager.js +46 -9
  30. package/data/build/dist/client/client.manager.js.map +1 -1
  31. package/data/build/dist/client/client.native-workspace-store.js +1 -1
  32. package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
  33. package/data/build/dist/client/client.theme.js +2 -0
  34. package/data/build/dist/client/client.theme.js.map +1 -1
  35. package/data/build/dist/client/client.transport.js +37 -9
  36. package/data/build/dist/client/client.transport.js.map +1 -1
  37. package/data/build/dist/client/desktop-assistant.js +57743 -359
  38. package/data/build/dist/client/features/assistant-conversation-message.d.ts +2 -1
  39. package/data/build/dist/client/features/assistant-conversation-message.d.ts.map +1 -1
  40. package/data/build/dist/client/features/assistant-conversation-message.js +59 -24
  41. package/data/build/dist/client/features/assistant-conversation-message.js.map +1 -1
  42. package/data/build/dist/client/features/assistant-notification-store.d.ts +7 -1
  43. package/data/build/dist/client/features/assistant-notification-store.d.ts.map +1 -1
  44. package/data/build/dist/client/features/assistant-notification-store.js +44 -0
  45. package/data/build/dist/client/features/assistant-notification-store.js.map +1 -1
  46. package/data/build/dist/client/features/assistant-record-style.js +11 -4
  47. package/data/build/dist/client/features/assistant-record-style.js.map +1 -1
  48. package/data/build/dist/client/features/assistant-workbench.d.ts +4 -0
  49. package/data/build/dist/client/features/assistant-workbench.d.ts.map +1 -1
  50. package/data/build/dist/client/features/assistant-workbench.js +27 -1
  51. package/data/build/dist/client/features/assistant-workbench.js.map +1 -1
  52. package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -1
  53. package/data/build/dist/client/features/global-voice-assistant.js +36 -4
  54. package/data/build/dist/client/features/global-voice-assistant.js.map +1 -1
  55. package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
  56. package/data/build/dist/client/features/peer-host.js +33 -2
  57. package/data/build/dist/client/features/peer-host.js.map +1 -1
  58. package/data/build/dist/client/locales/assistantWorkbench.d.ts +17 -3
  59. package/data/build/dist/client/locales/assistantWorkbench.d.ts.map +1 -1
  60. package/data/build/dist/client/locales/assistantWorkbench.js +15 -11
  61. package/data/build/dist/client/locales/assistantWorkbench.js.map +1 -1
  62. package/data/build/dist/client/peer-host-native-projection.d.ts +4 -0
  63. package/data/build/dist/client/peer-host-native-projection.d.ts.map +1 -1
  64. package/data/build/dist/client/peer-host-native-projection.js +40 -1
  65. package/data/build/dist/client/peer-host-native-projection.js.map +1 -1
  66. package/data/build/dist/client/peer-host-remote-events.d.ts +14 -0
  67. package/data/build/dist/client/peer-host-remote-events.d.ts.map +1 -1
  68. package/data/build/dist/client/peer-host-remote-events.js +92 -3
  69. package/data/build/dist/client/peer-host-remote-events.js.map +1 -1
  70. package/data/build/dist/client/style.css +2561 -0
  71. package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
  72. package/data/build/dist/client/subscription-slot.js +5 -1
  73. package/data/build/dist/client/subscription-slot.js.map +1 -1
  74. package/data/build/dist/client/theme.d.ts +2 -0
  75. package/data/build/dist/client/theme.d.ts.map +1 -1
  76. package/data/build/dist/client/theme.js +3 -0
  77. package/data/build/dist/client/theme.js.map +1 -1
  78. package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
  79. package/data/build/dist/client/workspace-session-visibility-dom.js +22 -10
  80. package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
  81. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts +9 -1
  82. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts.map +1 -1
  83. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js +39 -0
  84. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js.map +1 -1
  85. package/data/build/dist/host/cli-adapters/codex-driver.d.ts +1 -0
  86. package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
  87. package/data/build/dist/host/cli-adapters/codex-driver.js +7 -0
  88. package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
  89. package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts +13 -0
  90. package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts.map +1 -0
  91. package/data/build/dist/host/cli-adapters/codex-file-citations.js +271 -0
  92. package/data/build/dist/host/cli-adapters/codex-file-citations.js.map +1 -0
  93. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +2 -1
  94. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
  95. package/data/build/dist/host/cli-adapters/dsh-message-projector.js +16 -5
  96. package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
  97. package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
  98. package/data/build/dist/host/cli-adapters/feature.js +1 -0
  99. package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
  100. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.d.ts.map +1 -1
  101. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +20 -3
  102. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js.map +1 -1
  103. package/data/build/dist/host/desktop-assistant/controller.d.ts +2 -0
  104. package/data/build/dist/host/desktop-assistant/controller.d.ts.map +1 -1
  105. package/data/build/dist/host/desktop-assistant/controller.js +28 -1
  106. package/data/build/dist/host/desktop-assistant/controller.js.map +1 -1
  107. package/data/build/dist/host/features/assistant-management-tools.d.ts +2 -1
  108. package/data/build/dist/host/features/assistant-management-tools.d.ts.map +1 -1
  109. package/data/build/dist/host/features/assistant-management-tools.js +10 -3
  110. package/data/build/dist/host/features/assistant-management-tools.js.map +1 -1
  111. package/data/build/dist/host/features/assistant-notification-events.js +1 -1
  112. package/data/build/dist/host/features/assistant-notification-events.js.map +1 -1
  113. package/data/build/dist/host/features/assistant-notifications.d.ts +8 -1
  114. package/data/build/dist/host/features/assistant-notifications.d.ts.map +1 -1
  115. package/data/build/dist/host/features/assistant-notifications.js +105 -11
  116. package/data/build/dist/host/features/assistant-notifications.js.map +1 -1
  117. package/data/build/dist/host/features/global-voice-rpc.d.ts +2 -2
  118. package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
  119. package/data/build/dist/host/features/global-voice-rpc.js +89 -2
  120. package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
  121. package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
  122. package/data/build/dist/host/features/peer-host.js +34 -5
  123. package/data/build/dist/host/features/peer-host.js.map +1 -1
  124. package/data/build/dist/host/features/types.d.ts +3 -1
  125. package/data/build/dist/host/features/types.d.ts.map +1 -1
  126. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +7 -1
  127. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
  128. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +23 -4
  129. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
  130. package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
  131. package/data/build/dist/host/native-session-bridge.js +22 -9
  132. package/data/build/dist/host/native-session-bridge.js.map +1 -1
  133. package/data/build/dist/host/rpc.js +1 -1
  134. package/data/build/dist/host/rpc.js.map +1 -1
  135. package/data/build/dist/shared/assistant-message-timeline.d.ts +11 -0
  136. package/data/build/dist/shared/assistant-message-timeline.d.ts.map +1 -1
  137. package/data/build/dist/shared/assistant-message-timeline.js +19 -0
  138. package/data/build/dist/shared/assistant-message-timeline.js.map +1 -1
  139. package/data/build/dist/shared/assistant-notifications.d.ts +34 -0
  140. package/data/build/dist/shared/assistant-notifications.d.ts.map +1 -1
  141. package/data/build/dist/shared/assistant-notifications.js +8 -0
  142. package/data/build/dist/shared/assistant-notifications.js.map +1 -1
  143. package/data/build/dist/shared/assistant-session-messages.d.ts +13 -0
  144. package/data/build/dist/shared/assistant-session-messages.d.ts.map +1 -0
  145. package/data/build/dist/shared/assistant-session-messages.js +155 -0
  146. package/data/build/dist/shared/assistant-session-messages.js.map +1 -0
  147. package/data/build/dist/shared/contracts/assistant.d.ts +13 -0
  148. package/data/build/dist/shared/contracts/assistant.d.ts.map +1 -1
  149. package/data/build/dist/shared/contracts/version.d.ts +1 -1
  150. package/data/build/dist/shared/contracts/version.js +1 -1
  151. package/data/build/dist/shared/desktop-assistant.d.ts +2 -1
  152. package/data/build/dist/shared/desktop-assistant.d.ts.map +1 -1
  153. package/data/build/dist/shared/desktop-assistant.js +21 -9
  154. package/data/build/dist/shared/desktop-assistant.js.map +1 -1
  155. package/package.json +16 -14
  156. package/profile/README.md +2 -2
  157. package/profile/package.json +2 -2
  158. package/profile/version.json +1 -1
  159. package/version.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.assistant-workbench.js","names":["uiFontSize","CODINGNS_RPC_CHANNEL","useId","createElement","dshThemeColor","uiFontSize","createElement","uiFontSize","dshThemeColor","useRef","resolveAssistantControlIcon","dshSettingsButtonStyle","useId","dshSettingsPrimaryButtonStyle","getAssistantAvatarRegistry","AssistantAvatarPortraitService","assistantAvatarPortraitOverrideStore","getAssistantAvatarManager","AssistantAvatarManager","getGlobalVoiceAdapter","registerGlobalVoiceAdapter","getAssistantAvatarPortraitService","CODINGNS_RPC_CHANNEL","sameSettingsValue","hasAssistantAvatarConsent","codingNsTranslator","readAssistantTtsSettings","validateAssistantTtsParameters","DEFAULT_ASSISTANT_TTS_SETTINGS","MOSS_BUILTIN_VOICES","root","createElement","dshThemeColor","createElement","dshThemeColor","uiFontSize","AssistantAvatarPortrait","Fragment","getGlobalVoiceAdapter","useState","useRef","useId","voiceSessionDuration","createElement","dshThemeColor","uiFontSize","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","uiFontSize","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/** 全局智能助理默认使用中文 Zipformer Large;显式保存的模型选择继续保留。 */\nexport const DEFAULT_VOICE_MODEL_ID = 'sherpa-onnx-streaming-zh-large-2025-06-30'\n\n/** 只暴露支持实时输入的推荐模型;模型地址由 Host 根据此白名单解析。 */\nexport const ASSISTANT_VOICE_MODEL_CATALOG: readonly AssistantVoiceModel[] = [\n {\n id: DEFAULT_VOICE_MODEL_ID,\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-en',\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-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'\nimport { uiFontSize } from './font-scale.js'\n\n/** 助理各页共用选项排版,避免开关、许可复选框和字段标签分别继承宿主字号。 */\nexport const assistantSettingTextStyle: CSSProperties = { fontSize: uiFontSize(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, width: '100%', minWidth: 0 }\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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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, DEFAULT_ASSISTANT_TTS_SETTINGS } 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', 'notifications'].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 ? DEFAULT_ASSISTANT_TTS_SETTINGS.selectedId : 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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(12), fontWeight: 600 } }, label),\n createElement('span', { className: 'codingns-assistant-tool-name', title: call.name, style: { color: dshThemeColor.labelSecondary, fontFamily: dshThemeColor.codeFont,\n fontSize: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(18), overflowWrap: 'anywhere' } }, name),\n createElement('span', { style: { fontSize: uiFontSize(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: uiFontSize(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: uiFontSize(13), lineHeight: 1.6, color: dshThemeColor.labelTertiary } }, userText) : null,\n createElement('div', { 'aria-live': 'polite', style: { flexShrink: 0, display: 'grid', gap: 8, fontSize: uiFontSize(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: uiFontSize(13), fontWeight: 600 } }, t('awb.call.record')),\n createElement('span', { style: { fontSize: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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 - 44px))', minHeight: 0 } : {}) } },\n calling ? null : createElement('header', { style: { ...row, flexShrink: 0, padding: '22px 22px 11px' } },\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: uiFontSize(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 // 通话页自带统一内边距,外层不重复叠加;普通对话与设置页横向 22px、纵向 11px。\n style: { flex: '1 1 auto', padding: calling ? 0 : '11px 22px', 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: uiFontSize(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: '11px 22px 22px',\n 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: '11px 22px 22px', 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' }\n// 工作台外层统一保留 22px 四向边距;内部滚动区、页脚和组件间距保持原值。\nconst backdrop: CSSProperties = { position: 'fixed', inset: 0, zIndex: 10000, background: dshThemeColor.overlay, backdropFilter: 'blur(6px)', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 22, boxSizing: 'border-box' }\nconst dialog: CSSProperties = { display: 'flex', flexDirection: 'column', width: 'min(940px, 100%)', maxHeight: 'calc(100dvh - 44px)', 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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"}
1
+ {"version":3,"file":"client.assistant-workbench.js","names":["uiFontSize","CODINGNS_RPC_CHANNEL","useId","createElement","dshThemeColor","uiFontSize","createElement","uiFontSize","dshThemeColor","useRef","resolveAssistantControlIcon","dshSettingsButtonStyle","useId","dshSettingsPrimaryButtonStyle","getAssistantAvatarRegistry","AssistantAvatarPortraitService","assistantAvatarPortraitOverrideStore","getAssistantAvatarManager","AssistantAvatarManager","getGlobalVoiceAdapter","registerGlobalVoiceAdapter","getAssistantAvatarPortraitService","CODINGNS_RPC_CHANNEL","sameSettingsValue","hasAssistantAvatarConsent","codingNsTranslator","readAssistantTtsSettings","validateAssistantTtsParameters","DEFAULT_ASSISTANT_TTS_SETTINGS","MOSS_BUILTIN_VOICES","root","createElement","dshThemeColor","createElement","dshThemeColor","uiFontSize","AssistantAvatarPortrait","Fragment","getGlobalVoiceAdapter","useState","useRef","useId","voiceSessionDuration","createElement","dshThemeColor","uiFontSize","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","uiFontSize","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/** 全局智能助理默认使用中文 Zipformer Large;显式保存的模型选择继续保留。 */\nexport const DEFAULT_VOICE_MODEL_ID = 'sherpa-onnx-streaming-zh-large-2025-06-30'\n\n/** 只暴露支持实时输入的推荐模型;模型地址由 Host 根据此白名单解析。 */\nexport const ASSISTANT_VOICE_MODEL_CATALOG: readonly AssistantVoiceModel[] = [\n {\n id: DEFAULT_VOICE_MODEL_ID,\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-en',\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-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'\nimport { uiFontSize } from './font-scale.js'\n\n/** 助理各页共用选项排版,避免开关、许可复选框和字段标签分别继承宿主字号。 */\nexport const assistantSettingTextStyle: CSSProperties = { fontSize: uiFontSize(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, width: '100%', minWidth: 0 }\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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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, DEFAULT_ASSISTANT_TTS_SETTINGS } 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', 'notifications'].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 ? DEFAULT_ASSISTANT_TTS_SETTINGS.selectedId : 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\nexport type AssistantMessageTimelinePart =\n | { readonly kind: 'text'; readonly key: string; readonly text: string }\n | { readonly kind: 'tool-step'; readonly key: string; readonly calls: readonly 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\n/** 将同一正文位置连续发生的工具归入一个 DSH 风格 step;正文仍保持原有穿插位置。 */\nexport function assistantMessageStepTimeline(text: string, calls: readonly AssistantToolCall[] = []): readonly AssistantMessageTimelinePart[] {\n const parts = assistantMessageTimeline(text, calls)\n const grouped: AssistantMessageTimelinePart[] = []\n for (const part of parts) {\n if (part.kind === 'text') {\n grouped.push(part)\n continue\n }\n const previous = grouped.at(-1)\n if (previous?.kind === 'tool-step') {\n grouped[grouped.length - 1] = { ...previous, calls: [...previous.calls, part.call] }\n } else {\n grouped.push({ kind: 'tool-step', key: `tool-step-${part.call.id}`, calls: [part.call] })\n }\n }\n return grouped\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}\n.codingns-assistant-tool-summary::-webkit-details-marker{display:none}\n.codingns-assistant-tool-summary:hover,.codingns-assistant-record-button:hover{color:${dshThemeColor.labelPrimary}!important}\n.codingns-assistant-tool-summary:active,.codingns-assistant-record-button:active{color:${dshThemeColor.labelPrimary}!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-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-tool-step-summary{list-style:none;cursor:pointer}\n.codingns-assistant-tool-step-summary::-webkit-details-marker{display:none}\n.codingns-assistant-tool-step-summary:hover{color:${dshThemeColor.labelPrimary}!important}\n.codingns-assistant-tool-step-summary:active{color:${dshThemeColor.labelPrimary}!important}\n.codingns-assistant-tool-step-summary:focus-visible{outline:2px solid ${dshThemeColor.accent};outline-offset:2px}\n.codingns-assistant-tool-step-details[open]>.codingns-assistant-tool-step-summary .codingns-assistant-step-chevron{transform:rotate(180deg)}\n.codingns-assistant-tool-step-details[open] .codingns-assistant-tool-step-body{padding-inline:4px}\n.codingns-assistant-tool-step-details[open] .codingns-assistant-tool-step-preview{white-space:normal;overflow-wrap:anywhere}\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 { assistantMessageStepTimeline } from '../../shared/assistant-message-timeline.js'\nimport { AssistantRecordChevron, AssistantRecordStyle } from './assistant-record-style.js'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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: uiFontSize(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, ...assistantMessageStepTimeline(text, calls).map((part) => part.kind === 'tool-step'\n ? createElement(AssistantToolStepView, { key: part.key, calls: part.calls, 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, compact = false }: {\n readonly calls?: readonly AssistantToolCall[] | undefined; readonly t: CodingNsTranslator; readonly compact?: boolean\n}): ReactElement | null {\n if (!calls?.length) return null\n return createElement('div', { 'data-codingns-assistant-tools': true,\n 'data-codingns-assistant-tools-compact': compact,\n style: { display: 'grid', gap: 2, marginBlock: compact ? 0 : 6, textAlign: 'left', whiteSpace: 'normal', minWidth: 0 } },\n createElement(AssistantRecordStyle), ...calls.map((call) => createElement(AssistantToolCallView, { key: call.id, call, t, compact })))\n}\n\n/** 一个 step 只显示摘要;展开后才加载其中的工具调用明细。 */\nfunction AssistantToolStepView({ calls, t }: { readonly calls: readonly AssistantToolCall[]; readonly t: CodingNsTranslator }): ReactElement | null {\n if (calls.length === 0) return null\n const running = calls.some((call) => call.state === 'running')\n const failed = calls.some((call) => call.state === 'failed')\n const status = running ? 'running' : failed ? 'failed' : calls.every((call) => call.state === 'cancelled') ? 'cancelled' : 'completed'\n const latestCall = calls[calls.length - 1]!\n const latestArguments = assistantToolArgumentPreview(latestCall, t)\n const summary = calls.map((call) => assistantToolStepPreview(call, t)).filter((value, index, all) => all.indexOf(value) === index).join(t('awb.call.separator'))\n return createElement('div', { 'data-codingns-assistant-tool-step': true,\n style: { marginBlock: 6, textAlign: 'left', whiteSpace: 'normal', minWidth: 0, color: dshThemeColor.labelSecondary, fontSize: uiFontSize(13), lineHeight: 1.6 } },\n createElement(AssistantRecordStyle),\n createElement('details', { className: 'codingns-assistant-tool-step-details' },\n createElement('summary', { className: 'codingns-assistant-tool-step-summary', title: t('awb.call.stepDetails'),\n 'aria-label': `${t('awb.call.step')} · ${summary} · ${t(`awb.call.tool.${status}`)}`,\n style: { display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, padding: '2px 0', color: dshThemeColor.labelSecondary } },\n createElement(AssistantStepChevron), createElement('span', { className: 'codingns-assistant-tool-step-preview', 'data-latest-tool': latestCall.name,\n title: latestCall.name, style: { minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } },\n summary, ' · ', createElement('code', { style: { color: dshThemeColor.labelPrimary, fontFamily: dshThemeColor.codeFont, fontSize: '0.92em' } }, latestCall.name),\n latestArguments ? ` · ${latestArguments}` : '')),\n createElement('div', { className: 'codingns-assistant-tool-step-body', style: { display: 'grid', gap: 1, padding: '4px 0 5px 21px' } },\n createElement(AssistantToolCallsView, { calls, t, compact: true }))))\n}\n\nfunction assistantToolStepPreview(call: AssistantToolCall, t: CodingNsTranslator): string {\n if (call.name.includes('read') || call.kind === 'attachment') return t('awb.call.stepRead')\n if (call.name.includes('search') || call.kind === 'web-search') return t('awb.call.stepSearch')\n if (call.name.includes('workspace') || call.kind === 'workspace') return t('awb.call.stepWorkspace')\n return t('awb.call.stepTool')\n}\n\nfunction assistantToolArgumentPreview(call: AssistantToolCall, t: CodingNsTranslator): string {\n try {\n const args: unknown = JSON.parse(call.arguments)\n if (args === null || typeof args !== 'object' || Array.isArray(args)) return ''\n const record = args as Record<string, unknown>\n for (const key of ['query', 'queries', 'text', 'url', 'fileName', 'filename', 'file', 'title', 'message']) {\n const value = record[key]\n const preview = typeof value === 'string' ? value : Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string').join(t('awb.call.separator')) : ''\n if (preview.trim()) return preview.trim().slice(0, 120)\n }\n } catch { /* 非 JSON 参数不生成摘要,明细仍可在工具记录中查看。 */ }\n return ''\n}\n\n/** 整个标题栏就是展开入口;实时状态更新不替换 details,保留用户的展开状态。 */\nfunction AssistantToolCallView({ call, t, compact = false }: { readonly call: AssistantToolCall; readonly t: CodingNsTranslator; readonly compact?: boolean }): 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 argumentPreview = compact ? assistantToolArgumentPreview(call, t) : ''\n const rowColor = call.state === 'failed' ? dshThemeColor.error : dshThemeColor.labelSecondary\n return createElement('div', { 'data-codingns-assistant-tool-row': call.name, 'data-codingns-assistant-tool': call.name, 'data-state': call.state,\n style: { minWidth: 0, color: rowColor, fontSize: uiFontSize(13), lineHeight: 1.65 } },\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, minWidth: 0, padding: '1px 0' } },\n createElement(AssistantRecordChevron), createElement('span', { style: { flexShrink: 0 } }, label),\n createElement('span', { style: { color: dshThemeColor.labelTertiary, flexShrink: 0 } }, '·'),\n createElement('span', { title: call.name, style: { minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontFamily: dshThemeColor.codeFont } },\n call.name, argumentPreview ? ` · ${argumentPreview}` : '')),\n createElement('div', { className: 'codingns-assistant-tool-body', style: { display: 'grid', gap: 0, margin: '2px 0 4px 22px', border: `0.5px solid ${dshThemeColor.border}`, borderRadius: 6, overflow: 'hidden', minWidth: 0 } },\n ...[[t('awb.call.arguments'), call.arguments], [t('awb.call.result'), call.result]].map(([heading, value], index) => createElement('div', { key: heading,\n style: { display: 'grid', gridTemplateColumns: 'max-content minmax(0, 1fr)', gap: 12, alignItems: 'baseline', padding: '7px 10px', minWidth: 0,\n ...(index === 0 ? {} : { borderTop: `0.5px solid ${dshThemeColor.border}` }) } },\n createElement('small', { style: { color: dshThemeColor.labelTertiary, fontSize: uiFontSize(11), whiteSpace: 'nowrap' } }, heading),\n createElement('pre', { tabIndex: 0, 'aria-label': heading, style: { margin: 0, color: dshThemeColor.labelSecondary, maxHeight: 160, overflowY: 'auto', overscrollBehavior: 'contain', scrollbarWidth: 'thin',\n whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', fontFamily: dshThemeColor.codeFont, fontSize: uiFontSize(11), lineHeight: 1.5 } }, value || '—'))))))\n}\n\nfunction AssistantStepChevron(): ReactElement {\n return createElement('svg', { className: 'codingns-assistant-step-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: 'm6 9 6 6 6-6' }))\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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(18), overflowWrap: 'anywhere' } }, name),\n createElement('span', { style: { fontSize: uiFontSize(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: uiFontSize(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: uiFontSize(13), lineHeight: 1.6, color: dshThemeColor.labelTertiary } }, userText) : null,\n createElement('div', { 'aria-live': 'polite', style: { flexShrink: 0, display: 'grid', gap: 8, fontSize: uiFontSize(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: uiFontSize(13), fontWeight: 600 } }, t('awb.call.record')),\n createElement('span', { style: { fontSize: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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: uiFontSize(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'\nimport { uiFontSize } from '../font-scale.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: uiFontSize(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 - 44px))', minHeight: 0 } : {}) } },\n calling ? null : createElement('header', { style: { ...row, flexShrink: 0, padding: '22px 22px 11px' } },\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: uiFontSize(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 // 通话页自带统一内边距,外层不重复叠加;普通对话与设置页横向 22px、纵向 11px。\n style: { flex: '1 1 auto', padding: calling ? 0 : '11px 22px', overflowY: 'auto', overscrollBehavior: 'contain', minHeight: 0, display: 'flex', flexDirection: 'column', gap: configuring ? 11 : 16 } },\n !loaded ? createElement(AssistantLoadingView, { t }) : null,\n noticeText ? createElement('div', { role: 'alert', style: { color: dshThemeColor.error, fontSize: uiFontSize(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: '11px 22px 22px',\n 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: '11px 22px 22px', 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/** 首次读取期间使用居中的动态状态,避免把正常等待误显示成失败或重试入口。 */\nexport function AssistantLoadingView({ t }: { readonly t: CodingNsTranslator }): ReactElement {\n return createElement('div', { 'data-codingns-assistant-loading': true, role: 'status', 'aria-live': 'polite', 'aria-label': t('awb.loading'), style: assistantLoadingStyle },\n createElement('style', null, assistantLoadingCss),\n createElement('div', { 'aria-hidden': true, style: assistantLoadingOrbStyle },\n createElement('span', { className: 'codingns-assistant-loading-ring' }),\n createElement('span', { className: 'codingns-assistant-loading-core' }),\n createElement('span', { className: 'codingns-assistant-loading-dot codingns-assistant-loading-dot-one' }),\n createElement('span', { className: 'codingns-assistant-loading-dot codingns-assistant-loading-dot-two' }),\n createElement('span', { className: 'codingns-assistant-loading-dot codingns-assistant-loading-dot-three' })),\n createElement('div', { style: assistantLoadingLabelStyle }, t('awb.loadingHint')))\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 assistantLoadingStyle: CSSProperties = { flex: '1 1 auto', minHeight: 'min(420px, 45vh)', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 18, color: dshThemeColor.labelSecondary }\nconst assistantLoadingOrbStyle: CSSProperties = { position: 'relative', width: 76, height: 76, borderRadius: '50%', background: `radial-gradient(circle at 35% 28%, ${dshThemeColor.accent}33, transparent 58%)`, boxShadow: `0 0 0 1px ${dshThemeColor.border}, 0 0 42px ${dshThemeColor.accent}24` }\nconst assistantLoadingLabelStyle: CSSProperties = { fontSize: uiFontSize(13), letterSpacing: '0.04em' }\nconst assistantLoadingCss = `\n [data-codingns-assistant-loading] .codingns-assistant-loading-ring,\n [data-codingns-assistant-loading] .codingns-assistant-loading-core,\n [data-codingns-assistant-loading] .codingns-assistant-loading-dot{position:absolute;display:block;border-radius:50%}\n [data-codingns-assistant-loading] .codingns-assistant-loading-ring{inset:7px;border:1px solid ${dshThemeColor.accent}88;border-top-color:transparent;border-left-color:${dshThemeColor.accent};animation:codingns-assistant-loading-spin 2.8s linear infinite}\n [data-codingns-assistant-loading] .codingns-assistant-loading-core{inset:22px;background:${dshThemeColor.accent};box-shadow:0 0 18px ${dshThemeColor.accent}aa;animation:codingns-assistant-loading-breathe 1.8s ease-in-out infinite}\n [data-codingns-assistant-loading] .codingns-assistant-loading-dot{width:6px;height:6px;background:${dshThemeColor.labelPrimary};box-shadow:0 0 10px ${dshThemeColor.accent};animation:codingns-assistant-loading-pulse 1.8s ease-in-out infinite}\n [data-codingns-assistant-loading] .codingns-assistant-loading-dot-one{top:4px;left:35px}\n [data-codingns-assistant-loading] .codingns-assistant-loading-dot-two{right:7px;bottom:20px;animation-delay:.22s}\n [data-codingns-assistant-loading] .codingns-assistant-loading-dot-three{left:7px;bottom:20px;animation-delay:.44s}\n @keyframes codingns-assistant-loading-spin{to{transform:rotate(360deg)}}\n @keyframes codingns-assistant-loading-breathe{0%,100%{transform:scale(.82);opacity:.72}50%{transform:scale(1.08);opacity:1}}\n @keyframes codingns-assistant-loading-pulse{0%,100%{transform:scale(.65);opacity:.36}50%{transform:scale(1.15);opacity:1}}\n @media (prefers-reduced-motion:reduce){\n [data-codingns-assistant-loading] .codingns-assistant-loading-ring,\n [data-codingns-assistant-loading] .codingns-assistant-loading-core,\n [data-codingns-assistant-loading] .codingns-assistant-loading-dot{animation:none}\n }\n`\n// 工作台外层统一保留 22px 四向边距;内部滚动区、页脚和组件间距保持原值。\nconst backdrop: CSSProperties = { position: 'fixed', inset: 0, zIndex: 10000, background: dshThemeColor.overlay, backdropFilter: 'blur(6px)', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 22, boxSizing: 'border-box' }\nconst dialog: CSSProperties = { display: 'flex', flexDirection: 'column', width: 'min(940px, 100%)', maxHeight: 'calc(100dvh - 44px)', 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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"}