@dxos/plugin-assistant 0.8.4-main.c1de068 → 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 (359) hide show
  1. package/dist/lib/browser/{TemplateContainer-RPJ2LBOB.mjs → BlueprintContainer-H7H4BQ2C.mjs} +11 -9
  2. package/dist/lib/browser/BlueprintContainer-H7H4BQ2C.mjs.map +7 -0
  3. package/dist/lib/browser/{ChatContainer-M3IHQLRS.mjs → ChatContainer-SB7YC2XP.mjs} +37 -14
  4. package/dist/lib/browser/ChatContainer-SB7YC2XP.mjs.map +7 -0
  5. package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs → ChatDialog-X6PFOQSQ.mjs} +23 -8
  6. package/dist/lib/browser/ChatDialog-X6PFOQSQ.mjs.map +7 -0
  7. package/dist/lib/browser/{SequenceContainer-3UDVKWPA.mjs → SequenceContainer-627OQ557.mjs} +3 -2
  8. package/dist/lib/browser/SequenceContainer-627OQ557.mjs.map +7 -0
  9. package/dist/lib/browser/ai-service-7KJ5LXBT.mjs +22 -0
  10. package/dist/lib/browser/ai-service-7KJ5LXBT.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-builder-JTXBKE7O.mjs → app-graph-builder-ERU5XY2S.mjs} +17 -74
  12. package/dist/lib/browser/app-graph-builder-ERU5XY2S.mjs.map +7 -0
  13. package/dist/lib/browser/blueprint-definition-CMGIZAOW.mjs +146 -0
  14. package/dist/lib/browser/blueprint-definition-CMGIZAOW.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-OWY4CUQY.mjs → chunk-BVH6VK6Q.mjs} +816 -807
  16. package/dist/lib/browser/chunk-BVH6VK6Q.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  18. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-JBFDQMUJ.mjs +193 -0
  20. package/dist/lib/browser/chunk-JBFDQMUJ.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-LKP65RPA.mjs +20 -0
  22. package/dist/lib/browser/{chunk-FDCJSQYF.mjs.map → chunk-LKP65RPA.mjs.map} +1 -1
  23. package/dist/lib/browser/{chunk-AEAEKWOC.mjs → chunk-NZDCKQ6W.mjs} +12 -21
  24. package/dist/lib/browser/chunk-NZDCKQ6W.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-QB7OVS6Z.mjs +16 -0
  26. package/dist/lib/browser/chunk-QB7OVS6Z.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-Y66UJUHV.mjs +280 -0
  28. package/dist/lib/browser/chunk-Y66UJUHV.mjs.map +7 -0
  29. package/dist/lib/browser/edge-model-resolver-2HB4PCWH.mjs +24 -0
  30. package/dist/lib/browser/edge-model-resolver-2HB4PCWH.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +98 -51
  32. package/dist/lib/browser/index.mjs.map +4 -4
  33. package/dist/lib/browser/{intent-resolver-5RMMCMXG.mjs → intent-resolver-DGRO2XSG.mjs} +33 -12
  34. package/dist/lib/browser/intent-resolver-DGRO2XSG.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/{react-surface-66VY37YQ.mjs → react-surface-LPSIBHEJ.mjs} +45 -32
  37. package/dist/lib/browser/react-surface-LPSIBHEJ.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-2DGP3UTS.mjs → settings-ZFNQYSYP.mjs} +6 -5
  39. package/dist/lib/{node-esm/settings-47RYZOU4.mjs.map → browser/settings-ZFNQYSYP.mjs.map} +1 -1
  40. package/dist/lib/browser/toolkit-IW4FBLLB.mjs +105 -0
  41. package/dist/lib/browser/toolkit-IW4FBLLB.mjs.map +7 -0
  42. package/dist/lib/browser/types/index.mjs +7 -4
  43. package/dist/lib/node-esm/{TemplateContainer-A3NAQCZE.mjs → BlueprintContainer-VH4EE4CM.mjs} +11 -9
  44. package/dist/lib/node-esm/BlueprintContainer-VH4EE4CM.mjs.map +7 -0
  45. package/dist/lib/node-esm/{ChatContainer-VZT74PO2.mjs → ChatContainer-7JLMWHMX.mjs} +37 -14
  46. package/dist/lib/node-esm/ChatContainer-7JLMWHMX.mjs.map +7 -0
  47. package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs → ChatDialog-QDD722F2.mjs} +23 -8
  48. package/dist/lib/node-esm/ChatDialog-QDD722F2.mjs.map +7 -0
  49. package/dist/lib/node-esm/{SequenceContainer-RQQH5XOC.mjs → SequenceContainer-EQ5NP2PG.mjs} +3 -2
  50. package/dist/lib/node-esm/SequenceContainer-EQ5NP2PG.mjs.map +7 -0
  51. package/dist/lib/node-esm/ai-service-LDD32477.mjs +23 -0
  52. package/dist/lib/node-esm/ai-service-LDD32477.mjs.map +7 -0
  53. package/dist/lib/node-esm/{app-graph-builder-OWSOXFTD.mjs → app-graph-builder-RCT4ANP2.mjs} +17 -74
  54. package/dist/lib/node-esm/app-graph-builder-RCT4ANP2.mjs.map +7 -0
  55. package/dist/lib/node-esm/blueprint-definition-AEWYMW6I.mjs +147 -0
  56. package/dist/lib/node-esm/blueprint-definition-AEWYMW6I.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-SENTQAEO.mjs → chunk-ETS2CIDF.mjs} +816 -807
  58. package/dist/lib/node-esm/chunk-ETS2CIDF.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-2XL6MNPE.mjs → chunk-GAWXJ7K5.mjs} +12 -21
  60. package/dist/lib/node-esm/chunk-GAWXJ7K5.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-GENVBE3B.mjs +194 -0
  62. package/dist/lib/node-esm/chunk-GENVBE3B.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-KOC6ESG7.mjs +22 -0
  66. package/dist/lib/node-esm/{chunk-QN2H2EHV.mjs.map → chunk-KOC6ESG7.mjs.map} +1 -1
  67. package/dist/lib/node-esm/chunk-QS6GWTVA.mjs +281 -0
  68. package/dist/lib/node-esm/chunk-QS6GWTVA.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-X6AANUHZ.mjs +17 -0
  70. package/dist/lib/node-esm/chunk-X6AANUHZ.mjs.map +7 -0
  71. package/dist/lib/node-esm/edge-model-resolver-UDDR2IA6.mjs +25 -0
  72. package/dist/lib/node-esm/edge-model-resolver-UDDR2IA6.mjs.map +7 -0
  73. package/dist/lib/node-esm/index.mjs +98 -51
  74. package/dist/lib/node-esm/index.mjs.map +4 -4
  75. package/dist/lib/node-esm/{intent-resolver-YPPYELY3.mjs → intent-resolver-7CKWG7TZ.mjs} +33 -12
  76. package/dist/lib/node-esm/intent-resolver-7CKWG7TZ.mjs.map +7 -0
  77. package/dist/lib/node-esm/meta.json +1 -1
  78. package/dist/lib/node-esm/{react-surface-RJMRBR2M.mjs → react-surface-3EPAE4I4.mjs} +45 -32
  79. package/dist/lib/node-esm/react-surface-3EPAE4I4.mjs.map +7 -0
  80. package/dist/lib/node-esm/{settings-47RYZOU4.mjs → settings-UI4VQCWW.mjs} +6 -5
  81. package/dist/lib/{browser/settings-2DGP3UTS.mjs.map → node-esm/settings-UI4VQCWW.mjs.map} +1 -1
  82. package/dist/lib/node-esm/toolkit-2VNUL77B.mjs +106 -0
  83. package/dist/lib/node-esm/toolkit-2VNUL77B.mjs.map +7 -0
  84. package/dist/lib/node-esm/types/index.mjs +7 -4
  85. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/ai-service.d.ts +5 -0
  87. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/blueprint-definition.d.ts +3 -0
  90. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/capabilities.d.ts +11 -0
  92. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/edge-model-resolver.d.ts +5 -0
  94. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/index.d.ts +5 -0
  96. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  100. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  101. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  102. package/dist/types/src/components/BlueprintContainer.d.ts +8 -0
  103. package/dist/types/src/components/BlueprintContainer.d.ts.map +1 -0
  104. package/dist/types/src/components/Chat/Chat.d.ts +6 -8
  105. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  106. package/dist/types/src/components/ChatContainer.d.ts +5 -4
  107. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  108. package/dist/types/src/components/ChatDialog.d.ts.map +1 -1
  109. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +13 -0
  110. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -0
  111. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +3 -3
  112. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  113. package/dist/types/src/components/ChatPrompt/index.d.ts +1 -1
  114. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  115. package/dist/types/src/components/ChatThread/ChatMessage.d.ts +4 -3
  116. package/dist/types/src/components/ChatThread/ChatMessage.d.ts.map +1 -1
  117. package/dist/types/src/components/ChatThread/ChatThread.d.ts +2 -2
  118. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  119. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +33 -48
  120. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/ChatThread/Link.d.ts +9 -0
  122. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -0
  123. package/dist/types/src/components/ChatThread/ToolBlock.d.ts.map +1 -1
  124. package/dist/types/src/components/SequenceContainer.d.ts.map +1 -1
  125. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts.map +1 -1
  126. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts +1 -1
  127. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts.map +1 -1
  128. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -1
  129. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  130. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +2 -1
  132. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  133. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Timeline/Timeline.d.ts +42 -0
  135. package/dist/types/src/components/Timeline/Timeline.d.ts.map +1 -0
  136. package/dist/types/src/components/Timeline/Timeline.stories.d.ts +11 -0
  137. package/dist/types/src/components/Timeline/Timeline.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Timeline/index.d.ts +2 -0
  139. package/dist/types/src/components/Timeline/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Toolbox/Toolbox.d.ts +4 -7
  141. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  142. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +1 -2
  143. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/index.d.ts +3 -2
  145. package/dist/types/src/components/index.d.ts.map +1 -1
  146. package/dist/types/src/events.d.ts +1 -1
  147. package/dist/types/src/events.d.ts.map +1 -1
  148. package/dist/types/src/execution-graph/execution-graph.d.ts +21 -0
  149. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -0
  150. package/dist/types/src/execution-graph/index.d.ts +2 -0
  151. package/dist/types/src/execution-graph/index.d.ts.map +1 -0
  152. package/dist/types/src/functions/analysis.d.ts +5 -0
  153. package/dist/types/src/functions/analysis.d.ts.map +1 -0
  154. package/dist/types/src/functions/index.d.ts +4 -0
  155. package/dist/types/src/functions/index.d.ts.map +1 -0
  156. package/dist/types/src/functions/list.d.ts +10 -0
  157. package/dist/types/src/functions/list.d.ts.map +1 -0
  158. package/dist/types/src/functions/load.d.ts +8 -0
  159. package/dist/types/src/functions/load.d.ts.map +1 -0
  160. package/dist/types/src/hooks/chat-processor.d.ts +28 -42
  161. package/dist/types/src/hooks/chat-processor.d.ts.map +1 -1
  162. package/dist/types/src/hooks/errors.d.ts +4 -0
  163. package/dist/types/src/hooks/errors.d.ts.map +1 -0
  164. package/dist/types/src/hooks/index.d.ts +6 -1
  165. package/dist/types/src/hooks/index.d.ts.map +1 -1
  166. package/dist/types/src/hooks/presets.d.ts +2 -2
  167. package/dist/types/src/hooks/presets.d.ts.map +1 -1
  168. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +21 -0
  169. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -0
  170. package/dist/types/src/hooks/useChatProcessor.d.ts +7 -14
  171. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  172. package/dist/types/src/hooks/useChatServices.d.ts +5 -4
  173. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  174. package/dist/types/src/hooks/useExecutionGraph.d.ts +7 -0
  175. package/dist/types/src/hooks/useExecutionGraph.d.ts.map +1 -0
  176. package/dist/types/src/hooks/useOnline.d.ts +3 -0
  177. package/dist/types/src/hooks/useOnline.d.ts.map +1 -0
  178. package/dist/types/src/hooks/usePresets.d.ts +7 -0
  179. package/dist/types/src/hooks/usePresets.d.ts.map +1 -0
  180. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  181. package/dist/types/src/hooks/useResolveRef.d.ts +4 -0
  182. package/dist/types/src/hooks/useResolveRef.d.ts.map +1 -0
  183. package/dist/types/src/parser/filter-generator.d.ts.map +1 -1
  184. package/dist/types/src/parser/query-parser.d.ts.map +1 -1
  185. package/dist/types/src/stories/Chat.stories.d.ts +68 -49
  186. package/dist/types/src/stories/Chat.stories.d.ts.map +1 -1
  187. package/dist/types/src/stories/components/BlueprintContainer.d.ts +5 -0
  188. package/dist/types/src/stories/components/BlueprintContainer.d.ts.map +1 -0
  189. package/dist/types/src/stories/components/ChatContainer.d.ts +5 -0
  190. package/dist/types/src/stories/components/ChatContainer.d.ts.map +1 -0
  191. package/dist/types/src/stories/components/GraphContainer.d.ts +6 -0
  192. package/dist/types/src/stories/components/GraphContainer.d.ts.map +1 -0
  193. package/dist/types/src/stories/components/LoggingContainer.d.ts +5 -0
  194. package/dist/types/src/stories/components/LoggingContainer.d.ts.map +1 -0
  195. package/dist/types/src/stories/components/SurfaceContainer.d.ts +8 -0
  196. package/dist/types/src/stories/components/SurfaceContainer.d.ts.map +1 -0
  197. package/dist/types/src/stories/components/TasksContainer.d.ts +5 -0
  198. package/dist/types/src/stories/components/TasksContainer.d.ts.map +1 -0
  199. package/dist/types/src/stories/components/index.d.ts +8 -0
  200. package/dist/types/src/stories/components/index.d.ts.map +1 -0
  201. package/dist/types/src/stories/components/types.d.ts +7 -0
  202. package/dist/types/src/stories/components/types.d.ts.map +1 -0
  203. package/dist/types/src/stories/hooks/index.d.ts +3 -0
  204. package/dist/types/src/stories/hooks/index.d.ts.map +1 -0
  205. package/dist/types/src/stories/hooks/useFlush.d.ts +6 -0
  206. package/dist/types/src/stories/hooks/useFlush.d.ts.map +1 -0
  207. package/dist/types/src/stories/hooks/useMatcherExtension.d.ts +3 -0
  208. package/dist/types/src/stories/hooks/useMatcherExtension.d.ts.map +1 -0
  209. package/dist/types/src/stories/testing/data.d.ts +142 -0
  210. package/dist/types/src/stories/testing/data.d.ts.map +1 -0
  211. package/dist/types/src/stories/testing/index.d.ts +3 -0
  212. package/dist/types/src/stories/testing/index.d.ts.map +1 -0
  213. package/dist/types/src/stories/testing/testing.d.ts +26 -0
  214. package/dist/types/src/stories/testing/testing.d.ts.map +1 -0
  215. package/dist/types/src/testing/test-functions.d.ts +5 -2
  216. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  217. package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
  218. package/dist/types/src/tools/function.d.ts.map +1 -1
  219. package/dist/types/src/tools/openapi.d.ts.map +1 -1
  220. package/dist/types/src/translations.d.ts +6 -10
  221. package/dist/types/src/translations.d.ts.map +1 -1
  222. package/dist/types/src/types/Assistant.d.ts +42 -0
  223. package/dist/types/src/types/Assistant.d.ts.map +1 -0
  224. package/dist/types/src/types/AssistantAction.d.ts +91 -0
  225. package/dist/types/src/types/AssistantAction.d.ts.map +1 -0
  226. package/dist/types/src/types/defs.d.ts +2 -0
  227. package/dist/types/src/types/defs.d.ts.map +1 -0
  228. package/dist/types/src/types/index.d.ts +3 -1
  229. package/dist/types/src/types/index.d.ts.map +1 -1
  230. package/dist/types/src/types/service.d.ts +6 -6
  231. package/dist/types/src/types/service.d.ts.map +1 -1
  232. package/dist/types/tsconfig.tsbuildinfo +1 -1
  233. package/package.json +83 -75
  234. package/src/AssistantPlugin.tsx +59 -12
  235. package/src/capabilities/ai-service.ts +28 -0
  236. package/src/capabilities/app-graph-builder.ts +9 -93
  237. package/src/capabilities/blueprint-definition.ts +32 -0
  238. package/src/capabilities/capabilities.ts +22 -0
  239. package/src/capabilities/edge-model-resolver.ts +29 -0
  240. package/src/capabilities/index.ts +6 -0
  241. package/src/capabilities/intent-resolver.ts +24 -9
  242. package/src/capabilities/react-surface.tsx +29 -22
  243. package/src/capabilities/toolkit.ts +106 -0
  244. package/src/components/AssistantSettings/AssistantSettings.tsx +1 -1
  245. package/src/components/BlueprintContainer.tsx +24 -0
  246. package/src/components/Chat/Chat.tsx +77 -64
  247. package/src/components/ChatContainer.tsx +38 -14
  248. package/src/components/ChatDialog.tsx +10 -6
  249. package/src/components/ChatPrompt/ChatOptions.tsx +59 -0
  250. package/src/components/ChatPrompt/ChatReferences.tsx +11 -9
  251. package/src/components/ChatPrompt/index.ts +1 -1
  252. package/src/components/ChatThread/ChatMessage.tsx +141 -118
  253. package/src/components/ChatThread/ChatThread.stories.tsx +236 -104
  254. package/src/components/ChatThread/ChatThread.tsx +2 -2
  255. package/src/components/ChatThread/Link.tsx +23 -0
  256. package/src/components/ChatThread/ToolBlock.tsx +20 -16
  257. package/src/components/SequenceContainer.tsx +2 -1
  258. package/src/components/SequenceEditor/SequenceEditor.stories.tsx +3 -2
  259. package/src/components/SequenceEditor/SequenceEditor.tsx +1 -1
  260. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +12 -5
  261. package/src/components/TemplateEditor/TemplateEditor.tsx +15 -12
  262. package/src/components/TemplateEditor/TemplateForm.stories.tsx +12 -5
  263. package/src/components/TemplateEditor/TemplateForm.tsx +5 -3
  264. package/src/components/Timeline/Timeline.stories.tsx +144 -0
  265. package/src/components/Timeline/Timeline.tsx +202 -0
  266. package/src/components/Timeline/index.ts +5 -0
  267. package/src/components/Toolbox/Toolbox.stories.tsx +6 -12
  268. package/src/components/Toolbox/Toolbox.tsx +16 -40
  269. package/src/components/index.ts +2 -5
  270. package/src/events.ts +2 -2
  271. package/src/execution-graph/execution-graph.ts +184 -0
  272. package/src/execution-graph/index.ts +5 -0
  273. package/src/functions/analysis.ts +20 -0
  274. package/src/functions/index.ts +7 -0
  275. package/src/functions/list.ts +42 -0
  276. package/src/functions/load.ts +43 -0
  277. package/src/hooks/chat-processor.ts +123 -177
  278. package/src/hooks/errors.ts +8 -0
  279. package/src/hooks/index.ts +6 -1
  280. package/src/hooks/presets.ts +6 -5
  281. package/src/hooks/useBlueprintRegistry.ts +79 -0
  282. package/src/hooks/useChatProcessor.ts +21 -83
  283. package/src/hooks/useChatServices.ts +37 -54
  284. package/src/hooks/useExecutionGraph.ts +16 -0
  285. package/src/hooks/useOnline.ts +10 -0
  286. package/src/hooks/usePresets.ts +45 -0
  287. package/src/hooks/useReferencesProvider.ts +11 -9
  288. package/src/hooks/useResolveRef.ts +33 -0
  289. package/src/parser/filter-generator.ts +6 -13
  290. package/src/parser/query-parser.ts +1 -1
  291. package/src/queue-logger.ts +5 -5
  292. package/src/stories/Chat.stories.tsx +238 -299
  293. package/src/stories/components/BlueprintContainer.tsx +34 -0
  294. package/src/stories/components/ChatContainer.tsx +80 -0
  295. package/src/stories/components/GraphContainer.tsx +118 -0
  296. package/src/stories/components/LoggingContainer.tsx +29 -0
  297. package/src/stories/components/SurfaceContainer.tsx +62 -0
  298. package/src/stories/components/TasksContainer.tsx +51 -0
  299. package/src/stories/components/index.ts +12 -0
  300. package/src/stories/components/types.ts +11 -0
  301. package/src/stories/hooks/index.ts +6 -0
  302. package/src/stories/hooks/useFlush.ts +35 -0
  303. package/src/stories/hooks/useMatcherExtension.ts +45 -0
  304. package/src/stories/testing/data.ts +130 -0
  305. package/src/stories/testing/index.ts +6 -0
  306. package/src/stories/testing/testing.tsx +163 -0
  307. package/src/testing/test-functions.ts +8 -3
  308. package/src/testing/test-sequence.ts +1 -1
  309. package/src/tools/function.ts +4 -1
  310. package/src/tools/openapi.test.ts +7 -5
  311. package/src/tools/openapi.ts +4 -1
  312. package/src/translations.ts +8 -10
  313. package/src/types/Assistant.ts +62 -0
  314. package/src/types/AssistantAction.ts +54 -0
  315. package/src/types/defs.ts +5 -0
  316. package/src/types/index.ts +4 -1
  317. package/dist/lib/browser/ChatContainer-M3IHQLRS.mjs.map +0 -7
  318. package/dist/lib/browser/ChatDialog-X6VN6QZI.mjs.map +0 -7
  319. package/dist/lib/browser/SequenceContainer-3UDVKWPA.mjs.map +0 -7
  320. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs.map +0 -7
  321. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs.map +0 -7
  322. package/dist/lib/browser/chunk-AEAEKWOC.mjs.map +0 -7
  323. package/dist/lib/browser/chunk-EQDW6BYQ.mjs +0 -108
  324. package/dist/lib/browser/chunk-EQDW6BYQ.mjs.map +0 -7
  325. package/dist/lib/browser/chunk-FDCJSQYF.mjs +0 -40
  326. package/dist/lib/browser/chunk-JQBVLTM5.mjs +0 -158
  327. package/dist/lib/browser/chunk-JQBVLTM5.mjs.map +0 -7
  328. package/dist/lib/browser/chunk-OWY4CUQY.mjs.map +0 -7
  329. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs.map +0 -7
  330. package/dist/lib/browser/react-surface-66VY37YQ.mjs.map +0 -7
  331. package/dist/lib/node-esm/ChatContainer-VZT74PO2.mjs.map +0 -7
  332. package/dist/lib/node-esm/ChatDialog-RJ6FDX4Q.mjs.map +0 -7
  333. package/dist/lib/node-esm/SequenceContainer-RQQH5XOC.mjs.map +0 -7
  334. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs.map +0 -7
  335. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-BISJDTBK.mjs +0 -159
  338. package/dist/lib/node-esm/chunk-BISJDTBK.mjs.map +0 -7
  339. package/dist/lib/node-esm/chunk-E33DNNDW.mjs +0 -109
  340. package/dist/lib/node-esm/chunk-E33DNNDW.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-QN2H2EHV.mjs +0 -41
  342. package/dist/lib/node-esm/chunk-SENTQAEO.mjs.map +0 -7
  343. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs.map +0 -7
  344. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs.map +0 -7
  345. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts +0 -9
  346. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts.map +0 -1
  347. package/dist/types/src/components/TemplateContainer.d.ts +0 -8
  348. package/dist/types/src/components/TemplateContainer.d.ts.map +0 -1
  349. package/dist/types/src/hooks/chat-processor.test.d.ts +0 -2
  350. package/dist/types/src/hooks/chat-processor.test.d.ts.map +0 -1
  351. package/dist/types/src/hooks/useBlueprints.d.ts +0 -9
  352. package/dist/types/src/hooks/useBlueprints.d.ts.map +0 -1
  353. package/dist/types/src/types/schema.d.ts +0 -88
  354. package/dist/types/src/types/schema.d.ts.map +0 -1
  355. package/src/components/ChatPrompt/ChatOptionsMenu.tsx +0 -52
  356. package/src/components/TemplateContainer.tsx +0 -24
  357. package/src/hooks/chat-processor.test.ts +0 -16
  358. package/src/hooks/useBlueprints.ts +0 -57
  359. package/src/types/schema.ts +0 -95
@@ -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';
@@ -2,13 +2,17 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { Fragment, type FC, type PropsWithChildren } from 'react';
5
+ import React, { type FC, Fragment, type PropsWithChildren, useMemo } from 'react';
6
6
 
7
7
  import { type Tool } from '@dxos/ai';
8
- import { Surface } from '@dxos/app-framework';
8
+ import { ErrorBoundary, Surface } from '@dxos/app-framework';
9
+ import { resolveRef } from '@dxos/client';
10
+ import { Obj } from '@dxos/echo';
9
11
  import { invariant } from '@dxos/invariant';
12
+ import { DXN, DXN_ECHO_REGEXP } from '@dxos/keys';
13
+ import { useClient } from '@dxos/react-client';
10
14
  import { type Space } from '@dxos/react-client/echo';
11
- import { Button, Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';
15
+ import { Button, IconButton, Link, type ThemedClassName, useTranslation } from '@dxos/react-ui';
12
16
  import {
13
17
  MarkdownViewer,
14
18
  ToggleContainer as NativeToggleContainer,
@@ -18,35 +22,39 @@ import { mx } from '@dxos/react-ui-theme';
18
22
  import { type ContentBlock, type DataType } from '@dxos/schema';
19
23
  import { safeParseJson } from '@dxos/util';
20
24
 
21
- import { Json, ToolBlock, isToolMessage } from './ToolBlock';
22
- import { type ChatProcessor } from '../../hooks';
23
25
  import { meta } from '../../meta';
24
26
  import { type ChatEvent } from '../Chat';
25
- import { ToolboxContainer } from '../Toolbox';
27
+ import { Toolbox } from '../Toolbox';
28
+
29
+ import { ObjectLink } from './Link';
30
+ import { Json, ToolBlock, isToolMessage } from './ToolBlock';
31
+
32
+ const panelClasses = 'flex flex-col is-full bg-activeSurface rounded-sm';
33
+ const marginClasses = 'pie-4 pis-4';
34
+ const paddingClasses = 'pis-2 pie-2 pbs-0.5 pbe-0.5';
26
35
 
27
36
  export type ChatMessageProps = ThemedClassName<{
28
37
  debug?: boolean;
29
38
  space?: Space;
30
39
  message: DataType.Message;
31
- // TODO(burdon): Move to context.
32
- processor?: ChatProcessor;
33
40
  tools?: Tool[];
34
41
  onEvent?: (event: ChatEvent) => void;
42
+ onDelete?: () => void;
35
43
  }>;
36
44
 
37
- export const ChatMessage = ({ classNames, debug, space, message, processor, tools, onEvent }: ChatMessageProps) => {
45
+ export const ChatMessage = ({ classNames, debug, space, message, tools, onEvent, onDelete }: ChatMessageProps) => {
38
46
  const { t } = useTranslation(meta.id);
39
47
  const {
40
48
  sender: { role },
41
49
  blocks,
42
50
  } = message;
43
51
 
44
- // TODO(burdon): Restructure types to make check unnecessary.
52
+ // TODO(burdon): Consolidate tools upstream?
45
53
  if (isToolMessage(message)) {
46
54
  return (
47
- <MessageContainer classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}>
55
+ <MessageItem classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}>
48
56
  <ToolBlock classNames={panelClasses} message={message} tools={tools} />
49
- </MessageContainer>
57
+ </MessageItem>
50
58
  );
51
59
  }
52
60
 
@@ -64,16 +72,18 @@ export const ChatMessage = ({ classNames, debug, space, message, processor, tool
64
72
  return null;
65
73
  }
66
74
 
67
- const Component: BlockComponent = components[block._tag] ?? components.default!;
75
+ const Component: ContentBlockComponent = components[block._tag] ?? components.default!;
68
76
  if (!Component) {
69
77
  return null;
70
78
  }
71
79
 
72
80
  return (
73
81
  <Fragment key={idx}>
74
- <MessageContainer classNames={classNames} user={block._tag === 'text' && role === 'user'}>
75
- <Component space={space} processor={processor} block={block} onEvent={onEvent} />
76
- </MessageContainer>
82
+ <MessageItem classNames={classNames} user={block._tag === 'text' && role === 'user'}>
83
+ <ErrorBoundary data={block}>
84
+ <Component space={space} block={block} onEvent={onEvent} />
85
+ </ErrorBoundary>
86
+ </MessageItem>
77
87
  {debug && (
78
88
  <div className={mx('flex justify-end text-subdued', marginClasses)}>
79
89
  <pre className='text-xs'>{JSON.stringify({ block: block._tag })}</pre>
@@ -82,64 +92,122 @@ export const ChatMessage = ({ classNames, debug, space, message, processor, tool
82
92
  </Fragment>
83
93
  );
84
94
  })}
85
- <div className={mx('flex justify-end pbs-2 pbe-2 opacity-50 hover:opacity-100', marginClasses)}>
86
- <IconButton
87
- classNames='animate-[fadeIn_0.5s]'
88
- icon='ph--trash--regular'
89
- iconOnly
90
- label={t('button delete message')}
91
- onClick={() => onEvent?.({ type: 'delete', id: message.id })}
92
- />
93
- </div>
95
+
96
+ {onDelete && (
97
+ <div className={mx('flex justify-end pbs-2 pbe-2 opacity-50 hover:opacity-100', marginClasses)}>
98
+ <IconButton
99
+ classNames='animate-[fadeIn_0.5s]'
100
+ icon='ph--trash--regular'
101
+ iconOnly
102
+ label={t('button delete message')}
103
+ onClick={() => onDelete()}
104
+ />
105
+ </div>
106
+ )}
94
107
  </>
95
108
  );
96
109
  };
97
110
 
98
- type BlockComponentProps = {
111
+ type ContentBlockProps = {
99
112
  space?: Space;
100
113
  block: ContentBlock.Any;
101
- /** @deprecated Replace with context */
102
- processor?: ChatProcessor;
103
114
  onEvent?: (event: ChatEvent) => void;
104
115
  };
105
116
 
106
- type BlockComponent = FC<BlockComponentProps>;
117
+ type ContentBlockComponent = FC<ContentBlockProps>;
107
118
 
108
- const components: Partial<Record<ContentBlock.Any['_tag'] | 'default', BlockComponent>> = {
119
+ /**
120
+ * Components for rendering content blocks.
121
+ */
122
+ const components: Partial<Record<ContentBlock.Any['_tag'] | 'default', ContentBlockComponent>> = {
109
123
  //
110
124
  // Text
111
125
  //
112
- ['text' as const]: ({ block }) => {
126
+ ['text' as const]: ({ space, block }) => {
113
127
  invariant(block._tag === 'text');
114
- // const [open, setOpen] = useState(block.disposition === 'cot' && block.pending);
115
- const title = block.disposition ? titles[block.disposition] : undefined;
116
- if (!title) {
117
- return <MarkdownViewer content={block.text} />;
118
- }
128
+ return (
129
+ <MarkdownViewer
130
+ content={preprocessTextContent(block.text)}
131
+ components={{
132
+ a: ({ node: { properties }, children, href, ...props }) => {
133
+ if (space && typeof properties?.href === 'string' && properties?.href?.startsWith('dxn')) {
134
+ try {
135
+ // TODO(burdon): Check valid length (since serialized).
136
+ const dxn = DXN.parse(properties.href);
137
+ return <ObjectLink space={space} dxn={dxn} />;
138
+ } catch {}
139
+ }
119
140
 
120
- // TOOD(burdon): Store last time user opened/closed COT.
121
- // Autoclose when streaming ends.
122
- // useEffect(() => {
123
- // if (block.disposition === 'cot' && !block.pending) {
124
- // setOpen(false);
125
- // }
126
- // }, [block.disposition, block.pending]);
141
+ // TODO(burdon): Can we revert to the default handler?
142
+ return (
143
+ <Link href={href} target='_blank' rel='noopener noreferrer' {...props}>
144
+ {children}
145
+ </Link>
146
+ );
147
+ },
148
+ img: ({ node: { properties }, ...props }) => {
149
+ const client = useClient();
150
+ if (space && typeof properties?.src === 'string' && properties?.src?.startsWith('dxn')) {
151
+ try {
152
+ const dxn = DXN.parse(properties?.src);
153
+ const subject = resolveRef(client, dxn, space);
154
+ const data = useMemo(() => ({ subject }), [subject]);
155
+ return <Surface role='card--transclusion' data={data} limit={1} />;
156
+ } catch {}
157
+ }
158
+ return <img {...properties} />;
159
+ },
160
+ }}
161
+ />
162
+ );
163
+ },
127
164
 
165
+ //
166
+ // Suggest
167
+ //
168
+ ['suggest' as const]: ({ block, onEvent }) => {
169
+ const { t } = useTranslation(meta.id);
170
+ invariant(block._tag === 'suggest');
128
171
  return (
129
- <ToggleContainer
130
- // open={open}
131
- defaultOpen={systemDispositions.includes(block.disposition ?? '') && block.pending}
132
- title={title}
133
- icon={
134
- block.pending ? (
135
- <Icon icon={'ph--circle-notch--regular'} classNames='text-subdued animate-spin' size={4} />
136
- ) : undefined
137
- }
138
- >
139
- <MarkdownViewer
140
- content={block.text}
141
- classNames={['pbe-2', systemDispositions.includes(block.disposition ?? '') && 'text-sm text-subdued']}
142
- />
172
+ <IconButton
173
+ icon='ph--lightning--regular'
174
+ label={block.text}
175
+ title={t('button suggest')}
176
+ onClick={() => onEvent?.({ type: 'submit', text: block.text })}
177
+ />
178
+ );
179
+ },
180
+
181
+ //
182
+ // Select
183
+ //
184
+ ['select' as const]: ({ block, onEvent }) => {
185
+ const { t } = useTranslation(meta.id);
186
+ invariant(block._tag === 'select');
187
+ return (
188
+ <div className='flex flex-wrap gap-1'>
189
+ {block.options.map((option, idx) => (
190
+ <Button
191
+ classNames={'animate-[fadeIn_0.5s] rounded-sm text-sm'}
192
+ key={idx}
193
+ onClick={() => onEvent?.({ type: 'submit', text: option })}
194
+ title={t('button select option')}
195
+ >
196
+ {option}
197
+ </Button>
198
+ ))}
199
+ </div>
200
+ );
201
+ },
202
+
203
+ //
204
+ // Toolkit
205
+ //
206
+ ['toolkit' as const]: ({ block }) => {
207
+ invariant(block._tag === 'toolkit');
208
+ return (
209
+ <ToggleContainer title='Toolbox' classNames={panelClasses} defaultOpen>
210
+ <Toolbox classNames={marginClasses} />
143
211
  </ToggleContainer>
144
212
  );
145
213
  },
@@ -147,42 +215,11 @@ const components: Partial<Record<ContentBlock.Any['_tag'] | 'default', BlockComp
147
215
  //
148
216
  // JSON
149
217
  //
150
- ['json' as const]: ({ space, processor, block, onEvent }) => {
218
+ ['json' as const]: ({ block, onEvent }) => {
151
219
  invariant(block._tag === 'json');
152
220
 
221
+ // TODO(burdon): Disposition is deprecated.
153
222
  switch (block.disposition) {
154
- case 'tool_list': {
155
- return (
156
- <ToggleContainer title={titles[block.disposition]} defaultOpen={true}>
157
- <ToolboxContainer space={space} processor={processor} classNames='pbe-2' />
158
- </ToggleContainer>
159
- );
160
- }
161
-
162
- case 'suggest': {
163
- const { text = '' }: { text: string } = safeParseJson(block.data ?? '{}') ?? ({} as any);
164
- return (
165
- <IconButton icon='ph--lightning--regular' label={text} onClick={() => onEvent?.({ type: 'submit', text })} />
166
- );
167
- }
168
-
169
- case 'select': {
170
- const { options = [] }: { options: string[] } = safeParseJson(block.data ?? '{}') ?? ({} as any);
171
- return (
172
- <div className='flex flex-wrap gap-1'>
173
- {options.map((text, idx) => (
174
- <Button
175
- classNames={'animate-[fadeIn_0.5s] rounded-sm text-sm'}
176
- key={idx}
177
- onClick={() => onEvent?.({ type: 'submit', text })}
178
- >
179
- {text}
180
- </Button>
181
- ))}
182
- </div>
183
- );
184
- }
185
-
186
223
  case 'graph': {
187
224
  return (
188
225
  <div className='flex flex-wrap gap-1'>
@@ -204,9 +241,8 @@ const components: Partial<Record<ContentBlock.Any['_tag'] | 'default', BlockComp
204
241
  }
205
242
 
206
243
  default: {
207
- const title = block.disposition ? titles[block.disposition] : undefined;
208
244
  return (
209
- <ToggleContainer title={title ?? 'JSON'}>
245
+ <ToggleContainer title={block.disposition ?? block._tag}>
210
246
  <Json data={safeParseJson(block.data ?? block)} />
211
247
  </ToggleContainer>
212
248
  );
@@ -215,41 +251,21 @@ const components: Partial<Record<ContentBlock.Any['_tag'] | 'default', BlockComp
215
251
  },
216
252
 
217
253
  //
218
- // Default
254
+ // Fallback
219
255
  //
220
256
  default: ({ block }) => {
221
- let title = titles[block._tag];
222
- if (block._tag === 'toolCall') {
223
- title = `Tool [${block.name}]`; // TODO(burdon): Get label from tool.
224
- } else {
225
- title = block._tag;
226
- }
227
-
228
257
  return (
229
- <ToggleContainer title={title ?? 'JSON'}>
258
+ <ToggleContainer title={block._tag}>
230
259
  <Json data={block} />
231
260
  </ToggleContainer>
232
261
  );
233
262
  },
234
263
  };
235
264
 
236
- // TODO(burdon): Translations.
237
- const titles: Record<string, string> = {
238
- ['cot' as const]: 'Chain of thought',
239
- ['artifact' as const]: 'Artifact',
240
- ['tool_use' as const]: 'Tool request',
241
- ['tool_result' as const]: 'Tool result',
242
- ['tool_list' as const]: 'Tools',
243
- ['artifact-update' as const]: 'Artifact(s) changed',
244
- };
245
-
246
- const systemDispositions: string[] = ['cot', 'artifact-update'];
247
-
248
- const panelClasses = 'flex flex-col is-full bg-activeSurface rounded-sm';
249
- const marginClasses = 'pie-4 pis-4';
250
- const paddingClasses = 'pis-2 pie-2 pbs-0.5 pbe-0.5';
251
-
252
- const MessageContainer = ({ classNames, children, user }: ThemedClassName<PropsWithChildren<{ user?: boolean }>>) => {
265
+ /**
266
+ * Wrapper for each message.
267
+ */
268
+ const MessageItem = ({ classNames, children, user }: ThemedClassName<PropsWithChildren<{ user?: boolean }>>) => {
253
269
  if (!children) {
254
270
  return null;
255
271
  }
@@ -266,3 +282,10 @@ const MessageContainer = ({ classNames, children, user }: ThemedClassName<PropsW
266
282
  const ToggleContainer = (props: ToggleContainerProps) => {
267
283
  return <NativeToggleContainer {...props} classNames={mx(panelClasses, props.classNames)} />;
268
284
  };
285
+
286
+ export const renderObjectLink = (obj: Obj.Any, transclusion?: boolean) =>
287
+ `${transclusion ? '!' : ''}[${Obj.getLabel(obj)}](${Obj.getDXN(obj).toString()})`;
288
+
289
+ // TODO(burdon): Move to parser.
290
+ const preprocessTextContent = (content: string) =>
291
+ content.replaceAll(new RegExp(DXN_ECHO_REGEXP, 'g'), (_, dxn) => `<${dxn}>`);