@dxos/plugin-assistant 0.8.4-main.422d1c7879 → 0.8.4-main.51f1e5ca51

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 (400) hide show
  1. package/dist/lib/browser/AssistantSettings-GG52BLKS.mjs +40 -0
  2. package/dist/lib/browser/AssistantSettings-GG52BLKS.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +26 -3
  4. package/dist/lib/browser/blueprints/index.mjs.map +4 -4
  5. package/dist/lib/browser/{chunk-ATHYBVGN.mjs → chunk-RIJNPAYC.mjs} +5 -5
  6. package/dist/lib/browser/chunk-RIJNPAYC.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-LMVTXH54.mjs → chunk-SEMCG4ZK.mjs} +58 -17
  8. package/dist/lib/browser/chunk-SEMCG4ZK.mjs.map +7 -0
  9. package/dist/lib/browser/cli/index.mjs +3 -4
  10. package/dist/lib/browser/cli/index.mjs.map +3 -3
  11. package/dist/lib/browser/{create-chat-LBZHGVSN.mjs → create-chat-FZJASOQS.mjs} +5 -13
  12. package/dist/lib/browser/create-chat-FZJASOQS.mjs.map +7 -0
  13. package/dist/lib/browser/{ensure-companion-chat-ZEZA34MZ.mjs → ensure-companion-chat-PHUWWFVY.mjs} +4 -4
  14. package/dist/lib/browser/ensure-companion-chat-PHUWWFVY.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +804 -880
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{on-create-space-54RNX5JI.mjs → on-create-space-OQNCM7NC.mjs} +3 -3
  19. package/dist/lib/browser/{on-create-space-54RNX5JI.mjs.map → on-create-space-OQNCM7NC.mjs.map} +1 -1
  20. package/dist/lib/browser/operations/index.mjs +3 -3
  21. package/dist/lib/browser/operations/index.mjs.map +3 -3
  22. package/dist/lib/browser/{resolve-navigation-targets-NZOD66NY.mjs → resolve-navigation-targets-PMNR7D3P.mjs} +3 -3
  23. package/dist/lib/browser/{resolve-navigation-targets-NZOD66NY.mjs.map → resolve-navigation-targets-PMNR7D3P.mjs.map} +1 -1
  24. package/dist/lib/browser/{run-prompt-in-new-chat-THLK5YQC.mjs → run-prompt-in-new-chat-4XDYFKCV.mjs} +10 -39
  25. package/dist/lib/browser/run-prompt-in-new-chat-4XDYFKCV.mjs.map +7 -0
  26. package/dist/lib/browser/{set-current-chat-LRS3VFSH.mjs → set-current-chat-7V4DA66I.mjs} +4 -4
  27. package/dist/lib/browser/set-current-chat-7V4DA66I.mjs.map +7 -0
  28. package/dist/lib/browser/translations.mjs +171 -0
  29. package/dist/lib/browser/translations.mjs.map +7 -0
  30. package/dist/lib/browser/types/index.mjs +1 -3
  31. package/dist/lib/browser/{update-chat-name-3Y36KFAS.mjs → update-chat-name-ZGMU2UGN.mjs} +7 -22
  32. package/dist/lib/browser/update-chat-name-ZGMU2UGN.mjs.map +7 -0
  33. package/dist/lib/node-esm/AssistantSettings-23A5IMHS.mjs +41 -0
  34. package/dist/lib/node-esm/AssistantSettings-23A5IMHS.mjs.map +7 -0
  35. package/dist/lib/node-esm/blueprints/index.mjs +26 -3
  36. package/dist/lib/node-esm/blueprints/index.mjs.map +4 -4
  37. package/dist/lib/node-esm/{chunk-PXAJSTGZ.mjs → chunk-NCIZY5ZV.mjs} +5 -5
  38. package/dist/lib/node-esm/chunk-NCIZY5ZV.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-W3JZ2F4T.mjs → chunk-XAFVSEUJ.mjs} +58 -17
  40. package/dist/lib/node-esm/chunk-XAFVSEUJ.mjs.map +7 -0
  41. package/dist/lib/node-esm/cli/index.mjs +3 -4
  42. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  43. package/dist/lib/node-esm/{create-chat-3BEG4R6J.mjs → create-chat-RY6A4WUV.mjs} +5 -13
  44. package/dist/lib/node-esm/create-chat-RY6A4WUV.mjs.map +7 -0
  45. package/dist/lib/node-esm/{ensure-companion-chat-6K2WEWFP.mjs → ensure-companion-chat-BTDU5TS2.mjs} +4 -4
  46. package/dist/lib/node-esm/ensure-companion-chat-BTDU5TS2.mjs.map +7 -0
  47. package/dist/lib/node-esm/index.mjs +804 -880
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/{on-create-space-YRPZ6HZY.mjs → on-create-space-4LWCYT3H.mjs} +3 -3
  51. package/dist/lib/node-esm/{on-create-space-YRPZ6HZY.mjs.map → on-create-space-4LWCYT3H.mjs.map} +1 -1
  52. package/dist/lib/node-esm/operations/index.mjs +3 -3
  53. package/dist/lib/node-esm/operations/index.mjs.map +3 -3
  54. package/dist/lib/node-esm/{resolve-navigation-targets-3PPK7XLH.mjs → resolve-navigation-targets-GHS3XPVP.mjs} +3 -3
  55. package/dist/lib/node-esm/{resolve-navigation-targets-3PPK7XLH.mjs.map → resolve-navigation-targets-GHS3XPVP.mjs.map} +1 -1
  56. package/dist/lib/node-esm/{run-prompt-in-new-chat-OUYKCMQ7.mjs → run-prompt-in-new-chat-UF54E34O.mjs} +10 -39
  57. package/dist/lib/node-esm/run-prompt-in-new-chat-UF54E34O.mjs.map +7 -0
  58. package/dist/lib/node-esm/{set-current-chat-SMXZJD3F.mjs → set-current-chat-SWPAOLZL.mjs} +4 -4
  59. package/dist/lib/node-esm/set-current-chat-SWPAOLZL.mjs.map +7 -0
  60. package/dist/lib/node-esm/translations.mjs +172 -0
  61. package/dist/lib/node-esm/translations.mjs.map +7 -0
  62. package/dist/lib/node-esm/types/index.mjs +1 -3
  63. package/dist/lib/node-esm/{update-chat-name-HM2P4NSI.mjs → update-chat-name-CW6K5M37.mjs} +7 -22
  64. package/dist/lib/node-esm/update-chat-name-CW6K5M37.mjs.map +7 -0
  65. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  66. package/dist/types/src/blueprints/assistant/blueprint.d.ts +2 -2
  67. package/dist/types/src/blueprints/assistant/blueprint.d.ts.map +1 -1
  68. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/companion-chat-provisioner.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/index.d.ts +2 -2
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  77. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/migrations.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  80. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  85. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  86. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts +1 -1
  87. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  88. package/dist/types/src/components/AssistantSettings/AssistantSettings.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Chat/Chat.d.ts +29 -39
  90. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  91. package/dist/types/src/components/Chat/context.d.ts +29 -0
  92. package/dist/types/src/components/Chat/context.d.ts.map +1 -0
  93. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  94. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +5 -3
  95. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  96. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts +1 -1
  97. package/dist/types/src/components/ChatPrompt/ChatOptions.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/ChatPrompt/ChatPresets.d.ts.map +1 -1
  99. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts +28 -0
  100. package/dist/types/src/components/ChatPrompt/ChatPrompt.d.ts.map +1 -0
  101. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  102. package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts +20 -0
  103. package/dist/types/src/components/ChatPrompt/ChatStatus.d.ts.map +1 -0
  104. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +1 -1
  105. package/dist/types/src/components/ChatPrompt/index.d.ts +2 -0
  106. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  107. package/dist/types/src/components/ChatThread/Anchor.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/ChatThread/ChatThread.d.ts +6 -3
  109. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  110. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +4 -3
  111. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -1
  113. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts +1 -1
  114. package/dist/types/src/components/ChatThread/MarkdownStream.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/ChatThread/registry.d.ts +18 -0
  116. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -1
  117. package/dist/types/src/components/ChatThread/sync.d.ts +1 -1
  118. package/dist/types/src/components/ChatThread/sync.d.ts.map +1 -1
  119. package/dist/types/src/components/ChatThread/tool-widget-state.d.ts.map +1 -1
  120. package/dist/types/src/components/ChatThread/widgets/FallbackWidget.d.ts +4 -4
  121. package/dist/types/src/components/ChatThread/widgets/FallbackWidget.d.ts.map +1 -1
  122. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.d.ts.map +1 -1
  123. package/dist/types/src/components/ChatThread/widgets/ReasoningWidget.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ChatThread/widgets/ReferenceWidget.d.ts.map +1 -1
  125. package/dist/types/src/components/ChatThread/widgets/SelectWidget.d.ts.map +1 -1
  126. package/dist/types/src/components/ChatThread/widgets/StatsWidget.d.ts.map +1 -1
  127. package/dist/types/src/components/ChatThread/widgets/StatusWidget.d.ts.map +1 -1
  128. package/dist/types/src/components/ChatThread/widgets/SuggestionWidget.d.ts.map +1 -1
  129. package/dist/types/src/components/ChatThread/widgets/SummaryWidget.d.ts.map +1 -1
  130. package/dist/types/src/components/ChatThread/widgets/ToolWidget.d.ts.map +1 -1
  131. package/dist/types/src/components/ChatThread/widgets/ToolWidget.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts +5 -0
  133. package/dist/types/src/components/ChatThread/widgets/defaults.d.ts.map +1 -0
  134. package/dist/types/src/components/ChatThread/widgets/index.d.ts +1 -2
  135. package/dist/types/src/components/ChatThread/widgets/index.d.ts.map +1 -1
  136. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +2 -1
  137. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  138. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +0 -1
  139. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -2
  141. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  142. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +3 -3
  144. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  145. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  146. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +1 -1
  147. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts.map +1 -1
  148. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +4 -4
  149. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -1
  150. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -3
  151. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  152. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  153. package/dist/types/src/containers/AgentArticle/AgentArticle.d.ts.map +1 -1
  154. package/dist/types/src/containers/AgentArticle/AgentArticle.stories.d.ts.map +1 -1
  155. package/dist/types/src/containers/AgentProperties/AgentProperties.d.ts.map +1 -1
  156. package/dist/types/src/containers/AgentProperties/AgentProperties.stories.d.ts.map +1 -1
  157. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts +1 -1
  158. package/dist/types/src/containers/BlueprintArticle/BlueprintArticle.d.ts.map +1 -1
  159. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +1 -1
  160. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -1
  161. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  162. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts +6 -0
  163. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +1 -0
  164. package/dist/types/src/containers/RoutineArticle/index.d.ts +2 -0
  165. package/dist/types/src/containers/RoutineArticle/index.d.ts.map +1 -0
  166. package/dist/types/src/containers/RoutineList/RoutineList.d.ts +6 -0
  167. package/dist/types/src/containers/RoutineList/RoutineList.d.ts.map +1 -0
  168. package/dist/types/src/containers/{PromptList/PromptList.stories.d.ts → RoutineList/RoutineList.stories.d.ts} +1 -1
  169. package/dist/types/src/containers/RoutineList/RoutineList.stories.d.ts.map +1 -0
  170. package/dist/types/src/containers/RoutineList/index.d.ts +2 -0
  171. package/dist/types/src/containers/RoutineList/index.d.ts.map +1 -0
  172. package/dist/types/src/containers/TracePanel/TracePanel.d.ts +3 -2
  173. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  174. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts +1 -4
  175. package/dist/types/src/containers/TracePanel/TracePanel.stories.d.ts.map +1 -1
  176. package/dist/types/src/containers/TracePanel/dxn-extractor.d.ts +1 -1
  177. package/dist/types/src/containers/TracePanel/dxn-extractor.d.ts.map +1 -1
  178. package/dist/types/src/containers/TracePanel/execution-graph.d.ts +81 -1
  179. package/dist/types/src/containers/TracePanel/execution-graph.d.ts.map +1 -1
  180. package/dist/types/src/containers/TracePanel/execution-graph.test.d.ts +2 -0
  181. package/dist/types/src/containers/TracePanel/execution-graph.test.d.ts.map +1 -0
  182. package/dist/types/src/containers/TracePanel/index.d.ts.map +1 -1
  183. package/dist/types/src/containers/TracePanel/testing/index.d.ts +3 -0
  184. package/dist/types/src/containers/TracePanel/testing/index.d.ts.map +1 -0
  185. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts +14 -0
  186. package/dist/types/src/containers/TracePanel/testing/simulated-agent.d.ts.map +1 -0
  187. package/dist/types/src/containers/TracePanel/testing/snapshot-playback.d.ts +12 -0
  188. package/dist/types/src/containers/TracePanel/testing/snapshot-playback.d.ts.map +1 -0
  189. package/dist/types/src/containers/TriggerStatus/TriggerStatus.d.ts.map +1 -1
  190. package/dist/types/src/containers/index.d.ts +2 -2
  191. package/dist/types/src/containers/index.d.ts.map +1 -1
  192. package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
  193. package/dist/types/src/hooks/index.d.ts +2 -0
  194. package/dist/types/src/hooks/index.d.ts.map +1 -1
  195. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +1 -1
  196. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useChatKeymap.d.ts +12 -0
  198. package/dist/types/src/hooks/useChatKeymap.d.ts.map +1 -0
  199. package/dist/types/src/hooks/useChatProcessor.d.ts +1 -1
  200. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  202. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -1
  203. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -1
  204. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useDebug.d.ts +10 -0
  206. package/dist/types/src/hooks/useDebug.d.ts.map +1 -0
  207. package/dist/types/src/hooks/useFilteredTypes.d.ts.map +1 -1
  208. package/dist/types/src/hooks/useFlush.d.ts +1 -1
  209. package/dist/types/src/hooks/useFlush.d.ts.map +1 -1
  210. package/dist/types/src/hooks/usePresets.d.ts.map +1 -1
  211. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  212. package/dist/types/src/index.d.ts +0 -3
  213. package/dist/types/src/index.d.ts.map +1 -1
  214. package/dist/types/src/operations/create-chat.d.ts +1 -1
  215. package/dist/types/src/operations/create-chat.d.ts.map +1 -1
  216. package/dist/types/src/operations/definitions.d.ts +24 -19
  217. package/dist/types/src/operations/definitions.d.ts.map +1 -1
  218. package/dist/types/src/operations/ensure-companion-chat.d.ts +1 -1
  219. package/dist/types/src/operations/ensure-companion-chat.d.ts.map +1 -1
  220. package/dist/types/src/operations/index.d.ts +1 -1
  221. package/dist/types/src/operations/index.d.ts.map +1 -1
  222. package/dist/types/src/operations/on-create-space.d.ts +1 -1
  223. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  224. package/dist/types/src/operations/resolve-navigation-targets.d.ts +1 -1
  225. package/dist/types/src/operations/resolve-navigation-targets.d.ts.map +1 -1
  226. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts +1 -1
  227. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
  228. package/dist/types/src/operations/set-current-chat.d.ts +1 -1
  229. package/dist/types/src/operations/set-current-chat.d.ts.map +1 -1
  230. package/dist/types/src/operations/update-chat-name.d.ts +1 -1
  231. package/dist/types/src/operations/update-chat-name.d.ts.map +1 -1
  232. package/dist/types/src/processor/processor.d.ts +2 -2
  233. package/dist/types/src/processor/processor.d.ts.map +1 -1
  234. package/dist/types/src/queue-logger.d.ts.map +1 -1
  235. package/dist/types/src/testing/index.d.ts +1 -0
  236. package/dist/types/src/testing/index.d.ts.map +1 -1
  237. package/dist/types/src/testing/test-generator.d.ts +1 -1
  238. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  239. package/dist/types/src/testing/test-services.d.ts.map +1 -1
  240. package/dist/types/src/testing/test-trace.d.ts +5 -0
  241. package/dist/types/src/testing/test-trace.d.ts.map +1 -0
  242. package/dist/types/src/translations.d.ts.map +1 -1
  243. package/dist/types/src/types/Assistant.d.ts +22 -6
  244. package/dist/types/src/types/Assistant.d.ts.map +1 -1
  245. package/dist/types/src/types/Settings.d.ts +20 -5
  246. package/dist/types/src/types/Settings.d.ts.map +1 -1
  247. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  248. package/dist/types/src/types/events.d.ts.map +1 -1
  249. package/dist/types/src/types/index.d.ts +0 -1
  250. package/dist/types/src/types/index.d.ts.map +1 -1
  251. package/dist/types/src/types/service.d.ts +1 -1
  252. package/dist/types/src/types/service.d.ts.map +1 -1
  253. package/dist/types/tsconfig.tsbuildinfo +1 -1
  254. package/package.json +95 -91
  255. package/src/AssistantPlugin.tsx +10 -12
  256. package/src/blueprints/assistant/blueprint.test.ts +3 -3
  257. package/src/blueprints/assistant/blueprint.ts +3 -3
  258. package/src/capabilities/app-graph-builder.ts +3 -3
  259. package/src/capabilities/blueprint-definition.ts +0 -4
  260. package/src/capabilities/index.ts +1 -1
  261. package/src/capabilities/markdown.ts +1 -1
  262. package/src/capabilities/migrations.ts +1 -8
  263. package/src/capabilities/operation-handler.ts +1 -1
  264. package/src/capabilities/react-surface.tsx +16 -10
  265. package/src/cli/plugin.ts +3 -4
  266. package/src/components/AssistantSettings/AssistantSettings.stories.tsx +3 -2
  267. package/src/components/AssistantSettings/AssistantSettings.tsx +22 -111
  268. package/src/components/Chat/Chat.tsx +56 -260
  269. package/src/components/Chat/context.ts +39 -0
  270. package/src/components/ChatPrompt/ChatActions.tsx +10 -10
  271. package/src/components/ChatPrompt/ChatOptions.stories.tsx +24 -10
  272. package/src/components/ChatPrompt/ChatOptions.tsx +60 -31
  273. package/src/components/ChatPrompt/ChatPrompt.tsx +179 -0
  274. package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
  275. package/src/components/ChatPrompt/ChatStatus.tsx +123 -0
  276. package/src/components/ChatPrompt/index.ts +2 -0
  277. package/src/components/ChatThread/ChatThread.stories.tsx +3 -3
  278. package/src/components/ChatThread/ChatThread.tsx +31 -18
  279. package/src/components/ChatThread/DEBUG.md +41 -0
  280. package/src/components/ChatThread/MarkdownStream.stories.tsx +5 -4
  281. package/src/components/ChatThread/registry.tsx +53 -14
  282. package/src/components/ChatThread/sync.test.ts +80 -12
  283. package/src/components/ChatThread/sync.ts +1 -1
  284. package/src/components/ChatThread/widgets/ReasoningWidget.ts +6 -6
  285. package/src/components/ChatThread/widgets/ReferenceWidget.ts +3 -1
  286. package/src/components/ChatThread/widgets/SelectWidget.ts +3 -1
  287. package/src/components/ChatThread/widgets/StatsWidget.ts +3 -1
  288. package/src/components/ChatThread/widgets/StatusWidget.ts +3 -1
  289. package/src/components/ChatThread/widgets/SuggestionWidget.ts +1 -1
  290. package/src/components/ChatThread/widgets/SummaryWidget.tsx +3 -2
  291. package/src/components/ChatThread/widgets/ToolWidget.stories.tsx +2 -1
  292. package/src/components/ChatThread/widgets/defaults.ts +8 -0
  293. package/src/components/ChatThread/widgets/index.ts +1 -2
  294. package/src/components/ProcessTree/ProcessTree.stories.tsx +12 -38
  295. package/src/components/ProcessTree/ProcessTree.tsx +67 -35
  296. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +3 -2
  297. package/src/components/TemplateEditor/TemplateEditor.tsx +5 -5
  298. package/src/components/TemplateEditor/TemplateForm.stories.tsx +4 -3
  299. package/src/components/TemplateEditor/TemplateForm.tsx +3 -3
  300. package/src/components/Toolbox/Toolbox.stories.tsx +2 -1
  301. package/src/components/Toolbox/Toolbox.tsx +2 -2
  302. package/src/containers/AgentArticle/AgentArticle.stories.tsx +1 -1
  303. package/src/containers/AgentArticle/AgentArticle.tsx +2 -2
  304. package/src/containers/AgentProperties/AgentProperties.stories.tsx +2 -1
  305. package/src/containers/AgentProperties/AgentProperties.tsx +2 -2
  306. package/src/containers/BlueprintArticle/BlueprintArticle.tsx +1 -1
  307. package/src/containers/ChatCompanion/ChatCompanion.tsx +1 -1
  308. package/src/containers/ChatContainer/ChatContainer.tsx +16 -6
  309. package/src/containers/ChatDialog/ChatDialog.tsx +3 -9
  310. package/src/containers/{PromptArticle/PromptArticle.tsx → RoutineArticle/RoutineArticle.tsx} +4 -4
  311. package/src/containers/RoutineArticle/index.ts +5 -0
  312. package/src/containers/{PromptList/PromptList.stories.tsx → RoutineList/RoutineList.stories.tsx} +10 -9
  313. package/src/containers/{PromptList/PromptList.tsx → RoutineList/RoutineList.tsx} +6 -5
  314. package/src/containers/RoutineList/index.ts +5 -0
  315. package/src/containers/TracePanel/TracePanel.stories.tsx +204 -198
  316. package/src/containers/TracePanel/TracePanel.tsx +69 -44
  317. package/src/containers/TracePanel/dxn-extractor.test.ts +7 -7
  318. package/src/containers/TracePanel/dxn-extractor.ts +4 -4
  319. package/src/containers/TracePanel/execution-graph.test.ts +382 -0
  320. package/src/containers/TracePanel/execution-graph.ts +340 -213
  321. package/src/containers/TracePanel/testing/index.ts +6 -0
  322. package/src/containers/TracePanel/testing/simulated-agent.ts +114 -0
  323. package/src/containers/TracePanel/testing/snapshot-playback.ts +45 -0
  324. package/src/containers/index.ts +2 -2
  325. package/src/hooks/index.ts +2 -0
  326. package/src/hooks/useBlueprintRegistry.ts +1 -1
  327. package/src/hooks/useChatKeymap.ts +52 -0
  328. package/src/hooks/useChatProcessor.ts +1 -1
  329. package/src/hooks/useDebug.ts +38 -0
  330. package/src/index.ts +0 -3
  331. package/src/operations/create-chat.ts +2 -2
  332. package/src/operations/definitions.ts +4 -4
  333. package/src/operations/ensure-companion-chat.ts +1 -1
  334. package/src/operations/index.ts +1 -1
  335. package/src/operations/on-create-space.ts +1 -1
  336. package/src/operations/prompt.test.ts +5 -6
  337. package/src/operations/resolve-navigation-targets.ts +1 -1
  338. package/src/operations/run-prompt-in-new-chat.ts +3 -3
  339. package/src/operations/set-current-chat.ts +1 -1
  340. package/src/operations/update-chat-name.ts +2 -2
  341. package/src/processor/processor.test.ts +1 -1
  342. package/src/processor/processor.ts +4 -4
  343. package/src/queue-logger.ts +1 -1
  344. package/src/testing/data/trace-timeline.dx.json +3737 -1200
  345. package/src/testing/index.ts +1 -0
  346. package/src/testing/test-generator.test.ts +1 -1
  347. package/src/testing/test-generator.ts +4 -4
  348. package/src/testing/test-trace.ts +20 -0
  349. package/src/testing/trace-timeline.conversations.json +1 -1
  350. package/src/testing/trace-timeline.test.ts +53 -49
  351. package/src/translations.ts +24 -31
  352. package/src/types/Assistant.ts +11 -0
  353. package/src/types/Settings.ts +62 -7
  354. package/src/types/index.ts +0 -1
  355. package/src/types/service.ts +1 -1
  356. package/dist/lib/browser/AssistantSettings-7QMO3LGF.mjs +0 -97
  357. package/dist/lib/browser/AssistantSettings-7QMO3LGF.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-ATHYBVGN.mjs.map +0 -7
  359. package/dist/lib/browser/chunk-EZRS3J25.mjs +0 -30
  360. package/dist/lib/browser/chunk-EZRS3J25.mjs.map +0 -7
  361. package/dist/lib/browser/chunk-LMVTXH54.mjs.map +0 -7
  362. package/dist/lib/browser/create-chat-LBZHGVSN.mjs.map +0 -7
  363. package/dist/lib/browser/ensure-companion-chat-ZEZA34MZ.mjs.map +0 -7
  364. package/dist/lib/browser/run-prompt-in-new-chat-THLK5YQC.mjs.map +0 -7
  365. package/dist/lib/browser/set-current-chat-LRS3VFSH.mjs.map +0 -7
  366. package/dist/lib/browser/update-chat-name-3Y36KFAS.mjs.map +0 -7
  367. package/dist/lib/node-esm/AssistantSettings-UVUTKO7E.mjs +0 -98
  368. package/dist/lib/node-esm/AssistantSettings-UVUTKO7E.mjs.map +0 -7
  369. package/dist/lib/node-esm/chunk-NZIKC7AN.mjs +0 -32
  370. package/dist/lib/node-esm/chunk-NZIKC7AN.mjs.map +0 -7
  371. package/dist/lib/node-esm/chunk-PXAJSTGZ.mjs.map +0 -7
  372. package/dist/lib/node-esm/chunk-W3JZ2F4T.mjs.map +0 -7
  373. package/dist/lib/node-esm/create-chat-3BEG4R6J.mjs.map +0 -7
  374. package/dist/lib/node-esm/ensure-companion-chat-6K2WEWFP.mjs.map +0 -7
  375. package/dist/lib/node-esm/run-prompt-in-new-chat-OUYKCMQ7.mjs.map +0 -7
  376. package/dist/lib/node-esm/set-current-chat-SMXZJD3F.mjs.map +0 -7
  377. package/dist/lib/node-esm/update-chat-name-HM2P4NSI.mjs.map +0 -7
  378. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts +0 -10
  379. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts.map +0 -1
  380. package/dist/types/src/components/ChatProgress/index.d.ts +0 -2
  381. package/dist/types/src/components/ChatProgress/index.d.ts.map +0 -1
  382. package/dist/types/src/components/ChatThread/widgets/PromptWidget.d.ts +0 -15
  383. package/dist/types/src/components/ChatThread/widgets/PromptWidget.d.ts.map +0 -1
  384. package/dist/types/src/containers/PromptArticle/PromptArticle.d.ts +0 -6
  385. package/dist/types/src/containers/PromptArticle/PromptArticle.d.ts.map +0 -1
  386. package/dist/types/src/containers/PromptArticle/index.d.ts +0 -2
  387. package/dist/types/src/containers/PromptArticle/index.d.ts.map +0 -1
  388. package/dist/types/src/containers/PromptList/PromptList.d.ts +0 -6
  389. package/dist/types/src/containers/PromptList/PromptList.d.ts.map +0 -1
  390. package/dist/types/src/containers/PromptList/PromptList.stories.d.ts.map +0 -1
  391. package/dist/types/src/containers/PromptList/index.d.ts +0 -2
  392. package/dist/types/src/containers/PromptList/index.d.ts.map +0 -1
  393. package/dist/types/src/types/defs.d.ts +0 -2
  394. package/dist/types/src/types/defs.d.ts.map +0 -1
  395. package/src/components/ChatProgress/ChatProgress.tsx +0 -56
  396. package/src/components/ChatProgress/index.ts +0 -5
  397. package/src/components/ChatThread/widgets/PromptWidget.ts +0 -30
  398. package/src/containers/PromptArticle/index.ts +0 -5
  399. package/src/containers/PromptList/index.ts +0 -5
  400. package/src/types/defs.ts +0 -5
@@ -2,130 +2,41 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useMemo } from 'react';
6
6
 
7
- import { DEFAULT_EDGE_MODELS, DEFAULT_OLLAMA_MODELS } from '@dxos/ai';
7
+ import { DEFAULT_EDGE_MODELS, DEFAULT_LMSTUDIO_MODELS, DEFAULT_OLLAMA_MODELS } from '@dxos/ai';
8
8
  import { type AppSurface } from '@dxos/app-toolkit/ui';
9
- import { Input, Select, useTranslation } from '@dxos/react-ui';
10
- import { Settings as SettingsForm } from '@dxos/react-ui-form';
9
+ import { useTranslation } from '@dxos/react-ui';
10
+ import { Settings as SettingsForm, createSelectField } from '@dxos/react-ui-form';
11
11
 
12
12
  import { meta } from '#meta';
13
- import { type Assistant, LLM_PROVIDERS } from '#types';
14
-
15
- // TODO(burdon): Factor out default Selector.
16
- const DEFAULT_VALUE = '__default';
17
-
18
- const LLM_PROVIDER_LABELS = {
19
- edge: 'DXOS',
20
- ollama: 'Ollama',
21
- lmstudio: 'LM Studio',
22
- } as const;
13
+ import { Assistant } from '#types';
23
14
 
24
15
  export type AssistantSettingsProps = AppSurface.SettingsArticleProps<Assistant.Settings>;
25
16
 
26
17
  export const AssistantSettings = ({ settings, onSettingsChange }: AssistantSettingsProps) => {
27
18
  const { t } = useTranslation(meta.id);
19
+ const fieldMap = useMemo(
20
+ () => ({
21
+ modelDefaults: {
22
+ edge: createSelectField({ options: DEFAULT_EDGE_MODELS }),
23
+ ollama: createSelectField({ options: DEFAULT_OLLAMA_MODELS }),
24
+ lmstudio: createSelectField({ options: DEFAULT_LMSTUDIO_MODELS }),
25
+ },
26
+ }),
27
+ [],
28
+ );
28
29
 
29
30
  return (
30
31
  <SettingsForm.Viewport>
31
32
  <SettingsForm.Section title={t('settings.title', { ns: meta.id })}>
32
- <SettingsForm.Item
33
- title={t('settings.custom-prompts.label')}
34
- description={t('settings.custom-prompts.description')}
35
- >
36
- <Input.Switch
37
- disabled={!onSettingsChange}
38
- checked={!!settings.customPrompts}
39
- onCheckedChange={(checked) => onSettingsChange?.((s) => ({ ...s, customPrompts: checked }))}
40
- />
41
- </SettingsForm.Item>
42
-
43
- <SettingsForm.Item
44
- title={t('settings.llm-provider.label')}
45
- description={t('settings.llm-provider.description')}
46
- >
47
- <Select.Root
48
- disabled={!onSettingsChange}
49
- value={settings.llmProvider ?? 'edge'}
50
- onValueChange={(value) => {
51
- onSettingsChange?.((s) => ({
52
- ...s,
53
- llmProvider: value === DEFAULT_VALUE ? undefined : (value as any),
54
- }));
55
- }}
56
- >
57
- <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.llm-provider.label')} />
58
- <Select.Portal>
59
- <Select.Content>
60
- <Select.Viewport>
61
- <Select.Option value={DEFAULT_VALUE}>{t('settings.default.label')}</Select.Option>
62
- {LLM_PROVIDERS.map((model) => (
63
- <Select.Option key={model} value={model}>
64
- {LLM_PROVIDER_LABELS[model]}
65
- </Select.Option>
66
- ))}
67
- </Select.Viewport>
68
- <Select.Arrow />
69
- </Select.Content>
70
- </Select.Portal>
71
- </Select.Root>
72
- </SettingsForm.Item>
73
-
74
- <SettingsForm.Item
75
- title={t('settings.edge-llm-model.label')}
76
- description={t('settings.edge-llm-model.description')}
77
- >
78
- <Select.Root
79
- disabled={!onSettingsChange}
80
- value={settings.edgeModel ?? DEFAULT_VALUE}
81
- onValueChange={(value) => {
82
- onSettingsChange?.((s) => ({ ...s, edgeModel: value === DEFAULT_VALUE ? undefined : value }));
83
- }}
84
- >
85
- <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.default-llm-model.label')} />
86
- <Select.Portal>
87
- <Select.Content>
88
- <Select.Viewport>
89
- <Select.Option value={DEFAULT_VALUE}>{t('settings.default.label')}</Select.Option>
90
- {DEFAULT_EDGE_MODELS.map((model) => (
91
- <Select.Option key={model} value={model}>
92
- {model}
93
- </Select.Option>
94
- ))}
95
- </Select.Viewport>
96
- <Select.Arrow />
97
- </Select.Content>
98
- </Select.Portal>
99
- </Select.Root>
100
- </SettingsForm.Item>
101
-
102
- <SettingsForm.Item
103
- title={t('settings.ollama-llm-model.label')}
104
- description={t('settings.ollama-llm-model.description')}
105
- >
106
- <Select.Root
107
- disabled={!onSettingsChange}
108
- value={settings.ollamaModel ?? DEFAULT_VALUE}
109
- onValueChange={(value) => {
110
- onSettingsChange?.((s) => ({ ...s, ollamaModel: value === DEFAULT_VALUE ? undefined : value }));
111
- }}
112
- >
113
- <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.default-llm-model.label')} />
114
- <Select.Portal>
115
- <Select.Content>
116
- <Select.Viewport>
117
- <Select.Option value={DEFAULT_VALUE}>{t('settings.default.label')}</Select.Option>
118
- {DEFAULT_OLLAMA_MODELS.map((model) => (
119
- <Select.Option key={model} value={model}>
120
- {model}
121
- </Select.Option>
122
- ))}
123
- </Select.Viewport>
124
- <Select.Arrow />
125
- </Select.Content>
126
- </Select.Portal>
127
- </Select.Root>
128
- </SettingsForm.Item>
33
+ <SettingsForm.FieldSet<Assistant.Settings>
34
+ readonly={!onSettingsChange}
35
+ schema={Assistant.Settings}
36
+ fieldMap={fieldMap}
37
+ values={settings}
38
+ onValuesChanged={(values) => onSettingsChange?.(() => values)}
39
+ />
129
40
  </SettingsForm.Section>
130
41
  </SettingsForm.Viewport>
131
42
  );
@@ -2,59 +2,32 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Extension, Prec } from '@codemirror/state';
6
- import { keymap } from '@codemirror/view';
7
5
  import { useAtomValue } from '@effect-atom/atom-react';
8
- import { createContext } from '@radix-ui/react-context';
9
6
  import * as Array from 'effect/Array';
10
7
  import * as Option from 'effect/Option';
11
8
  import React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';
12
9
 
13
- import { type Chat as ChatModule } from '@dxos/assistant-toolkit';
14
10
  import { Event } from '@dxos/async';
15
- import { type Database, Filter, Obj } from '@dxos/echo';
16
- import { useVoiceInput } from '@dxos/plugin-transcription';
11
+ import { Filter, Obj } from '@dxos/echo';
17
12
  import { type Queue, useQuery } from '@dxos/react-client/echo';
18
13
  import { useIdentity } from '@dxos/react-client/halo';
19
- import { Input, type ThemedClassName, useDynamicRef, useTranslation } from '@dxos/react-ui';
20
- import { ChatEditor, type ChatEditorController, type ChatEditorProps } from '@dxos/react-ui-chat';
21
- import { type MarkdownStreamController } from '@dxos/react-ui-components';
14
+ import { type MarkdownStreamController } from '@dxos/react-ui-markdown';
22
15
  import { Menu, MenuRootProps } from '@dxos/react-ui-menu';
23
16
  import { Message } from '@dxos/types';
24
- import { composable, composableProps, mx } from '@dxos/ui-theme';
25
- import { isTruthy, trim } from '@dxos/util';
17
+ import { composable, composableProps } from '@dxos/ui-theme';
26
18
 
27
- import { useChatToolbarActions } from '#hooks';
28
- import { meta } from '#meta';
19
+ import { useChatKeymapExtensions, useChatToolbarActions, useDebug } from '#hooks';
29
20
 
30
- import { type AiChatProcessor } from '../../processor';
31
21
  import {
32
- ChatActions,
33
- type ChatActionsProps,
34
- ChatOptions,
35
- type ChatPresetsProps,
36
- ChatReferences,
37
- ChatStatusIndicator,
22
+ ChatStatus,
23
+ ChatPrompt as NaturalChatPrompt,
24
+ type ChatPromptProps as NaturalChatPromptProps,
38
25
  } from '../ChatPrompt';
39
26
  import { ChatThread as NaturalChatThread, type ChatThreadProps as NaturalChatThreadProps } from '../ChatThread';
27
+ import { ChatContextProvider, type ChatContextValue, type ChatRequestTiming, useChatContext } from './context';
40
28
  import { type ChatEvent } from './events';
41
29
 
42
- //
43
- // Context
44
- // NOTE: The context should not be exported. It is only used internally.
45
- // Components outside of this Radix-style group shuld define their own APIs.
46
- //
47
-
48
- type ChatContextValue = {
49
- debug?: boolean;
50
- event: Event<ChatEvent>;
51
- db?: Database.Database;
52
- chat?: ChatModule.Chat;
53
- messages: Message.Message[];
54
- processor: AiChatProcessor;
55
- };
56
-
57
- export const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');
30
+ export { useChatContext };
58
31
 
59
32
  //
60
33
  // Root
@@ -62,49 +35,28 @@ export const [ChatContextProvider, useChatContext] = createContext<ChatContextVa
62
35
 
63
36
  type ChatRootProps = PropsWithChildren<
64
37
  Pick<ChatContextValue, 'db' | 'chat' | 'processor'> & {
65
- queue?: Queue;
38
+ feed?: Queue;
66
39
  onEvent?: (event: ChatEvent) => void;
67
40
  }
68
41
  >;
69
42
 
70
- const ChatRoot = ({ children, chat, queue, processor, onEvent, ...props }: ChatRootProps) => {
43
+ const ChatRoot = ({ children, chat, feed, processor, onEvent, ...props }: ChatRootProps) => {
71
44
  const [debug, setDebug] = useState(false);
72
- const pending = useAtomValue(processor.messages);
73
45
  const streaming = useAtomValue(processor.streaming);
46
+ const active = useAtomValue(processor.active);
47
+ const requestTiming = useRequestTiming({ active });
74
48
  const lastPrompt = useRef<string | undefined>(undefined);
49
+ const db = props.db ?? (chat && Obj.getDatabase(chat));
50
+
51
+ const feedMessages = useQuery(feed, Filter.type(Message.Message));
52
+ const pendingMessages = useAtomValue(processor.messages);
53
+ const messages = useMemo(
54
+ () => Array.dedupeWith([...feedMessages, ...pendingMessages], ({ id: a }, { id: b }) => a === b),
55
+ [feedMessages, pendingMessages],
56
+ );
57
+
58
+ const dump = useDebug({ processor });
75
59
 
76
- // Messages.
77
- const storedMessages = useQuery(queue, Filter.type(Message.Message));
78
- const messages = useMemo(() => {
79
- return Array.dedupeWith([...storedMessages, ...pending], ({ id: a }, { id: b }) => a === b);
80
- }, [storedMessages, pending]);
81
-
82
- // Debug.
83
- const dump = useCallback(async () => {
84
- const objects = processor.context.getObjects();
85
- const blueprints = processor.context.getBlueprints();
86
- const system = await processor.getSystemPrompt();
87
- const tools = await processor.getTools();
88
-
89
- // eslint-disable-next-line no-console
90
- // eslint-disable-next-line no-console
91
- console.group('Chat', { objects, blueprints });
92
- // eslint-disable-next-line no-console
93
- console.log(trim`
94
- System Prompt:
95
- ${system}
96
- `);
97
- // eslint-disable-next-line no-console
98
- console.log(trim`
99
- Tools:
100
- ${Object.values(tools)
101
- .map((tool) => JSON.stringify(tool, null, 2))
102
- .join('\n')}
103
- `);
104
- console.groupEnd();
105
- }, [processor]);
106
-
107
- // Events.
108
60
  const event = useMemo(() => new Event<ChatEvent>(), []);
109
61
  useEffect(() => {
110
62
  return event.on((ev) => {
@@ -152,8 +104,6 @@ const ChatRoot = ({ children, chat, queue, processor, onEvent, ...props }: ChatR
152
104
  });
153
105
  }, [event, dump, processor, streaming, onEvent]);
154
106
 
155
- const db = props.db ?? (chat && Obj.getDatabase(chat));
156
-
157
107
  return (
158
108
  <ChatContextProvider
159
109
  debug={debug}
@@ -162,6 +112,7 @@ const ChatRoot = ({ children, chat, queue, processor, onEvent, ...props }: ChatR
162
112
  chat={chat}
163
113
  messages={messages}
164
114
  processor={processor}
115
+ requestTiming={requestTiming}
165
116
  {...props}
166
117
  >
167
118
  {children}
@@ -171,6 +122,19 @@ const ChatRoot = ({ children, chat, queue, processor, onEvent, ...props }: ChatR
171
122
 
172
123
  ChatRoot.displayName = 'Chat.Root';
173
124
 
125
+ const useRequestTiming = ({ active }: { active: boolean }) => {
126
+ const [requestTiming, setRequestTiming] = useState<ChatRequestTiming | null>(null);
127
+ useEffect(() => {
128
+ if (active) {
129
+ setRequestTiming({ startedAt: Date.now(), endedAt: null });
130
+ } else {
131
+ setRequestTiming((prev) => (prev && prev.endedAt == null ? { ...prev, endedAt: Date.now() } : prev));
132
+ }
133
+ }, [active]);
134
+
135
+ return requestTiming;
136
+ };
137
+
174
138
  //
175
139
  // Toolbar
176
140
  //
@@ -197,14 +161,14 @@ const ChatToolbar = composable<HTMLDivElement, ChatToolbarProps>(
197
161
  ChatToolbar.displayName = CHAT_TOOLBAR_NAME;
198
162
 
199
163
  //
200
- // Viewport
164
+ // Content
201
165
  //
202
166
 
203
- const CHAT_VIEWPORT_NAME = 'Chat.Viewport';
167
+ const CHAT_CONTENT_NAME = 'Chat.Content';
204
168
 
205
- type ChatViewportProps = {};
169
+ type ChatContentProps = {};
206
170
 
207
- const ChatViewport = composable<HTMLDivElement, ChatViewportProps>(({ children, ...props }, forwardedRef) => {
171
+ const ChatContent = composable<HTMLDivElement, ChatContentProps>(({ children, ...props }, forwardedRef) => {
208
172
  return (
209
173
  <div {...composableProps(props, { classNames: 'dx-expander flex flex-col' })} ref={forwardedRef}>
210
174
  {children}
@@ -212,7 +176,7 @@ const ChatViewport = composable<HTMLDivElement, ChatViewportProps>(({ children,
212
176
  );
213
177
  });
214
178
 
215
- ChatViewport.displayName = CHAT_VIEWPORT_NAME;
179
+ ChatContent.displayName = CHAT_CONTENT_NAME;
216
180
 
217
181
  //
218
182
  // Thread
@@ -222,10 +186,12 @@ const CHAT_THREAD_NAME = 'Chat.Thread';
222
186
 
223
187
  type ChatThreadProps = Omit<NaturalChatThreadProps, 'identity' | 'messages' | 'tools'>;
224
188
 
225
- const ChatThread = (props: ChatThreadProps) => {
189
+ const ChatThread = ({ viewType, debug: debugProp, ...props }: ChatThreadProps) => {
226
190
  const { debug, event, messages, processor } = useChatContext(CHAT_THREAD_NAME);
191
+ const debugView = viewType === 'debug';
227
192
  const identity = useIdentity();
228
193
  const error = useAtomValue(processor.error).pipe(Option.getOrUndefined);
194
+ const extensions = useChatKeymapExtensions({ event });
229
195
 
230
196
  const controllerRef = useRef<MarkdownStreamController | null>(null);
231
197
  useEffect(() => {
@@ -262,7 +228,9 @@ const ChatThread = (props: ChatThreadProps) => {
262
228
  identity={identity}
263
229
  messages={messages}
264
230
  error={error}
265
- debug={debug}
231
+ debug={debugProp ?? (debug || debugView)}
232
+ viewType={viewType}
233
+ extensions={extensions}
266
234
  onEvent={handleEvent}
267
235
  ref={controllerRef}
268
236
  />
@@ -277,184 +245,11 @@ ChatThread.displayName = CHAT_THREAD_NAME;
277
245
 
278
246
  const CHAT_PROMPT_NAME = 'Chat.Prompt';
279
247
 
280
- type ChatPromptProps = ThemedClassName<
281
- {
282
- outline?: boolean;
283
- settings?: boolean;
284
- } & Pick<ChatEditorProps, 'placeholder'> &
285
- Omit<ChatPresetsProps, 'onChange'> & {
286
- expandable?: boolean;
287
- online?: boolean;
288
- onOnlineChange?: (online: boolean) => void;
289
- onPresetChange?: ChatPresetsProps['onChange'];
290
- }
291
- >;
292
-
293
- const ChatPrompt = ({
294
- classNames,
295
- outline,
296
- settings = true,
297
- placeholder,
298
- expandable,
299
- online,
300
- presets,
301
- preset,
302
- onPresetChange,
303
- onOnlineChange,
304
- }: ChatPromptProps) => {
305
- const { t } = useTranslation(meta.id);
306
- const { db, processor, event } = useChatContext(CHAT_PROMPT_NAME);
248
+ type ChatPromptProps = Omit<NaturalChatPromptProps, 'chat' | 'db' | 'processor' | 'event'>;
307
249
 
308
- const error = useAtomValue(processor.error).pipe(Option.getOrUndefined);
309
- const streaming = useAtomValue(processor.streaming);
310
- const active = useAtomValue(processor.active);
311
- const activeRef = useDynamicRef(active);
312
-
313
- const editorRef = useRef<ChatEditorController>(null);
314
- const [recordingState, setRecordingState] = useState(false);
315
- useEffect(() => {
316
- return event.on((event) => {
317
- switch (event.type) {
318
- case 'update-prompt':
319
- if (!editorRef.current?.getText()?.length) {
320
- editorRef.current?.setText(event.text);
321
- editorRef.current?.focus();
322
- }
323
- break;
324
- case 'record-start':
325
- setRecordingState(true);
326
- break;
327
- case 'record-stop':
328
- setRecordingState(false);
329
- break;
330
- }
331
- });
332
- }, [event]);
333
-
334
- // TODO(burdon): Configure capability in TranscriptionPlugin.
335
- const { recording } = useVoiceInput({
336
- active: recordingState,
337
- onUpdate: (text) => {
338
- editorRef.current?.setText(text);
339
- editorRef.current?.focus();
340
- },
341
- });
342
-
343
- const extensions = useMemo<Extension[]>(() => {
344
- return [
345
- Prec.highest(
346
- keymap.of([
347
- {
348
- key: 'Mod-d',
349
- preventDefault: true,
350
- run: () => {
351
- event.emit({ type: 'toggle-debug' });
352
- return true;
353
- },
354
- },
355
- {
356
- key: 'Mod-ArrowUp',
357
- preventDefault: true,
358
- run: () => {
359
- event.emit({ type: 'nav-previous' });
360
- return true;
361
- },
362
- shift: () => {
363
- event.emit({ type: 'thread-open' });
364
- return true;
365
- },
366
- },
367
- {
368
- key: 'Mod-ArrowDown',
369
- preventDefault: true,
370
- run: () => {
371
- event.emit({ type: 'nav-next' });
372
- return true;
373
- },
374
- shift: () => {
375
- event.emit({ type: 'thread-close' });
376
- return true;
377
- },
378
- },
379
- ]),
380
- ),
381
- ].filter(isTruthy);
382
- }, [event, expandable]);
383
-
384
- const handleSubmit = useCallback<NonNullable<ChatEditorProps['onSubmit']>>(
385
- (text) => {
386
- if (!activeRef.current) {
387
- event.emit({ type: 'submit', text });
388
- return true;
389
- }
390
- },
391
- [event],
392
- );
393
-
394
- const handleEvent = useCallback<NonNullable<ChatActionsProps['onEvent']>>(
395
- (ev) => {
396
- event.emit(ev);
397
- },
398
- [event],
399
- );
400
-
401
- return (
402
- <div
403
- role='group'
404
- className={mx(
405
- 'flex flex-col w-full dx-density-fine',
406
- outline &&
407
- 'bg-group-surface border border-subdued-separator transition transition-border [&:has(.cm-content:focus)]:border-separator rounded-sm',
408
- classNames,
409
- )}
410
- >
411
- <div role='none' className='flex p-2 gap-2'>
412
- <ChatStatusIndicator classNames='p-1' preset={preset} error={error} processing={streaming} />
413
- <ChatEditor
414
- ref={editorRef}
415
- autoFocus
416
- lineWrapping
417
- classNames='col-span-2 pt-0.5'
418
- placeholder={placeholder ?? t('prompt.placeholder')}
419
- extensions={extensions}
420
- onSubmit={handleSubmit}
421
- />
422
- </div>
423
-
424
- {db && settings && (
425
- <div role='none' className='flex items-center overflow-hidden'>
426
- <ChatOptions
427
- db={db}
428
- blueprintRegistry={processor.blueprintRegistry}
429
- context={processor.context}
430
- preset={preset}
431
- presets={presets}
432
- onPresetChange={onPresetChange}
433
- />
434
-
435
- <div role='none' className='flex grow overflow-x-auto scrollbar-none'>
436
- <ChatReferences db={db} context={processor.context} />
437
- </div>
438
-
439
- <ChatActions
440
- classNames='col-span-2'
441
- microphone={true}
442
- recording={recording}
443
- processing={streaming}
444
- onEvent={handleEvent}
445
- >
446
- {/* TODO(burdon): Move offline switch into dialog. */}
447
- {online !== undefined && (
448
- <Input.Root>
449
- <Input.Label srOnly>{t('online-switch.label')}</Input.Label>
450
- <Input.Switch classNames='mx-2' checked={online} onCheckedChange={onOnlineChange} />
451
- </Input.Root>
452
- )}
453
- </ChatActions>
454
- </div>
455
- )}
456
- </div>
457
- );
250
+ const ChatPrompt = (props: ChatPromptProps) => {
251
+ const { chat, db, processor, event } = useChatContext(CHAT_PROMPT_NAME);
252
+ return <NaturalChatPrompt {...props} chat={chat} db={db} processor={processor} event={event} />;
458
253
  };
459
254
 
460
255
  ChatPrompt.displayName = CHAT_PROMPT_NAME;
@@ -466,9 +261,10 @@ ChatPrompt.displayName = CHAT_PROMPT_NAME;
466
261
  export const Chat = {
467
262
  Root: ChatRoot,
468
263
  Toolbar: ChatToolbar,
469
- Viewport: ChatViewport,
470
- Thread: ChatThread,
264
+ Content: ChatContent,
471
265
  Prompt: ChatPrompt,
266
+ Status: ChatStatus,
267
+ Thread: ChatThread,
472
268
  };
473
269
 
474
- export type { ChatRootProps, ChatToolbarProps, ChatViewportProps, ChatThreadProps, ChatPromptProps, ChatEvent };
270
+ export type { ChatRootProps, ChatToolbarProps, ChatContentProps, ChatPromptProps, ChatThreadProps, ChatEvent };
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+
7
+ import { type Chat as ChatModule } from '@dxos/assistant-toolkit';
8
+ import { type Event } from '@dxos/async';
9
+ import { type Database } from '@dxos/echo';
10
+ import { type Message } from '@dxos/types';
11
+
12
+ import { type AiChatProcessor } from '../../processor';
13
+ import { type ChatEvent } from './events';
14
+
15
+ /**
16
+ * Wall-clock timestamps for the most-recent (or in-flight) request, lifted out of
17
+ * `ChatStreamStatus` so the elapsed value survives across re-mounts triggered when wire's
18
+ * drip queue toggles `wireDrainingEffect` (which removes/restores the footer block widget).
19
+ * `endedAt` is `null` while the request is still active.
20
+ */
21
+ export type ChatRequestTiming = {
22
+ startedAt: number;
23
+ endedAt: number | null;
24
+ };
25
+
26
+ export type ChatContextValue = {
27
+ debug?: boolean;
28
+ event: Event<ChatEvent>;
29
+ db?: Database.Database;
30
+ chat?: ChatModule.Chat;
31
+ messages: Message.Message[];
32
+ processor: AiChatProcessor;
33
+ requestTiming: ChatRequestTiming | null;
34
+ };
35
+
36
+ // Internal: not re-exported from `Chat/index.ts`. Accessed by sibling components in this
37
+ // package (e.g. `ChatStreamStatus`) without dragging in `Chat.tsx`'s heavy transitive
38
+ // imports (transcription, etc.).
39
+ export const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');
@@ -33,18 +33,9 @@ export const ChatActions = ({
33
33
  const { t } = useTranslation(meta.id);
34
34
 
35
35
  return (
36
- <div className={mx('flex items-center me-1', classNames)}>
36
+ <div className={mx('flex items-center', classNames)}>
37
37
  {children}
38
38
 
39
- <IconButton
40
- disabled={!processing}
41
- variant='ghost'
42
- icon='ph--x--regular'
43
- iconOnly
44
- label={t('cancel-processing.button')}
45
- onClick={() => onEvent?.({ type: 'cancel' })}
46
- />
47
-
48
39
  {microphone && (
49
40
  <IconButton
50
41
  disabled={!processing}
@@ -70,6 +61,15 @@ export const ChatActions = ({
70
61
  onClick={() => onEvent?.({ type: 'toggle-debug' })}
71
62
  />
72
63
  )}
64
+
65
+ <IconButton
66
+ disabled={!processing}
67
+ variant='ghost'
68
+ icon='ph--x--regular'
69
+ iconOnly
70
+ label={t('cancel-processing.button')}
71
+ onClick={() => onEvent?.({ type: 'cancel' })}
72
+ />
73
73
  </div>
74
74
  );
75
75
  };