@dxos/plugin-assistant 0.8.2-staging.7ac8446 → 0.8.3-main.672df60

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 (365) hide show
  1. package/dist/lib/browser/AssistantDialog-UAZSN6GT.mjs +46 -0
  2. package/dist/lib/browser/AssistantDialog-UAZSN6GT.mjs.map +7 -0
  3. package/dist/lib/browser/BlueprintEditor-DGV4KJDM.mjs +45 -0
  4. package/dist/lib/browser/BlueprintEditor-DGV4KJDM.mjs.map +7 -0
  5. package/dist/lib/browser/ChatContainer-UTN3AO5U.mjs +39 -0
  6. package/dist/lib/browser/ChatContainer-UTN3AO5U.mjs.map +7 -0
  7. package/dist/lib/browser/TemplateContainer-AKUYL4AV.mjs +28 -0
  8. package/dist/lib/browser/TemplateContainer-AKUYL4AV.mjs.map +7 -0
  9. package/dist/lib/browser/{ai-client-CDZLSNXE.mjs → ai-client-COXVUC6V.mjs} +6 -6
  10. package/dist/lib/browser/ai-client-COXVUC6V.mjs.map +7 -0
  11. package/dist/lib/browser/app-graph-builder-56OZ5RW4.mjs +206 -0
  12. package/dist/lib/browser/app-graph-builder-56OZ5RW4.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-TXJWGWJ7.mjs → chunk-3F44MBHU.mjs} +3 -3
  14. package/dist/lib/browser/chunk-3F44MBHU.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-6SD7S7W5.mjs +157 -0
  16. package/dist/lib/browser/chunk-6SD7S7W5.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-JQFUME3B.mjs +87 -0
  18. package/dist/lib/{node-esm/chunk-PBZA7XJR.mjs.map → browser/chunk-JQFUME3B.mjs.map} +1 -1
  19. package/dist/lib/browser/chunk-NBSPGIHL.mjs +206 -0
  20. package/dist/lib/browser/chunk-NBSPGIHL.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-Q6UZ4F3H.mjs +96 -0
  22. package/dist/lib/browser/chunk-Q6UZ4F3H.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-FMB7RGMP.mjs → chunk-Q6XE3O3E.mjs} +1714 -1536
  24. package/dist/lib/browser/chunk-Q6XE3O3E.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-3HCI5FIL.mjs → chunk-XOZ7YMO3.mjs} +3 -3
  26. package/dist/lib/browser/{chunk-3HCI5FIL.mjs.map → chunk-XOZ7YMO3.mjs.map} +1 -1
  27. package/dist/lib/browser/index.mjs +47 -23
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/intent-resolver-GWELYIX2.mjs +39 -0
  30. package/dist/lib/browser/intent-resolver-GWELYIX2.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/react-surface-DGS34EON.mjs +144 -0
  33. package/dist/lib/browser/react-surface-DGS34EON.mjs.map +7 -0
  34. package/dist/lib/browser/{settings-U6UFQX32.mjs → settings-BTFB7IQ6.mjs} +5 -5
  35. package/dist/lib/browser/settings-BTFB7IQ6.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +6 -2
  37. package/dist/lib/node/AssistantDialog-RTB5Q7FP.cjs +72 -0
  38. package/dist/lib/node/AssistantDialog-RTB5Q7FP.cjs.map +7 -0
  39. package/dist/lib/node/BlueprintEditor-43VM3XPO.cjs +72 -0
  40. package/dist/lib/node/BlueprintEditor-43VM3XPO.cjs.map +7 -0
  41. package/dist/lib/node/{ChatContainer-ZJ5JXF6A.cjs → ChatContainer-P3JL4VZ7.cjs} +25 -19
  42. package/dist/lib/node/ChatContainer-P3JL4VZ7.cjs.map +7 -0
  43. package/dist/lib/node/TemplateContainer-CTG2MB4W.cjs +58 -0
  44. package/dist/lib/node/TemplateContainer-CTG2MB4W.cjs.map +7 -0
  45. package/dist/lib/node/{ai-client-URCCYU6B.cjs → ai-client-R2CGEYZW.cjs} +13 -13
  46. package/dist/lib/node/ai-client-R2CGEYZW.cjs.map +7 -0
  47. package/dist/lib/node/app-graph-builder-QLF353LH.cjs +216 -0
  48. package/dist/lib/node/app-graph-builder-QLF353LH.cjs.map +7 -0
  49. package/dist/lib/node/{chunk-XI2ARIEO.cjs → chunk-4EEWTDQK.cjs} +45 -39
  50. package/dist/lib/node/{chunk-XI2ARIEO.cjs.map → chunk-4EEWTDQK.cjs.map} +1 -1
  51. package/dist/lib/node/chunk-BWL5A3O5.cjs +184 -0
  52. package/dist/lib/node/chunk-BWL5A3O5.cjs.map +7 -0
  53. package/dist/lib/node/chunk-HRNIUYVQ.cjs +128 -0
  54. package/dist/lib/node/chunk-HRNIUYVQ.cjs.map +7 -0
  55. package/dist/lib/node/{chunk-Q5XWEMHB.cjs → chunk-P74TWGMG.cjs} +6 -6
  56. package/dist/lib/node/{chunk-Q5XWEMHB.cjs.map → chunk-P74TWGMG.cjs.map} +1 -1
  57. package/dist/lib/node/{chunk-RPBKMP2E.cjs → chunk-PG7YNQ4R.cjs} +1523 -1338
  58. package/dist/lib/node/chunk-PG7YNQ4R.cjs.map +7 -0
  59. package/dist/lib/node/{chunk-GBUNQ257.cjs → chunk-TS3H5OSX.cjs} +7 -7
  60. package/dist/lib/node/chunk-TS3H5OSX.cjs.map +7 -0
  61. package/dist/lib/node/chunk-UNVDZOLA.cjs +231 -0
  62. package/dist/lib/node/chunk-UNVDZOLA.cjs.map +7 -0
  63. package/dist/lib/node/index.cjs +88 -65
  64. package/dist/lib/node/index.cjs.map +3 -3
  65. package/dist/lib/node/{intent-resolver-R3OSTIMH.cjs → intent-resolver-U7663JU7.cjs} +15 -21
  66. package/dist/lib/node/intent-resolver-U7663JU7.cjs.map +7 -0
  67. package/dist/lib/node/meta.json +1 -1
  68. package/dist/lib/node/react-surface-QXZTILW6.cjs +157 -0
  69. package/dist/lib/node/react-surface-QXZTILW6.cjs.map +7 -0
  70. package/dist/lib/node/{settings-TXGRCYAL.cjs → settings-LBJMT6YB.cjs} +9 -9
  71. package/dist/lib/node/settings-LBJMT6YB.cjs.map +7 -0
  72. package/dist/lib/node/types/index.cjs +17 -13
  73. package/dist/lib/node/types/index.cjs.map +2 -2
  74. package/dist/lib/node-esm/AssistantDialog-DONAO6SA.mjs +47 -0
  75. package/dist/lib/node-esm/AssistantDialog-DONAO6SA.mjs.map +7 -0
  76. package/dist/lib/node-esm/BlueprintEditor-CTARB2FO.mjs +47 -0
  77. package/dist/lib/node-esm/BlueprintEditor-CTARB2FO.mjs.map +7 -0
  78. package/dist/lib/node-esm/ChatContainer-FVIGCDIG.mjs +40 -0
  79. package/dist/lib/node-esm/ChatContainer-FVIGCDIG.mjs.map +7 -0
  80. package/dist/lib/node-esm/TemplateContainer-IVDQ4XQG.mjs +29 -0
  81. package/dist/lib/node-esm/TemplateContainer-IVDQ4XQG.mjs.map +7 -0
  82. package/dist/lib/node-esm/{ai-client-WMHS5EGV.mjs → ai-client-I5LXHMOZ.mjs} +6 -6
  83. package/dist/lib/node-esm/ai-client-I5LXHMOZ.mjs.map +7 -0
  84. package/dist/lib/node-esm/app-graph-builder-5YX5TKKT.mjs +207 -0
  85. package/dist/lib/node-esm/app-graph-builder-5YX5TKKT.mjs.map +7 -0
  86. package/dist/lib/node-esm/{chunk-ECRK6TUQ.mjs → chunk-BB2TAT4P.mjs} +3 -3
  87. package/dist/lib/node-esm/{chunk-ECRK6TUQ.mjs.map → chunk-BB2TAT4P.mjs.map} +1 -1
  88. package/dist/lib/node-esm/chunk-CDAILLCU.mjs +98 -0
  89. package/dist/lib/node-esm/chunk-CDAILLCU.mjs.map +7 -0
  90. package/dist/lib/node-esm/chunk-GJE4WCUJ.mjs +158 -0
  91. package/dist/lib/node-esm/chunk-GJE4WCUJ.mjs.map +7 -0
  92. package/dist/lib/node-esm/{chunk-6JK5HEUQ.mjs → chunk-HLPGKJ7N.mjs} +3 -3
  93. package/dist/lib/node-esm/chunk-HLPGKJ7N.mjs.map +7 -0
  94. package/dist/lib/node-esm/{chunk-MVDAY3CZ.mjs → chunk-MNH6E6EB.mjs} +1714 -1536
  95. package/dist/lib/node-esm/chunk-MNH6E6EB.mjs.map +7 -0
  96. package/dist/lib/node-esm/{chunk-PBZA7XJR.mjs → chunk-OYN6HLXZ.mjs} +42 -36
  97. package/dist/lib/{browser/chunk-NFUHCW2J.mjs.map → node-esm/chunk-OYN6HLXZ.mjs.map} +1 -1
  98. package/dist/lib/node-esm/chunk-TQYSF2GS.mjs +207 -0
  99. package/dist/lib/node-esm/chunk-TQYSF2GS.mjs.map +7 -0
  100. package/dist/lib/node-esm/index.mjs +47 -23
  101. package/dist/lib/node-esm/index.mjs.map +3 -3
  102. package/dist/lib/node-esm/intent-resolver-N5TM3RTL.mjs +40 -0
  103. package/dist/lib/node-esm/intent-resolver-N5TM3RTL.mjs.map +7 -0
  104. package/dist/lib/node-esm/meta.json +1 -1
  105. package/dist/lib/node-esm/react-surface-FTKGQQD2.mjs +145 -0
  106. package/dist/lib/node-esm/react-surface-FTKGQQD2.mjs.map +7 -0
  107. package/dist/lib/node-esm/{settings-DZU5PNXM.mjs → settings-TGCCAH5D.mjs} +5 -5
  108. package/dist/lib/node-esm/settings-TGCCAH5D.mjs.map +7 -0
  109. package/dist/lib/node-esm/types/index.mjs +6 -2
  110. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/ai-client.d.ts +3 -3
  112. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -179
  114. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  116. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/index.d.ts +3 -179
  118. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  121. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +3 -1
  122. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -1
  123. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  124. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts +8 -0
  125. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts.map +1 -0
  126. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.stories.d.ts +8 -0
  127. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/BlueprintEditor/index.d.ts +3 -0
  129. package/dist/types/src/components/BlueprintEditor/index.d.ts.map +1 -0
  130. package/dist/types/src/components/ChatContainer.d.ts +4 -3
  131. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  132. package/dist/types/src/components/Prompt/Prompt.d.ts +5 -2
  133. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  134. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +6 -3
  135. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/Prompt/PromptBar.d.ts +9 -4
  137. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
  138. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts +9 -0
  139. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts.map +1 -0
  140. package/dist/types/src/components/Prompt/autocomplete.d.ts +5 -1
  141. package/dist/types/src/components/Prompt/autocomplete.d.ts.map +1 -1
  142. package/dist/types/src/components/Prompt/references.d.ts.map +1 -1
  143. package/dist/types/src/components/PromptSettings.d.ts +6 -0
  144. package/dist/types/src/components/PromptSettings.d.ts.map +1 -0
  145. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  146. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  147. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +2 -2
  149. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  150. package/dist/types/src/components/Thread/Thread.d.ts +2 -2
  151. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  152. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Thread/ThreadContainer.d.ts +1 -1
  154. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
  155. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +2 -2
  156. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
  157. package/dist/types/src/components/Thread/ThreadMessage.d.ts +4 -2
  158. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  159. package/dist/types/src/components/Thread/ToolInvocations.d.ts +1 -1
  160. package/dist/types/src/components/Thread/ToolInvocations.d.ts.map +1 -1
  161. package/dist/types/src/components/Thread/reducer.d.ts +1 -1
  162. package/dist/types/src/components/Thread/reducer.d.ts.map +1 -1
  163. package/dist/types/src/components/Toolbox/Toolbox.d.ts +3 -2
  164. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  165. package/dist/types/src/components/index.d.ts +5 -6
  166. package/dist/types/src/components/index.d.ts.map +1 -1
  167. package/dist/types/src/experimental/transcription/index.d.ts +1 -0
  168. package/dist/types/src/experimental/transcription/index.d.ts.map +1 -0
  169. package/dist/types/src/hooks/index.d.ts +0 -1
  170. package/dist/types/src/hooks/index.d.ts.map +1 -1
  171. package/dist/types/src/hooks/processor.d.ts +6 -5
  172. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  174. package/dist/types/src/hooks/useContextProvider.d.ts +1 -1
  175. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -1
  176. package/dist/types/src/hooks/useMessageQueue.d.ts +11 -10
  177. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useServices.d.ts.map +1 -1
  179. package/dist/types/src/hooks/useTextInputEvents.d.ts.map +1 -1
  180. package/dist/types/src/parser/filter-generator.d.ts +4 -0
  181. package/dist/types/src/parser/filter-generator.d.ts.map +1 -0
  182. package/dist/types/src/parser/filter-generator.test.d.ts +2 -0
  183. package/dist/types/src/parser/filter-generator.test.d.ts.map +1 -0
  184. package/dist/types/src/parser/index.d.ts +4 -0
  185. package/dist/types/src/parser/index.d.ts.map +1 -0
  186. package/dist/types/src/parser/query-parser.d.ts +15 -0
  187. package/dist/types/src/parser/query-parser.d.ts.map +1 -0
  188. package/dist/types/src/parser/query-parser.test.d.ts +2 -0
  189. package/dist/types/src/parser/query-parser.test.d.ts.map +1 -0
  190. package/dist/types/src/parser/types.d.ts +24 -0
  191. package/dist/types/src/parser/types.d.ts.map +1 -0
  192. package/dist/types/src/stories/Prompt.stories.d.ts +8 -0
  193. package/dist/types/src/stories/Prompt.stories.d.ts.map +1 -0
  194. package/dist/types/src/stories/Query.stories.d.ts +19 -0
  195. package/dist/types/src/stories/Query.stories.d.ts.map +1 -0
  196. package/dist/types/src/stories/Research.stories.d.ts +15 -0
  197. package/dist/types/src/stories/Research.stories.d.ts.map +1 -0
  198. package/dist/types/src/stories/test-data.d.ts +3 -0
  199. package/dist/types/src/stories/test-data.d.ts.map +1 -0
  200. package/dist/types/src/stories/testing.d.ts +12 -0
  201. package/dist/types/src/stories/testing.d.ts.map +1 -0
  202. package/dist/types/src/testing/index.d.ts +1 -0
  203. package/dist/types/src/testing/index.d.ts.map +1 -1
  204. package/dist/types/src/testing/test-blueprint.d.ts +14 -0
  205. package/dist/types/src/testing/test-blueprint.d.ts.map +1 -0
  206. package/dist/types/src/testing/test-functions.d.ts +1 -1
  207. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  208. package/dist/types/src/tools/function.d.ts +4 -4
  209. package/dist/types/src/tools/function.d.ts.map +1 -1
  210. package/dist/types/src/tools/openapi.d.ts +3 -3
  211. package/dist/types/src/tools/openapi.d.ts.map +1 -1
  212. package/dist/types/src/translations.d.ts +6 -0
  213. package/dist/types/src/translations.d.ts.map +1 -1
  214. package/dist/types/src/types/chat.d.ts +18 -8
  215. package/dist/types/src/types/chat.d.ts.map +1 -1
  216. package/dist/types/src/types/service.d.ts +96 -95
  217. package/dist/types/src/types/service.d.ts.map +1 -1
  218. package/dist/types/src/types/template.d.ts +52 -52
  219. package/dist/types/src/types/template.d.ts.map +1 -1
  220. package/dist/types/src/types/types.d.ts +34 -23
  221. package/dist/types/src/types/types.d.ts.map +1 -1
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/package.json +79 -61
  224. package/src/AssistantPlugin.tsx +12 -11
  225. package/src/capabilities/ai-client.ts +5 -6
  226. package/src/capabilities/app-graph-builder.ts +173 -135
  227. package/src/capabilities/capabilities.ts +1 -1
  228. package/src/capabilities/index.ts +1 -1
  229. package/src/capabilities/intent-resolver.ts +10 -11
  230. package/src/capabilities/react-surface.tsx +88 -22
  231. package/src/capabilities/settings.ts +2 -2
  232. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +2 -2
  233. package/src/components/AmbientDialog/AmbientDialog.tsx +27 -13
  234. package/src/components/AssistantDialog.tsx +1 -1
  235. package/src/components/AssistantSettings/AssistantSettings.tsx +29 -7
  236. package/src/components/BlueprintEditor/BlueprintEditor.stories.tsx +32 -0
  237. package/src/components/BlueprintEditor/BlueprintEditor.tsx +40 -0
  238. package/src/components/BlueprintEditor/index.ts +7 -0
  239. package/src/components/ChatContainer.tsx +6 -8
  240. package/src/components/Prompt/Prompt.stories.tsx +60 -52
  241. package/src/components/Prompt/Prompt.tsx +24 -10
  242. package/src/components/Prompt/PromptBar.stories.tsx +69 -0
  243. package/src/components/Prompt/PromptBar.tsx +82 -88
  244. package/src/components/Prompt/autocomplete.ts +14 -8
  245. package/src/components/Prompt/references.ts +3 -3
  246. package/src/components/PromptSettings.tsx +91 -0
  247. package/src/components/TemplateContainer.tsx +3 -79
  248. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +4 -4
  249. package/src/components/TemplateEditor/TemplateForm.stories.tsx +3 -3
  250. package/src/components/TemplateEditor/TemplateForm.tsx +2 -2
  251. package/src/components/Thread/Thread.stories.tsx +14 -17
  252. package/src/components/Thread/Thread.tsx +2 -2
  253. package/src/components/Thread/ThreadContainer.stories.tsx +83 -62
  254. package/src/components/Thread/ThreadContainer.tsx +26 -5
  255. package/src/components/Thread/ThreadMessage.tsx +49 -11
  256. package/src/components/Thread/ToolInvocations.tsx +9 -7
  257. package/src/components/Thread/reducer.ts +1 -1
  258. package/src/components/Toolbox/Toolbox.stories.tsx +4 -4
  259. package/src/components/Toolbox/Toolbox.tsx +5 -4
  260. package/src/components/index.ts +4 -1
  261. package/src/experimental/transcription/index.ts +3 -0
  262. package/src/hooks/index.ts +0 -1
  263. package/src/hooks/processor.ts +68 -8
  264. package/src/hooks/useChatProcessor.tsx +12 -11
  265. package/src/hooks/useContextProvider.ts +20 -17
  266. package/src/hooks/useMessageQueue.ts +5 -5
  267. package/src/meta.ts +2 -2
  268. package/src/parser/filter-generator.test.ts +32 -0
  269. package/src/parser/filter-generator.ts +81 -0
  270. package/src/parser/index.ts +7 -0
  271. package/src/parser/query-parser.test.ts +139 -0
  272. package/src/parser/query-parser.ts +199 -0
  273. package/src/parser/types.ts +34 -0
  274. package/src/shims.d.ts +8 -0
  275. package/src/stories/Prompt.stories.tsx +60 -0
  276. package/src/stories/Query.stories.tsx +515 -0
  277. package/src/stories/Research.stories.tsx +496 -0
  278. package/src/stories/test-data.ts +128 -0
  279. package/src/stories/testing.ts +60 -0
  280. package/src/testing/index.ts +1 -0
  281. package/src/testing/test-blueprint.ts +50 -0
  282. package/src/testing/test-functions.ts +1 -1
  283. package/src/testing/test-services.ts +6 -6
  284. package/src/tools/function.ts +11 -12
  285. package/src/tools/openapi.test.ts +18 -19
  286. package/src/tools/openapi.ts +24 -17
  287. package/src/translations.ts +14 -6
  288. package/src/types/chat.ts +27 -4
  289. package/src/types/service.ts +39 -37
  290. package/src/types/template.ts +27 -25
  291. package/src/types/types.ts +24 -19
  292. package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs +0 -117
  293. package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs.map +0 -7
  294. package/dist/lib/browser/ChatContainer-V5GP7DYF.mjs +0 -33
  295. package/dist/lib/browser/ChatContainer-V5GP7DYF.mjs.map +0 -7
  296. package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs +0 -78
  297. package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs.map +0 -7
  298. package/dist/lib/browser/ai-client-CDZLSNXE.mjs.map +0 -7
  299. package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs +0 -209
  300. package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-FMB7RGMP.mjs.map +0 -7
  302. package/dist/lib/browser/chunk-IAMR2FAE.mjs +0 -183
  303. package/dist/lib/browser/chunk-IAMR2FAE.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-KYMKVE6M.mjs +0 -128
  305. package/dist/lib/browser/chunk-KYMKVE6M.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-NFUHCW2J.mjs +0 -81
  307. package/dist/lib/browser/chunk-TXJWGWJ7.mjs.map +0 -7
  308. package/dist/lib/browser/intent-resolver-WJGLKKVO.mjs +0 -46
  309. package/dist/lib/browser/intent-resolver-WJGLKKVO.mjs.map +0 -7
  310. package/dist/lib/browser/react-surface-57VRDOQT.mjs +0 -90
  311. package/dist/lib/browser/react-surface-57VRDOQT.mjs.map +0 -7
  312. package/dist/lib/browser/settings-U6UFQX32.mjs.map +0 -7
  313. package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs +0 -141
  314. package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs.map +0 -7
  315. package/dist/lib/node/ChatContainer-ZJ5JXF6A.cjs.map +0 -7
  316. package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs +0 -104
  317. package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs.map +0 -7
  318. package/dist/lib/node/ai-client-URCCYU6B.cjs.map +0 -7
  319. package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs +0 -220
  320. package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs.map +0 -7
  321. package/dist/lib/node/chunk-APRU3QWK.cjs +0 -206
  322. package/dist/lib/node/chunk-APRU3QWK.cjs.map +0 -7
  323. package/dist/lib/node/chunk-GBUNQ257.cjs.map +0 -7
  324. package/dist/lib/node/chunk-RPBKMP2E.cjs.map +0 -7
  325. package/dist/lib/node/chunk-ZKOC4ZFY.cjs +0 -152
  326. package/dist/lib/node/chunk-ZKOC4ZFY.cjs.map +0 -7
  327. package/dist/lib/node/intent-resolver-R3OSTIMH.cjs.map +0 -7
  328. package/dist/lib/node/react-surface-NUQTM6MS.cjs +0 -106
  329. package/dist/lib/node/react-surface-NUQTM6MS.cjs.map +0 -7
  330. package/dist/lib/node/settings-TXGRCYAL.cjs.map +0 -7
  331. package/dist/lib/node-esm/AssistantDialog-U2FQX5TD.mjs +0 -118
  332. package/dist/lib/node-esm/AssistantDialog-U2FQX5TD.mjs.map +0 -7
  333. package/dist/lib/node-esm/ChatContainer-QW3OOXTT.mjs +0 -34
  334. package/dist/lib/node-esm/ChatContainer-QW3OOXTT.mjs.map +0 -7
  335. package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs +0 -79
  336. package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs.map +0 -7
  337. package/dist/lib/node-esm/ai-client-WMHS5EGV.mjs.map +0 -7
  338. package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs +0 -210
  339. package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-6JK5HEUQ.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-GBBXIW5F.mjs +0 -129
  342. package/dist/lib/node-esm/chunk-GBBXIW5F.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-MVDAY3CZ.mjs.map +0 -7
  344. package/dist/lib/node-esm/chunk-MXK2EANZ.mjs +0 -184
  345. package/dist/lib/node-esm/chunk-MXK2EANZ.mjs.map +0 -7
  346. package/dist/lib/node-esm/intent-resolver-H32TL4X6.mjs +0 -47
  347. package/dist/lib/node-esm/intent-resolver-H32TL4X6.mjs.map +0 -7
  348. package/dist/lib/node-esm/react-surface-JBVZF6CP.mjs +0 -91
  349. package/dist/lib/node-esm/react-surface-JBVZF6CP.mjs.map +0 -7
  350. package/dist/lib/node-esm/settings-DZU5PNXM.mjs.map +0 -7
  351. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +0 -6
  352. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +0 -1
  353. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +0 -8
  354. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +0 -1
  355. package/dist/types/src/components/ServiceRegistry/index.d.ts +0 -2
  356. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +0 -1
  357. package/dist/types/src/hooks/invocation-handler.d.ts +0 -5
  358. package/dist/types/src/hooks/invocation-handler.d.ts.map +0 -1
  359. package/dist/types/src/hooks/useLocalTriggerManager.d.ts +0 -3
  360. package/dist/types/src/hooks/useLocalTriggerManager.d.ts.map +0 -1
  361. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +0 -49
  362. package/src/components/ServiceRegistry/ServiceRegistry.tsx +0 -76
  363. package/src/components/ServiceRegistry/index.ts +0 -5
  364. package/src/hooks/invocation-handler.ts +0 -107
  365. package/src/hooks/useLocalTriggerManager.ts +0 -82
@@ -7,7 +7,7 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React, { useState } from 'react';
9
9
 
10
- import { create } from '@dxos/live-object';
10
+ import { live } from '@dxos/live-object';
11
11
  import { useClient } from '@dxos/react-client';
12
12
  import { withClientProvider } from '@dxos/react-client/testing';
13
13
  import { withLayout, withTheme } from '@dxos/storybook-utils';
@@ -30,7 +30,7 @@ const DefaultStory = () => {
30
30
  const client = useClient();
31
31
  const [template] = useState(() => {
32
32
  const space = client.spaces.default;
33
- return space.db.add(create(TemplateType, { source: TEMPLATE, kind: { include: 'manual' } }));
33
+ return space.db.add(live(TemplateType, { source: TEMPLATE, kind: { include: 'manual' } }));
34
34
  });
35
35
 
36
36
  return (
@@ -41,7 +41,7 @@ const DefaultStory = () => {
41
41
  };
42
42
 
43
43
  const meta: Meta<typeof TemplateForm> = {
44
- title: 'plugins/plugin-automation/TemplateForm',
44
+ title: 'plugins/plugin-assistant/TemplateForm',
45
45
  component: TemplateForm,
46
46
  render: DefaultStory,
47
47
  decorators: [
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type Schema as S } from 'effect';
5
+ import { type Schema } from 'effect';
6
6
  import React, { Fragment, useEffect } from 'react';
7
7
 
8
8
  import { Input, Select, useTranslation } from '@dxos/react-ui';
@@ -15,7 +15,7 @@ import { type TemplateInput, TemplateInputType, type TemplateType } from '../../
15
15
 
16
16
  export type TemplateFormProps = {
17
17
  template: TemplateType;
18
- schema?: S.Schema<any, any, any>;
18
+ schema?: Schema.Schema<any, any, any>;
19
19
  commandEditable?: boolean;
20
20
  };
21
21
 
@@ -7,10 +7,10 @@ import '@dxos-theme';
7
7
  import { type StoryObj, type Meta } from '@storybook/react';
8
8
  import React, { useCallback, useEffect, useState } from 'react';
9
9
 
10
+ import { type Message } from '@dxos/ai';
10
11
  import { IntentPlugin } from '@dxos/app-framework';
11
12
  import { withPluginManager } from '@dxos/app-framework/testing';
12
- import { type Message } from '@dxos/artifact';
13
- import { ObjectId } from '@dxos/echo-schema';
13
+ import { Type } from '@dxos/echo';
14
14
  import { faker } from '@dxos/random';
15
15
  import { withClientProvider } from '@dxos/react-client/testing';
16
16
  import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
@@ -29,9 +29,9 @@ const DefaultStory = ({ messages: _messages, ...props }: ThreadProps) => {
29
29
 
30
30
  const handleSubmit = useCallback(
31
31
  (text: string) => {
32
- const request: Message = { id: ObjectId.random(), role: 'user', content: [{ type: 'text', text }] };
32
+ const request: Message = { id: Type.ObjectId.random(), role: 'user', content: [{ type: 'text', text }] };
33
33
  const response: Message = {
34
- id: ObjectId.random(),
34
+ id: Type.ObjectId.random(),
35
35
  role: 'assistant',
36
36
  content: [{ type: 'text', disposition: 'cot', pending: true, text: faker.lorem.paragraphs(1) }],
37
37
  };
@@ -44,7 +44,7 @@ const DefaultStory = ({ messages: _messages, ...props }: ThreadProps) => {
44
44
  request,
45
45
  response,
46
46
  {
47
- id: ObjectId.random(),
47
+ id: Type.ObjectId.random(),
48
48
  role: 'assistant',
49
49
  content: [{ type: 'text', text: faker.lorem.paragraphs(1) }],
50
50
  },
@@ -69,18 +69,15 @@ const DefaultStory = ({ messages: _messages, ...props }: ThreadProps) => {
69
69
  };
70
70
 
71
71
  const meta: Meta<ThreadProps> = {
72
- title: 'plugins/plugin-automation/Thread',
72
+ title: 'plugins/plugin-assistant/Thread',
73
73
  render: DefaultStory,
74
74
  component: Thread,
75
75
  decorators: [
76
76
  withSignals,
77
- withClientProvider({
78
- createIdentity: true,
79
- createSpace: true,
80
- }),
77
+ withClientProvider({ createIdentity: true, createSpace: true }),
81
78
  withPluginManager({ plugins: [IntentPlugin()] }),
82
79
  withTheme,
83
- withLayout({ fullscreen: true, tooltips: true, classNames: 'flex justify-center' }),
80
+ withLayout({ fullscreen: true, classNames: 'flex justify-center' }),
84
81
  ],
85
82
  parameters: {
86
83
  translations,
@@ -93,7 +90,7 @@ type Story = StoryObj<ThreadProps>;
93
90
 
94
91
  const TEST_MESSAGES: Message[] = [
95
92
  {
96
- id: ObjectId.random(),
93
+ id: Type.ObjectId.random(),
97
94
  role: 'user',
98
95
  content: [
99
96
  {
@@ -103,7 +100,7 @@ const TEST_MESSAGES: Message[] = [
103
100
  ],
104
101
  },
105
102
  {
106
- id: ObjectId.random(),
103
+ id: Type.ObjectId.random(),
107
104
  role: 'assistant',
108
105
  content: [
109
106
  {
@@ -128,7 +125,7 @@ const TEST_MESSAGES: Message[] = [
128
125
  ],
129
126
  },
130
127
  {
131
- id: ObjectId.random(),
128
+ id: Type.ObjectId.random(),
132
129
  role: 'user',
133
130
  content: [
134
131
  {
@@ -139,7 +136,7 @@ const TEST_MESSAGES: Message[] = [
139
136
  ],
140
137
  },
141
138
  {
142
- id: ObjectId.random(),
139
+ id: Type.ObjectId.random(),
143
140
  role: 'assistant',
144
141
  content: [
145
142
  {
@@ -151,7 +148,7 @@ const TEST_MESSAGES: Message[] = [
151
148
  ],
152
149
  },
153
150
  {
154
- id: ObjectId.random(),
151
+ id: Type.ObjectId.random(),
155
152
  role: 'user',
156
153
  content: [
157
154
  {
@@ -162,7 +159,7 @@ const TEST_MESSAGES: Message[] = [
162
159
  ],
163
160
  },
164
161
  {
165
- id: ObjectId.random(),
162
+ id: Type.ObjectId.random(),
166
163
  role: 'assistant',
167
164
  content: [
168
165
  {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { type CSSProperties, useCallback, useMemo, useRef } from 'react';
6
6
 
7
- import { type Message } from '@dxos/artifact';
7
+ import { type Message } from '@dxos/ai';
8
8
  import { type Space } from '@dxos/react-client/echo';
9
9
  import { useIdentity } from '@dxos/react-client/halo';
10
10
  import { type ThemedClassName } from '@dxos/react-ui';
@@ -32,7 +32,7 @@ export type ThreadProps = ThemedClassName<{
32
32
  contextProvider?: ContextProvider;
33
33
  }> &
34
34
  Pick<PromptBarProps, 'processing' | 'error' | 'onSubmit' | 'onSuggest' | 'onCancel'> &
35
- Pick<ThreadMessageProps, 'debug' | 'tools' | 'onPrompt' | 'onDelete'>;
35
+ Pick<ThreadMessageProps, 'debug' | 'tools' | 'onPrompt' | 'onDelete' | 'onAddToGraph'>;
36
36
 
37
37
  /**
38
38
  * Chat thread component.
@@ -7,6 +7,7 @@ import '@dxos-theme';
7
7
  import { type StoryObj, type Meta } from '@storybook/react';
8
8
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
9
9
 
10
+ import { AIServiceEdgeClient, Message } from '@dxos/ai';
10
11
  import {
11
12
  Capabilities,
12
13
  Events,
@@ -17,42 +18,45 @@ import {
17
18
  useIntentDispatcher,
18
19
  } from '@dxos/app-framework';
19
20
  import { withPluginManager } from '@dxos/app-framework/testing';
20
- import { Message, type Tool } from '@dxos/artifact';
21
- import { genericTools, localServiceEndpoints, type IsObject } from '@dxos/artifact-testing';
22
- import { AIServiceEdgeClient } from '@dxos/assistant';
23
- import { createStatic, ObjectId } from '@dxos/echo-schema';
21
+ import { remoteServiceEndpoints } from '@dxos/artifact-testing';
22
+ import { Type, type Obj } from '@dxos/echo';
23
+ import { createQueueDxn, create, Query, Filter } from '@dxos/echo-schema';
24
24
  import { invariant } from '@dxos/invariant';
25
- import { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';
26
25
  import { ChessPlugin } from '@dxos/plugin-chess';
27
26
  import { ChessType } from '@dxos/plugin-chess/types';
28
27
  import { ClientPlugin } from '@dxos/plugin-client';
29
28
  import { InboxPlugin } from '@dxos/plugin-inbox';
30
29
  import { MapPlugin } from '@dxos/plugin-map';
30
+ import { MarkdownPlugin } from '@dxos/plugin-markdown';
31
31
  import { SpacePlugin } from '@dxos/plugin-space';
32
32
  import { TablePlugin } from '@dxos/plugin-table';
33
- import { useQueue, useSpace } from '@dxos/react-client/echo';
34
- import { withClientProvider } from '@dxos/react-client/testing';
33
+ import { useClient } from '@dxos/react-client';
34
+ import { useQueue, useQuery } from '@dxos/react-client/echo';
35
35
  import { IconButton, Input, Toolbar } from '@dxos/react-ui';
36
- import { mx } from '@dxos/react-ui-theme';
37
- import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
36
+ import { descriptionMessage, mx } from '@dxos/react-ui-theme';
37
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
38
38
 
39
39
  import { Thread, type ThreadProps } from './Thread';
40
40
  import { ChatProcessor } from '../../hooks';
41
41
  import { createProcessorOptions } from '../../testing';
42
42
  import translations from '../../translations';
43
43
 
44
- const endpoints = localServiceEndpoints;
44
+ // TODO(burdon): Configure for local with ollama/LM studio.
45
+ // const endpoints = localServiceEndpoints;
46
+ const endpoints = remoteServiceEndpoints;
45
47
 
46
48
  type RenderProps = {
47
- items?: IsObject[];
49
+ items?: Obj.Any[];
48
50
  prompts?: string[];
49
51
  } & Pick<ThreadProps, 'debug'>;
50
52
 
51
53
  // TODO(burdon): Use ChatContainer.
52
54
  const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) => {
53
- const space = useSpace();
55
+ const client = useClient();
56
+ const space = client.spaces.default;
57
+
54
58
  const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
55
- const tools = useMemo<Tool[]>(() => [...genericTools], []);
59
+ const tools = useCapabilities(Capabilities.Tools);
56
60
 
57
61
  const [aiClient] = useState(() => new AIServiceEdgeClient({ endpoint: endpoints.ai }));
58
62
  const { dispatchPromise: dispatch } = useIntentDispatcher();
@@ -66,7 +70,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
66
70
 
67
71
  return new ChatProcessor(
68
72
  aiClient,
69
- tools,
73
+ tools.flat(),
70
74
  artifactDefinitions,
71
75
  {
72
76
  space,
@@ -77,13 +81,19 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
77
81
  }, [aiClient, tools, space, dispatch, artifactDefinitions]);
78
82
 
79
83
  // Queue.
80
- const [queueDxn, setQueueDxn] = useState<string>(() => randomQueueDxn());
81
- const queue = useQueue<Message>(DXN.tryParse(queueDxn));
84
+ const [queueDxn, setQueueDxn] = useState<string>(() => createQueueDxn(space.id).toString());
85
+ const queue = useQueue<Message>(Type.DXN.tryParse(queueDxn));
82
86
 
83
87
  useEffect(() => {
84
- if (queue?.items.length === 0 && !queue.isLoading && prompts.length > 0) {
88
+ if (space) {
89
+ setQueueDxn(createQueueDxn(space.id).toString());
90
+ }
91
+ }, [space]);
92
+
93
+ useEffect(() => {
94
+ if (queue?.objects.length === 0 && !queue.isLoading && prompts.length > 0) {
85
95
  queue.append([
86
- createStatic(Message, {
96
+ create(Message, {
87
97
  role: 'assistant',
88
98
  content: prompts.map(
89
99
  (prompt) =>
@@ -96,48 +106,52 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
96
106
  }),
97
107
  ]);
98
108
  }
99
- }, [queueDxn, prompts, queue?.items.length, queue?.isLoading]);
109
+ }, [queueDxn, prompts, queue?.objects.length, queue?.isLoading]);
100
110
 
101
111
  // State.
102
- const artifactItems: any[] = []; // TODO(burdon): Query from space.
103
- const messages = [...(queue?.items ?? []), ...(processor?.messages.value ?? [])];
104
-
105
- const handleSubmit = processor
106
- ? (message: string) => {
107
- requestAnimationFrame(async () => {
108
- invariant(processor);
109
- if (processor.streaming.value) {
110
- await processor.cancel();
111
- }
112
-
113
- invariant(queue);
114
- await processor.request(message, {
115
- history: queue.items,
116
- onComplete: (messages) => {
117
- queue.append(messages);
118
- },
119
- });
120
- });
112
+ const query = useMemo(
113
+ () => Query.select(Filter.or(...artifactDefinitions.map((definition) => Filter.type(definition.schema)))),
114
+ [artifactDefinitions],
115
+ );
116
+ const artifactItems = useQuery(space, query);
117
+ const messages = [...(queue?.objects ?? []), ...(processor?.messages.value ?? [])];
118
+
119
+ const handleSubmit = useCallback(
120
+ (message: string) => {
121
+ requestAnimationFrame(async () => {
122
+ if (!processor || !queue) {
123
+ return;
124
+ }
121
125
 
122
- return true;
123
- }
124
- : undefined;
126
+ if (processor.streaming.value) {
127
+ await processor.cancel();
128
+ }
129
+
130
+ await processor.request(message, {
131
+ history: queue.objects,
132
+ onComplete: (messages) => {
133
+ queue.append(messages);
134
+ },
135
+ });
136
+ });
125
137
 
126
- const handlePrompt = useCallback(
127
- (text: string) => {
128
- void handleSubmit?.(text);
138
+ return true;
129
139
  },
130
- [handleSubmit],
140
+ [processor, queue],
131
141
  );
132
142
 
133
143
  const handleDelete = useCallback(
134
144
  (id: string) => {
135
- invariant(ObjectId.isValid(id), 'Invalid message id');
145
+ invariant(Type.ObjectId.isValid(id), 'Invalid message id');
136
146
  void queue?.delete([id]);
137
147
  },
138
148
  [queue],
139
149
  );
140
150
 
151
+ if (!space) {
152
+ return <></>;
153
+ }
154
+
141
155
  return (
142
156
  <div className='grid grid-cols-2 w-full h-full divide-x divide-separator overflow-hidden'>
143
157
  {/* Thread */}
@@ -160,7 +174,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
160
174
  iconOnly
161
175
  label='Clear history'
162
176
  icon='ph--trash--regular'
163
- onClick={() => setQueueDxn(randomQueueDxn())}
177
+ onClick={() => setQueueDxn(createQueueDxn(space.id).toString())}
164
178
  />
165
179
  <IconButton iconOnly label='Stop' icon='ph--stop--regular' onClick={() => processor?.cancel()} />
166
180
  </Input.Root>
@@ -173,7 +187,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
173
187
  error={processor?.error.value}
174
188
  tools={processor?.tools}
175
189
  onSubmit={processor ? handleSubmit : undefined}
176
- onPrompt={processor ? handlePrompt : undefined}
190
+ onPrompt={processor ? handleSubmit : undefined}
177
191
  onDelete={processor ? handleDelete : undefined}
178
192
  {...props}
179
193
  />
@@ -183,7 +197,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
183
197
  <div className='overflow-hidden grid grid-rows-[2fr_1fr] divide-y divide-separator'>
184
198
  {artifactItems.length > 0 && (
185
199
  <div className={mx('flex grow overflow-hidden', artifactItems.length === 1 && 'row-span-2')}>
186
- <Surface role='canvas-node' limit={1} data={artifactItems[0]} />
200
+ <Surface role='article' limit={1} data={{ subject: artifactItems[0] }} fallback={Fallback} />
187
201
  </div>
188
202
  )}
189
203
 
@@ -191,7 +205,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
191
205
  <div className='flex shrink-0 overflow-hidden divide-x divide-separator'>
192
206
  <div className='flex flex-1 h-full'>
193
207
  {artifactItems.slice(1, 3).map((item, idx) => (
194
- <Surface key={idx} role='canvas-node' limit={1} data={item} />
208
+ <Surface key={idx} role='article' limit={1} data={{ subject: item }} fallback={Fallback} />
195
209
  ))}
196
210
  </div>
197
211
  </div>
@@ -201,18 +215,10 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
201
215
  );
202
216
  };
203
217
 
204
- const randomQueueDxn = () =>
205
- new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]).toString();
206
-
207
218
  const meta: Meta<typeof DefaultStory> = {
208
- title: 'plugins/plugin-automation/ThreadContainer',
219
+ title: 'plugins/plugin-assistant/ThreadContainer',
209
220
  render: DefaultStory,
210
221
  decorators: [
211
- withSignals,
212
- withClientProvider({
213
- createIdentity: true,
214
- createSpace: true,
215
- }),
216
222
  withPluginManager({
217
223
  plugins: [
218
224
  ClientPlugin({
@@ -220,7 +226,7 @@ const meta: Meta<typeof DefaultStory> = {
220
226
  await client.halo.createIdentity();
221
227
  },
222
228
  }),
223
- SpacePlugin({ observability: false }),
229
+ SpacePlugin(),
224
230
  SettingsPlugin(),
225
231
  IntentPlugin(),
226
232
 
@@ -228,12 +234,13 @@ const meta: Meta<typeof DefaultStory> = {
228
234
  ChessPlugin(),
229
235
  InboxPlugin(),
230
236
  MapPlugin(),
237
+ MarkdownPlugin(),
231
238
  TablePlugin(),
232
239
  ],
233
240
  fireEvents: [Events.SetupArtifactDefinition],
234
241
  }),
235
242
  withTheme,
236
- withLayout({ fullscreen: true, tooltips: true }),
243
+ withLayout({ fullscreen: true }),
237
244
  ],
238
245
  parameters: {
239
246
  translations,
@@ -255,9 +262,23 @@ export const WithInitialItems: Story = {
255
262
  args: {
256
263
  debug: true,
257
264
  items: [
258
- createStatic(ChessType, {
265
+ create(ChessType, {
259
266
  fen: 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1',
260
267
  }),
261
268
  ],
262
269
  },
263
270
  };
271
+
272
+ const Fallback = ({ error }: { error?: Error }) => {
273
+ const errorString = error?.toString() ?? '';
274
+ return (
275
+ <div role='none' className='overflow-auto p-8 attention-surface grid place-items-center'>
276
+ <p
277
+ role='alert'
278
+ className={mx(descriptionMessage, 'break-words rounded-lg p-8', errorString.length < 256 && 'text-lg')}
279
+ >
280
+ {error ? errorString : 'error'}
281
+ </p>
282
+ </div>
283
+ );
284
+ };
@@ -2,10 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback, type FC } from 'react';
5
+ import React, { useCallback, type FC, useEffect } from 'react';
6
6
 
7
+ import { CollaborationActions, createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
8
  import { type AssociatedArtifact } from '@dxos/artifact';
8
9
  import { invariant } from '@dxos/invariant';
10
+ import { DXN } from '@dxos/keys';
11
+ import { refFromDXN } from '@dxos/live-object';
9
12
  import { log } from '@dxos/log';
10
13
  import { getSpace } from '@dxos/react-client/echo';
11
14
  import { type ThemedClassName } from '@dxos/react-ui';
@@ -19,7 +22,7 @@ export type ThreadContainerProps = {
19
22
  settings?: AssistantSettingsProps;
20
23
  part?: 'deck' | 'dialog';
21
24
  associatedArtifact?: AssociatedArtifact;
22
- } & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange'>;
25
+ } & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange' | 'onAddToGraph'>;
23
26
 
24
27
  // TODO(burdon): Since this only wraps Thread, just separate out hook?
25
28
  export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
@@ -35,7 +38,25 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
35
38
  const contextProvider = useContextProvider(space);
36
39
  const processor = useChatProcessor({ chat, space, settings, part, associatedArtifact });
37
40
  const messageQueue = useMessageQueue(chat);
38
- const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];
41
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
42
+ // TODO(thure): This will be referentially new on every render, is it causing overreactivity?
43
+ const messages = [...(messageQueue?.objects ?? []), ...processor.messages.value];
44
+
45
+ // Post last message to document.
46
+ useEffect(() => {
47
+ if (!processor.streaming.value && messageQueue?.objects) {
48
+ const message = messageQueue.objects[messageQueue.objects.length - 1];
49
+ if (space && chat && message && dispatch && associatedArtifact) {
50
+ void dispatch(
51
+ createIntent(CollaborationActions.InsertContent, {
52
+ target: associatedArtifact,
53
+ object: refFromDXN(new DXN(DXN.kind.QUEUE, [...chat.queue.dxn.parts, message.id])),
54
+ label: 'View proposal',
55
+ }),
56
+ );
57
+ }
58
+ }
59
+ }, [messageQueue, associatedArtifact, processor.streaming.value]);
39
60
 
40
61
  const handleSubmit = useCallback(
41
62
  (text: string) => {
@@ -49,7 +70,7 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
49
70
 
50
71
  invariant(messageQueue);
51
72
  void processor.request(text, {
52
- history: messageQueue.items,
73
+ history: messageQueue.objects,
53
74
  onComplete: (messages) => {
54
75
  messageQueue.append(messages);
55
76
  },
@@ -74,11 +95,11 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
74
95
  processing={processor.streaming.value}
75
96
  error={processor.error.value}
76
97
  tools={processor.tools}
98
+ contextProvider={contextProvider}
77
99
  onSubmit={handleSubmit}
78
100
  onCancel={handleCancel}
79
101
  onPrompt={handleSubmit}
80
102
  onOpenChange={onOpenChange}
81
- contextProvider={contextProvider}
82
103
  {...props}
83
104
  />
84
105
  );
@@ -2,9 +2,11 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type PropsWithChildren, type FC } from 'react';
5
+ import React, { type FC, type PropsWithChildren } from 'react';
6
6
 
7
- import { type MessageContentBlock, type Message, type ToolType } from '@dxos/artifact';
7
+ import { type MessageContentBlock, type Message, type Tool } from '@dxos/ai';
8
+ import { Surface } from '@dxos/app-framework';
9
+ import { type Obj } from '@dxos/echo';
8
10
  import { invariant } from '@dxos/invariant';
9
11
  import { type Space } from '@dxos/react-client/echo';
10
12
  import { Button, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';
@@ -20,8 +22,8 @@ import { safeParseJson } from '@dxos/util';
20
22
  import { ToolBlock, isToolMessage } from './ToolInvocations';
21
23
  import { ToolboxContainer } from '../Toolbox';
22
24
 
23
- const panelClassNames = 'flex flex-col w-full px-2 bg-groupSurface rounded-md';
24
- const userClassNames = 'bg-[--user-fill] text-inverse';
25
+ const panelClassNames = 'flex flex-col w-full px-2 bg-activeSurface rounded-md';
26
+ const userClassNames = 'bg-[--user-fill] text-accentSurfaceText';
25
27
 
26
28
  const ToggleContainer = (props: ToggleContainerProps) => {
27
29
  return <NativeToggleContainer {...props} classNames={mx(panelClassNames, props.classNames)} />;
@@ -43,12 +45,20 @@ export type ThreadMessageProps = ThemedClassName<{
43
45
  space?: Space;
44
46
  message: Message;
45
47
  debug?: boolean;
46
- tools?: ToolType[];
48
+ tools?: Tool[];
47
49
  onPrompt?: (text: string) => void;
48
50
  onDelete?: (id: string) => void;
51
+ onAddToGraph?: (object: Obj.Any) => void;
49
52
  }>;
50
53
 
51
- export const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, message, tools, onPrompt }) => {
54
+ export const ThreadMessage: FC<ThreadMessageProps> = ({
55
+ classNames,
56
+ space,
57
+ message,
58
+ tools,
59
+ onPrompt,
60
+ onAddToGraph,
61
+ }) => {
52
62
  const { role, content = [] } = message;
53
63
 
54
64
  // TODO(burdon): Restructure types to make check unnecessary.
@@ -74,13 +84,18 @@ export const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, messa
74
84
  classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}
75
85
  user={block.type === 'text' && role === 'user'}
76
86
  >
77
- <Component space={space} block={block} onPrompt={onPrompt} />
87
+ <Component space={space} block={block} onPrompt={onPrompt} onAddToGraph={onAddToGraph} />
78
88
  </MessageContainer>
79
89
  );
80
90
  });
81
91
  };
82
92
 
83
- type BlockComponent = FC<{ space?: Space; block: MessageContentBlock; onPrompt?: (text: string) => void }>;
93
+ type BlockComponent = FC<{
94
+ space?: Space;
95
+ block: MessageContentBlock;
96
+ onPrompt?: (text: string) => void;
97
+ onAddToGraph?: (object: Obj.Any) => void;
98
+ }>;
84
99
 
85
100
  const components: Record<string, BlockComponent> = {
86
101
  //
@@ -105,7 +120,7 @@ const components: Record<string, BlockComponent> = {
105
120
  return (
106
121
  <ToggleContainer
107
122
  // open={open}
108
- defaultOpen={block.disposition === 'cot' && block.pending}
123
+ defaultOpen={systemDispositions.includes(block.disposition ?? '') && block.pending}
109
124
  title={title}
110
125
  icon={
111
126
  block.pending ? (
@@ -115,7 +130,7 @@ const components: Record<string, BlockComponent> = {
115
130
  >
116
131
  <MarkdownViewer
117
132
  content={block.text}
118
- classNames={['pbe-2', block.disposition === 'cot' && 'text-sm text-subdued']}
133
+ classNames={['pbe-2', systemDispositions.includes(block.disposition ?? '') && 'text-sm text-subdued']}
119
134
  />
120
135
  </ToggleContainer>
121
136
  );
@@ -124,7 +139,7 @@ const components: Record<string, BlockComponent> = {
124
139
  //
125
140
  // JSON
126
141
  //
127
- ['json' as const]: ({ space, block, onPrompt }) => {
142
+ ['json' as const]: ({ space, block, onPrompt, onAddToGraph }) => {
128
143
  invariant(block.type === 'json');
129
144
 
130
145
  switch (block.disposition) {
@@ -158,6 +173,26 @@ const components: Record<string, BlockComponent> = {
158
173
  );
159
174
  }
160
175
 
176
+ case 'graph': {
177
+ return (
178
+ <div className='flex flex-wrap gap-1'>
179
+ <Surface
180
+ role='card'
181
+ data={{ subject: JSON.parse(block.json ?? '{}') }}
182
+ limit={1}
183
+ fallback={<div className='font-mono text-xs text-pre'>{block.json}</div>}
184
+ />
185
+ {onAddToGraph && (
186
+ <IconButton
187
+ icon='ph--plus--regular'
188
+ label='Add to graph'
189
+ onClick={() => onAddToGraph?.(JSON.parse(block.json ?? '{}'))}
190
+ />
191
+ )}
192
+ </div>
193
+ );
194
+ }
195
+
161
196
  default: {
162
197
  const title = block.disposition ? titles[block.disposition] : undefined;
163
198
  return (
@@ -193,4 +228,7 @@ const titles: Record<string, string> = {
193
228
  ['tool_use' as const]: 'Tool request',
194
229
  ['tool_result' as const]: 'Tool result',
195
230
  ['tool_list' as const]: 'Tools',
231
+ ['artifact-update' as const]: 'Artifact(s) changed',
196
232
  };
233
+
234
+ const systemDispositions: string[] = ['cot', 'artifact-update'];