@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,14 +2,21 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';
5
+ import {
6
+ allOf,
7
+ Capabilities,
8
+ contributes,
9
+ createIntent,
10
+ defineModule,
11
+ definePlugin,
12
+ Events,
13
+ } from '@dxos/app-framework';
6
14
  import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
7
- import { DeckCapabilities, DeckEvents } from '@dxos/plugin-deck';
8
15
  import { SpaceCapabilities } from '@dxos/plugin-space';
9
16
  import { defineObjectForm } from '@dxos/plugin-space/types';
10
17
 
11
18
  import { AiClient, AppGraphBuilder, IntentResolver, ReactSurface, AssistantSettings } from './capabilities';
12
- import { ASSISTANT_PLUGIN, meta } from './meta';
19
+ import { meta } from './meta';
13
20
  import translations from './translations';
14
21
  import { AssistantAction, AIChatType, ServiceType, TemplateType } from './types';
15
22
 
@@ -32,14 +39,12 @@ export const AssistantPlugin = () =>
32
39
  contributes(Capabilities.Metadata, {
33
40
  id: TemplateType.typename,
34
41
  metadata: {
35
- placeholder: ['template title placeholder', { ns: ASSISTANT_PLUGIN }],
36
42
  icon: 'ph--code-block--regular',
37
43
  },
38
44
  }),
39
45
  contributes(Capabilities.Metadata, {
40
46
  id: AIChatType.typename,
41
47
  metadata: {
42
- placeholder: ['chat title placeholder', { ns: ASSISTANT_PLUGIN }],
43
48
  icon: 'ph--atom--regular',
44
49
  },
45
50
  }),
@@ -60,6 +65,7 @@ export const AssistantPlugin = () =>
60
65
  SpaceCapabilities.ObjectForm,
61
66
  defineObjectForm({
62
67
  objectSchema: TemplateType,
68
+ hidden: true,
63
69
  getIntent: () => createIntent(AssistantAction.CreateTemplate),
64
70
  }),
65
71
  ),
@@ -70,23 +76,6 @@ export const AssistantPlugin = () =>
70
76
  activatesOn: ClientEvents.SetupSchema,
71
77
  activate: () => contributes(ClientCapabilities.Schema, [ServiceType, TemplateType]),
72
78
  }),
73
- defineModule({
74
- id: `${meta.id}/module/complementary-panels`,
75
- activatesOn: DeckEvents.SetupComplementaryPanels,
76
- activate: () =>
77
- contributes(DeckCapabilities.ComplementaryPanel, {
78
- id: 'service-registry',
79
- label: ['service registry label', { ns: ASSISTANT_PLUGIN }],
80
- icon: 'ph--plugs--regular',
81
- }),
82
- }),
83
- defineModule({
84
- id: `${meta.id}/module/react-surface`,
85
- activatesOn: Events.SetupReactSurface,
86
- // TODO(wittjosiah): Should occur before the chat is loaded when surfaces activation is more granular.
87
- activatesBefore: [Events.SetupArtifactDefinition],
88
- activate: ReactSurface,
89
- }),
90
79
  defineModule({
91
80
  id: `${meta.id}/module/app-graph-builder`,
92
81
  activatesOn: Events.SetupAppGraph,
@@ -97,9 +86,16 @@ export const AssistantPlugin = () =>
97
86
  activatesOn: Events.SetupIntentResolver,
98
87
  activate: IntentResolver,
99
88
  }),
89
+ defineModule({
90
+ id: `${meta.id}/module/react-surface`,
91
+ activatesOn: Events.SetupReactSurface,
92
+ // TODO(wittjosiah): Should occur before the chat is loaded when surfaces activation is more granular.
93
+ activatesBefore: [Events.SetupArtifactDefinition],
94
+ activate: ReactSurface,
95
+ }),
100
96
  defineModule({
101
97
  id: `${meta.id}/module/ai-client`,
102
- activatesOn: ClientEvents.ClientReady,
98
+ activatesOn: allOf(ClientEvents.ClientReady, Events.SettingsReady),
103
99
  activate: AiClient,
104
100
  }),
105
101
  ]);
@@ -2,12 +2,15 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { contributes, type PluginsContext } from '@dxos/app-framework';
6
- import { AIServiceEdgeClient } from '@dxos/assistant';
7
- import { log } from '@dxos/log';
5
+ import { effect, signal } from '@preact/signals-core';
6
+
7
+ import { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';
8
+ import { type AIServiceClient, AIServiceEdgeClient, OllamaClient } from '@dxos/assistant';
8
9
  import { ClientCapabilities } from '@dxos/plugin-client';
9
10
 
10
11
  import { AssistantCapabilities } from './capabilities';
12
+ import { ASSISTANT_PLUGIN } from '../meta';
13
+ import { type AssistantSettingsProps } from '../types';
11
14
 
12
15
  // TODO(wittjosiah): Factor out.
13
16
  const DEFAULT_AI_SERVICE_URL = 'http://localhost:8788';
@@ -15,8 +18,21 @@ const DEFAULT_AI_SERVICE_URL = 'http://localhost:8788';
15
18
  export default (context: PluginsContext) => {
16
19
  const client = context.requestCapability(ClientCapabilities.Client);
17
20
  const endpoint = client.config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL;
18
- // TODO(burdon): Use prefs.
19
- const ai = new AIServiceEdgeClient({ endpoint });
20
- log.info('ai', { endpoint, context });
21
- return contributes(AssistantCapabilities.AiClient, ai);
21
+
22
+ const ai = signal<AIServiceClient>(new AIServiceEdgeClient({ endpoint }));
23
+
24
+ const unsubscribe = effect(() => {
25
+ // TODO(burdon): Could be undefined.
26
+ const settings = context
27
+ .requestCapability(Capabilities.SettingsStore)
28
+ .getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;
29
+
30
+ if (settings?.llmProvider === 'ollama') {
31
+ ai.value = new OllamaClient();
32
+ } else {
33
+ ai.value = new AIServiceEdgeClient({ endpoint });
34
+ }
35
+ });
36
+
37
+ return contributes(AssistantCapabilities.AiClient, ai, () => unsubscribe());
22
38
  };
@@ -11,14 +11,23 @@ import {
11
11
  type PluginsContext,
12
12
  } from '@dxos/app-framework';
13
13
  import { invariant } from '@dxos/invariant';
14
- import { log } from '@dxos/log';
15
14
  import { ClientCapabilities } from '@dxos/plugin-client';
15
+ import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
16
16
  import { createExtension, type Node, ROOT_ID } from '@dxos/plugin-graph';
17
+ import { memoizeQuery } from '@dxos/plugin-space';
17
18
  import { SpaceAction } from '@dxos/plugin-space/types';
18
- import { type Space, Filter, getSpace } from '@dxos/react-client/echo';
19
+ import {
20
+ type Space,
21
+ Filter,
22
+ fullyQualifiedId,
23
+ getSpace,
24
+ isSpace,
25
+ isReactiveObject,
26
+ parseId,
27
+ } from '@dxos/react-client/echo';
19
28
 
20
29
  import { ASSISTANT_DIALOG, ASSISTANT_PLUGIN } from '../meta';
21
- import { AIChatType, AssistantAction } from '../types';
30
+ import { AIChatType, AssistantAction, TemplateType } from '../types';
22
31
 
23
32
  export default (context: PluginsContext) =>
24
33
  contributes(Capabilities.AppGraphBuilder, [
@@ -51,7 +60,6 @@ export default (context: PluginsContext) =>
51
60
  }
52
61
 
53
62
  if (!chat) {
54
- log.warn('no chat found');
55
63
  return;
56
64
  }
57
65
 
@@ -71,7 +79,7 @@ export default (context: PluginsContext) =>
71
79
  },
72
80
  properties: {
73
81
  label: ['open assistant label', { ns: ASSISTANT_PLUGIN }],
74
- icon: 'ph--chat-centered-text--regular',
82
+ icon: 'ph--star-four--regular',
75
83
  disposition: 'pin-end',
76
84
  position: 'hoist',
77
85
  keyBinding: {
@@ -82,6 +90,93 @@ export default (context: PluginsContext) =>
82
90
  },
83
91
  ],
84
92
  }),
93
+
94
+ createExtension({
95
+ id: `${ASSISTANT_PLUGIN}/service-registry`,
96
+ filter: (node): node is Node<null> => node.id === 'root',
97
+ connector: ({ node }) => {
98
+ const layout = context.requestCapability(Capabilities.Layout);
99
+ const client = context.requestCapability(ClientCapabilities.Client);
100
+ const { spaceId } = parseId(layout.workspace);
101
+ const space = spaceId ? client.spaces.get(spaceId) : null;
102
+
103
+ return [
104
+ {
105
+ id: [node.id, 'service-registry'].join(ATTENDABLE_PATH_SEPARATOR),
106
+ type: DECK_COMPANION_TYPE,
107
+ data: space,
108
+ properties: {
109
+ label: ['service registry label', { ns: ASSISTANT_PLUGIN }],
110
+ icon: 'ph--plugs--regular',
111
+ disposition: 'hidden',
112
+ },
113
+ },
114
+ ];
115
+ },
116
+ }),
117
+
118
+ createExtension({
119
+ id: `${ASSISTANT_PLUGIN}/object-chat-companion`,
120
+ filter: (node): node is Node<AIChatType> =>
121
+ isReactiveObject(node.data) && node.data.assistantChatQueue && node.data.type !== AIChatType.typename,
122
+ connector: ({ node }) => [
123
+ {
124
+ id: [node.id, 'assistant-chat'].join(ATTENDABLE_PATH_SEPARATOR),
125
+ type: PLANK_COMPANION_TYPE,
126
+ data: 'assistant-chat',
127
+ properties: {
128
+ label: ['assistant chat label', { ns: ASSISTANT_PLUGIN }],
129
+ icon: 'ph--star-four--regular',
130
+ position: 'hoist',
131
+ },
132
+ },
133
+ ],
134
+ }),
135
+
136
+ createExtension({
137
+ id: `${ASSISTANT_PLUGIN}/root`,
138
+ filter: (node): node is Node<Space> => isSpace(node.data),
139
+ connector: ({ node }) => {
140
+ const templates = memoizeQuery(node.data, Filter.schema(TemplateType));
141
+ return templates.length > 0
142
+ ? [
143
+ {
144
+ id: `${ASSISTANT_PLUGIN}/templates`,
145
+ type: `${ASSISTANT_PLUGIN}/templates`,
146
+ data: null,
147
+ properties: {
148
+ label: ['templates label', { ns: ASSISTANT_PLUGIN }],
149
+ icon: 'ph--file-code--regular',
150
+ space: node.data,
151
+ },
152
+ },
153
+ ]
154
+ : [];
155
+ },
156
+ }),
157
+
158
+ createExtension({
159
+ id: `${ASSISTANT_PLUGIN}/templates`,
160
+ filter: (node): node is Node<null, { space: Space }> => node.id === `${ASSISTANT_PLUGIN}/templates`,
161
+ connector: ({ node }) => {
162
+ const templates = memoizeQuery(node.properties.space, Filter.schema(TemplateType));
163
+ return templates
164
+ .toSorted((a, b) => {
165
+ const nameA = a.name ?? '';
166
+ const nameB = b.name ?? '';
167
+ return nameA.localeCompare(nameB);
168
+ })
169
+ .map((template) => ({
170
+ id: fullyQualifiedId(template),
171
+ type: `${ASSISTANT_PLUGIN}/template`,
172
+ data: template,
173
+ properties: {
174
+ label: template.name ?? ['template title placeholder', { ns: ASSISTANT_PLUGIN }],
175
+ icon: 'ph--file-code--regular',
176
+ },
177
+ }));
178
+ },
179
+ }),
85
180
  ]);
86
181
 
87
182
  // TODO(burdon): Factor out.
@@ -2,11 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { type ReadonlySignal } from '@preact/signals-core';
6
+
5
7
  import { defineCapability } from '@dxos/app-framework';
6
8
  import { type AIServiceClient } from '@dxos/assistant';
7
9
 
8
10
  import { ASSISTANT_PLUGIN } from '../meta';
9
11
 
10
12
  export namespace AssistantCapabilities {
11
- export const AiClient = defineCapability<AIServiceClient>(`${ASSISTANT_PLUGIN}/capability/ai-client`);
13
+ export const AiClient = defineCapability<ReadonlySignal<AIServiceClient>>(`${ASSISTANT_PLUGIN}/capability/ai-client`);
12
14
  }
@@ -17,8 +17,9 @@ export default () => [
17
17
  resolve: ({ spaceId, name }) => ({
18
18
  data: {
19
19
  object: create(AIChatType, {
20
- name,
21
- queue: refFromDXN(new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId, ObjectId.random()])),
20
+ assistantChatQueue: refFromDXN(
21
+ new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId, ObjectId.random()]),
22
+ ),
22
23
  }),
23
24
  },
24
25
  }),
@@ -30,7 +31,7 @@ export default () => [
30
31
  intent: AssistantAction.CreateTemplate,
31
32
  resolve: ({ name }) => ({
32
33
  data: {
33
- object: create(TemplateType, { name, source: '{{! Template }}' }),
34
+ object: create(TemplateType, { name, kind: { include: 'manual' }, source: '{{! Template }}' }),
34
35
  },
35
36
  }),
36
37
  }),
@@ -2,11 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useMemo } from 'react';
6
6
 
7
7
  import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
+ import { isInstanceOf } from '@dxos/echo-schema';
9
+ import { getTypename } from '@dxos/live-object';
8
10
  import { SettingsStore } from '@dxos/local-storage';
9
- import { getSpace, isSpace } from '@dxos/react-client/echo';
11
+ import { fullyQualifiedId, isReactiveObject, isSpace, type Space } from '@dxos/react-client/echo';
10
12
 
11
13
  import { AssistantDialog, AssistantSettings, ChatContainer, ServiceRegistry, TemplateContainer } from '../components';
12
14
  import { ASSISTANT_PLUGIN, ASSISTANT_DIALOG } from '../meta';
@@ -15,7 +17,7 @@ import { AIChatType, type AssistantSettingsProps, TemplateType } from '../types'
15
17
  export default () =>
16
18
  contributes(Capabilities.ReactSurface, [
17
19
  createSurface({
18
- id: `${ASSISTANT_PLUGIN}/settings`,
20
+ id: `${ASSISTANT_PLUGIN}/plugin-settings`,
19
21
  role: 'article',
20
22
  filter: (data): data is { subject: SettingsStore<AssistantSettingsProps> } =>
21
23
  data.subject instanceof SettingsStore && data.subject.prefix === ASSISTANT_PLUGIN,
@@ -30,20 +32,36 @@ export default () =>
30
32
  createSurface({
31
33
  id: `${ASSISTANT_PLUGIN}/chat`,
32
34
  role: 'article',
33
- filter: (data): data is { subject: AIChatType } => data.subject instanceof AIChatType,
35
+ filter: (data): data is { subject: AIChatType; variant: undefined } =>
36
+ isInstanceOf(AIChatType, data.subject) && data.variant !== 'assistant-chat',
34
37
  component: ({ data, role }) => <ChatContainer role={role} chat={data.subject} />,
35
38
  }),
39
+ createSurface({
40
+ id: `${ASSISTANT_PLUGIN}/object-chat`,
41
+ role: 'article',
42
+ filter: (data): data is { companionTo: AIChatType; subject: 'assistant-chat' } =>
43
+ isReactiveObject(data.companionTo) && data.companionTo.assistantChatQueue && data.subject === 'assistant-chat',
44
+ component: ({ data, role }) => {
45
+ const associatedArtifact = useMemo(
46
+ () => ({
47
+ id: fullyQualifiedId(data.companionTo),
48
+ typename: getTypename(data.companionTo) ?? 'unknown',
49
+ }),
50
+ [data.companionTo],
51
+ );
52
+ return <ChatContainer role={role} chat={data.companionTo} associatedArtifact={associatedArtifact} />;
53
+ },
54
+ }),
36
55
  createSurface({
37
56
  id: `${ASSISTANT_PLUGIN}/template`,
38
57
  role: 'article',
39
- filter: (data): data is { subject: TemplateType } => data.subject instanceof TemplateType,
58
+ filter: (data): data is { subject: TemplateType } => isInstanceOf(TemplateType, data.subject),
40
59
  component: ({ data, role }) => <TemplateContainer role={role} template={data.subject} />,
41
60
  }),
42
61
  createSurface({
43
62
  id: `${ASSISTANT_PLUGIN}/service-registry`,
44
- role: 'complementary--service-registry',
45
- component: ({ data }) => (
46
- <ServiceRegistry space={isSpace(data.subject) ? data.subject : getSpace(data.subject)!} />
47
- ),
63
+ role: 'deck-companion--service-registry',
64
+ filter: (data): data is { subject: Space } => isSpace(data.subject),
65
+ component: ({ data }) => <ServiceRegistry space={data.subject} />,
48
66
  }),
49
67
  ]);
@@ -65,7 +65,9 @@ const meta: Meta<typeof AmbientDialog> = {
65
65
  createIdentity: true,
66
66
  createSpace: true,
67
67
  }),
68
- withPluginManager({ plugins: [IntentPlugin()] }),
68
+ withPluginManager({
69
+ plugins: [IntentPlugin()],
70
+ }),
69
71
  withTheme,
70
72
  withLayout({ fullscreen: true, tooltips: true }),
71
73
  ],
@@ -12,21 +12,21 @@ const preventDefault = (event: Event) => event.preventDefault();
12
12
 
13
13
  const minSize = 5;
14
14
 
15
- // TODO(burdon): Factor out.
16
- export const AmbientDialog = ({
17
- children,
18
- open: _open,
19
- title,
20
- onOpenChange,
21
- }: PropsWithChildren<{ open?: boolean; onOpenChange?: (open: boolean) => void; title?: string }>) => {
15
+ export type AmbientDialogProps = PropsWithChildren<{
16
+ open?: boolean;
17
+ title?: string;
18
+ onOpenChange?: (open: boolean) => void;
19
+ }>;
20
+
21
+ export const AmbientDialog = ({ children, open: controlledOpen, title, onOpenChange }: AmbientDialogProps) => {
22
22
  const [resizeKey, setReizeKey] = useState(0);
23
23
  const [size, setSize] = useState<Size>('min-content');
24
- const [open, setOpen] = useState(_open);
24
+ const [open, setOpen] = useState(controlledOpen);
25
25
 
26
26
  // Update controlled value.
27
27
  useEffect(() => {
28
- setOpen(_open);
29
- }, [_open]);
28
+ setOpen(controlledOpen);
29
+ }, [controlledOpen]);
30
30
 
31
31
  // Update size and key.
32
32
  useEffect(() => {
@@ -52,7 +52,7 @@ export const AmbientDialog = ({
52
52
  {...resizeAttributes}
53
53
  style={{
54
54
  ...sizeStyle(size, 'vertical', true),
55
- maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 8rem)',
55
+ maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 9rem)',
56
56
  }}
57
57
  onInteractOutside={preventDefault}
58
58
  >
@@ -15,7 +15,7 @@ import { type AssistantSettingsProps, type AIChatType } from '../types';
15
15
 
16
16
  export const AssistantDialog: FC<{ chat?: AIChatType }> = ({ chat }) => {
17
17
  const { t } = useTranslation(ASSISTANT_PLUGIN);
18
- const transcription = useCapabilities(TranscriptionCapabilities.Transcription).length > 0;
18
+ const transcription = useCapabilities(TranscriptionCapabilities.Transcriber).length > 0;
19
19
  const settings = useCapability(Capabilities.SettingsStore).getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;
20
20
 
21
21
  // TODO(burdon): Refocus when open.
@@ -23,7 +23,13 @@ export const AssistantDialog: FC<{ chat?: AIChatType }> = ({ chat }) => {
23
23
 
24
24
  return (
25
25
  <AmbientDialog open={open} onOpenChange={setOpen} title={t('assistant dialog title')}>
26
- <ThreadContainer chat={chat} onOpenChange={setOpen} settings={settings} transcription={transcription} />
26
+ <ThreadContainer
27
+ chat={chat}
28
+ onOpenChange={setOpen}
29
+ settings={settings}
30
+ part={'dialog'}
31
+ transcription={transcription}
32
+ />
27
33
  </AmbientDialog>
28
34
  );
29
35
  };
@@ -4,13 +4,16 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { DEFAULT_LLM_MODELS } from '@dxos/assistant';
7
+ import { DEFAULT_EDGE_MODELS, DEFAULT_OLLAMA_MODELS } from '@dxos/assistant';
8
8
  import { Input, Select, useTranslation } from '@dxos/react-ui';
9
9
  import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
10
10
 
11
11
  import { ASSISTANT_PLUGIN } from '../../meta';
12
12
  import { type AssistantSettingsProps } from '../../types';
13
13
 
14
+ // TODO(burdon): Factor out.
15
+ const DEFAULT_VALUE = '__default';
16
+
14
17
  export const AssistantSettings = ({ settings }: { settings: AssistantSettingsProps }) => {
15
18
  const { t } = useTranslation(ASSISTANT_PLUGIN);
16
19
 
@@ -23,18 +26,49 @@ export const AssistantSettings = ({ settings }: { settings: AssistantSettingsPro
23
26
  />
24
27
  </DeprecatedFormInput>
25
28
 
26
- <DeprecatedFormInput label={t('settings llm model label')}>
29
+ <DeprecatedFormInput label={t('settings llm provider label')}>
30
+ <Input.Switch
31
+ checked={settings.llmProvider === 'ollama'}
32
+ onCheckedChange={(checked) => (settings.llmProvider = checked ? 'ollama' : 'edge')}
33
+ />
34
+ </DeprecatedFormInput>
35
+
36
+ <DeprecatedFormInput label={t('settings edge llm model label')}>
37
+ <Select.Root
38
+ value={settings.edgeModel ?? DEFAULT_VALUE}
39
+ onValueChange={(value) => {
40
+ settings.edgeModel = value === DEFAULT_VALUE ? undefined : value;
41
+ }}
42
+ >
43
+ <Select.TriggerButton placeholder={t('settings default llm model label')} />
44
+ <Select.Portal>
45
+ <Select.Content>
46
+ <Select.Viewport>
47
+ <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>
48
+ {DEFAULT_EDGE_MODELS.map((model) => (
49
+ <Select.Option key={model} value={model}>
50
+ {model}
51
+ </Select.Option>
52
+ ))}
53
+ </Select.Viewport>
54
+ </Select.Content>
55
+ </Select.Portal>
56
+ </Select.Root>
57
+ </DeprecatedFormInput>
58
+
59
+ <DeprecatedFormInput label={t('settings ollama llm model label')}>
27
60
  <Select.Root
28
- value={settings.llmModel ?? 'default'}
61
+ value={settings.ollamaModel ?? DEFAULT_VALUE}
29
62
  onValueChange={(value) => {
30
- settings.llmModel = value;
63
+ settings.ollamaModel = value === DEFAULT_VALUE ? undefined : value;
31
64
  }}
32
65
  >
33
66
  <Select.TriggerButton placeholder={t('settings default llm model label')} />
34
67
  <Select.Portal>
35
68
  <Select.Content>
36
69
  <Select.Viewport>
37
- {DEFAULT_LLM_MODELS.map((model) => (
70
+ <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>
71
+ {DEFAULT_OLLAMA_MODELS.map((model) => (
38
72
  <Select.Option key={model} value={model}>
39
73
  {model}
40
74
  </Select.Option>
@@ -5,6 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Capabilities, useCapabilities, useCapability } from '@dxos/app-framework';
8
+ import { type AssociatedArtifact } from '@dxos/artifact';
8
9
  import { TranscriptionCapabilities } from '@dxos/plugin-transcription';
9
10
  import { StackItem } from '@dxos/react-ui-stack';
10
11
 
@@ -13,13 +14,26 @@ import { ASSISTANT_PLUGIN } from '../meta';
13
14
  import { type AssistantSettingsProps, type AIChatType } from '../types';
14
15
 
15
16
  // TODO(burdon): Attention.
16
- export const ChatContainer = ({ chat, role }: { chat: AIChatType; role: string }) => {
17
- const transcription = useCapabilities(TranscriptionCapabilities.Transcription).length > 0;
17
+ export const ChatContainer = ({
18
+ role,
19
+ chat,
20
+ associatedArtifact,
21
+ }: {
22
+ role: string;
23
+ chat: AIChatType;
24
+ associatedArtifact?: AssociatedArtifact;
25
+ }) => {
26
+ const transcription = useCapabilities(TranscriptionCapabilities.Transcriber).length > 0;
18
27
  const settings = useCapability(Capabilities.SettingsStore).getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;
19
28
 
20
29
  return (
21
- <StackItem.Content toolbar={false} role={role} classNames='mli-auto w-full max-w-[50rem]'>
22
- <ThreadContainer chat={chat} settings={settings} transcription={transcription} />
30
+ <StackItem.Content role={role} classNames='container-max-width'>
31
+ <ThreadContainer
32
+ chat={chat}
33
+ settings={settings}
34
+ transcription={transcription}
35
+ associatedArtifact={associatedArtifact}
36
+ />
23
37
  </StackItem.Content>
24
38
  );
25
39
  };
@@ -11,6 +11,7 @@ import { withTheme, withLayout } from '@dxos/storybook-utils';
11
11
 
12
12
  import { Prompt } from './Prompt';
13
13
  import { PromptBar } from './PromptBar';
14
+ import type { ReferenceData } from './references';
14
15
  import translations from '../../translations';
15
16
 
16
17
  const meta: Meta<typeof Prompt> = {
@@ -77,3 +78,36 @@ export const Toolbar: Story = {
77
78
  );
78
79
  },
79
80
  };
81
+
82
+ export const Includes: Story = {
83
+ args: {
84
+ classNames: 'w-96 p-4 rounded outline outline-gray-200',
85
+ references: {
86
+ getReferences: async ({ query }) => {
87
+ const res = references.filter((i) => i.label.toLowerCase().startsWith(query.toLowerCase()));
88
+ console.log('getReferences', { query, res });
89
+ return res;
90
+ },
91
+ resolveReference: async ({ uri }) => {
92
+ const res = references.find((i) => i.uri === uri);
93
+ console.log('resolveReference', { uri, res });
94
+ return res ?? null;
95
+ },
96
+ },
97
+ },
98
+ };
99
+
100
+ const references: ReferenceData[] = [
101
+ {
102
+ uri: 'dxn:echo:@:AAAAAAAA',
103
+ label: 'Meeting Notes',
104
+ },
105
+ {
106
+ uri: 'dxn:echo:@:BBBBBBBB',
107
+ label: 'Project Plan',
108
+ },
109
+ {
110
+ uri: 'dxn:echo:@:CCCCCCCC',
111
+ label: 'Meeting Plan',
112
+ },
113
+ ];