@dxos/plugin-assistant 0.8.1-main.ae460ac → 0.8.1-staging.31c3ee1

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 (257) hide show
  1. package/dist/lib/browser/{AssistantDialog-6KB6INZE.mjs → AssistantDialog-YSHMAHW5.mjs} +15 -14
  2. package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs.map +7 -0
  3. package/dist/lib/browser/{ChatContainer-DQNUNADE.mjs → ChatContainer-V5GP7DYF.mjs} +11 -11
  4. package/dist/lib/browser/ChatContainer-V5GP7DYF.mjs.map +7 -0
  5. package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs +78 -0
  6. package/dist/lib/browser/TemplateContainer-K4EJNGIL.mjs.map +7 -0
  7. package/dist/lib/browser/ai-client-CDZLSNXE.mjs +35 -0
  8. package/dist/lib/browser/ai-client-CDZLSNXE.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs +209 -0
  10. package/dist/lib/browser/app-graph-builder-MF5EVDWW.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-NV7SVHMV.mjs → chunk-3HCI5FIL.mjs} +2 -2
  12. package/dist/lib/browser/{chunk-NV7SVHMV.mjs.map → chunk-3HCI5FIL.mjs.map} +2 -2
  13. package/dist/lib/browser/{chunk-NIESO4DA.mjs → chunk-FMB7RGMP.mjs} +395 -247
  14. package/dist/lib/browser/chunk-FMB7RGMP.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-IAMR2FAE.mjs +183 -0
  16. package/dist/lib/browser/chunk-IAMR2FAE.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-6F6FUSOV.mjs → chunk-KYMKVE6M.mjs} +37 -15
  18. package/dist/lib/browser/chunk-KYMKVE6M.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-EUMPBC4T.mjs → chunk-NFUHCW2J.mjs} +3 -3
  20. package/dist/lib/browser/{chunk-NTLTGYYS.mjs → chunk-TXJWGWJ7.mjs} +3 -3
  21. package/dist/lib/browser/chunk-TXJWGWJ7.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +37 -53
  23. package/dist/lib/browser/index.mjs.map +3 -3
  24. package/dist/lib/browser/{intent-resolver-QRVRZL6K.mjs → intent-resolver-WJGLKKVO.mjs} +8 -6
  25. package/dist/lib/browser/{intent-resolver-QRVRZL6K.mjs.map → intent-resolver-WJGLKKVO.mjs.map} +3 -3
  26. package/dist/lib/browser/meta.json +1 -1
  27. package/dist/lib/browser/{react-surface-UX6A7C24.mjs → react-surface-57VRDOQT.mjs} +36 -15
  28. package/dist/lib/browser/react-surface-57VRDOQT.mjs.map +7 -0
  29. package/dist/lib/browser/{settings-JTT62IHD.mjs → settings-U6UFQX32.mjs} +4 -4
  30. package/dist/lib/browser/types/index.mjs +6 -2
  31. package/dist/lib/node/{AssistantDialog-DSBHAWOS.cjs → AssistantDialog-YI2BSGSX.cjs} +18 -17
  32. package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs.map +7 -0
  33. package/dist/lib/node/{ChatContainer-3RAAOIWP.cjs → ChatContainer-ZJ5JXF6A.cjs} +15 -15
  34. package/dist/lib/node/ChatContainer-ZJ5JXF6A.cjs.map +7 -0
  35. package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs +104 -0
  36. package/dist/lib/node/TemplateContainer-XWFYJB4T.cjs.map +7 -0
  37. package/dist/lib/node/{ai-client-RBDOGK6W.cjs → ai-client-URCCYU6B.cjs} +19 -19
  38. package/dist/lib/node/ai-client-URCCYU6B.cjs.map +7 -0
  39. package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs +220 -0
  40. package/dist/lib/node/app-graph-builder-N5ZUUI2Z.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-37GI4NYH.cjs → chunk-APRU3QWK.cjs} +34 -11
  42. package/dist/lib/node/chunk-APRU3QWK.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-3WXG6WA6.cjs → chunk-GBUNQ257.cjs} +6 -6
  44. package/dist/lib/node/chunk-GBUNQ257.cjs.map +7 -0
  45. package/dist/lib/node/{chunk-GNPXCHFT.cjs → chunk-Q5XWEMHB.cjs} +4 -4
  46. package/dist/lib/node/{chunk-GNPXCHFT.cjs.map → chunk-Q5XWEMHB.cjs.map} +2 -2
  47. package/dist/lib/node/{chunk-KOSGO3RY.cjs → chunk-RPBKMP2E.cjs} +370 -226
  48. package/dist/lib/node/chunk-RPBKMP2E.cjs.map +7 -0
  49. package/dist/lib/node/{chunk-NV4TQQSU.cjs → chunk-XI2ARIEO.cjs} +6 -6
  50. package/dist/lib/node/{chunk-XANPLPBO.cjs → chunk-ZKOC4ZFY.cjs} +40 -18
  51. package/dist/lib/node/chunk-ZKOC4ZFY.cjs.map +7 -0
  52. package/dist/lib/node/index.cjs +78 -94
  53. package/dist/lib/node/index.cjs.map +3 -3
  54. package/dist/lib/node/{intent-resolver-YMMAFVOB.cjs → intent-resolver-R3OSTIMH.cjs} +14 -12
  55. package/dist/lib/node/intent-resolver-R3OSTIMH.cjs.map +7 -0
  56. package/dist/lib/node/meta.json +1 -1
  57. package/dist/lib/node/{react-surface-HTFYCQUK.cjs → react-surface-NUQTM6MS.cjs} +47 -26
  58. package/dist/lib/node/react-surface-NUQTM6MS.cjs.map +7 -0
  59. package/dist/lib/node/{settings-4YEO7KXF.cjs → settings-TXGRCYAL.cjs} +8 -8
  60. package/dist/lib/node/types/index.cjs +15 -11
  61. package/dist/lib/node/types/index.cjs.map +2 -2
  62. package/dist/lib/node-esm/{AssistantDialog-Y2AN6UPH.mjs → AssistantDialog-U2FQX5TD.mjs} +15 -14
  63. package/dist/lib/node-esm/AssistantDialog-U2FQX5TD.mjs.map +7 -0
  64. package/dist/lib/node-esm/{ChatContainer-OZO2R4TX.mjs → ChatContainer-QW3OOXTT.mjs} +11 -11
  65. package/dist/lib/node-esm/ChatContainer-QW3OOXTT.mjs.map +7 -0
  66. package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs +79 -0
  67. package/dist/lib/node-esm/TemplateContainer-EUM2X65J.mjs.map +7 -0
  68. package/dist/lib/node-esm/ai-client-WMHS5EGV.mjs +36 -0
  69. package/dist/lib/node-esm/ai-client-WMHS5EGV.mjs.map +7 -0
  70. package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs +210 -0
  71. package/dist/lib/node-esm/app-graph-builder-DWBNIMHM.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-ICQN3TDS.mjs → chunk-6JK5HEUQ.mjs} +3 -3
  73. package/dist/lib/node-esm/chunk-6JK5HEUQ.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs → chunk-ECRK6TUQ.mjs} +2 -2
  75. package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs.map → chunk-ECRK6TUQ.mjs.map} +2 -2
  76. package/dist/lib/node-esm/{chunk-KICG37HX.mjs → chunk-GBBXIW5F.mjs} +37 -15
  77. package/dist/lib/node-esm/chunk-GBBXIW5F.mjs.map +7 -0
  78. package/dist/lib/node-esm/{chunk-GKBHTBON.mjs → chunk-MVDAY3CZ.mjs} +395 -247
  79. package/dist/lib/node-esm/chunk-MVDAY3CZ.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-MXK2EANZ.mjs +184 -0
  81. package/dist/lib/node-esm/chunk-MXK2EANZ.mjs.map +7 -0
  82. package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs → chunk-PBZA7XJR.mjs} +3 -3
  83. package/dist/lib/node-esm/index.mjs +37 -53
  84. package/dist/lib/node-esm/index.mjs.map +3 -3
  85. package/dist/lib/node-esm/{intent-resolver-MR7BOKEW.mjs → intent-resolver-H32TL4X6.mjs} +8 -6
  86. package/dist/lib/node-esm/{intent-resolver-MR7BOKEW.mjs.map → intent-resolver-H32TL4X6.mjs.map} +3 -3
  87. package/dist/lib/node-esm/meta.json +1 -1
  88. package/dist/lib/node-esm/{react-surface-AMVW4HZ7.mjs → react-surface-JBVZF6CP.mjs} +36 -15
  89. package/dist/lib/node-esm/react-surface-JBVZF6CP.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-S7P5RWQI.mjs → settings-DZU5PNXM.mjs} +4 -4
  91. package/dist/lib/node-esm/types/index.mjs +6 -2
  92. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/ai-client.d.ts +2 -1
  94. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/capabilities.d.ts +2 -1
  97. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/index.d.ts +1 -1
  99. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  102. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +5 -4
  103. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -1
  104. package/dist/types/src/components/AmbientDialog/AmbientDialog.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/AssistantDialog.d.ts.map +1 -1
  106. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts +2 -1
  107. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  108. package/dist/types/src/components/ChatContainer.d.ts +6 -3
  109. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  110. package/dist/types/src/components/Prompt/Prompt.d.ts +3 -0
  111. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  112. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +1 -0
  113. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/Prompt/PromptBar.d.ts +3 -2
  115. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
  116. package/dist/types/src/components/Prompt/references.d.ts +30 -0
  117. package/dist/types/src/components/Prompt/references.d.ts.map +1 -0
  118. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +2 -1
  119. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -1
  120. package/dist/types/src/components/TemplateContainer.d.ts +2 -1
  121. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  122. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -1
  123. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  124. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +5 -4
  125. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +2 -1
  127. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  128. package/dist/types/src/components/Thread/Thread.d.ts +12 -1
  129. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  130. package/dist/types/src/components/Thread/ThreadContainer.d.ts +3 -0
  131. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
  132. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +4 -3
  133. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  135. package/dist/types/src/components/Toolbox/Toolbox.d.ts +4 -3
  136. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  137. package/dist/types/src/components/index.d.ts +5 -4
  138. package/dist/types/src/components/index.d.ts.map +1 -1
  139. package/dist/types/src/hooks/index.d.ts +1 -0
  140. package/dist/types/src/hooks/index.d.ts.map +1 -1
  141. package/dist/types/src/hooks/invocation-handler.d.ts +1 -1
  142. package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
  143. package/dist/types/src/hooks/processor.d.ts +9 -14
  144. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  145. package/dist/types/src/hooks/useChatProcessor.d.ts +11 -2
  146. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  147. package/dist/types/src/hooks/useContextProvider.d.ts +17 -0
  148. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useMessageQueue.d.ts +3 -3
  150. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
  151. package/dist/types/src/meta.d.ts +2 -8
  152. package/dist/types/src/meta.d.ts.map +1 -1
  153. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  154. package/dist/types/src/tools/function.d.ts +1 -1
  155. package/dist/types/src/tools/function.d.ts.map +1 -1
  156. package/dist/types/src/translations.d.ts +26 -12
  157. package/dist/types/src/translations.d.ts.map +1 -1
  158. package/dist/types/src/types/chat.d.ts +4 -6
  159. package/dist/types/src/types/chat.d.ts.map +1 -1
  160. package/dist/types/src/types/service.d.ts +1 -1
  161. package/dist/types/src/types/service.d.ts.map +1 -1
  162. package/dist/types/src/types/template.d.ts +36 -0
  163. package/dist/types/src/types/template.d.ts.map +1 -1
  164. package/dist/types/src/types/types.d.ts +3 -1
  165. package/dist/types/src/types/types.d.ts.map +1 -1
  166. package/package.json +58 -55
  167. package/src/AssistantPlugin.tsx +19 -23
  168. package/src/capabilities/ai-client.ts +23 -7
  169. package/src/capabilities/app-graph-builder.ts +100 -5
  170. package/src/capabilities/capabilities.ts +3 -1
  171. package/src/capabilities/intent-resolver.ts +4 -3
  172. package/src/capabilities/react-surface.tsx +27 -9
  173. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +3 -1
  174. package/src/components/AmbientDialog/AmbientDialog.tsx +11 -11
  175. package/src/components/AssistantDialog.tsx +8 -2
  176. package/src/components/AssistantSettings/AssistantSettings.tsx +39 -5
  177. package/src/components/ChatContainer.tsx +18 -4
  178. package/src/components/Prompt/Prompt.stories.tsx +34 -0
  179. package/src/components/Prompt/Prompt.tsx +28 -18
  180. package/src/components/Prompt/PromptBar.tsx +19 -8
  181. package/src/components/Prompt/references.ts +180 -0
  182. package/src/components/TemplateContainer.tsx +79 -4
  183. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +5 -5
  184. package/src/components/TemplateEditor/TemplateForm.stories.tsx +3 -3
  185. package/src/components/Thread/Thread.stories.tsx +3 -3
  186. package/src/components/Thread/Thread.tsx +21 -0
  187. package/src/components/Thread/ThreadContainer.stories.tsx +9 -14
  188. package/src/components/Thread/ThreadContainer.tsx +10 -4
  189. package/src/components/Thread/ThreadMessage.tsx +17 -9
  190. package/src/components/Toolbox/Toolbox.stories.tsx +2 -2
  191. package/src/components/Toolbox/Toolbox.tsx +1 -1
  192. package/src/components/index.ts +3 -0
  193. package/src/hooks/index.ts +1 -0
  194. package/src/hooks/invocation-handler.ts +3 -5
  195. package/src/hooks/processor.ts +59 -109
  196. package/src/hooks/useChatProcessor.tsx +36 -20
  197. package/src/hooks/useContextProvider.ts +55 -0
  198. package/src/hooks/useLocalTriggerManager.ts +1 -1
  199. package/src/hooks/useMessageQueue.ts +4 -6
  200. package/src/meta.ts +2 -2
  201. package/src/testing/test-functions.ts +2 -2
  202. package/src/tools/function.ts +2 -2
  203. package/src/translations.ts +11 -5
  204. package/src/types/chat.ts +2 -3
  205. package/src/types/service.ts +1 -1
  206. package/src/types/template.ts +22 -0
  207. package/src/types/types.ts +3 -1
  208. package/dist/lib/browser/AssistantDialog-6KB6INZE.mjs.map +0 -7
  209. package/dist/lib/browser/ChatContainer-DQNUNADE.mjs.map +0 -7
  210. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs +0 -23
  211. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs.map +0 -7
  212. package/dist/lib/browser/ai-client-PORKRZXM.mjs +0 -33
  213. package/dist/lib/browser/ai-client-PORKRZXM.mjs.map +0 -7
  214. package/dist/lib/browser/app-graph-builder-AXAIFOGV.mjs +0 -110
  215. package/dist/lib/browser/app-graph-builder-AXAIFOGV.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-6F6FUSOV.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-FRIKXDDQ.mjs +0 -162
  218. package/dist/lib/browser/chunk-FRIKXDDQ.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-NIESO4DA.mjs.map +0 -7
  220. package/dist/lib/browser/chunk-NTLTGYYS.mjs.map +0 -7
  221. package/dist/lib/browser/react-surface-UX6A7C24.mjs.map +0 -7
  222. package/dist/lib/node/AssistantDialog-DSBHAWOS.cjs.map +0 -7
  223. package/dist/lib/node/ChatContainer-3RAAOIWP.cjs.map +0 -7
  224. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs +0 -53
  225. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs.map +0 -7
  226. package/dist/lib/node/ai-client-RBDOGK6W.cjs.map +0 -7
  227. package/dist/lib/node/app-graph-builder-D7SHQTZS.cjs +0 -122
  228. package/dist/lib/node/app-graph-builder-D7SHQTZS.cjs.map +0 -7
  229. package/dist/lib/node/chunk-37GI4NYH.cjs.map +0 -7
  230. package/dist/lib/node/chunk-3WXG6WA6.cjs.map +0 -7
  231. package/dist/lib/node/chunk-KOSGO3RY.cjs.map +0 -7
  232. package/dist/lib/node/chunk-XANPLPBO.cjs.map +0 -7
  233. package/dist/lib/node/intent-resolver-YMMAFVOB.cjs.map +0 -7
  234. package/dist/lib/node/react-surface-HTFYCQUK.cjs.map +0 -7
  235. package/dist/lib/node-esm/AssistantDialog-Y2AN6UPH.mjs.map +0 -7
  236. package/dist/lib/node-esm/ChatContainer-OZO2R4TX.mjs.map +0 -7
  237. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs +0 -24
  238. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs.map +0 -7
  239. package/dist/lib/node-esm/ai-client-OTZVBDUH.mjs +0 -34
  240. package/dist/lib/node-esm/ai-client-OTZVBDUH.mjs.map +0 -7
  241. package/dist/lib/node-esm/app-graph-builder-H2GC2AZA.mjs +0 -111
  242. package/dist/lib/node-esm/app-graph-builder-H2GC2AZA.mjs.map +0 -7
  243. package/dist/lib/node-esm/chunk-CJ4Y3QW5.mjs +0 -163
  244. package/dist/lib/node-esm/chunk-CJ4Y3QW5.mjs.map +0 -7
  245. package/dist/lib/node-esm/chunk-GKBHTBON.mjs.map +0 -7
  246. package/dist/lib/node-esm/chunk-ICQN3TDS.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-KICG37HX.mjs.map +0 -7
  248. package/dist/lib/node-esm/react-surface-AMVW4HZ7.mjs.map +0 -7
  249. package/dist/types/src/hooks/email.d.ts +0 -4
  250. package/dist/types/src/hooks/email.d.ts.map +0 -1
  251. package/src/hooks/email.ts +0 -49
  252. /package/dist/lib/browser/{chunk-EUMPBC4T.mjs.map → chunk-NFUHCW2J.mjs.map} +0 -0
  253. /package/dist/lib/browser/{settings-JTT62IHD.mjs.map → settings-U6UFQX32.mjs.map} +0 -0
  254. /package/dist/lib/node/{chunk-NV4TQQSU.cjs.map → chunk-XI2ARIEO.cjs.map} +0 -0
  255. /package/dist/lib/node/{settings-4YEO7KXF.cjs.map → settings-TXGRCYAL.cjs.map} +0 -0
  256. /package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs.map → chunk-PBZA7XJR.mjs.map} +0 -0
  257. /package/dist/lib/node-esm/{settings-S7P5RWQI.mjs.map → settings-DZU5PNXM.mjs.map} +0 -0
@@ -2,20 +2,23 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type FC, useCallback } from 'react';
5
+ import React, { useCallback, type FC } from 'react';
6
6
 
7
+ import { type AssociatedArtifact } from '@dxos/artifact';
7
8
  import { invariant } from '@dxos/invariant';
8
9
  import { log } from '@dxos/log';
9
10
  import { getSpace } from '@dxos/react-client/echo';
10
11
  import { type ThemedClassName } from '@dxos/react-ui';
11
12
 
12
13
  import { Thread, type ThreadProps } from './Thread';
13
- import { useChatProcessor, useMessageQueue } from '../../hooks';
14
+ import { useChatProcessor, useContextProvider, useMessageQueue } from '../../hooks';
14
15
  import { type AIChatType, type AssistantSettingsProps } from '../../types';
15
16
 
16
17
  export type ThreadContainerProps = {
17
18
  chat?: AIChatType;
18
19
  settings?: AssistantSettingsProps;
20
+ part?: 'deck' | 'dialog';
21
+ associatedArtifact?: AssociatedArtifact;
19
22
  } & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange'>;
20
23
 
21
24
  // TODO(burdon): Since this only wraps Thread, just separate out hook?
@@ -23,12 +26,14 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
23
26
  classNames,
24
27
  chat,
25
28
  settings,
29
+ part,
30
+ associatedArtifact,
26
31
  onOpenChange,
27
32
  ...props
28
33
  }) => {
29
- // Push up capabilities hooks out of components.
30
34
  const space = getSpace(chat);
31
- const processor = useChatProcessor(space, settings);
35
+ const contextProvider = useContextProvider(space);
36
+ const processor = useChatProcessor({ chat, space, settings, part, associatedArtifact });
32
37
  const messageQueue = useMessageQueue(chat);
33
38
  const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];
34
39
 
@@ -73,6 +78,7 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
73
78
  onCancel={handleCancel}
74
79
  onPrompt={handleSubmit}
75
80
  onOpenChange={onOpenChange}
81
+ contextProvider={contextProvider}
76
82
  {...props}
77
83
  />
78
84
  );
@@ -7,7 +7,7 @@ import React, { type PropsWithChildren, type FC } from 'react';
7
7
  import { type MessageContentBlock, type Message, type ToolType } from '@dxos/artifact';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { type Space } from '@dxos/react-client/echo';
10
- import { Button, ButtonGroup, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';
10
+ import { Button, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';
11
11
  import {
12
12
  MarkdownViewer,
13
13
  ToggleContainer as NativeToggleContainer,
@@ -21,7 +21,7 @@ import { ToolBlock, isToolMessage } from './ToolInvocations';
21
21
  import { ToolboxContainer } from '../Toolbox';
22
22
 
23
23
  const panelClassNames = 'flex flex-col w-full px-2 bg-groupSurface rounded-md';
24
- const userClassNames = 'bg-[--user-fill]';
24
+ const userClassNames = 'bg-[--user-fill] text-inverse';
25
25
 
26
26
  const ToggleContainer = (props: ToggleContainerProps) => {
27
27
  return <NativeToggleContainer {...props} classNames={mx(panelClassNames, props.classNames)} />;
@@ -54,7 +54,7 @@ export const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, messa
54
54
  // TODO(burdon): Restructure types to make check unnecessary.
55
55
  if (isToolMessage(message)) {
56
56
  return (
57
- <MessageContainer classNames={classNames}>
57
+ <MessageContainer classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}>
58
58
  <ToolBlock space={space} classNames={panelClassNames} message={message} tools={tools} />
59
59
  </MessageContainer>
60
60
  );
@@ -69,7 +69,11 @@ export const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, messa
69
69
  const Component = components[block.type] ?? components.default;
70
70
 
71
71
  return (
72
- <MessageContainer key={idx} classNames={classNames} user={block.type === 'text' && role === 'user'}>
72
+ <MessageContainer
73
+ key={idx}
74
+ classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}
75
+ user={block.type === 'text' && role === 'user'}
76
+ >
73
77
  <Component space={space} block={block} onPrompt={onPrompt} />
74
78
  </MessageContainer>
75
79
  );
@@ -87,7 +91,7 @@ const components: Record<string, BlockComponent> = {
87
91
  // const [open, setOpen] = useState(block.disposition === 'cot' && block.pending);
88
92
  const title = block.disposition ? titles[block.disposition] : undefined;
89
93
  if (!title) {
90
- return <MarkdownViewer content={block.text} />;
94
+ return <MarkdownViewer classNames='[&>p]:animate-[fadeIn_0.5s]' content={block.text} />;
91
95
  }
92
96
 
93
97
  // TOOD(burdon): Store last time user opened/closed COT.
@@ -140,13 +144,17 @@ const components: Record<string, BlockComponent> = {
140
144
  case 'select': {
141
145
  const { options = [] }: { options: string[] } = safeParseJson(block.json ?? '{}') ?? ({} as any);
142
146
  return (
143
- <ButtonGroup>
144
- {options.map((option) => (
145
- <Button key={option} onClick={() => onPrompt?.(option)}>
147
+ <div className='flex flex-wrap gap-1'>
148
+ {options.map((option, idx) => (
149
+ <Button
150
+ classNames={'animate-[fadeIn_0.5s] rounded-2xl text-sm'}
151
+ key={option}
152
+ onClick={() => onPrompt?.(option)}
153
+ >
146
154
  {option}
147
155
  </Button>
148
156
  ))}
149
- </ButtonGroup>
157
+ </div>
150
158
  );
151
159
  }
152
160
 
@@ -20,7 +20,7 @@ import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
20
20
  import { Toolbox, type ToolboxProps } from './Toolbox';
21
21
  import translations from '../../translations';
22
22
 
23
- const Render = (props: ToolboxProps) => {
23
+ const DefaultStory = (props: ToolboxProps) => {
24
24
  const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
25
25
  return (
26
26
  <Toolbox
@@ -34,7 +34,7 @@ const Render = (props: ToolboxProps) => {
34
34
  const meta: Meta<typeof Toolbox> = {
35
35
  title: 'plugins/plugin-automation/Toolbox',
36
36
  component: Toolbox,
37
- render: Render,
37
+ render: DefaultStory,
38
38
  decorators: [
39
39
  withSignals,
40
40
  withPluginManager({
@@ -6,7 +6,7 @@ import React, { useState, useEffect, Fragment, type FC } from 'react';
6
6
 
7
7
  import { Capabilities, useCapabilities } from '@dxos/app-framework';
8
8
  import { parseToolName, type ArtifactDefinition, type Tool } from '@dxos/artifact';
9
- import { FunctionType } from '@dxos/functions';
9
+ import { FunctionType } from '@dxos/functions/types';
10
10
  import { log } from '@dxos/log';
11
11
  import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
12
12
  import { type ThemedClassName } from '@dxos/react-ui';
@@ -10,6 +10,9 @@ export * from './TemplateEditor';
10
10
  export * from './Thread';
11
11
  export * from './Toolbox';
12
12
 
13
+ // TODO(burdon): Lazy loading causes issues with Tabster.
14
+ // Repro: open assistant dialog then close.
15
+ // https://github.com/microsoft/fluentui/issues/34020
13
16
  export const AssistantDialog = lazy(() => import('./AssistantDialog'));
14
17
  export const ChatContainer = lazy(() => import('./ChatContainer'));
15
18
  export const TemplateContainer = lazy(() => import('./TemplateContainer'));
@@ -9,3 +9,4 @@ export * from './useLocalTriggerManager';
9
9
  export * from './useMessageQueue';
10
10
  export * from './useServices';
11
11
  export * from './useTextInputEvents';
12
+ export * from './useContextProvider';
@@ -5,8 +5,8 @@
5
5
  import { sleep } from '@dxos/async';
6
6
  import { getObjectCore, ResultFormat } from '@dxos/echo-db';
7
7
  import { type AnyObjectData } from '@dxos/echo-schema';
8
- import { FunctionType } from '@dxos/functions';
9
- import { type FunctionTrigger } from '@dxos/functions';
8
+ import { FunctionType, getUserFunctionUrlInMetadata } from '@dxos/functions/types';
9
+ import { type FunctionTrigger } from '@dxos/functions/types';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { DXN, LOCAL_SPACE_TAG } from '@dxos/keys';
12
12
  import { log } from '@dxos/log';
@@ -53,7 +53,7 @@ export const invokeFunction = async (client: Client, space: Space, trigger: Func
53
53
  .query({ __typename: FunctionType.typename }, { format: ResultFormat.Plain })
54
54
  .run();
55
55
  const func = functions.find((fn) => referenceEquals(fn.source, trigger.function!)) as AnyObjectData | undefined;
56
- const funcSlug = func?.__meta.keys.find((key) => key.source === USERFUNCTIONS_META_KEY)?.id;
56
+ const funcSlug = func && getUserFunctionUrlInMetadata(func.__meta);
57
57
  if (!funcSlug) {
58
58
  log.warn('function not deployed', { scriptId: script.id, name: script.name });
59
59
  return 404;
@@ -72,8 +72,6 @@ export const invokeFunction = async (client: Client, space: Space, trigger: Func
72
72
  }
73
73
  };
74
74
 
75
- const USERFUNCTIONS_META_KEY = 'dxos.org/service/function';
76
-
77
75
  const getFunctionUrl = (config: Config, slug: string, spaceId?: string) => {
78
76
  const baseUrl = new URL('functions/', config.values.runtime?.services?.edge?.url);
79
77
 
@@ -5,17 +5,8 @@
5
5
  import { type Signal, batch, computed, signal } from '@preact/signals-core';
6
6
 
7
7
  import { type PromiseIntentDispatcher } from '@dxos/app-framework';
8
- import { type Tool, Message, type MessageContentBlock } from '@dxos/artifact';
9
- import {
10
- isToolUse,
11
- runTools,
12
- type GenerateRequest,
13
- type GenerationStream,
14
- MixedStreamParser,
15
- DEFAULT_LLM_MODEL,
16
- type AIServiceClient,
17
- } from '@dxos/assistant';
18
- import { createStatic } from '@dxos/echo-schema';
8
+ import { type ArtifactDefinition, type Message, type MessageContentBlock, type Tool } from '@dxos/artifact';
9
+ import { type AIServiceClient, AISession, DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';
19
10
  import { invariant } from '@dxos/invariant';
20
11
  import { log } from '@dxos/log';
21
12
  import { type Space } from '@dxos/react-client/echo';
@@ -36,7 +27,7 @@ type RequestOptions = {
36
27
  export type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;
37
28
 
38
29
  const defaultOptions: ChatProcessorOptions = {
39
- model: DEFAULT_LLM_MODEL,
30
+ model: DEFAULT_EDGE_MODEL,
40
31
  systemPrompt: 'you are a helpful assistant',
41
32
  };
42
33
 
@@ -47,20 +38,14 @@ const defaultOptions: ChatProcessorOptions = {
47
38
  * Supports cancellation of in-progress requests.
48
39
  */
49
40
  export class ChatProcessor {
50
- /** SSE stream parser. */
51
- private readonly _parser = new MixedStreamParser();
52
-
53
- /** Current streaming response. */
54
- private _stream: GenerationStream | undefined;
55
-
56
41
  /** Pending messages (incl. the current user request). */
57
42
  private readonly _pending: Signal<Message[]> = signal([]);
58
43
 
59
44
  /** Current streaming block (from the AI service). */
60
45
  private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);
61
46
 
62
- /** Prior history from queue. */
63
- private _history: Message[] = [];
47
+ /** Current streaming response. */
48
+ private _session: AISession | undefined;
64
49
 
65
50
  /**
66
51
  * Streaming state.
@@ -94,24 +79,10 @@ export class ChatProcessor {
94
79
  constructor(
95
80
  private readonly _ai: AIServiceClient,
96
81
  private _tools?: Tool[],
82
+ private _artifacts?: ArtifactDefinition[],
97
83
  private readonly _extensions?: ToolContextExtensions,
98
84
  private readonly _options: ChatProcessorOptions = defaultOptions,
99
- ) {
100
- // Message complete.
101
- this._parser.message.on((message) => {
102
- batch(() => {
103
- this._pending.value = [...this._pending.value, message];
104
- this._block.value = undefined;
105
- });
106
- });
107
-
108
- // Streaming update (happens before message complete).
109
- this._parser.update.on((block) => {
110
- batch(() => {
111
- this._block.value = block;
112
- });
113
- });
114
- }
85
+ ) {}
115
86
 
116
87
  get tools() {
117
88
  return this._tools;
@@ -128,19 +99,55 @@ export class ChatProcessor {
128
99
  * Make GPT request.
129
100
  */
130
101
  async request(message: string, options: RequestOptions = {}): Promise<Message[]> {
131
- batch(() => {
132
- this._history = options.history ?? [];
133
- this._pending.value = [
134
- createStatic(Message, {
135
- role: 'user',
136
- content: [{ type: 'text', text: message }],
137
- }),
138
- ];
139
- this._block.value = undefined;
102
+ this._session = new AISession({ operationModel: 'immediate' });
103
+
104
+ // Message complete.
105
+ this._session.message.on((message) => {
106
+ batch(() => {
107
+ this._pending.value = [...this._pending.value, message];
108
+ this._block.value = undefined;
109
+ });
140
110
  });
141
111
 
142
- await this._request();
143
- options.onComplete?.(this._pending.value);
112
+ // Streaming update (happens before message complete).
113
+ this._session.update.on((block) => {
114
+ batch(() => {
115
+ this._block.value = block;
116
+ });
117
+ });
118
+
119
+ this._session.userMessage.on((message) => {
120
+ this._pending.value = [...this._pending.value, message];
121
+ });
122
+
123
+ try {
124
+ const messages = await this._session.run({
125
+ client: this._ai,
126
+ history: options.history ?? [],
127
+ artifacts: this._artifacts ?? [],
128
+ tools: this._tools ?? [],
129
+ prompt: message,
130
+ systemPrompt: this._options.systemPrompt,
131
+ extensions: this._extensions,
132
+ generationOptions: {
133
+ model: this._options.model,
134
+ },
135
+ });
136
+
137
+ log.info('completed', { messages });
138
+
139
+ options.onComplete?.(this._pending.value);
140
+ } catch (err) {
141
+ log.catch(err);
142
+ if (err instanceof Error && err.message.includes('Overloaded')) {
143
+ this.error.value = new AIServiceOverloadedError('AI service overloaded', { cause: err });
144
+ } else {
145
+ this.error.value = new Error('AI service error', { cause: err });
146
+ }
147
+ } finally {
148
+ this._session = undefined;
149
+ }
150
+
144
151
  return this._reset();
145
152
  }
146
153
 
@@ -150,79 +157,22 @@ export class ChatProcessor {
150
157
  */
151
158
  async cancel(): Promise<Message[]> {
152
159
  log.info('cancelling...');
153
- this._stream?.abort();
160
+ this._session?.abort();
154
161
  return this._reset();
155
162
  }
156
163
 
157
164
  private async _reset(): Promise<Message[]> {
158
165
  const messages = this._pending.value;
159
166
  batch(() => {
160
- this._history = [];
161
167
  this._pending.value = [];
162
168
  this._block.value = undefined;
163
169
  });
164
170
 
165
171
  return messages;
166
172
  }
173
+ }
167
174
 
168
- /**
169
- * Generate a response from the AI service.
170
- * Iterates over tool requests.
171
- */
172
- private async _request() {
173
- try {
174
- let more = false;
175
- do {
176
- log('request', {
177
- pending: this._pending.value.length,
178
- history: this._history.length,
179
- tools: this._tools?.map((tool) => tool.name),
180
- });
181
-
182
- // Open request stream.
183
- this._stream = await this._ai.exec({
184
- ...this._options,
185
- // TODO(burdon): Rename messages or separate history/message.
186
- history: [...this._history, ...this._pending.value],
187
- tools: this._tools,
188
- });
189
-
190
- // Wait until complete.
191
- await this._parser.parse(this._stream);
192
- await this._stream.complete();
193
-
194
- // Add messages.
195
- log('response', { pending: this._pending.value });
196
-
197
- // Resolve tool use locally.
198
- more = false;
199
- const message = this._pending.value.at(-1);
200
- invariant(message);
201
- if (isToolUse(message)) {
202
- log('tool request...');
203
- const response = await runTools({
204
- message: this._pending.value.at(-1)!,
205
- tools: this._tools ?? [],
206
- extensions: this._extensions,
207
- });
208
-
209
- log('tool response', { response });
210
- switch (response.type) {
211
- case 'continue': {
212
- this._pending.value = [...this._pending.value, response.message];
213
- more = true;
214
- break;
215
- }
216
- }
217
- }
218
- } while (more);
219
-
220
- this.error.value = undefined;
221
- } catch (err) {
222
- log.catch(err);
223
- this.error.value = new Error('AI service error', { cause: err });
224
- } finally {
225
- this._stream = undefined;
226
- }
227
- }
175
+ // TODO(wittjosiah): Move to ai-service-client.
176
+ export class AIServiceOverloadedError extends Error {
177
+ code = 'AI_SERVICE_OVERLOADED';
228
178
  }
@@ -5,23 +5,37 @@
5
5
  import { useEffect, useMemo, useState } from 'react';
6
6
 
7
7
  import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';
8
- import { createSystemPrompt, type Tool } from '@dxos/artifact';
9
- import { DEFAULT_LLM_MODEL } from '@dxos/assistant';
10
- import { FunctionType } from '@dxos/functions';
8
+ import { type AssociatedArtifact, createSystemPrompt, type Tool } from '@dxos/artifact';
9
+ import { DEFAULT_EDGE_MODEL, DEFAULT_OLLAMA_MODEL } from '@dxos/assistant';
10
+ import { FunctionType } from '@dxos/functions/types';
11
11
  import { log } from '@dxos/log';
12
12
  import { useConfig } from '@dxos/react-client';
13
- import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
13
+ import { Filter, fullyQualifiedId, type Space, useQuery } from '@dxos/react-client/echo';
14
14
  import { isNonNullable } from '@dxos/util';
15
15
 
16
16
  import { AssistantCapabilities } from '../capabilities';
17
- import { ChatProcessor } from '../hooks';
17
+ import { ChatProcessor, type ChatProcessorOptions } from '../hooks';
18
18
  import { covertFunctionToTool, createToolsFromService } from '../tools';
19
- import { type AssistantSettingsProps, ServiceType } from '../types';
19
+ import { type AIChatType, type AssistantSettingsProps, ServiceType } from '../types';
20
+
21
+ type UseChatProcessorProps = {
22
+ chat?: AIChatType;
23
+ space?: Space;
24
+ settings?: AssistantSettingsProps;
25
+ part?: 'deck' | 'dialog';
26
+ associatedArtifact?: AssociatedArtifact;
27
+ };
20
28
 
21
29
  /**
22
30
  * Configure and create ChatProcessor.
23
31
  */
24
- export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProps): ChatProcessor => {
32
+ export const useChatProcessor = ({
33
+ chat,
34
+ space,
35
+ settings,
36
+ part = 'deck',
37
+ associatedArtifact,
38
+ }: UseChatProcessorProps): ChatProcessor => {
25
39
  const aiClient = useCapability(AssistantCapabilities.AiClient);
26
40
  const globalTools = useCapabilities(Capabilities.Tools);
27
41
  const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
@@ -41,40 +55,42 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
41
55
  // Tools and context.
42
56
  const config = useConfig();
43
57
  const functions = useQuery(space, Filter.schema(FunctionType));
58
+ const chatId = useMemo(() => (chat ? fullyQualifiedId(chat) : undefined), [chat]);
44
59
  const [tools, extensions] = useMemo(() => {
45
60
  log('creating tools...');
46
61
  const tools = [
47
62
  ...globalTools.flat(),
48
- ...artifactDefinitions.flatMap((definition) => definition.tools),
49
63
  ...serviceTools,
50
64
  ...functions
51
65
  .map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))
52
66
  .filter(isNonNullable),
53
67
  ];
54
- const extensions = { space, dispatch };
68
+ const extensions = { space, dispatch, pivotId: chatId, part };
55
69
  return [tools, extensions];
56
- }, [dispatch, globalTools, artifactDefinitions, space, serviceTools, functions]);
70
+ }, [dispatch, globalTools, space, chatId, serviceTools, functions]);
57
71
 
58
72
  // Prompt.
59
73
  const systemPrompt = useMemo(
60
74
  () =>
61
75
  createSystemPrompt({
62
- artifacts: artifactDefinitions.map((definition) => definition.instructions),
76
+ artifacts: artifactDefinitions.map((definition) => `${definition.name}\n${definition.instructions}`),
77
+ associatedArtifact,
63
78
  }),
64
- [artifactDefinitions],
79
+ [artifactDefinitions, associatedArtifact],
65
80
  );
66
81
 
82
+ // TODO(burdon): Remove default (let backend decide if not specified).
83
+ const model: ChatProcessorOptions['model'] =
84
+ settings?.llmProvider === 'ollama'
85
+ ? ((settings?.ollamaModel ?? DEFAULT_OLLAMA_MODEL) as ChatProcessorOptions['model'])
86
+ : ((settings?.edgeModel ?? DEFAULT_EDGE_MODEL) as ChatProcessorOptions['model']);
87
+
67
88
  // Create processor.
68
- // TODO(burdon): Updated on each query update above. Should just update current processor.
89
+ // TODO(burdon): Updated on each query update above; should just update current processor.
69
90
  const processor = useMemo(() => {
70
91
  log('creating processor...', { settings });
71
- return new ChatProcessor(aiClient, tools, extensions, {
72
- // TODO(burdon): Remove defualt (let backend decide if not specified).
73
- model: settings?.llmModel ?? DEFAULT_LLM_MODEL,
74
- // TOOD(burdon): Query.
75
- systemPrompt,
76
- });
77
- }, [aiClient, tools, extensions, systemPrompt, settings?.llmModel]);
92
+ return new ChatProcessor(aiClient.value, tools, artifactDefinitions, extensions, { model, systemPrompt });
93
+ }, [aiClient.value, tools, extensions, model, systemPrompt]);
78
94
 
79
95
  return processor;
80
96
  };
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useMemo } from 'react';
6
+
7
+ import { Capabilities, useCapabilities } from '@dxos/app-framework';
8
+ import type { Space } from '@dxos/client/echo';
9
+ import { getDXN, getLabel, getSchema } from '@dxos/echo-schema';
10
+ import { log } from '@dxos/log';
11
+ import { Filter } from '@dxos/react-client/echo';
12
+
13
+ export type ContextProvider = {
14
+ query: (params: { query: string }) => Promise<Array<{ uri: string; label: string }>>;
15
+ resolveMetadata: (params: { uri: string }) => Promise<{ uri: string; label: string }>;
16
+ };
17
+
18
+ const stringMatch = (query: string, label: string) => label.toLowerCase().startsWith(query.toLowerCase());
19
+
20
+ export const useContextProvider = (space?: Space): ContextProvider | undefined => {
21
+ const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
22
+
23
+ return useMemo<ContextProvider | undefined>((): ContextProvider | undefined => {
24
+ if (!space) {
25
+ return undefined;
26
+ }
27
+
28
+ return {
29
+ query: async ({ query }) => {
30
+ const artifactSchemas = artifactDefinitions.map((artifact) => artifact.schema);
31
+ const { objects } = await space.db
32
+ .query(Filter.or(...artifactSchemas.map((schema) => Filter.schema(schema))))
33
+ .run();
34
+ return objects
35
+ .map((object) => {
36
+ log.info('object', { object, label: getLabel(getSchema(object)!, object) });
37
+ return object;
38
+ })
39
+ .filter((object) => stringMatch(query, getLabel(getSchema(object)!, object) ?? ''))
40
+ .filter((object) => !!getDXN(object))
41
+ .map((object) => ({
42
+ uri: getDXN(object)!.toString(),
43
+ label: getLabel(getSchema(object)!, object) ?? '',
44
+ }));
45
+ },
46
+ resolveMetadata: async ({ uri }) => {
47
+ const object = await space.db.query({ id: uri }).first();
48
+ return {
49
+ uri,
50
+ label: getLabel(getSchema(object)!, object) ?? '',
51
+ };
52
+ },
53
+ };
54
+ }, [space, artifactDefinitions]);
55
+ };
@@ -7,7 +7,7 @@ import { useEffect, useState } from 'react';
7
7
  import { Mutex } from '@dxos/async';
8
8
  import { Context } from '@dxos/context';
9
9
  import { createSubscriptionTrigger, type TriggerFactory } from '@dxos/functions';
10
- import { FunctionTrigger } from '@dxos/functions';
10
+ import { FunctionTrigger } from '@dxos/functions/types';
11
11
  import { invariant } from '@dxos/invariant';
12
12
  import { log } from '@dxos/log';
13
13
  import { useClient } from '@dxos/react-client';
@@ -6,18 +6,16 @@ import { useMemo } from 'react';
6
6
 
7
7
  import { type Message } from '@dxos/artifact';
8
8
  import { DXN, QueueSubspaceTags } from '@dxos/keys';
9
- import { getSpace } from '@dxos/react-client/echo';
10
- import { useEdgeClient, useQueue } from '@dxos/react-edge-client';
9
+ import { getSpace, useQueue } from '@dxos/react-client/echo';
11
10
 
12
11
  import { type AIChatType } from '../types';
13
12
 
14
13
  export const useMessageQueue = (chat?: AIChatType) => {
15
14
  const space = getSpace(chat);
16
15
  const queueDxn = useMemo(() => {
17
- const dxn = space && chat?.queue.dxn;
16
+ const dxn = space && chat?.assistantChatQueue.dxn;
18
17
  return dxn ? new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space.id, dxn.parts.at(-1)!]) : undefined;
19
- }, [space, chat?.queue.dxn]);
18
+ }, [space, chat?.assistantChatQueue.dxn]);
20
19
 
21
- const edgeClient = useEdgeClient();
22
- return useQueue<Message>(edgeClient, queueDxn);
20
+ return useQueue<Message>(queueDxn);
23
21
  };
package/src/meta.ts CHANGED
@@ -8,11 +8,11 @@ export const ASSISTANT_PLUGIN = 'dxos.org/plugin/assistant';
8
8
 
9
9
  export const ASSISTANT_DIALOG = `${ASSISTANT_PLUGIN}/assistant/dialog`;
10
10
 
11
- export const meta = {
11
+ export const meta: PluginMeta = {
12
12
  id: ASSISTANT_PLUGIN,
13
13
  name: 'Assistant',
14
14
  description: 'The Assistant tab allows you to chat with your spaces inside of Composer.',
15
15
  icon: 'ph--atom--regular',
16
16
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-assistant',
17
17
  tags: ['experimental'],
18
- } satisfies PluginMeta;
18
+ };
@@ -3,9 +3,9 @@
3
3
  //
4
4
 
5
5
  import { createSystemPrompt } from '@dxos/artifact';
6
- import { DEFAULT_LLM_MODEL, type GenerateRequest } from '@dxos/assistant';
6
+ import { DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';
7
7
 
8
8
  export const createProcessorOptions = (artifacts: string[]): Pick<GenerateRequest, 'model' | 'systemPrompt'> => ({
9
- model: DEFAULT_LLM_MODEL,
9
+ model: DEFAULT_EDGE_MODEL,
10
10
  systemPrompt: createSystemPrompt({ artifacts }),
11
11
  });
@@ -5,8 +5,8 @@
5
5
  import { defineTool, ToolResult } from '@dxos/artifact';
6
6
  import type { Tool } from '@dxos/artifact';
7
7
  import { toEffectSchema } from '@dxos/echo-schema';
8
- import { getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions';
9
- import type { FunctionType } from '@dxos/functions';
8
+ import { getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions/types';
9
+ import type { FunctionType } from '@dxos/functions/types';
10
10
  import { log } from '@dxos/log';
11
11
  import type { SpaceId } from '@dxos/react-client/echo';
12
12
  import { getMeta } from '@dxos/react-client/echo';