@dxos/plugin-assistant 0.8.4-main.67995b8 → 0.8.4-main.f5c0578

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 (350) hide show
  1. package/dist/lib/browser/{BlueprintContainer-IZ4AK5EO.mjs → BlueprintContainer-H7H4BQ2C.mjs} +4 -3
  2. package/dist/lib/browser/{ChatContainer-RP3QEXYX.mjs → ChatContainer-SB7YC2XP.mjs} +37 -14
  3. package/dist/lib/browser/ChatContainer-SB7YC2XP.mjs.map +7 -0
  4. package/dist/lib/browser/{ChatDialog-ZVLXFHEY.mjs → ChatDialog-X6PFOQSQ.mjs} +23 -8
  5. package/dist/lib/browser/ChatDialog-X6PFOQSQ.mjs.map +7 -0
  6. package/dist/lib/browser/{SequenceContainer-3UDVKWPA.mjs → SequenceContainer-627OQ557.mjs} +3 -2
  7. package/dist/lib/browser/SequenceContainer-627OQ557.mjs.map +7 -0
  8. package/dist/lib/browser/ai-service-7KJ5LXBT.mjs +22 -0
  9. package/dist/lib/browser/ai-service-7KJ5LXBT.mjs.map +7 -0
  10. package/dist/lib/browser/{app-graph-builder-XSEOKJLG.mjs → app-graph-builder-ERU5XY2S.mjs} +14 -12
  11. package/dist/lib/browser/app-graph-builder-ERU5XY2S.mjs.map +7 -0
  12. package/dist/lib/browser/blueprint-definition-CMGIZAOW.mjs +146 -0
  13. package/dist/lib/browser/blueprint-definition-CMGIZAOW.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-63GG6U6D.mjs → chunk-BVH6VK6Q.mjs} +817 -789
  15. package/dist/lib/browser/chunk-BVH6VK6Q.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-JBFDQMUJ.mjs +193 -0
  19. package/dist/lib/browser/chunk-JBFDQMUJ.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-LKP65RPA.mjs +20 -0
  21. package/dist/lib/browser/{chunk-FDCJSQYF.mjs.map → chunk-LKP65RPA.mjs.map} +1 -1
  22. package/dist/lib/browser/{chunk-KFXSBNZR.mjs → chunk-NZDCKQ6W.mjs} +3 -3
  23. package/dist/lib/{node-esm/chunk-VIIMA3XQ.mjs.map → browser/chunk-NZDCKQ6W.mjs.map} +2 -2
  24. package/dist/lib/browser/chunk-QB7OVS6Z.mjs +16 -0
  25. package/dist/lib/browser/chunk-QB7OVS6Z.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-Y66UJUHV.mjs +280 -0
  27. package/dist/lib/browser/chunk-Y66UJUHV.mjs.map +7 -0
  28. package/dist/lib/browser/edge-model-resolver-2HB4PCWH.mjs +24 -0
  29. package/dist/lib/browser/edge-model-resolver-2HB4PCWH.mjs.map +7 -0
  30. package/dist/lib/browser/index.mjs +83 -48
  31. package/dist/lib/browser/index.mjs.map +4 -4
  32. package/dist/lib/browser/{intent-resolver-MV3VSZLS.mjs → intent-resolver-DGRO2XSG.mjs} +20 -14
  33. package/dist/lib/browser/intent-resolver-DGRO2XSG.mjs.map +7 -0
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/{react-surface-3GYEHQRP.mjs → react-surface-LPSIBHEJ.mjs} +36 -23
  36. package/dist/lib/browser/react-surface-LPSIBHEJ.mjs.map +7 -0
  37. package/dist/lib/browser/{settings-5GTTCVGD.mjs → settings-ZFNQYSYP.mjs} +6 -5
  38. package/dist/lib/{node-esm/settings-J2EXEM5H.mjs.map → browser/settings-ZFNQYSYP.mjs.map} +1 -1
  39. package/dist/lib/browser/toolkit-IW4FBLLB.mjs +105 -0
  40. package/dist/lib/browser/toolkit-IW4FBLLB.mjs.map +7 -0
  41. package/dist/lib/browser/types/index.mjs +7 -4
  42. package/dist/lib/node-esm/{BlueprintContainer-RGTMNLNX.mjs → BlueprintContainer-VH4EE4CM.mjs} +4 -3
  43. package/dist/lib/{browser/BlueprintContainer-IZ4AK5EO.mjs.map → node-esm/BlueprintContainer-VH4EE4CM.mjs.map} +1 -1
  44. package/dist/lib/node-esm/{ChatContainer-W3W6FWV3.mjs → ChatContainer-7JLMWHMX.mjs} +37 -14
  45. package/dist/lib/node-esm/ChatContainer-7JLMWHMX.mjs.map +7 -0
  46. package/dist/lib/node-esm/{ChatDialog-QW4JRKVO.mjs → ChatDialog-QDD722F2.mjs} +23 -8
  47. package/dist/lib/node-esm/ChatDialog-QDD722F2.mjs.map +7 -0
  48. package/dist/lib/node-esm/{SequenceContainer-RQQH5XOC.mjs → SequenceContainer-EQ5NP2PG.mjs} +3 -2
  49. package/dist/lib/node-esm/SequenceContainer-EQ5NP2PG.mjs.map +7 -0
  50. package/dist/lib/node-esm/ai-service-LDD32477.mjs +23 -0
  51. package/dist/lib/node-esm/ai-service-LDD32477.mjs.map +7 -0
  52. package/dist/lib/node-esm/{app-graph-builder-PANCJUHV.mjs → app-graph-builder-RCT4ANP2.mjs} +14 -12
  53. package/dist/lib/node-esm/app-graph-builder-RCT4ANP2.mjs.map +7 -0
  54. package/dist/lib/node-esm/blueprint-definition-AEWYMW6I.mjs +147 -0
  55. package/dist/lib/node-esm/blueprint-definition-AEWYMW6I.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-BFO3KHYL.mjs → chunk-ETS2CIDF.mjs} +817 -789
  57. package/dist/lib/node-esm/chunk-ETS2CIDF.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-VIIMA3XQ.mjs → chunk-GAWXJ7K5.mjs} +3 -3
  59. package/dist/lib/{browser/chunk-KFXSBNZR.mjs.map → node-esm/chunk-GAWXJ7K5.mjs.map} +2 -2
  60. package/dist/lib/node-esm/chunk-GENVBE3B.mjs +194 -0
  61. package/dist/lib/node-esm/chunk-GENVBE3B.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-KOC6ESG7.mjs +22 -0
  65. package/dist/lib/node-esm/{chunk-QN2H2EHV.mjs.map → chunk-KOC6ESG7.mjs.map} +1 -1
  66. package/dist/lib/node-esm/chunk-QS6GWTVA.mjs +281 -0
  67. package/dist/lib/node-esm/chunk-QS6GWTVA.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-X6AANUHZ.mjs +17 -0
  69. package/dist/lib/node-esm/chunk-X6AANUHZ.mjs.map +7 -0
  70. package/dist/lib/node-esm/edge-model-resolver-UDDR2IA6.mjs +25 -0
  71. package/dist/lib/node-esm/edge-model-resolver-UDDR2IA6.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +83 -48
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/{intent-resolver-3FMC3GHC.mjs → intent-resolver-7CKWG7TZ.mjs} +20 -14
  75. package/dist/lib/node-esm/intent-resolver-7CKWG7TZ.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/{react-surface-QDQWJ7FZ.mjs → react-surface-3EPAE4I4.mjs} +36 -23
  78. package/dist/lib/node-esm/react-surface-3EPAE4I4.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-J2EXEM5H.mjs → settings-UI4VQCWW.mjs} +6 -5
  80. package/dist/lib/{browser/settings-5GTTCVGD.mjs.map → node-esm/settings-UI4VQCWW.mjs.map} +1 -1
  81. package/dist/lib/node-esm/toolkit-2VNUL77B.mjs +106 -0
  82. package/dist/lib/node-esm/toolkit-2VNUL77B.mjs.map +7 -0
  83. package/dist/lib/node-esm/types/index.mjs +7 -4
  84. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/ai-service.d.ts +5 -0
  86. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/blueprint-definition.d.ts +3 -0
  89. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/capabilities.d.ts +11 -0
  91. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/edge-model-resolver.d.ts +5 -0
  93. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/index.d.ts +5 -0
  95. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  99. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  100. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  101. package/dist/types/src/components/Chat/Chat.d.ts +6 -8
  102. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  103. package/dist/types/src/components/ChatContainer.d.ts +5 -4
  104. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  105. package/dist/types/src/components/ChatDialog.d.ts.map +1 -1
  106. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +13 -0
  107. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -0
  108. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +3 -3
  109. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  110. package/dist/types/src/components/ChatPrompt/index.d.ts +1 -1
  111. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  112. package/dist/types/src/components/ChatThread/ChatMessage.d.ts +4 -3
  113. package/dist/types/src/components/ChatThread/ChatMessage.d.ts.map +1 -1
  114. package/dist/types/src/components/ChatThread/ChatThread.d.ts +2 -2
  115. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  116. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +33 -6
  117. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ChatThread/Link.d.ts +9 -0
  119. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -0
  120. package/dist/types/src/components/ChatThread/ToolBlock.d.ts.map +1 -1
  121. package/dist/types/src/components/SequenceContainer.d.ts.map +1 -1
  122. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts.map +1 -1
  123. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts +1 -1
  124. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  126. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  128. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Timeline/Timeline.d.ts +42 -0
  130. package/dist/types/src/components/Timeline/Timeline.d.ts.map +1 -0
  131. package/dist/types/src/components/Timeline/Timeline.stories.d.ts +11 -0
  132. package/dist/types/src/components/Timeline/Timeline.stories.d.ts.map +1 -0
  133. package/dist/types/src/components/Timeline/index.d.ts +2 -0
  134. package/dist/types/src/components/Timeline/index.d.ts.map +1 -0
  135. package/dist/types/src/components/Toolbox/Toolbox.d.ts +4 -7
  136. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  137. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +1 -2
  138. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/index.d.ts +2 -1
  140. package/dist/types/src/components/index.d.ts.map +1 -1
  141. package/dist/types/src/events.d.ts +1 -1
  142. package/dist/types/src/events.d.ts.map +1 -1
  143. package/dist/types/src/execution-graph/execution-graph.d.ts +21 -0
  144. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -0
  145. package/dist/types/src/execution-graph/index.d.ts +2 -0
  146. package/dist/types/src/execution-graph/index.d.ts.map +1 -0
  147. package/dist/types/src/functions/analysis.d.ts +5 -0
  148. package/dist/types/src/functions/analysis.d.ts.map +1 -0
  149. package/dist/types/src/functions/index.d.ts +4 -0
  150. package/dist/types/src/functions/index.d.ts.map +1 -0
  151. package/dist/types/src/functions/list.d.ts +10 -0
  152. package/dist/types/src/functions/list.d.ts.map +1 -0
  153. package/dist/types/src/functions/load.d.ts +8 -0
  154. package/dist/types/src/functions/load.d.ts.map +1 -0
  155. package/dist/types/src/hooks/chat-processor.d.ts +28 -42
  156. package/dist/types/src/hooks/chat-processor.d.ts.map +1 -1
  157. package/dist/types/src/hooks/errors.d.ts +4 -0
  158. package/dist/types/src/hooks/errors.d.ts.map +1 -0
  159. package/dist/types/src/hooks/index.d.ts +6 -1
  160. package/dist/types/src/hooks/index.d.ts.map +1 -1
  161. package/dist/types/src/hooks/presets.d.ts +2 -2
  162. package/dist/types/src/hooks/presets.d.ts.map +1 -1
  163. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +21 -0
  164. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -0
  165. package/dist/types/src/hooks/useChatProcessor.d.ts +7 -14
  166. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  167. package/dist/types/src/hooks/useChatServices.d.ts +4 -3
  168. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  169. package/dist/types/src/hooks/useExecutionGraph.d.ts +7 -0
  170. package/dist/types/src/hooks/useExecutionGraph.d.ts.map +1 -0
  171. package/dist/types/src/hooks/useOnline.d.ts +3 -0
  172. package/dist/types/src/hooks/useOnline.d.ts.map +1 -0
  173. package/dist/types/src/hooks/usePresets.d.ts +7 -0
  174. package/dist/types/src/hooks/usePresets.d.ts.map +1 -0
  175. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  176. package/dist/types/src/hooks/useResolveRef.d.ts +4 -0
  177. package/dist/types/src/hooks/useResolveRef.d.ts.map +1 -0
  178. package/dist/types/src/parser/filter-generator.d.ts.map +1 -1
  179. package/dist/types/src/parser/query-parser.d.ts.map +1 -1
  180. package/dist/types/src/stories/Chat.stories.d.ts +66 -5
  181. package/dist/types/src/stories/Chat.stories.d.ts.map +1 -1
  182. package/dist/types/src/stories/components/BlueprintContainer.d.ts +5 -0
  183. package/dist/types/src/stories/components/BlueprintContainer.d.ts.map +1 -0
  184. package/dist/types/src/stories/components/ChatContainer.d.ts +5 -0
  185. package/dist/types/src/stories/components/ChatContainer.d.ts.map +1 -0
  186. package/dist/types/src/stories/components/GraphContainer.d.ts +6 -0
  187. package/dist/types/src/stories/components/GraphContainer.d.ts.map +1 -0
  188. package/dist/types/src/stories/components/LoggingContainer.d.ts +5 -0
  189. package/dist/types/src/stories/components/LoggingContainer.d.ts.map +1 -0
  190. package/dist/types/src/stories/components/SurfaceContainer.d.ts +8 -0
  191. package/dist/types/src/stories/components/SurfaceContainer.d.ts.map +1 -0
  192. package/dist/types/src/stories/components/TasksContainer.d.ts +5 -0
  193. package/dist/types/src/stories/components/TasksContainer.d.ts.map +1 -0
  194. package/dist/types/src/stories/components/index.d.ts +8 -0
  195. package/dist/types/src/stories/components/index.d.ts.map +1 -0
  196. package/dist/types/src/stories/components/types.d.ts +7 -0
  197. package/dist/types/src/stories/components/types.d.ts.map +1 -0
  198. package/dist/types/src/stories/hooks/index.d.ts +3 -0
  199. package/dist/types/src/stories/hooks/index.d.ts.map +1 -0
  200. package/dist/types/src/stories/hooks/useFlush.d.ts +6 -0
  201. package/dist/types/src/stories/hooks/useFlush.d.ts.map +1 -0
  202. package/dist/types/src/stories/hooks/useMatcherExtension.d.ts +3 -0
  203. package/dist/types/src/stories/hooks/useMatcherExtension.d.ts.map +1 -0
  204. package/dist/types/src/stories/testing/data.d.ts +142 -0
  205. package/dist/types/src/stories/testing/data.d.ts.map +1 -0
  206. package/dist/types/src/stories/testing/index.d.ts +3 -0
  207. package/dist/types/src/stories/testing/index.d.ts.map +1 -0
  208. package/dist/types/src/stories/testing/testing.d.ts +26 -0
  209. package/dist/types/src/stories/testing/testing.d.ts.map +1 -0
  210. package/dist/types/src/testing/test-functions.d.ts +5 -2
  211. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  212. package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
  213. package/dist/types/src/tools/function.d.ts.map +1 -1
  214. package/dist/types/src/tools/openapi.d.ts.map +1 -1
  215. package/dist/types/src/translations.d.ts +5 -0
  216. package/dist/types/src/translations.d.ts.map +1 -1
  217. package/dist/types/src/types/Assistant.d.ts +42 -0
  218. package/dist/types/src/types/Assistant.d.ts.map +1 -0
  219. package/dist/types/src/types/AssistantAction.d.ts +91 -0
  220. package/dist/types/src/types/AssistantAction.d.ts.map +1 -0
  221. package/dist/types/src/types/defs.d.ts +2 -0
  222. package/dist/types/src/types/defs.d.ts.map +1 -0
  223. package/dist/types/src/types/index.d.ts +3 -1
  224. package/dist/types/src/types/index.d.ts.map +1 -1
  225. package/dist/types/src/types/service.d.ts +6 -6
  226. package/dist/types/src/types/service.d.ts.map +1 -1
  227. package/dist/types/tsconfig.tsbuildinfo +1 -1
  228. package/package.json +85 -79
  229. package/src/AssistantPlugin.tsx +37 -16
  230. package/src/capabilities/ai-service.ts +28 -0
  231. package/src/capabilities/app-graph-builder.ts +8 -8
  232. package/src/capabilities/blueprint-definition.ts +32 -0
  233. package/src/capabilities/capabilities.ts +22 -0
  234. package/src/capabilities/edge-model-resolver.ts +29 -0
  235. package/src/capabilities/index.ts +6 -0
  236. package/src/capabilities/intent-resolver.ts +13 -12
  237. package/src/capabilities/react-surface.tsx +22 -15
  238. package/src/capabilities/toolkit.ts +106 -0
  239. package/src/components/AssistantSettings/AssistantSettings.tsx +1 -1
  240. package/src/components/Chat/Chat.tsx +77 -64
  241. package/src/components/ChatContainer.tsx +38 -14
  242. package/src/components/ChatDialog.tsx +10 -6
  243. package/src/components/ChatPrompt/ChatOptions.tsx +59 -0
  244. package/src/components/ChatPrompt/ChatReferences.tsx +11 -9
  245. package/src/components/ChatPrompt/index.ts +1 -1
  246. package/src/components/ChatThread/ChatMessage.tsx +141 -118
  247. package/src/components/ChatThread/ChatThread.stories.tsx +236 -104
  248. package/src/components/ChatThread/ChatThread.tsx +2 -2
  249. package/src/components/ChatThread/Link.tsx +23 -0
  250. package/src/components/ChatThread/ToolBlock.tsx +20 -16
  251. package/src/components/SequenceContainer.tsx +2 -1
  252. package/src/components/SequenceEditor/SequenceEditor.stories.tsx +3 -2
  253. package/src/components/SequenceEditor/SequenceEditor.tsx +1 -1
  254. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +9 -2
  255. package/src/components/TemplateEditor/TemplateEditor.tsx +3 -2
  256. package/src/components/TemplateEditor/TemplateForm.stories.tsx +9 -2
  257. package/src/components/TemplateEditor/TemplateForm.tsx +2 -1
  258. package/src/components/Timeline/Timeline.stories.tsx +144 -0
  259. package/src/components/Timeline/Timeline.tsx +202 -0
  260. package/src/components/Timeline/index.ts +5 -0
  261. package/src/components/Toolbox/Toolbox.stories.tsx +6 -12
  262. package/src/components/Toolbox/Toolbox.tsx +16 -40
  263. package/src/components/index.ts +1 -4
  264. package/src/events.ts +2 -2
  265. package/src/execution-graph/execution-graph.ts +184 -0
  266. package/src/execution-graph/index.ts +5 -0
  267. package/src/functions/analysis.ts +20 -0
  268. package/src/functions/index.ts +7 -0
  269. package/src/functions/list.ts +42 -0
  270. package/src/functions/load.ts +43 -0
  271. package/src/hooks/chat-processor.ts +123 -177
  272. package/src/hooks/errors.ts +8 -0
  273. package/src/hooks/index.ts +6 -1
  274. package/src/hooks/presets.ts +6 -5
  275. package/src/hooks/useBlueprintRegistry.ts +79 -0
  276. package/src/hooks/useChatProcessor.ts +21 -83
  277. package/src/hooks/useChatServices.ts +29 -22
  278. package/src/hooks/useExecutionGraph.ts +16 -0
  279. package/src/hooks/useOnline.ts +10 -0
  280. package/src/hooks/usePresets.ts +45 -0
  281. package/src/hooks/useReferencesProvider.ts +11 -9
  282. package/src/hooks/useResolveRef.ts +33 -0
  283. package/src/parser/filter-generator.ts +6 -13
  284. package/src/parser/query-parser.ts +1 -1
  285. package/src/queue-logger.ts +5 -5
  286. package/src/stories/Chat.stories.tsx +236 -290
  287. package/src/stories/components/BlueprintContainer.tsx +34 -0
  288. package/src/stories/components/ChatContainer.tsx +80 -0
  289. package/src/stories/components/GraphContainer.tsx +118 -0
  290. package/src/stories/components/LoggingContainer.tsx +29 -0
  291. package/src/stories/components/SurfaceContainer.tsx +62 -0
  292. package/src/stories/components/TasksContainer.tsx +51 -0
  293. package/src/stories/components/index.ts +12 -0
  294. package/src/stories/components/types.ts +11 -0
  295. package/src/stories/hooks/index.ts +6 -0
  296. package/src/stories/hooks/useFlush.ts +35 -0
  297. package/src/stories/hooks/useMatcherExtension.ts +45 -0
  298. package/src/stories/testing/data.ts +130 -0
  299. package/src/stories/testing/index.ts +6 -0
  300. package/src/stories/testing/testing.tsx +163 -0
  301. package/src/testing/test-functions.ts +8 -3
  302. package/src/testing/test-sequence.ts +1 -1
  303. package/src/tools/function.ts +4 -1
  304. package/src/tools/openapi.test.ts +7 -5
  305. package/src/tools/openapi.ts +4 -1
  306. package/src/translations.ts +7 -0
  307. package/src/types/Assistant.ts +62 -0
  308. package/src/types/AssistantAction.ts +54 -0
  309. package/src/types/defs.ts +5 -0
  310. package/src/types/index.ts +4 -1
  311. package/dist/lib/browser/ChatContainer-RP3QEXYX.mjs.map +0 -7
  312. package/dist/lib/browser/ChatDialog-ZVLXFHEY.mjs.map +0 -7
  313. package/dist/lib/browser/SequenceContainer-3UDVKWPA.mjs.map +0 -7
  314. package/dist/lib/browser/app-graph-builder-XSEOKJLG.mjs.map +0 -7
  315. package/dist/lib/browser/chunk-63GG6U6D.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-7W7LHTRH.mjs +0 -171
  317. package/dist/lib/browser/chunk-7W7LHTRH.mjs.map +0 -7
  318. package/dist/lib/browser/chunk-FDCJSQYF.mjs +0 -40
  319. package/dist/lib/browser/chunk-LERGF5YG.mjs +0 -108
  320. package/dist/lib/browser/chunk-LERGF5YG.mjs.map +0 -7
  321. package/dist/lib/browser/intent-resolver-MV3VSZLS.mjs.map +0 -7
  322. package/dist/lib/browser/react-surface-3GYEHQRP.mjs.map +0 -7
  323. package/dist/lib/node-esm/ChatContainer-W3W6FWV3.mjs.map +0 -7
  324. package/dist/lib/node-esm/ChatDialog-QW4JRKVO.mjs.map +0 -7
  325. package/dist/lib/node-esm/SequenceContainer-RQQH5XOC.mjs.map +0 -7
  326. package/dist/lib/node-esm/app-graph-builder-PANCJUHV.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-BFO3KHYL.mjs.map +0 -7
  328. package/dist/lib/node-esm/chunk-MS3PJARN.mjs +0 -109
  329. package/dist/lib/node-esm/chunk-MS3PJARN.mjs.map +0 -7
  330. package/dist/lib/node-esm/chunk-QN2H2EHV.mjs +0 -41
  331. package/dist/lib/node-esm/chunk-Z7PUODRT.mjs +0 -172
  332. package/dist/lib/node-esm/chunk-Z7PUODRT.mjs.map +0 -7
  333. package/dist/lib/node-esm/intent-resolver-3FMC3GHC.mjs.map +0 -7
  334. package/dist/lib/node-esm/react-surface-QDQWJ7FZ.mjs.map +0 -7
  335. package/dist/types/src/capability-definitions.d.ts +0 -7
  336. package/dist/types/src/capability-definitions.d.ts.map +0 -1
  337. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts +0 -9
  338. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts.map +0 -1
  339. package/dist/types/src/hooks/chat-processor.test.d.ts +0 -2
  340. package/dist/types/src/hooks/chat-processor.test.d.ts.map +0 -1
  341. package/dist/types/src/hooks/useBlueprints.d.ts +0 -9
  342. package/dist/types/src/hooks/useBlueprints.d.ts.map +0 -1
  343. package/dist/types/src/types/schema.d.ts +0 -120
  344. package/dist/types/src/types/schema.d.ts.map +0 -1
  345. package/src/capability-definitions.ts +0 -15
  346. package/src/components/ChatPrompt/ChatOptionsMenu.tsx +0 -52
  347. package/src/hooks/chat-processor.test.ts +0 -16
  348. package/src/hooks/useBlueprints.ts +0 -57
  349. package/src/types/schema.ts +0 -108
  350. /package/dist/lib/{node-esm/BlueprintContainer-RGTMNLNX.mjs.map → browser/BlueprintContainer-H7H4BQ2C.mjs.map} +0 -0
@@ -0,0 +1,106 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { AiTool, AiToolkit } from '@effect/ai';
6
+ import { Effect, Schema } from 'effect';
7
+
8
+ import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
+ import { Filter, Obj, Type } from '@dxos/echo';
10
+ import { DatabaseService } from '@dxos/functions';
11
+ import { ClientCapabilities } from '@dxos/plugin-client';
12
+ import { SpaceCapabilities, getActiveSpace } from '@dxos/plugin-space';
13
+ import { SpaceAction } from '@dxos/plugin-space/types';
14
+ import { DataType } from '@dxos/schema';
15
+ import { trim } from '@dxos/util';
16
+
17
+ class SchemaToolkit extends AiToolkit.make(
18
+ AiTool.make('get-schemas', {
19
+ description: trim`
20
+ Retrieves schemas definitions.
21
+ `,
22
+ parameters: {
23
+ // TODO(wittjosiah): Remove this once parameter-less tools are fixed.
24
+ limit: Schema.Number,
25
+ },
26
+ // TODO(dmaretskyi): Effect returns ({ result, encodedResult })
27
+ success: Schema.Any,
28
+ failure: Schema.Never,
29
+ }),
30
+ AiTool.make('create-record', {
31
+ description: trim`
32
+ Creates a new record.
33
+ Get the schema from the get-schemas tool and ensure that the data matches the corresponding schema.
34
+ Note that only record schemas are supported.
35
+ `,
36
+ parameters: {
37
+ typename: Schema.String,
38
+ data: Schema.Any,
39
+ },
40
+ success: Schema.Any,
41
+ failure: Schema.Never,
42
+ }),
43
+ ) {
44
+ static layer = (context: PluginContext) =>
45
+ SchemaToolkit.toLayer({
46
+ //
47
+ 'get-schemas': () => {
48
+ const space = getActiveSpace(context);
49
+ const service = space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable;
50
+ return Effect.gen(function* () {
51
+ const forms = context.getCapabilities(SpaceCapabilities.ObjectForm).map((form) => ({
52
+ typename: Type.getTypename(form.objectSchema),
53
+ jsonSchema: Type.toJsonSchema(form.objectSchema),
54
+ kind: 'item',
55
+ }));
56
+ const allowed = context
57
+ .getCapabilities(ClientCapabilities.SchemaWhiteList)
58
+ .flat()
59
+ .map((schema) => ({
60
+ typename: Type.getTypename(schema),
61
+ jsonSchema: Type.toJsonSchema(schema),
62
+ kind: 'record',
63
+ }));
64
+ const schemas = [...forms, ...allowed];
65
+ if (space) {
66
+ const { objects } = yield* DatabaseService.runQuery(Filter.type(DataType.StoredSchema));
67
+ schemas.push(
68
+ ...objects.map((object) => ({
69
+ typename: object.typename,
70
+ jsonSchema: object.jsonSchema,
71
+ kind: 'record',
72
+ })),
73
+ );
74
+ }
75
+ return schemas.map((schema) => schema.typename);
76
+ }).pipe(Effect.provide(service));
77
+ },
78
+
79
+ //
80
+ 'create-record': ({ typename, data }) => {
81
+ const space = getActiveSpace(context);
82
+ const service = space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable;
83
+ console.log('create-record', { typename, data, space });
84
+ return Effect.gen(function* () {
85
+ const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
86
+ const schemas = context.getCapabilities(ClientCapabilities.SchemaWhiteList).flat();
87
+ const { objects } = yield* DatabaseService.runQuery(Filter.type(DataType.StoredSchema));
88
+ schemas.push(...objects.map((object) => Type.toEffectSchema(object.jsonSchema)));
89
+
90
+ const schema = schemas.find((schema) => Type.getTypename(schema) === typename);
91
+ if (!schema) {
92
+ throw new Error(`Schema not found for ${typename}`);
93
+ }
94
+
95
+ const object = Obj.make(schema, data);
96
+ yield* dispatch(createIntent(SpaceAction.AddObject, { object, target: space!, hidden: true }));
97
+ return object;
98
+ }).pipe(Effect.provide(service), Effect.orDie);
99
+ },
100
+ });
101
+ }
102
+
103
+ export default (context: PluginContext) => [
104
+ contributes(Capabilities.Toolkit, SchemaToolkit),
105
+ contributes(Capabilities.ToolkitHandler, SchemaToolkit.layer(context)),
106
+ ];
@@ -9,7 +9,7 @@ import { Input, Select, useTranslation } from '@dxos/react-ui';
9
9
  import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
10
10
 
11
11
  import { meta } from '../../meta';
12
- import { LLM_PROVIDERS, type Assistant } from '../../types';
12
+ import { type Assistant, LLM_PROVIDERS } from '../../types';
13
13
 
14
14
  // TODO(burdon): Factor out default Selector.
15
15
  const DEFAULT_VALUE = '__default';
@@ -4,32 +4,31 @@
4
4
 
5
5
  import { type Extension, Prec } from '@codemirror/state';
6
6
  import { keymap } from '@codemirror/view';
7
+ import { Result, useRxValue } from '@effect-rx/rx-react';
7
8
  import { createContext } from '@radix-ui/react-context';
8
- import { dedupeWith } from 'effect/Array';
9
+ import { Array, Option } from 'effect';
9
10
  import React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
11
 
11
- import { CollaborationActions, createIntent, useIntentDispatcher } from '@dxos/app-framework';
12
12
  import { Event } from '@dxos/async';
13
13
  import { DXN, Obj, Ref } from '@dxos/echo';
14
14
  import { log } from '@dxos/log';
15
15
  import { useVoiceInput } from '@dxos/plugin-transcription';
16
- import { type Expando, getSpace, useQueue, type Space } from '@dxos/react-client/echo';
16
+ import { type Space, getSpace, useQueue } from '@dxos/react-client/echo';
17
17
  import { useIdentity } from '@dxos/react-client/halo';
18
- import { Input, useTranslation, type ThemedClassName } from '@dxos/react-ui';
18
+ import { Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
19
19
  import { ChatEditor, type ChatEditorController, type ChatEditorProps, references } from '@dxos/react-ui-chat';
20
20
  import { type ScrollController } from '@dxos/react-ui-components';
21
21
  import { mx } from '@dxos/react-ui-theme';
22
22
  import { DataType } from '@dxos/schema';
23
23
  import { isNotFalsy } from '@dxos/util';
24
24
 
25
- import { type ChatEvent } from './events';
26
- import { type ChatProcessor, useBlueprints, useReferencesProvider } from '../../hooks';
25
+ import { type AiChatProcessor, useBlueprintHandlers, useReferencesProvider } from '../../hooks';
27
26
  import { meta } from '../../meta';
28
27
  import { type Assistant } from '../../types';
29
28
  import {
30
29
  ChatActions,
31
30
  type ChatActionsProps,
32
- ChatOptionsMenu,
31
+ ChatOptions,
33
32
  ChatPresets,
34
33
  type ChatPresetsProps,
35
34
  ChatReferences,
@@ -38,6 +37,8 @@ import {
38
37
  } from '../ChatPrompt';
39
38
  import { ChatThread as NativeChatThread, type ChatThreadProps as NativeChatThreadProps } from '../ChatThread';
40
39
 
40
+ import { type ChatEvent } from './events';
41
+
41
42
  // TODO(burdon): Factor out.
42
43
  const Endcap = ({ children }: PropsWithChildren) => {
43
44
  return (
@@ -57,11 +58,8 @@ type ChatContextValue = {
57
58
  event: Event<ChatEvent>;
58
59
  space: Space;
59
60
  chat: Assistant.Chat;
60
- processor: ChatProcessor;
61
61
  messages: DataType.Message[];
62
-
63
- /** @deprecated Remove and replace with context. */
64
- artifact?: Expando;
62
+ processor: AiChatProcessor;
65
63
  };
66
64
 
67
65
  // NOTE: Do not export.
@@ -73,43 +71,46 @@ const [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('C
73
71
 
74
72
  type ChatRootProps = ThemedClassName<
75
73
  PropsWithChildren<
76
- Pick<ChatContextValue, 'chat' | 'processor' | 'artifact'> & {
74
+ Pick<ChatContextValue, 'chat' | 'processor'> & {
77
75
  onEvent?: (event: ChatEvent) => void;
78
76
  }
79
77
  >
80
78
  >;
81
79
 
82
- const ChatRoot = ({ classNames, children, chat, processor, artifact, onEvent, ...props }: ChatRootProps) => {
80
+ const ChatRoot = ({ classNames, children, chat, processor, onEvent, ...props }: ChatRootProps) => {
83
81
  const [debug, setDebug] = useState(false);
84
82
  const space = getSpace(chat);
85
83
 
86
84
  // Messages.
87
85
  const queue = useQueue<DataType.Message>(chat?.queue.dxn);
88
- const messages = useMemo(
89
- () =>
90
- dedupeWith(
91
- [...(queue?.objects?.filter(Obj.instanceOf(DataType.Message)) ?? []), ...(processor?.messages.value ?? [])],
92
- (a, b) => a.id === b.id,
93
- ),
94
- [queue?.objects, processor?.messages.value],
95
- );
96
-
97
- // TODO(burdon): Replace with tool.
98
- const { dispatchPromise: dispatch } = useIntentDispatcher();
99
- useEffect(() => {
100
- if (!processor?.streaming.value && queue?.objects && artifact) {
101
- const message = queue.objects[queue.objects.length - 1];
102
- if (dispatch && space && chat && message) {
103
- void dispatch(
104
- createIntent(CollaborationActions.InsertContent, {
105
- target: artifact,
106
- object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...chat.queue.dxn.parts, message.id])),
107
- label: 'View proposal',
108
- }),
109
- );
110
- }
111
- }
112
- }, [queue, processor?.streaming.value]);
86
+ const pending = useRxValue(processor.messages);
87
+ const streaming = useRxValue(processor.streaming);
88
+
89
+ const messages = useMemo(() => {
90
+ const queueMessages = queue?.objects?.filter(Obj.instanceOf(DataType.Message)) ?? [];
91
+ return Result.match(pending, {
92
+ onInitial: () => queueMessages,
93
+ onSuccess: (pending) => Array.dedupeWith([...queueMessages, ...pending.value], (a, b) => a.id === b.id),
94
+ onFailure: () => queueMessages,
95
+ });
96
+ }, [queue?.objects, pending]);
97
+
98
+ // TODO(burdon): Replace with tool to select artifact.
99
+ // const { dispatchPromise: dispatch } = useIntentDispatcher();
100
+ // useEffect(() => {
101
+ // if (!processor?.streaming.value && queue?.objects) {
102
+ // const message = queue.objects[queue.objects.length - 1];
103
+ // if (dispatch && space && chat && message) {
104
+ // void dispatch(
105
+ // createIntent(CollaborationActions.InsertContent, {
106
+ // target: artifact,
107
+ // object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...chat.queue.dxn.parts, message.id])),
108
+ // label: 'View proposal',
109
+ // }),
110
+ // );
111
+ // }
112
+ // }
113
+ // }, [queue, processor?.streaming.value]);
113
114
 
114
115
  // Events.
115
116
  const event = useMemo(() => new Event<ChatEvent>(), []);
@@ -117,12 +118,17 @@ const ChatRoot = ({ classNames, children, chat, processor, artifact, onEvent, ..
117
118
  return event.on((event) => {
118
119
  switch (event.type) {
119
120
  case 'toggle-debug': {
120
- setDebug((debug) => !debug);
121
+ setDebug((current) => {
122
+ const debug = !current;
123
+ log.info('toggle-debug', { debug });
124
+ // log.config({ filter: debug ? 'assistant:debug' : 'info' });
125
+ return debug;
126
+ });
121
127
  break;
122
128
  }
123
129
 
124
130
  case 'submit': {
125
- if (!processor.streaming.value) {
131
+ if (!streaming) {
126
132
  void processor.request(event.text);
127
133
  }
128
134
  break;
@@ -138,7 +144,7 @@ const ChatRoot = ({ classNames, children, chat, processor, artifact, onEvent, ..
138
144
  }
139
145
  }
140
146
  });
141
- }, [event, onEvent]);
147
+ }, [event, onEvent, processor, streaming]);
142
148
 
143
149
  if (!space) {
144
150
  return null;
@@ -170,7 +176,7 @@ ChatRoot.displayName = 'Chat.Root';
170
176
  type ChatThreadProps = Omit<NativeChatThreadProps, 'identity' | 'space' | 'messages' | 'tools' | 'onEvent'>;
171
177
 
172
178
  const ChatThread = (props: ChatThreadProps) => {
173
- const { debug, event, space, processor, messages } = useChatContext(ChatThread.displayName);
179
+ const { debug, event, space, messages } = useChatContext(ChatThread.displayName);
174
180
  const identity = useIdentity();
175
181
 
176
182
  const scrollerRef = useRef<ScrollController>(null);
@@ -197,7 +203,6 @@ const ChatThread = (props: ChatThreadProps) => {
197
203
  identity={identity}
198
204
  space={space}
199
205
  messages={messages}
200
- tools={processor?.tools}
201
206
  onEvent={(ev) => event.emit(ev)}
202
207
  />
203
208
  );
@@ -231,6 +236,8 @@ const ChatPrompt = ({
231
236
  }: ChatPromptProps) => {
232
237
  const { t } = useTranslation(meta.id);
233
238
  const { space, event, processor } = useChatContext(ChatPrompt.displayName);
239
+ const streaming = useRxValue(processor.streaming);
240
+ const error = useRxValue(processor.error).pipe(Option.getOrUndefined);
234
241
 
235
242
  const [active, setActive] = useState(false);
236
243
  useEffect(() => {
@@ -257,16 +264,14 @@ const ChatPrompt = ({
257
264
  },
258
265
  });
259
266
 
260
- const [blueprints, handleUpdateBlueprints] = useBlueprints(space, processor.context, processor.blueprintRegistry);
261
-
262
267
  // TODO(burdon): Reconcile with object tags.
263
- const contextProvider = useReferencesProvider(space);
268
+ const referencesProvider = useReferencesProvider(space);
264
269
  const extensions = useMemo<Extension[]>(() => {
265
270
  return [
266
- contextProvider && references({ provider: contextProvider }),
267
- expandable &&
268
- Prec.highest(
269
- keymap.of([
271
+ referencesProvider && references({ provider: referencesProvider }),
272
+ Prec.highest(
273
+ keymap.of(
274
+ [
270
275
  {
271
276
  key: 'cmd-d',
272
277
  preventDefault: true,
@@ -275,7 +280,7 @@ const ChatPrompt = ({
275
280
  return true;
276
281
  },
277
282
  },
278
- {
283
+ expandable && {
279
284
  key: 'cmd-ArrowUp',
280
285
  preventDefault: true,
281
286
  run: () => {
@@ -283,7 +288,7 @@ const ChatPrompt = ({
283
288
  return true;
284
289
  },
285
290
  },
286
- {
291
+ expandable && {
287
292
  key: 'cmd-ArrowDown',
288
293
  preventDefault: true,
289
294
  run: () => {
@@ -291,19 +296,20 @@ const ChatPrompt = ({
291
296
  return true;
292
297
  },
293
298
  },
294
- ]),
299
+ ].filter(isNotFalsy),
295
300
  ),
301
+ ),
296
302
  ].filter(isNotFalsy);
297
- }, [event, expandable, contextProvider]);
303
+ }, [event, expandable, referencesProvider]);
298
304
 
299
305
  const handleSubmit = useCallback<NonNullable<ChatEditorProps['onSubmit']>>(
300
306
  (text) => {
301
- if (!processor.streaming.value) {
307
+ if (!streaming) {
302
308
  event.emit({ type: 'submit', text });
303
309
  return true;
304
310
  }
305
311
  },
306
- [processor, event],
312
+ [streaming, event],
307
313
  );
308
314
 
309
315
  const handleEvent = useCallback<NonNullable<ChatActionsProps['onEvent']>>(
@@ -313,11 +319,17 @@ const ChatPrompt = ({
313
319
  [event],
314
320
  );
315
321
 
316
- // TODO(burdon): Update context.
317
- const handleUpdateReferences = useCallback<NonNullable<ChatReferencesProps['onUpdate']>>((ids) => {
318
- log.info('update', { ids });
322
+ const handleUpdateReferences = useCallback<NonNullable<ChatReferencesProps['onUpdate']>>((dxns) => {
323
+ log.info('update', { dxns });
324
+ void processor.context.bind({ objects: dxns.map((dxn) => Ref.fromDXN(DXN.parse(dxn))) });
319
325
  }, []);
320
326
 
327
+ const { onUpdateBlueprint } = useBlueprintHandlers({
328
+ space,
329
+ context: processor.context,
330
+ blueprintRegistry: processor.blueprintRegistry,
331
+ });
332
+
321
333
  return (
322
334
  <div
323
335
  className={mx(
@@ -326,7 +338,7 @@ const ChatPrompt = ({
326
338
  )}
327
339
  >
328
340
  <Endcap>
329
- <ChatStatusIndicator preset={preset} error={processor.error.value} processing={processor.streaming.value} />
341
+ <ChatStatusIndicator preset={preset} error={error} processing={streaming} />
330
342
  </Endcap>
331
343
 
332
344
  <ChatEditor
@@ -347,16 +359,17 @@ const ChatPrompt = ({
347
359
  onUpdate={handleUpdateReferences}
348
360
  />
349
361
 
350
- <ChatOptionsMenu
362
+ <ChatOptions
351
363
  blueprintRegistry={processor.blueprintRegistry}
352
- blueprints={blueprints}
353
- onChange={handleUpdateBlueprints}
364
+ context={processor.context}
365
+ onUpdateBlueprint={onUpdateBlueprint}
354
366
  />
367
+
355
368
  <ChatActions
356
369
  classNames='col-span-2'
357
370
  microphone={true}
358
371
  recording={recording}
359
- processing={processor.streaming.value}
372
+ processing={streaming}
360
373
  onEvent={handleEvent}
361
374
  >
362
375
  <>
@@ -2,40 +2,64 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useEffect } from 'react';
6
6
 
7
7
  import { Capabilities, useCapability } from '@dxos/app-framework';
8
- import { type AssociatedArtifact } from '@dxos/blueprints';
9
8
  import { getSpace } from '@dxos/client/echo';
10
9
  import { StackItem } from '@dxos/react-ui-stack';
10
+ import { type MaybePromise } from '@dxos/util';
11
11
 
12
- import { Chat } from './Chat';
13
- import { useChatProcessor, useChatServices } from '../hooks';
12
+ import {
13
+ type AiChatProcessor,
14
+ useBlueprintRegistry,
15
+ useChatProcessor,
16
+ useChatServices,
17
+ useOnline,
18
+ usePresets,
19
+ } from '../hooks';
14
20
  import { meta } from '../meta';
15
21
  import { type Assistant } from '../types';
16
22
 
23
+ import { Chat } from './Chat';
24
+
17
25
  export type ChatContainerProps = {
18
- role: string;
19
26
  chat: Assistant.Chat;
20
- artifact?: AssociatedArtifact;
27
+ role?: string;
28
+ onProcessorReady?: (processor: AiChatProcessor) => MaybePromise<void>;
21
29
  };
22
30
 
23
- export const ChatContainer = ({ role, chat, artifact }: ChatContainerProps) => {
31
+ export const ChatContainer = ({ chat, onProcessorReady }: ChatContainerProps) => {
24
32
  const space = getSpace(chat);
25
33
  const settings = useCapability(Capabilities.SettingsStore).getStore<Assistant.Settings>(meta.id)?.value;
26
- const services = useChatServices({ space });
27
- const processor = useChatProcessor({ chat, services, settings });
28
- if (!processor) {
34
+ const services = useChatServices({ space, chat });
35
+ const [online, setOnline] = useOnline();
36
+ const { preset, ...chatProps } = usePresets(online);
37
+ const blueprintRegistry = useBlueprintRegistry();
38
+ const processor = useChatProcessor({ space, chat, preset, services, blueprintRegistry, settings });
39
+
40
+ useEffect(() => {
41
+ if (processor && onProcessorReady) {
42
+ const timeout = setTimeout(() => onProcessorReady(processor));
43
+ return () => clearTimeout(timeout);
44
+ }
45
+ }, [processor, onProcessorReady]);
46
+
47
+ if (!chat || !processor) {
29
48
  return null;
30
49
  }
31
50
 
32
- // TODO(burdon): Add attention attributes.
33
51
  return (
34
52
  <StackItem.Content classNames='container-max-width'>
35
- <Chat.Root chat={chat} processor={processor} artifact={artifact}>
53
+ <Chat.Root chat={chat} processor={processor}>
36
54
  <Chat.Thread />
37
- <div className='pbe-4 pis-2 pie-2'>
38
- <Chat.Prompt classNames='border border-subduedSeparator rounded-md' />
55
+ <div className='p-2'>
56
+ <Chat.Prompt
57
+ {...chatProps}
58
+ classNames='p-2 border border-transparent rounded-md'
59
+ preset={preset?.id}
60
+ online={online}
61
+ onChangeOnline={setOnline}
62
+ />
39
63
  </div>
40
64
  </Chat.Root>
41
65
  </StackItem.Content>
@@ -4,16 +4,17 @@
4
4
 
5
5
  import React, { useCallback, useState } from 'react';
6
6
 
7
- import { useCapability, Capabilities } from '@dxos/app-framework';
7
+ import { Capabilities, useCapability } from '@dxos/app-framework';
8
8
  import { getSpace } from '@dxos/client/echo';
9
9
  import { useTranslation } from '@dxos/react-ui';
10
10
  import { ChatDialog as NativeChatDialog } from '@dxos/react-ui-chat';
11
11
 
12
- import { Chat, type ChatRootProps } from './Chat';
13
- import { useChatProcessor, useChatServices } from '../hooks';
12
+ import { useBlueprintRegistry, useChatProcessor, useChatServices, useOnline, usePresets } from '../hooks';
14
13
  import { meta } from '../meta';
15
14
  import { type Assistant } from '../types';
16
15
 
16
+ import { Chat, type ChatRootProps } from './Chat';
17
+
17
18
  export type ChatDialogProps = {
18
19
  chat?: Assistant.Chat;
19
20
  };
@@ -23,8 +24,11 @@ export const ChatDialog = ({ chat }: ChatDialogProps) => {
23
24
 
24
25
  const space = getSpace(chat);
25
26
  const settings = useCapability(Capabilities.SettingsStore).getStore<Assistant.Settings>(meta.id)?.value;
26
- const services = useChatServices({ space });
27
- const processor = useChatProcessor({ chat, services, settings });
27
+ const services = useChatServices({ space, chat });
28
+ const [online, setOnline] = useOnline();
29
+ const { preset, ...chatProps } = usePresets(online);
30
+ const blueprintRegistry = useBlueprintRegistry();
31
+ const processor = useChatProcessor({ space, chat, preset, services, blueprintRegistry, settings });
28
32
 
29
33
  // TODO(burdon): Refocus when open.
30
34
  const [open, setOpen] = useState(true);
@@ -54,7 +58,7 @@ export const ChatDialog = ({ chat }: ChatDialogProps) => {
54
58
  <Chat.Thread />
55
59
  </NativeChatDialog.Content>
56
60
  <NativeChatDialog.Footer>
57
- <Chat.Prompt expandable />
61
+ <Chat.Prompt {...chatProps} preset={preset?.id} online={online} onChangeOnline={setOnline} expandable />
58
62
  </NativeChatDialog.Footer>
59
63
  </NativeChatDialog.Root>
60
64
  </Chat.Root>
@@ -0,0 +1,59 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useMemo } from 'react';
6
+
7
+ import { type AiContextBinder } from '@dxos/assistant';
8
+ import { type Blueprint } from '@dxos/blueprints';
9
+ import { DropdownMenu, Icon, IconButton, useTranslation } from '@dxos/react-ui';
10
+
11
+ import { useBlueprints } from '../../hooks';
12
+ import { meta } from '../../meta';
13
+
14
+ export type ChatOptionsProps = {
15
+ context?: AiContextBinder;
16
+ blueprintRegistry?: Blueprint.Registry;
17
+ onUpdateBlueprint?: (key: string, isActive: boolean) => void;
18
+ };
19
+
20
+ /**
21
+ * Manages the runtime context for the chat.
22
+ */
23
+ // TODO(burdon): Refactor this as a Dialog (and move the object selector here also).
24
+ export const ChatOptions = ({ context, blueprintRegistry, onUpdateBlueprint }: ChatOptionsProps) => {
25
+ const { t } = useTranslation(meta.id);
26
+
27
+ // TODO(burdon): Possibly constrain query as registry grows.
28
+ const blueprints = useMemo(() => blueprintRegistry?.query() ?? [], [blueprintRegistry]);
29
+
30
+ const activeBlueprints = useBlueprints({ context });
31
+
32
+ return (
33
+ <DropdownMenu.Root>
34
+ <DropdownMenu.Trigger asChild>
35
+ <IconButton icon='ph--plus--regular' variant='ghost' size={5} iconOnly label={t('button add blueprint')} />
36
+ </DropdownMenu.Trigger>
37
+ <DropdownMenu.Portal>
38
+ <DropdownMenu.Content side='left'>
39
+ <DropdownMenu.Viewport>
40
+ {blueprints.map((blueprint) => (
41
+ <DropdownMenu.CheckboxItem
42
+ key={blueprint.key}
43
+ checked={activeBlueprints?.get(blueprint.key) !== undefined}
44
+ onCheckedChange={(checked) => onUpdateBlueprint?.(blueprint.key, !!checked)}
45
+ classNames='gap-2'
46
+ >
47
+ <div className='flex-1 min-is-0'>{blueprint.name}</div>
48
+ <DropdownMenu.ItemIndicator asChild>
49
+ <Icon icon='ph--check--regular' size={4} />
50
+ </DropdownMenu.ItemIndicator>
51
+ </DropdownMenu.CheckboxItem>
52
+ ))}
53
+ </DropdownMenu.Viewport>
54
+ <DropdownMenu.Arrow />
55
+ </DropdownMenu.Content>
56
+ </DropdownMenu.Portal>
57
+ </DropdownMenu.Root>
58
+ );
59
+ };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { type ContextBinder } from '@dxos/assistant';
7
+ import { type AiContextBinder } from '@dxos/assistant';
8
8
  import { type Space } from '@dxos/client/echo';
9
9
  import { Filter, Obj, Ref } from '@dxos/echo';
10
10
  import { type ThemedClassName, useAsyncState, useTranslation } from '@dxos/react-ui';
@@ -16,26 +16,28 @@ import { meta } from '../../meta';
16
16
 
17
17
  export type ChatReferencesProps = ThemedClassName<{
18
18
  space: Space;
19
- context: ContextBinder;
20
- onUpdate?: (ids: string[]) => void;
19
+ context: AiContextBinder;
20
+ onUpdate?: (dxns: string[]) => void;
21
21
  }>;
22
22
 
23
23
  export const ChatReferences = ({ classNames, space, context, onUpdate }: ChatReferencesProps) => {
24
- const { t: _t } = useTranslation(meta.id);
24
+ const { t } = useTranslation(meta.id);
25
25
 
26
26
  const [items] = useAsyncState<TagPickerItemData[]>(async () => {
27
27
  const objects = await Ref.Array.loadAll(context.objects.value ?? []);
28
- return objects.filter(isNonNullable).map((obj) => ({ id: obj.id, label: Obj.getLabel(obj) ?? obj.id }));
28
+ return objects
29
+ .filter(isNonNullable)
30
+ .map((obj) => ({ id: Obj.getDXN(obj).toString(), label: Obj.getLabel(obj) ?? Obj.getTypename(obj) ?? obj.id }));
29
31
  }, [context]);
30
32
 
31
33
  const handleSearch = useCallback<NonNullable<TagPickerOptions['onSearch']>>(
32
- (text, ids) => {
34
+ (text, dxns) => {
33
35
  // TODO(burdon): Filter by Item tag (e.g., exclude "contacts") and Query by object label.
34
36
  // TODO(burdon): Change to Filter.text().
35
37
  const objects = space.db.query(Filter.everything()).runSync();
36
38
  return objects
37
- .map(({ object }) => ({ id: object.id, label: Obj.getLabel(object) ?? '' }))
38
- .filter(({ id, label }) => !ids.includes(id) && label.toLocaleLowerCase().includes(text.toLocaleLowerCase()));
39
+ .map(({ object }) => ({ id: Obj.getDXN(object).toString(), label: Obj.getLabel(object) ?? '' }))
40
+ .filter(({ id, label }) => !dxns.includes(id) && label.toLocaleLowerCase().includes(text.toLocaleLowerCase()));
39
41
  },
40
42
  [space],
41
43
  );
@@ -44,7 +46,7 @@ export const ChatReferences = ({ classNames, space, context, onUpdate }: ChatRef
44
46
  <TagPicker
45
47
  classNames={mx('h-[1.75rem] text-sm', classNames)}
46
48
  mode='multi-select'
47
- // placeholder={t('context objects placeholder')}
49
+ placeholder={t('context objects placeholder')}
48
50
  items={items}
49
51
  onSearch={handleSearch}
50
52
  onUpdate={onUpdate}
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  export * from './ChatActions';
6
- export * from './ChatOptionsMenu';
6
+ export * from './ChatOptions';
7
7
  export * from './ChatPresets';
8
8
  export * from './ChatReferences';
9
9
  export * from './ChatStatusIndicator';