@dxos/plugin-assistant 0.8.3 → 0.8.4-main.f9ba587

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 (391) hide show
  1. package/dist/lib/browser/ChatContainer-6XNB5NEI.mjs +57 -0
  2. package/dist/lib/browser/ChatContainer-6XNB5NEI.mjs.map +7 -0
  3. package/dist/lib/browser/ChatDialog-IMWPRXTO.mjs +74 -0
  4. package/dist/lib/browser/ChatDialog-IMWPRXTO.mjs.map +7 -0
  5. package/dist/lib/browser/{BlueprintContainer-AT5Y7EXG.mjs → SequenceContainer-6XOYB2RN.mjs} +38 -37
  6. package/dist/lib/browser/SequenceContainer-6XOYB2RN.mjs.map +7 -0
  7. package/dist/lib/browser/{TemplateContainer-QQHVOTSI.mjs → TemplateContainer-6ZGGH5T4.mjs} +4 -4
  8. package/dist/lib/browser/TemplateContainer-6ZGGH5T4.mjs.map +7 -0
  9. package/dist/lib/browser/{ai-client-MK2ZZII2.mjs → ai-client-ML7OQWAO.mjs} +6 -6
  10. package/dist/lib/browser/ai-client-ML7OQWAO.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-builder-E4H5DCOJ.mjs → app-graph-builder-UJ5NHRGK.mjs} +31 -33
  12. package/dist/lib/browser/app-graph-builder-UJ5NHRGK.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-JQFUME3B.mjs → chunk-44HZKIAW.mjs} +5 -5
  14. package/dist/lib/browser/chunk-44HZKIAW.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-XOZ7YMO3.mjs → chunk-LKP65RPA.mjs} +2 -2
  16. package/dist/lib/browser/chunk-NTBGTFTV.mjs +15 -0
  17. package/dist/lib/browser/chunk-NTBGTFTV.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-BI6AHRNJ.mjs → chunk-OZL4OHTU.mjs} +15 -15
  19. package/dist/lib/browser/chunk-OZL4OHTU.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-TQ3QW3HJ.mjs +2072 -0
  21. package/dist/lib/browser/chunk-TQ3QW3HJ.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-AAOKC2JN.mjs → chunk-TU7UUGWQ.mjs} +68 -73
  23. package/dist/lib/browser/chunk-TU7UUGWQ.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-WPZ4UANI.mjs +16 -0
  25. package/dist/lib/browser/index.mjs +53 -68
  26. package/dist/lib/browser/index.mjs.map +3 -3
  27. package/dist/lib/browser/{intent-resolver-3UICTGPM.mjs → intent-resolver-LEAPB55Q.mjs} +10 -11
  28. package/dist/lib/browser/intent-resolver-LEAPB55Q.mjs.map +7 -0
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/{react-surface-LXCNUSZN.mjs → react-surface-TMF7JJA4.mjs} +34 -37
  31. package/dist/lib/browser/react-surface-TMF7JJA4.mjs.map +7 -0
  32. package/dist/lib/browser/{settings-XRHXVWGB.mjs → settings-N4HEXADL.mjs} +6 -6
  33. package/dist/lib/browser/settings-N4HEXADL.mjs.map +7 -0
  34. package/dist/lib/browser/types/index.mjs +4 -10
  35. package/dist/lib/node-esm/ChatContainer-VOLG7J6N.mjs +58 -0
  36. package/dist/lib/node-esm/ChatContainer-VOLG7J6N.mjs.map +7 -0
  37. package/dist/lib/node-esm/ChatDialog-B2XNUNRM.mjs +75 -0
  38. package/dist/lib/node-esm/ChatDialog-B2XNUNRM.mjs.map +7 -0
  39. package/dist/lib/node-esm/{BlueprintContainer-STOJAVML.mjs → SequenceContainer-WWG6IMN3.mjs} +38 -37
  40. package/dist/lib/node-esm/SequenceContainer-WWG6IMN3.mjs.map +7 -0
  41. package/dist/lib/node-esm/{TemplateContainer-SOEWY2ZN.mjs → TemplateContainer-6KRNEMVE.mjs} +4 -4
  42. package/dist/lib/node-esm/TemplateContainer-6KRNEMVE.mjs.map +7 -0
  43. package/dist/lib/node-esm/{ai-client-XGZBJ6BE.mjs → ai-client-2FQ434CT.mjs} +6 -6
  44. package/dist/lib/node-esm/ai-client-2FQ434CT.mjs.map +7 -0
  45. package/dist/lib/node-esm/{app-graph-builder-3SY5MBIK.mjs → app-graph-builder-MEQ5CYNI.mjs} +31 -33
  46. package/dist/lib/node-esm/app-graph-builder-MEQ5CYNI.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-D3HTVK5D.mjs +2073 -0
  48. package/dist/lib/node-esm/chunk-D3HTVK5D.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-3UEZLJ2V.mjs → chunk-E6V2RUQ2.mjs} +5 -5
  50. package/dist/lib/node-esm/chunk-E6V2RUQ2.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-UCOFKNKN.mjs → chunk-HVMVHP4R.mjs} +15 -15
  52. package/dist/lib/node-esm/chunk-HVMVHP4R.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-HXKRKIN2.mjs +18 -0
  54. package/dist/lib/node-esm/{chunk-BB2TAT4P.mjs → chunk-KOC6ESG7.mjs} +2 -2
  55. package/dist/lib/node-esm/{chunk-OYN6HLXZ.mjs → chunk-VESVUAOS.mjs} +5 -5
  56. package/dist/lib/node-esm/chunk-VESVUAOS.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-J6UXXZGJ.mjs → chunk-YYUVTTVK.mjs} +68 -73
  58. package/dist/lib/node-esm/chunk-YYUVTTVK.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +53 -68
  60. package/dist/lib/node-esm/index.mjs.map +3 -3
  61. package/dist/lib/node-esm/{intent-resolver-E6MXTYAU.mjs → intent-resolver-4ULF3F7U.mjs} +10 -11
  62. package/dist/lib/node-esm/intent-resolver-4ULF3F7U.mjs.map +7 -0
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/{react-surface-7HA5EDWY.mjs → react-surface-6XL6SWL2.mjs} +34 -37
  65. package/dist/lib/node-esm/react-surface-6XL6SWL2.mjs.map +7 -0
  66. package/dist/lib/node-esm/{settings-5IAY6BT4.mjs → settings-WQ76EG6O.mjs} +6 -6
  67. package/dist/lib/node-esm/settings-WQ76EG6O.mjs.map +7 -0
  68. package/dist/lib/node-esm/types/index.mjs +4 -10
  69. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  72. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts +2 -2
  73. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  74. package/dist/types/src/components/Chat/Chat.d.ts +42 -0
  75. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  76. package/dist/types/src/components/Chat/index.d.ts +2 -0
  77. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  78. package/dist/types/src/components/ChatContainer.d.ts +5 -5
  79. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  80. package/dist/types/src/components/ChatDialog.d.ts +8 -0
  81. package/dist/types/src/components/ChatDialog.d.ts.map +1 -0
  82. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts +10 -0
  83. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -0
  84. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts +9 -0
  85. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts.map +1 -0
  86. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +11 -0
  87. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -0
  88. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +7 -0
  89. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +1 -0
  90. package/dist/types/src/components/ChatPrompt/events.d.ts +17 -0
  91. package/dist/types/src/components/ChatPrompt/events.d.ts.map +1 -0
  92. package/dist/types/src/components/ChatPrompt/index.d.ts +6 -0
  93. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -0
  94. package/dist/types/src/components/{Thread/ThreadMessage.d.ts → ChatThread/ChatMessage.d.ts} +6 -4
  95. package/dist/types/src/components/ChatThread/ChatMessage.d.ts.map +1 -0
  96. package/dist/types/src/components/ChatThread/ChatThread.d.ts +25 -0
  97. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -0
  98. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +232 -0
  99. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -0
  100. package/dist/types/src/components/ChatThread/ToolBlock.d.ts +18 -0
  101. package/dist/types/src/components/ChatThread/ToolBlock.d.ts.map +1 -0
  102. package/dist/types/src/components/ChatThread/index.d.ts +2 -0
  103. package/dist/types/src/components/ChatThread/index.d.ts.map +1 -0
  104. package/dist/types/src/components/ChatThread/reducer.d.ts.map +1 -0
  105. package/dist/types/src/components/SequenceContainer.d.ts +9 -0
  106. package/dist/types/src/components/SequenceContainer.d.ts.map +1 -0
  107. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts +13 -0
  108. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts.map +1 -0
  109. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts +8 -0
  110. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/SequenceEditor/index.d.ts +2 -0
  112. package/dist/types/src/components/SequenceEditor/index.d.ts.map +1 -0
  113. package/dist/types/src/components/TemplateContainer.d.ts +4 -3
  114. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  115. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +1 -1
  116. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  117. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  118. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +1 -1
  119. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Toolbox/Toolbox.d.ts +10 -3
  121. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  122. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +1 -1
  123. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/index.d.ts +6 -12
  125. package/dist/types/src/components/index.d.ts.map +1 -1
  126. package/dist/types/src/events.d.ts.map +1 -1
  127. package/dist/types/src/hooks/{processor.d.ts → chat-processor.d.ts} +27 -17
  128. package/dist/types/src/hooks/chat-processor.d.ts.map +1 -0
  129. package/dist/types/src/hooks/chat-processor.test.d.ts +2 -0
  130. package/dist/types/src/hooks/chat-processor.test.d.ts.map +1 -0
  131. package/dist/types/src/hooks/index.d.ts +4 -4
  132. package/dist/types/src/hooks/index.d.ts.map +1 -1
  133. package/dist/types/src/hooks/useBlueprints.d.ts +4 -0
  134. package/dist/types/src/hooks/useBlueprints.d.ts.map +1 -0
  135. package/dist/types/src/hooks/useChatProcessor.d.ts +20 -6
  136. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  137. package/dist/types/src/hooks/useContextProvider.d.ts +6 -0
  138. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -1
  139. package/dist/types/src/hooks/useServiceContainer.d.ts +8 -0
  140. package/dist/types/src/hooks/useServiceContainer.d.ts.map +1 -0
  141. package/dist/types/src/queue-logger.d.ts +5 -5
  142. package/dist/types/src/queue-logger.d.ts.map +1 -1
  143. package/dist/types/src/stories/Chat.stories.d.ts +199 -0
  144. package/dist/types/src/stories/Chat.stories.d.ts.map +1 -0
  145. package/dist/types/src/testing/index.d.ts +1 -1
  146. package/dist/types/src/testing/index.d.ts.map +1 -1
  147. package/dist/types/src/testing/test-sequence.d.ts +8 -0
  148. package/dist/types/src/testing/test-sequence.d.ts.map +1 -0
  149. package/dist/types/src/translations.d.ts +61 -113
  150. package/dist/types/src/translations.d.ts.map +1 -1
  151. package/dist/types/src/types/index.d.ts +1 -2
  152. package/dist/types/src/types/index.d.ts.map +1 -1
  153. package/dist/types/src/types/schema.d.ts +71 -0
  154. package/dist/types/src/types/schema.d.ts.map +1 -0
  155. package/dist/types/src/types/service.d.ts +6 -6
  156. package/dist/types/src/types/service.d.ts.map +1 -1
  157. package/dist/types/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +76 -74
  159. package/src/AssistantPlugin.tsx +13 -13
  160. package/src/capabilities/ai-client.ts +3 -6
  161. package/src/capabilities/app-graph-builder.ts +30 -26
  162. package/src/capabilities/capabilities.ts +2 -3
  163. package/src/capabilities/intent-resolver.ts +6 -6
  164. package/src/capabilities/react-surface.tsx +29 -29
  165. package/src/capabilities/settings.ts +3 -3
  166. package/src/components/AssistantSettings/AssistantSettings.tsx +4 -4
  167. package/src/components/Chat/Chat.tsx +348 -0
  168. package/src/{experimental/transcription → components/Chat}/index.ts +2 -0
  169. package/src/components/ChatContainer.tsx +24 -18
  170. package/src/components/ChatDialog.tsx +65 -0
  171. package/src/components/ChatPrompt/ChatActions.tsx +76 -0
  172. package/src/components/ChatPrompt/ChatOptionsMenu.tsx +52 -0
  173. package/src/components/ChatPrompt/ChatReferences.tsx +52 -0
  174. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +26 -0
  175. package/src/components/ChatPrompt/events.ts +12 -0
  176. package/src/components/ChatPrompt/index.ts +10 -0
  177. package/src/components/{Thread/ThreadMessage.tsx → ChatThread/ChatMessage.tsx} +35 -31
  178. package/src/components/ChatThread/ChatThread.stories.tsx +148 -0
  179. package/src/components/ChatThread/ChatThread.tsx +68 -0
  180. package/src/components/{Thread/ToolInvocations.tsx → ChatThread/ToolBlock.tsx} +13 -8
  181. package/src/components/{AmbientDialog → ChatThread}/index.ts +1 -1
  182. package/src/components/PromptSettings.tsx +2 -2
  183. package/src/components/{BlueprintContainer.tsx → SequenceContainer.tsx} +23 -32
  184. package/src/components/SequenceEditor/SequenceEditor.stories.tsx +32 -0
  185. package/src/components/{BlueprintEditor/BlueprintEditor.tsx → SequenceEditor/SequenceEditor.tsx} +7 -7
  186. package/src/components/SequenceEditor/index.ts +5 -0
  187. package/src/components/TemplateContainer.tsx +7 -5
  188. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +2 -2
  189. package/src/components/TemplateEditor/TemplateEditor.tsx +2 -2
  190. package/src/components/TemplateEditor/TemplateForm.stories.tsx +2 -2
  191. package/src/components/TemplateEditor/TemplateForm.tsx +2 -3
  192. package/src/components/Toolbox/Toolbox.stories.tsx +4 -5
  193. package/src/components/Toolbox/Toolbox.tsx +56 -3
  194. package/src/components/index.ts +4 -5
  195. package/src/events.ts +2 -2
  196. package/src/hooks/{processor.test.ts → chat-processor.test.ts} +1 -1
  197. package/src/hooks/{processor.ts → chat-processor.ts} +115 -72
  198. package/src/hooks/index.ts +4 -4
  199. package/src/hooks/useBlueprints.ts +31 -0
  200. package/src/hooks/useChatProcessor.tsx +69 -24
  201. package/src/hooks/useContextProvider.ts +8 -2
  202. package/src/hooks/useServiceContainer.ts +42 -0
  203. package/src/queue-logger.ts +6 -6
  204. package/src/stories/Chat.stories.tsx +269 -0
  205. package/src/testing/index.ts +1 -1
  206. package/src/testing/{test-blueprint.ts → test-sequence.ts} +4 -9
  207. package/src/tools/openapi.test.ts +11 -11
  208. package/src/translations.ts +24 -22
  209. package/src/types/index.ts +1 -2
  210. package/src/types/schema.ts +86 -0
  211. package/dist/lib/browser/AssistantDialog-MQOOR364.mjs +0 -47
  212. package/dist/lib/browser/AssistantDialog-MQOOR364.mjs.map +0 -7
  213. package/dist/lib/browser/BlueprintContainer-AT5Y7EXG.mjs.map +0 -7
  214. package/dist/lib/browser/ChatContainer-C2NEAS3A.mjs +0 -40
  215. package/dist/lib/browser/ChatContainer-C2NEAS3A.mjs.map +0 -7
  216. package/dist/lib/browser/TemplateContainer-QQHVOTSI.mjs.map +0 -7
  217. package/dist/lib/browser/ai-client-MK2ZZII2.mjs.map +0 -7
  218. package/dist/lib/browser/app-graph-builder-E4H5DCOJ.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-AAOKC2JN.mjs.map +0 -7
  220. package/dist/lib/browser/chunk-BI6AHRNJ.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-JO4W3MF7.mjs +0 -2101
  222. package/dist/lib/browser/chunk-JO4W3MF7.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-JQFUME3B.mjs.map +0 -7
  224. package/dist/lib/browser/chunk-MEGMOFJB.mjs +0 -16
  225. package/dist/lib/browser/chunk-Q6UZ4F3H.mjs +0 -96
  226. package/dist/lib/browser/chunk-Q6UZ4F3H.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-UE3IZ4PN.mjs +0 -15
  228. package/dist/lib/browser/chunk-UE3IZ4PN.mjs.map +0 -7
  229. package/dist/lib/browser/intent-resolver-3UICTGPM.mjs.map +0 -7
  230. package/dist/lib/browser/react-surface-LXCNUSZN.mjs.map +0 -7
  231. package/dist/lib/browser/settings-XRHXVWGB.mjs.map +0 -7
  232. package/dist/lib/node/AssistantDialog-AN4Z6YUV.cjs +0 -73
  233. package/dist/lib/node/AssistantDialog-AN4Z6YUV.cjs.map +0 -7
  234. package/dist/lib/node/BlueprintContainer-NOWLDYCZ.cjs +0 -344
  235. package/dist/lib/node/BlueprintContainer-NOWLDYCZ.cjs.map +0 -7
  236. package/dist/lib/node/ChatContainer-VKYBQHUB.cjs +0 -68
  237. package/dist/lib/node/ChatContainer-VKYBQHUB.cjs.map +0 -7
  238. package/dist/lib/node/TemplateContainer-JZF2DCCG.cjs +0 -58
  239. package/dist/lib/node/TemplateContainer-JZF2DCCG.cjs.map +0 -7
  240. package/dist/lib/node/ai-client-7HNSMUMT.cjs +0 -53
  241. package/dist/lib/node/ai-client-7HNSMUMT.cjs.map +0 -7
  242. package/dist/lib/node/app-graph-builder-PPR5B5KU.cjs +0 -235
  243. package/dist/lib/node/app-graph-builder-PPR5B5KU.cjs.map +0 -7
  244. package/dist/lib/node/chunk-4EEWTDQK.cjs +0 -117
  245. package/dist/lib/node/chunk-4EEWTDQK.cjs.map +0 -7
  246. package/dist/lib/node/chunk-FUAGEO7Q.cjs +0 -52
  247. package/dist/lib/node/chunk-FUAGEO7Q.cjs.map +0 -7
  248. package/dist/lib/node/chunk-HRNIUYVQ.cjs +0 -128
  249. package/dist/lib/node/chunk-HRNIUYVQ.cjs.map +0 -7
  250. package/dist/lib/node/chunk-IKZBMHSW.cjs +0 -184
  251. package/dist/lib/node/chunk-IKZBMHSW.cjs.map +0 -7
  252. package/dist/lib/node/chunk-LMDJEGZ2.cjs +0 -233
  253. package/dist/lib/node/chunk-LMDJEGZ2.cjs.map +0 -7
  254. package/dist/lib/node/chunk-NIDICM57.cjs +0 -2080
  255. package/dist/lib/node/chunk-NIDICM57.cjs.map +0 -7
  256. package/dist/lib/node/chunk-P74TWGMG.cjs +0 -44
  257. package/dist/lib/node/chunk-P74TWGMG.cjs.map +0 -7
  258. package/dist/lib/node/chunk-QGPWY6GW.cjs +0 -34
  259. package/dist/lib/node/chunk-QGPWY6GW.cjs.map +0 -7
  260. package/dist/lib/node/index.cjs +0 -289
  261. package/dist/lib/node/index.cjs.map +0 -7
  262. package/dist/lib/node/intent-resolver-QSWGTKON.cjs +0 -58
  263. package/dist/lib/node/intent-resolver-QSWGTKON.cjs.map +0 -7
  264. package/dist/lib/node/meta.json +0 -1
  265. package/dist/lib/node/react-surface-D3NBYRZ6.cjs +0 -172
  266. package/dist/lib/node/react-surface-D3NBYRZ6.cjs.map +0 -7
  267. package/dist/lib/node/settings-2JXLKYGE.cjs +0 -36
  268. package/dist/lib/node/settings-2JXLKYGE.cjs.map +0 -7
  269. package/dist/lib/node/types/index.cjs +0 -54
  270. package/dist/lib/node/types/index.cjs.map +0 -7
  271. package/dist/lib/node-esm/AssistantDialog-6WEMLUPU.mjs +0 -48
  272. package/dist/lib/node-esm/AssistantDialog-6WEMLUPU.mjs.map +0 -7
  273. package/dist/lib/node-esm/BlueprintContainer-STOJAVML.mjs.map +0 -7
  274. package/dist/lib/node-esm/ChatContainer-3MVBTUJN.mjs +0 -41
  275. package/dist/lib/node-esm/ChatContainer-3MVBTUJN.mjs.map +0 -7
  276. package/dist/lib/node-esm/TemplateContainer-SOEWY2ZN.mjs.map +0 -7
  277. package/dist/lib/node-esm/ai-client-XGZBJ6BE.mjs.map +0 -7
  278. package/dist/lib/node-esm/app-graph-builder-3SY5MBIK.mjs.map +0 -7
  279. package/dist/lib/node-esm/chunk-34EX6E5Q.mjs +0 -18
  280. package/dist/lib/node-esm/chunk-3UEZLJ2V.mjs.map +0 -7
  281. package/dist/lib/node-esm/chunk-CDAILLCU.mjs +0 -98
  282. package/dist/lib/node-esm/chunk-CDAILLCU.mjs.map +0 -7
  283. package/dist/lib/node-esm/chunk-J6UXXZGJ.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-OD574YIU.mjs +0 -2102
  285. package/dist/lib/node-esm/chunk-OD574YIU.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-OYN6HLXZ.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-UCOFKNKN.mjs.map +0 -7
  288. package/dist/lib/node-esm/intent-resolver-E6MXTYAU.mjs.map +0 -7
  289. package/dist/lib/node-esm/react-surface-7HA5EDWY.mjs.map +0 -7
  290. package/dist/lib/node-esm/settings-5IAY6BT4.mjs.map +0 -7
  291. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +0 -10
  292. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +0 -1
  293. package/dist/types/src/components/AmbientDialog/AmbientDialog.stories.d.ts +0 -8
  294. package/dist/types/src/components/AmbientDialog/AmbientDialog.stories.d.ts.map +0 -1
  295. package/dist/types/src/components/AmbientDialog/index.d.ts +0 -2
  296. package/dist/types/src/components/AmbientDialog/index.d.ts.map +0 -1
  297. package/dist/types/src/components/AssistantDialog.d.ts +0 -7
  298. package/dist/types/src/components/AssistantDialog.d.ts.map +0 -1
  299. package/dist/types/src/components/BlueprintContainer.d.ts +0 -9
  300. package/dist/types/src/components/BlueprintContainer.d.ts.map +0 -1
  301. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts +0 -13
  302. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts.map +0 -1
  303. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.stories.d.ts +0 -8
  304. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.stories.d.ts.map +0 -1
  305. package/dist/types/src/components/BlueprintEditor/index.d.ts +0 -2
  306. package/dist/types/src/components/BlueprintEditor/index.d.ts.map +0 -1
  307. package/dist/types/src/components/Prompt/Prompt.d.ts +0 -23
  308. package/dist/types/src/components/Prompt/Prompt.d.ts.map +0 -1
  309. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +0 -13
  310. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +0 -1
  311. package/dist/types/src/components/Prompt/PromptBar.d.ts +0 -16
  312. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +0 -1
  313. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts +0 -9
  314. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts.map +0 -1
  315. package/dist/types/src/components/Prompt/autocomplete.d.ts +0 -25
  316. package/dist/types/src/components/Prompt/autocomplete.d.ts.map +0 -1
  317. package/dist/types/src/components/Prompt/index.d.ts +0 -3
  318. package/dist/types/src/components/Prompt/index.d.ts.map +0 -1
  319. package/dist/types/src/components/Prompt/references.d.ts +0 -30
  320. package/dist/types/src/components/Prompt/references.d.ts.map +0 -1
  321. package/dist/types/src/components/Thread/Thread.d.ts +0 -28
  322. package/dist/types/src/components/Thread/Thread.d.ts.map +0 -1
  323. package/dist/types/src/components/Thread/Thread.stories.d.ts +0 -11
  324. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +0 -1
  325. package/dist/types/src/components/Thread/ThreadContainer.d.ts +0 -13
  326. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +0 -1
  327. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +0 -16
  328. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +0 -1
  329. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +0 -1
  330. package/dist/types/src/components/Thread/ToolInvocations.d.ts +0 -13
  331. package/dist/types/src/components/Thread/ToolInvocations.d.ts.map +0 -1
  332. package/dist/types/src/components/Thread/index.d.ts +0 -3
  333. package/dist/types/src/components/Thread/index.d.ts.map +0 -1
  334. package/dist/types/src/components/Thread/reducer.d.ts.map +0 -1
  335. package/dist/types/src/experimental/transcription/index.d.ts +0 -1
  336. package/dist/types/src/experimental/transcription/index.d.ts.map +0 -1
  337. package/dist/types/src/hooks/processor.d.ts.map +0 -1
  338. package/dist/types/src/hooks/processor.test.d.ts +0 -2
  339. package/dist/types/src/hooks/processor.test.d.ts.map +0 -1
  340. package/dist/types/src/hooks/useMessageQueue.d.ts +0 -42
  341. package/dist/types/src/hooks/useMessageQueue.d.ts.map +0 -1
  342. package/dist/types/src/hooks/useServices.d.ts +0 -7
  343. package/dist/types/src/hooks/useServices.d.ts.map +0 -1
  344. package/dist/types/src/stories/Prompt.stories.d.ts +0 -8
  345. package/dist/types/src/stories/Prompt.stories.d.ts.map +0 -1
  346. package/dist/types/src/stories/Query.stories.d.ts +0 -19
  347. package/dist/types/src/stories/Query.stories.d.ts.map +0 -1
  348. package/dist/types/src/stories/Research.stories.d.ts +0 -15
  349. package/dist/types/src/stories/Research.stories.d.ts.map +0 -1
  350. package/dist/types/src/stories/test-data.d.ts +0 -3
  351. package/dist/types/src/stories/test-data.d.ts.map +0 -1
  352. package/dist/types/src/stories/testing.d.ts +0 -12
  353. package/dist/types/src/stories/testing.d.ts.map +0 -1
  354. package/dist/types/src/testing/test-blueprint.d.ts +0 -8
  355. package/dist/types/src/testing/test-blueprint.d.ts.map +0 -1
  356. package/dist/types/src/types/chat.d.ts +0 -23
  357. package/dist/types/src/types/chat.d.ts.map +0 -1
  358. package/dist/types/src/types/types.d.ts +0 -50
  359. package/dist/types/src/types/types.d.ts.map +0 -1
  360. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +0 -84
  361. package/src/components/AmbientDialog/AmbientDialog.tsx +0 -117
  362. package/src/components/AssistantDialog.tsx +0 -37
  363. package/src/components/BlueprintEditor/BlueprintEditor.stories.tsx +0 -32
  364. package/src/components/BlueprintEditor/index.ts +0 -5
  365. package/src/components/Prompt/Prompt.stories.tsx +0 -121
  366. package/src/components/Prompt/Prompt.tsx +0 -124
  367. package/src/components/Prompt/PromptBar.stories.tsx +0 -69
  368. package/src/components/Prompt/PromptBar.tsx +0 -105
  369. package/src/components/Prompt/autocomplete.ts +0 -218
  370. package/src/components/Prompt/index.ts +0 -6
  371. package/src/components/Prompt/references.ts +0 -180
  372. package/src/components/Thread/Thread.stories.tsx +0 -201
  373. package/src/components/Thread/Thread.tsx +0 -118
  374. package/src/components/Thread/ThreadContainer.stories.tsx +0 -283
  375. package/src/components/Thread/ThreadContainer.tsx +0 -105
  376. package/src/components/Thread/index.ts +0 -6
  377. package/src/hooks/useMessageQueue.ts +0 -22
  378. package/src/hooks/useServices.ts +0 -28
  379. package/src/stories/Prompt.stories.tsx +0 -60
  380. package/src/stories/Query.stories.tsx +0 -514
  381. package/src/stories/Research.stories.tsx +0 -482
  382. package/src/stories/test-data.ts +0 -128
  383. package/src/stories/testing.ts +0 -60
  384. package/src/types/chat.ts +0 -32
  385. package/src/types/types.ts +0 -48
  386. /package/dist/lib/browser/{chunk-XOZ7YMO3.mjs.map → chunk-LKP65RPA.mjs.map} +0 -0
  387. /package/dist/lib/browser/{chunk-MEGMOFJB.mjs.map → chunk-WPZ4UANI.mjs.map} +0 -0
  388. /package/dist/lib/node-esm/{chunk-34EX6E5Q.mjs.map → chunk-HXKRKIN2.mjs.map} +0 -0
  389. /package/dist/lib/node-esm/{chunk-BB2TAT4P.mjs.map → chunk-KOC6ESG7.mjs.map} +0 -0
  390. /package/dist/types/src/components/{Thread → ChatThread}/reducer.d.ts +0 -0
  391. /package/src/components/{Thread → ChatThread}/reducer.ts +0 -0
@@ -6,47 +6,47 @@ import { Effect } from 'effect';
6
6
  import React, { useEffect, useMemo } from 'react';
7
7
 
8
8
  import { Capabilities, contributes, createIntent, createSurface, useIntentDispatcher } from '@dxos/app-framework';
9
- import { Blueprint } from '@dxos/assistant';
9
+ import { fullyQualifiedId, getSpace, getTypename } from '@dxos/client/echo';
10
+ import { Sequence } from '@dxos/conductor';
10
11
  import { InvocationTraceContainer } from '@dxos/devtools';
11
12
  import { Filter, type Key, Obj, Query } from '@dxos/echo';
12
13
  import { SettingsStore } from '@dxos/local-storage';
13
14
  import { SpaceAction } from '@dxos/plugin-space/types';
14
- import { fullyQualifiedId, getSpace, getTypename } from '@dxos/react-client/echo';
15
15
  import { StackItem } from '@dxos/react-ui-stack';
16
16
 
17
17
  import {
18
- AssistantDialog,
19
18
  AssistantSettings,
20
- BlueprintContainer,
21
19
  ChatContainer,
20
+ ChatDialog,
22
21
  PromptSettings,
22
+ SequenceContainer,
23
23
  TemplateContainer,
24
24
  } from '../components';
25
- import { ASSISTANT_PLUGIN, ASSISTANT_DIALOG } from '../meta';
26
- import { AIChatType, AssistantAction, type AssistantSettingsProps, CompanionTo, TemplateType } from '../types';
25
+ import { meta, ASSISTANT_DIALOG } from '../meta';
26
+ import { Assistant, TemplateType } from '../types';
27
27
 
28
28
  export default () =>
29
29
  contributes(Capabilities.ReactSurface, [
30
30
  createSurface({
31
- id: `${ASSISTANT_PLUGIN}/plugin-settings`,
31
+ id: `${meta.id}/plugin-settings`,
32
32
  role: 'article',
33
- filter: (data): data is { subject: SettingsStore<AssistantSettingsProps> } =>
34
- data.subject instanceof SettingsStore && data.subject.prefix === ASSISTANT_PLUGIN,
33
+ filter: (data): data is { subject: SettingsStore<Assistant.Settings> } =>
34
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
35
35
  component: ({ data: { subject } }) => <AssistantSettings settings={subject.value} />,
36
36
  }),
37
37
  createSurface({
38
- id: `${ASSISTANT_PLUGIN}/chat`,
38
+ id: `${meta.id}/chat`,
39
39
  role: 'article',
40
- filter: (data): data is { subject: AIChatType; variant: undefined } =>
41
- Obj.instanceOf(AIChatType, data.subject) && data.variant !== 'assistant-chat',
40
+ filter: (data): data is { subject: Assistant.Chat; variant: undefined } =>
41
+ Obj.instanceOf(Assistant.Chat, data.subject) && data.variant !== 'assistant-chat',
42
42
  component: ({ data, role }) => <ChatContainer role={role} chat={data.subject} />,
43
43
  }),
44
44
  createSurface({
45
- id: `${ASSISTANT_PLUGIN}/object-chat`,
45
+ id: `${meta.id}/object-chat`,
46
46
  role: 'article',
47
- filter: (data): data is { companionTo: Obj.Any; subject: AIChatType | 'assistant-chat' } =>
47
+ filter: (data): data is { companionTo: Obj.Any; subject: Assistant.Chat | 'assistant-chat' } =>
48
48
  Obj.isObject(data.companionTo) &&
49
- (Obj.instanceOf(AIChatType, data.subject) || data.subject === 'assistant-chat'),
49
+ (Obj.instanceOf(Assistant.Chat, data.subject) || data.subject === 'assistant-chat'),
50
50
  component: ({ data, role }) => {
51
51
  const { dispatch } = useIntentDispatcher();
52
52
  const associatedArtifact = useMemo(
@@ -64,19 +64,19 @@ export default () =>
64
64
  const space = getSpace(data.companionTo);
65
65
  if (space && data.subject === 'assistant-chat') {
66
66
  const result = await space.db
67
- .query(Query.select(Filter.ids(data.companionTo.id)).targetOf(CompanionTo).source())
67
+ .query(Query.select(Filter.ids(data.companionTo.id)).targetOf(Assistant.CompanionTo).source())
68
68
  .run();
69
69
  if (result.objects.length > 0) {
70
70
  return;
71
71
  }
72
72
 
73
73
  const program = Effect.gen(function* () {
74
- const { object } = yield* dispatch(createIntent(AssistantAction.CreateChat, { space }));
74
+ const { object } = yield* dispatch(createIntent(Assistant.CreateChat, { space }));
75
75
  yield* dispatch(createIntent(SpaceAction.AddObject, { object, target: space, hidden: true }));
76
76
  yield* dispatch(
77
77
  createIntent(SpaceAction.AddRelation, {
78
78
  space,
79
- schema: CompanionTo,
79
+ schema: Assistant.CompanionTo,
80
80
  source: object,
81
81
  target: data.companionTo,
82
82
  }),
@@ -93,20 +93,20 @@ export default () =>
93
93
  return null;
94
94
  }
95
95
 
96
- return <ChatContainer role={role} chat={data.subject} associatedArtifact={associatedArtifact} />;
96
+ return <ChatContainer role={role} chat={data.subject} artifact={associatedArtifact} />;
97
97
  },
98
98
  }),
99
99
  createSurface({
100
- id: `${ASSISTANT_PLUGIN}/blueprint`,
100
+ id: `${meta.id}/sequence`,
101
101
  role: 'article',
102
- filter: (data): data is { subject: Blueprint } => Obj.instanceOf(Blueprint, data.subject),
103
- component: ({ data, role }) => <BlueprintContainer role={role} blueprint={data.subject} />,
102
+ filter: (data): data is { subject: Sequence } => Obj.instanceOf(Sequence, data.subject),
103
+ component: ({ data, role }) => <SequenceContainer role={role} sequence={data.subject} />,
104
104
  }),
105
105
  createSurface({
106
- id: `${ASSISTANT_PLUGIN}/companion/logs`,
106
+ id: `${meta.id}/companion/logs`,
107
107
  role: 'article',
108
- filter: (data): data is { companionTo: Blueprint } =>
109
- Obj.instanceOf(Blueprint, data.companionTo) && data.subject === 'logs',
108
+ filter: (data): data is { companionTo: Sequence } =>
109
+ Obj.instanceOf(Sequence, data.companionTo) && data.subject === 'logs',
110
110
  component: ({ data, role }) => {
111
111
  const space = getSpace(data.companionTo);
112
112
  return (
@@ -117,7 +117,7 @@ export default () =>
117
117
  },
118
118
  }),
119
119
  createSurface({
120
- id: `${ASSISTANT_PLUGIN}/template`,
120
+ id: `${meta.id}/template`,
121
121
  role: 'article',
122
122
  filter: (data): data is { subject: TemplateType } => Obj.instanceOf(TemplateType, data.subject),
123
123
  component: ({ data, role }) => <TemplateContainer role={role} template={data.subject} />,
@@ -125,11 +125,11 @@ export default () =>
125
125
  createSurface({
126
126
  id: ASSISTANT_DIALOG,
127
127
  role: 'dialog',
128
- filter: (data): data is { props: { chat: AIChatType } } => data.component === ASSISTANT_DIALOG,
129
- component: ({ data }) => <AssistantDialog {...data.props} />,
128
+ filter: (data): data is { props: { chat: Assistant.Chat } } => data.component === ASSISTANT_DIALOG,
129
+ component: ({ data }) => <ChatDialog {...data.props} />,
130
130
  }),
131
131
  createSurface({
132
- id: `${ASSISTANT_PLUGIN}/prompt-settings`,
132
+ id: `${meta.id}/prompt-settings`,
133
133
  role: 'object-settings',
134
134
  filter: (data): data is { subject: TemplateType } => Obj.instanceOf(TemplateType, data.subject),
135
135
  component: ({ data }) => <PromptSettings template={data.subject} />,
@@ -6,14 +6,14 @@ import { Capabilities, contributes } from '@dxos/app-framework';
6
6
  import { live } from '@dxos/live-object';
7
7
 
8
8
  import { meta } from '../meta';
9
- import { type AssistantSettingsProps, AssistantSettingsSchema } from '../types';
9
+ import { Assistant } from '../types';
10
10
 
11
11
  export default () => {
12
- const settings = live<AssistantSettingsProps>({});
12
+ const settings = live<Assistant.Settings>({});
13
13
 
14
14
  return contributes(Capabilities.Settings, {
15
15
  prefix: meta.id,
16
- schema: AssistantSettingsSchema,
16
+ schema: Assistant.Settings,
17
17
  value: settings,
18
18
  });
19
19
  };
@@ -8,8 +8,8 @@ import { DEFAULT_EDGE_MODELS, DEFAULT_OLLAMA_MODELS } from '@dxos/ai';
8
8
  import { Input, Select, useTranslation } from '@dxos/react-ui';
9
9
  import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
10
10
 
11
- import { ASSISTANT_PLUGIN } from '../../meta';
12
- import { LLM_PROVIDERS, type AssistantSettingsProps } from '../../types';
11
+ import { meta } from '../../meta';
12
+ import { LLM_PROVIDERS, type Assistant } from '../../types';
13
13
 
14
14
  // TODO(burdon): Factor out default Selector.
15
15
  const DEFAULT_VALUE = '__default';
@@ -20,8 +20,8 @@ const LLM_PROVIDER_LABELS = {
20
20
  lmstudio: 'LM Studio',
21
21
  } as const;
22
22
 
23
- export const AssistantSettings = ({ settings }: { settings: AssistantSettingsProps }) => {
24
- const { t } = useTranslation(ASSISTANT_PLUGIN);
23
+ export const AssistantSettings = ({ settings }: { settings: Assistant.Settings }) => {
24
+ const { t } = useTranslation(meta.id);
25
25
 
26
26
  return (
27
27
  <DeprecatedFormContainer>
@@ -0,0 +1,348 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Extension, Prec } from '@codemirror/state';
6
+ import { keymap } from '@codemirror/view';
7
+ import { createContext } from '@radix-ui/react-context';
8
+ import { dedupeWith } from 'effect/Array';
9
+ import React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
+
11
+ import { Message } from '@dxos/ai';
12
+ import { CollaborationActions, createIntent, useIntentDispatcher } from '@dxos/app-framework';
13
+ import { Event } from '@dxos/async';
14
+ import { DXN, Obj, Ref } from '@dxos/echo';
15
+ import { log } from '@dxos/log';
16
+ import { useVoiceInput } from '@dxos/plugin-transcription';
17
+ import { type Expando, getSpace, useQueue, type Space } from '@dxos/react-client/echo';
18
+ import { useIdentity } from '@dxos/react-client/halo';
19
+ import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
20
+ import { ChatEditor, type ChatEditorController, type ChatEditorProps, references } from '@dxos/react-ui-chat';
21
+ import { type ScrollController } from '@dxos/react-ui-components';
22
+ import { mx } from '@dxos/react-ui-theme';
23
+ import { isNotFalsy } from '@dxos/util';
24
+
25
+ import { type ChatProcessor, useContextProvider, useBlueprints } from '../../hooks';
26
+ import { meta } from '../../meta';
27
+ import { type Assistant } from '../../types';
28
+ import {
29
+ ChatActions,
30
+ type ChatActionsProps,
31
+ type ChatEvent,
32
+ ChatOptionsMenu,
33
+ ChatReferences,
34
+ type ChatReferencesProps,
35
+ ChatStatusIndicator,
36
+ } from '../ChatPrompt';
37
+ import { ChatThread as NativeChatThread, type ChatThreadProps as NativeChatThreadProps } from '../ChatThread';
38
+
39
+ // TODO(burdon): Factor out.
40
+ const Endcap = ({ children }: PropsWithChildren) => {
41
+ return (
42
+ <div className='grid w-[var(--rail-action)] h-[var(--rail-action)] items-center justify-center'>{children}</div>
43
+ );
44
+ };
45
+
46
+ //
47
+ // Context
48
+ // NOTE: The context should not be exported. It is only used internally.
49
+ // Components outside of this Radix-style group shuld define their own APIs.
50
+ //
51
+
52
+ // TODO(burdon): Inject via effect layer.
53
+ type ChatContextValue = {
54
+ event: Event<ChatEvent>;
55
+ space: Space;
56
+ chat: Assistant.Chat;
57
+ processor: ChatProcessor;
58
+ messages: Message[];
59
+
60
+ /** @deprecated Remove and replace with context. */
61
+ artifact?: Expando;
62
+ };
63
+
64
+ // NOTE: Do not export.
65
+ const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');
66
+
67
+ //
68
+ // Root
69
+ //
70
+
71
+ type ChatRootProps = ThemedClassName<
72
+ PropsWithChildren<
73
+ Pick<ChatContextValue, 'chat' | 'processor' | 'artifact'> & {
74
+ onEvent?: (event: ChatEvent) => void;
75
+ }
76
+ >
77
+ >;
78
+
79
+ const ChatRoot = ({ classNames, children, chat, processor, artifact, onEvent, ...props }: ChatRootProps) => {
80
+ const space = getSpace(chat);
81
+
82
+ // Messages.
83
+ const queue = useQueue<Message>(chat?.queue.dxn);
84
+ const messages = useMemo(
85
+ () =>
86
+ dedupeWith(
87
+ [...(queue?.objects?.filter(Obj.instanceOf(Message)) ?? []), ...(processor?.messages.value ?? [])],
88
+ (a, b) => a.id === b.id,
89
+ ),
90
+ [queue?.objects, processor?.messages.value],
91
+ );
92
+
93
+ // TODO(burdon): Replace with tool.
94
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
95
+ useEffect(() => {
96
+ if (!processor?.streaming.value && queue?.objects && artifact) {
97
+ const message = queue.objects[queue.objects.length - 1];
98
+ if (dispatch && space && chat && message) {
99
+ void dispatch(
100
+ createIntent(CollaborationActions.InsertContent, {
101
+ target: artifact,
102
+ object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...chat.queue.dxn.parts, message.id])),
103
+ label: 'View proposal',
104
+ }),
105
+ );
106
+ }
107
+ }
108
+ }, [queue, processor?.streaming.value]);
109
+
110
+ // Events.
111
+ const event = useMemo(() => new Event<ChatEvent>(), []);
112
+ useEffect(() => {
113
+ return event.on((event) => {
114
+ switch (event.type) {
115
+ case 'submit': {
116
+ if (!processor.streaming.value) {
117
+ void processor.request(event.text);
118
+ }
119
+ break;
120
+ }
121
+
122
+ case 'cancel': {
123
+ void processor.cancel();
124
+ break;
125
+ }
126
+ }
127
+
128
+ onEvent?.(event);
129
+ });
130
+ }, [event, onEvent]);
131
+
132
+ if (!space) {
133
+ return null;
134
+ }
135
+
136
+ return (
137
+ <ChatContextProvider event={event} chat={chat} space={space} processor={processor} messages={messages} {...props}>
138
+ <div role='none' className={mx('flex flex-col grow', classNames)}>
139
+ {children}
140
+ </div>
141
+ </ChatContextProvider>
142
+ );
143
+ };
144
+
145
+ ChatRoot.displayName = 'Chat.Root';
146
+
147
+ //
148
+ // Thread
149
+ //
150
+
151
+ type ChatThreadProps = Omit<NativeChatThreadProps, 'identity' | 'space' | 'messages' | 'tools' | 'onPrompt'>;
152
+
153
+ const ChatThread = (props: ChatThreadProps) => {
154
+ const { event, space, processor, messages } = useChatContext(ChatThread.displayName);
155
+ const identity = useIdentity();
156
+
157
+ const scrollerRef = useRef<ScrollController>(null);
158
+ useEffect(() => {
159
+ return event.on((event) => {
160
+ switch (event.type) {
161
+ case 'submit':
162
+ case 'scroll-to-bottom':
163
+ scrollerRef.current?.scrollToBottom('smooth');
164
+ break;
165
+ }
166
+ });
167
+ }, [event]);
168
+
169
+ const handlePrompt = useCallback<NonNullable<NativeChatThreadProps['onPrompt']>>(
170
+ (text) => {
171
+ if (!processor.streaming.value) {
172
+ event.emit({ type: 'submit', text });
173
+ return true;
174
+ }
175
+ },
176
+ [processor, event],
177
+ );
178
+
179
+ if (!identity) {
180
+ return null;
181
+ }
182
+
183
+ return (
184
+ <NativeChatThread
185
+ {...props}
186
+ ref={scrollerRef}
187
+ identity={identity}
188
+ space={space}
189
+ messages={messages}
190
+ tools={processor?.tools}
191
+ onPrompt={handlePrompt}
192
+ />
193
+ );
194
+ };
195
+
196
+ ChatThread.displayName = 'Chat.Thread';
197
+
198
+ //
199
+ // Prompt
200
+ //
201
+
202
+ type ChatPromptProps = ThemedClassName<Pick<ChatEditorProps, 'placeholder'> & { expandable?: boolean }>;
203
+
204
+ const ChatPrompt = ({ classNames, placeholder, expandable }: ChatPromptProps) => {
205
+ const { t } = useTranslation(meta.id);
206
+ const { space, event, processor } = useChatContext(ChatPrompt.displayName);
207
+
208
+ const [active, setActive] = useState(false);
209
+ useEffect(() => {
210
+ return event.on((event) => {
211
+ switch (event.type) {
212
+ case 'record-start':
213
+ setActive(true);
214
+ break;
215
+ case 'record-stop':
216
+ setActive(false);
217
+ break;
218
+ }
219
+ });
220
+ }, [event]);
221
+
222
+ const editorRef = useRef<ChatEditorController>(null);
223
+
224
+ // TODO(burdon): Configure capability in TranscriptionPlugin.
225
+ const { recording } = useVoiceInput({
226
+ active,
227
+ onUpdate: (text) => {
228
+ editorRef.current?.setText(text);
229
+ editorRef.current?.focus();
230
+ },
231
+ });
232
+
233
+ const [blueprints, handleUpdateBlueprints] = useBlueprints(processor.context);
234
+
235
+ // TODO(burdon): Reconcile with object tags.
236
+ const contextProvider = useContextProvider(space);
237
+ const extensions = useMemo<Extension[]>(() => {
238
+ return [
239
+ contextProvider &&
240
+ references({
241
+ provider: {
242
+ getReferences: async ({ query }) => contextProvider.query({ query }),
243
+ resolveReference: async ({ uri }) => contextProvider.resolveMetadata({ uri }),
244
+ },
245
+ }),
246
+ expandable &&
247
+ Prec.highest(
248
+ keymap.of([
249
+ {
250
+ key: 'cmd-ArrowUp',
251
+ preventDefault: true,
252
+ run: () => {
253
+ event.emit({ type: 'thread-open' });
254
+ return true;
255
+ },
256
+ },
257
+ {
258
+ key: 'cmd-ArrowDown',
259
+ preventDefault: true,
260
+ run: () => {
261
+ event.emit({ type: 'thread-close' });
262
+ return true;
263
+ },
264
+ },
265
+ ]),
266
+ ),
267
+ ].filter(isNotFalsy);
268
+ }, [event, expandable, contextProvider]);
269
+
270
+ const handleSubmit = useCallback<NonNullable<ChatEditorProps['onSubmit']>>(
271
+ (text) => {
272
+ if (!processor.streaming.value) {
273
+ event.emit({ type: 'submit', text });
274
+ return true;
275
+ }
276
+ },
277
+ [processor, event],
278
+ );
279
+
280
+ const handleEvent = useCallback<NonNullable<ChatActionsProps['onEvent']>>(
281
+ (ev) => {
282
+ event.emit(ev);
283
+ },
284
+ [event],
285
+ );
286
+
287
+ // TODO(burdon): Update context.
288
+ const handleUpdateReferences = useCallback<NonNullable<ChatReferencesProps['onUpdate']>>((ids) => {
289
+ log.info('update', { ids });
290
+ }, []);
291
+
292
+ return (
293
+ <div
294
+ className={mx(
295
+ 'is-full grid grid-cols-[var(--rail-action)_1fr_min-content] grid-rows-[min-content_var(--rail-action)]',
296
+ classNames,
297
+ )}
298
+ >
299
+ <Endcap>
300
+ <ChatStatusIndicator error={processor.error.value} processing={processor.streaming.value} />
301
+ </Endcap>
302
+
303
+ <ChatEditor
304
+ ref={editorRef}
305
+ autoFocus
306
+ lineWrapping
307
+ classNames='col-span-2 pis-1 pbs-2'
308
+ placeholder={placeholder ?? t('prompt placeholder')}
309
+ extensions={extensions}
310
+ onSubmit={handleSubmit}
311
+ />
312
+
313
+ <ChatOptionsMenu
314
+ blueprintRegistry={processor.blueprintRegistry}
315
+ blueprints={blueprints}
316
+ onChange={handleUpdateBlueprints}
317
+ />
318
+
319
+ <ChatReferences
320
+ classNames='flex pis-1 items-center'
321
+ space={space}
322
+ context={processor.context}
323
+ onUpdate={handleUpdateReferences}
324
+ />
325
+
326
+ <ChatActions
327
+ microphone={true}
328
+ recording={recording}
329
+ processing={processor.streaming.value}
330
+ onEvent={handleEvent}
331
+ />
332
+ </div>
333
+ );
334
+ };
335
+
336
+ ChatPrompt.displayName = 'Chat.Prompt';
337
+
338
+ //
339
+ // Chat
340
+ //
341
+
342
+ export const Chat = {
343
+ Root: ChatRoot,
344
+ Thread: ChatThread,
345
+ Prompt: ChatPrompt,
346
+ };
347
+
348
+ export type { ChatRootProps, ChatThreadProps, ChatPromptProps, ChatEvent };
@@ -1,3 +1,5 @@
1
1
  //
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
+
5
+ export * from './Chat';
@@ -2,36 +2,42 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type FC } from 'react';
5
+ import React from 'react';
6
6
 
7
- import { Capabilities, useCapabilities, useCapability } from '@dxos/app-framework';
7
+ import { Capabilities, useCapability } from '@dxos/app-framework';
8
8
  import { type AssociatedArtifact } from '@dxos/artifact';
9
- import { TranscriptionCapabilities } from '@dxos/plugin-transcription';
9
+ import { getSpace } from '@dxos/client/echo';
10
10
  import { StackItem } from '@dxos/react-ui-stack';
11
11
 
12
- import { ThreadContainer } from './Thread';
13
- import { ASSISTANT_PLUGIN } from '../meta';
14
- import { type AssistantSettingsProps, type AIChatType } from '../types';
12
+ import { Chat } from './Chat';
13
+ import { useChatProcessor, useServiceContainer } from '../hooks';
14
+ import { meta } from '../meta';
15
+ import { type Assistant } from '../types';
15
16
 
16
17
  export type ChatContainerProps = {
17
18
  role: string;
18
- chat: AIChatType;
19
- associatedArtifact?: AssociatedArtifact;
19
+ chat: Assistant.Chat;
20
+ artifact?: AssociatedArtifact;
20
21
  };
21
22
 
22
- // TODO(burdon): Attention.
23
- export const ChatContainer: FC<ChatContainerProps> = ({ role, chat, associatedArtifact }) => {
24
- const transcription = useCapabilities(TranscriptionCapabilities.Transcriber).length > 0;
25
- const settings = useCapability(Capabilities.SettingsStore).getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;
23
+ export const ChatContainer = ({ role, chat, artifact }: ChatContainerProps) => {
24
+ const space = getSpace(chat);
25
+ const settings = useCapability(Capabilities.SettingsStore).getStore<Assistant.Settings>(meta.id)?.value;
26
+ const serviceContainer = useServiceContainer({ space });
27
+ const processor = useChatProcessor({ part: 'deck', chat, serviceContainer, settings });
28
+ if (!processor) {
29
+ return null;
30
+ }
26
31
 
32
+ // TODO(burdon): Add attention attributes.
27
33
  return (
28
34
  <StackItem.Content role={role} classNames='container-max-width'>
29
- <ThreadContainer
30
- chat={chat}
31
- settings={settings}
32
- transcription={transcription}
33
- associatedArtifact={associatedArtifact}
34
- />
35
+ <Chat.Root chat={chat} processor={processor} artifact={artifact}>
36
+ <Chat.Thread />
37
+ <div className='pbe-4 pis-2 pie-2'>
38
+ <Chat.Prompt classNames='border border-subduedSeparator rounded-md' />
39
+ </div>
40
+ </Chat.Root>
35
41
  </StackItem.Content>
36
42
  );
37
43
  };
@@ -0,0 +1,65 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useState } from 'react';
6
+
7
+ import { useCapability, Capabilities } from '@dxos/app-framework';
8
+ import { getSpace } from '@dxos/client/echo';
9
+ import { useTranslation } from '@dxos/react-ui';
10
+ import { ChatDialog as NativeChatDialog } from '@dxos/react-ui-chat';
11
+
12
+ import { Chat, type ChatRootProps } from './Chat';
13
+ import { useChatProcessor, useServiceContainer } from '../hooks';
14
+ import { meta } from '../meta';
15
+ import { type Assistant } from '../types';
16
+
17
+ export type ChatDialogProps = {
18
+ chat?: Assistant.Chat;
19
+ };
20
+
21
+ export const ChatDialog = ({ chat }: ChatDialogProps) => {
22
+ const { t } = useTranslation(meta.id);
23
+
24
+ const space = getSpace(chat);
25
+ const settings = useCapability(Capabilities.SettingsStore).getStore<Assistant.Settings>(meta.id)?.value;
26
+ const serviceContainer = useServiceContainer({ space });
27
+ const processor = useChatProcessor({ part: 'dialog', chat, serviceContainer, settings });
28
+
29
+ // TODO(burdon): Refocus when open.
30
+ const [open, setOpen] = useState(true);
31
+ const [expanded, setExpanded] = useState(false);
32
+ const handleEvent = useCallback<NonNullable<ChatRootProps['onEvent']>>((event) => {
33
+ switch (event.type) {
34
+ case 'submit':
35
+ case 'thread-open':
36
+ setOpen(true);
37
+ setExpanded(true);
38
+ break;
39
+
40
+ case 'thread-close':
41
+ setOpen(false);
42
+ break;
43
+ }
44
+ }, []);
45
+
46
+ if (!chat || !processor) {
47
+ return null;
48
+ }
49
+
50
+ return (
51
+ <Chat.Root chat={chat} processor={processor} onEvent={handleEvent}>
52
+ <NativeChatDialog.Root open={open} expanded={expanded} onOpenChange={setOpen}>
53
+ <NativeChatDialog.Header title={t('assistant dialog title')} />
54
+ <NativeChatDialog.Content>
55
+ <Chat.Thread />
56
+ </NativeChatDialog.Content>
57
+ <NativeChatDialog.Footer>
58
+ <Chat.Prompt expandable />
59
+ </NativeChatDialog.Footer>
60
+ </NativeChatDialog.Root>
61
+ </Chat.Root>
62
+ );
63
+ };
64
+
65
+ export default ChatDialog;