@dxos/plugin-assistant 0.8.1-staging.391c573 → 0.8.1-staging.97aedb1

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 (235) hide show
  1. package/dist/lib/browser/{AssistantDialog-CM33SOCT.mjs → AssistantDialog-YSHMAHW5.mjs} +15 -14
  2. package/dist/lib/browser/AssistantDialog-YSHMAHW5.mjs.map +7 -0
  3. package/dist/lib/browser/{ChatContainer-VW73VNUY.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-WVME6K4X.mjs → chunk-FMB7RGMP.mjs} +379 -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-M2SADJVS.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-FQRN6747.mjs → intent-resolver-WJGLKKVO.mjs} +8 -6
  25. package/dist/lib/browser/{intent-resolver-FQRN6747.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-ZT6EQ7FJ.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-VVQUGG56.mjs → settings-U6UFQX32.mjs} +4 -4
  30. package/dist/lib/browser/types/index.mjs +6 -2
  31. package/dist/lib/node/{AssistantDialog-5PVOCPE2.cjs → AssistantDialog-YI2BSGSX.cjs} +18 -17
  32. package/dist/lib/node/AssistantDialog-YI2BSGSX.cjs.map +7 -0
  33. package/dist/lib/node/{ChatContainer-I45I3ICI.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-6CY35ZIR.cjs → ai-client-URCCYU6B.cjs} +19 -8
  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-34WE2FD2.cjs → chunk-APRU3QWK.cjs} +32 -9
  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-JWUHUQ56.cjs → chunk-RPBKMP2E.cjs} +350 -222
  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-HFOUAFOW.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-Z37RNNMC.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-KFXP3GGK.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-TJHHVI6B.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-Q2ZBOHOV.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-5ULBF3GW.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-2OUUYMBT.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-ASMI7PQ2.mjs → chunk-MVDAY3CZ.mjs} +379 -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-LOTXWV4J.mjs → intent-resolver-H32TL4X6.mjs} +8 -6
  86. package/dist/lib/node-esm/{intent-resolver-LOTXWV4J.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-NZNNP2QI.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-BVWR244C.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 +4 -3
  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.map +1 -1
  107. package/dist/types/src/components/ChatContainer.d.ts +4 -2
  108. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  109. package/dist/types/src/components/Prompt/Prompt.d.ts +3 -0
  110. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  111. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +1 -0
  112. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Prompt/PromptBar.d.ts +2 -2
  114. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
  115. package/dist/types/src/components/Prompt/references.d.ts +30 -0
  116. package/dist/types/src/components/Prompt/references.d.ts.map +1 -0
  117. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +3 -3
  119. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Thread/Thread.d.ts +11 -1
  121. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  122. package/dist/types/src/components/Thread/ThreadContainer.d.ts +3 -0
  123. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
  124. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +3 -3
  125. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  127. package/dist/types/src/components/index.d.ts +3 -2
  128. package/dist/types/src/components/index.d.ts.map +1 -1
  129. package/dist/types/src/hooks/index.d.ts +1 -0
  130. package/dist/types/src/hooks/index.d.ts.map +1 -1
  131. package/dist/types/src/hooks/processor.d.ts +7 -15
  132. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  133. package/dist/types/src/hooks/useChatProcessor.d.ts +11 -2
  134. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  135. package/dist/types/src/hooks/useContextProvider.d.ts +17 -0
  136. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -0
  137. package/dist/types/src/hooks/useMessageQueue.d.ts +3 -3
  138. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
  139. package/dist/types/src/meta.d.ts +2 -8
  140. package/dist/types/src/meta.d.ts.map +1 -1
  141. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  142. package/dist/types/src/translations.d.ts +26 -12
  143. package/dist/types/src/translations.d.ts.map +1 -1
  144. package/dist/types/src/types/chat.d.ts +4 -6
  145. package/dist/types/src/types/chat.d.ts.map +1 -1
  146. package/dist/types/src/types/template.d.ts +36 -0
  147. package/dist/types/src/types/template.d.ts.map +1 -1
  148. package/dist/types/src/types/types.d.ts +3 -1
  149. package/dist/types/src/types/types.d.ts.map +1 -1
  150. package/package.json +58 -55
  151. package/src/AssistantPlugin.tsx +19 -23
  152. package/src/capabilities/ai-client.ts +23 -5
  153. package/src/capabilities/app-graph-builder.ts +100 -3
  154. package/src/capabilities/capabilities.ts +3 -1
  155. package/src/capabilities/intent-resolver.ts +4 -3
  156. package/src/capabilities/react-surface.tsx +27 -9
  157. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +3 -1
  158. package/src/components/AmbientDialog/AmbientDialog.tsx +11 -11
  159. package/src/components/AssistantDialog.tsx +8 -2
  160. package/src/components/AssistantSettings/AssistantSettings.tsx +39 -5
  161. package/src/components/ChatContainer.tsx +18 -4
  162. package/src/components/Prompt/Prompt.stories.tsx +34 -0
  163. package/src/components/Prompt/Prompt.tsx +28 -18
  164. package/src/components/Prompt/PromptBar.tsx +5 -3
  165. package/src/components/Prompt/references.ts +180 -0
  166. package/src/components/TemplateContainer.tsx +79 -4
  167. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +5 -5
  168. package/src/components/TemplateEditor/TemplateForm.stories.tsx +3 -3
  169. package/src/components/Thread/Thread.stories.tsx +3 -3
  170. package/src/components/Thread/Thread.tsx +21 -0
  171. package/src/components/Thread/ThreadContainer.stories.tsx +9 -14
  172. package/src/components/Thread/ThreadContainer.tsx +10 -4
  173. package/src/components/Thread/ThreadMessage.tsx +17 -9
  174. package/src/components/Toolbox/Toolbox.stories.tsx +2 -2
  175. package/src/hooks/index.ts +1 -0
  176. package/src/hooks/processor.ts +57 -116
  177. package/src/hooks/useChatProcessor.tsx +35 -19
  178. package/src/hooks/useContextProvider.ts +55 -0
  179. package/src/hooks/useMessageQueue.ts +4 -6
  180. package/src/meta.ts +2 -2
  181. package/src/testing/test-functions.ts +2 -2
  182. package/src/translations.ts +11 -5
  183. package/src/types/chat.ts +2 -3
  184. package/src/types/template.ts +22 -0
  185. package/src/types/types.ts +3 -1
  186. package/dist/lib/browser/AssistantDialog-CM33SOCT.mjs.map +0 -7
  187. package/dist/lib/browser/ChatContainer-VW73VNUY.mjs.map +0 -7
  188. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs +0 -23
  189. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs.map +0 -7
  190. package/dist/lib/browser/ai-client-HZPB7E6M.mjs +0 -22
  191. package/dist/lib/browser/ai-client-HZPB7E6M.mjs.map +0 -7
  192. package/dist/lib/browser/app-graph-builder-4DIOTGOG.mjs +0 -103
  193. package/dist/lib/browser/app-graph-builder-4DIOTGOG.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-FPXC3LKK.mjs +0 -162
  195. package/dist/lib/browser/chunk-FPXC3LKK.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-M2SADJVS.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-NTLTGYYS.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-WVME6K4X.mjs.map +0 -7
  199. package/dist/lib/browser/react-surface-ZT6EQ7FJ.mjs.map +0 -7
  200. package/dist/lib/node/AssistantDialog-5PVOCPE2.cjs.map +0 -7
  201. package/dist/lib/node/ChatContainer-I45I3ICI.cjs.map +0 -7
  202. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs +0 -53
  203. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs.map +0 -7
  204. package/dist/lib/node/ai-client-6CY35ZIR.cjs.map +0 -7
  205. package/dist/lib/node/app-graph-builder-7O4U4RXH.cjs +0 -115
  206. package/dist/lib/node/app-graph-builder-7O4U4RXH.cjs.map +0 -7
  207. package/dist/lib/node/chunk-34WE2FD2.cjs.map +0 -7
  208. package/dist/lib/node/chunk-3WXG6WA6.cjs.map +0 -7
  209. package/dist/lib/node/chunk-HFOUAFOW.cjs.map +0 -7
  210. package/dist/lib/node/chunk-JWUHUQ56.cjs.map +0 -7
  211. package/dist/lib/node/intent-resolver-Z37RNNMC.cjs.map +0 -7
  212. package/dist/lib/node/react-surface-KFXP3GGK.cjs.map +0 -7
  213. package/dist/lib/node-esm/AssistantDialog-Q2ZBOHOV.mjs.map +0 -7
  214. package/dist/lib/node-esm/ChatContainer-5ULBF3GW.mjs.map +0 -7
  215. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs +0 -24
  216. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs.map +0 -7
  217. package/dist/lib/node-esm/ai-client-GSA67EIB.mjs +0 -23
  218. package/dist/lib/node-esm/ai-client-GSA67EIB.mjs.map +0 -7
  219. package/dist/lib/node-esm/app-graph-builder-SX3SREXF.mjs +0 -104
  220. package/dist/lib/node-esm/app-graph-builder-SX3SREXF.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-2OUUYMBT.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-ASMI7PQ2.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-ICQN3TDS.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-LELXJPGJ.mjs +0 -163
  225. package/dist/lib/node-esm/chunk-LELXJPGJ.mjs.map +0 -7
  226. package/dist/lib/node-esm/react-surface-NZNNP2QI.mjs.map +0 -7
  227. package/dist/types/src/hooks/email.d.ts +0 -4
  228. package/dist/types/src/hooks/email.d.ts.map +0 -1
  229. package/src/hooks/email.ts +0 -49
  230. /package/dist/lib/browser/{chunk-EUMPBC4T.mjs.map → chunk-NFUHCW2J.mjs.map} +0 -0
  231. /package/dist/lib/browser/{settings-VVQUGG56.mjs.map → settings-U6UFQX32.mjs.map} +0 -0
  232. /package/dist/lib/node/{chunk-NV4TQQSU.cjs.map → chunk-XI2ARIEO.cjs.map} +0 -0
  233. /package/dist/lib/node/{settings-TJHHVI6B.cjs.map → settings-TXGRCYAL.cjs.map} +0 -0
  234. /package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs.map → chunk-PBZA7XJR.mjs.map} +0 -0
  235. /package/dist/lib/node-esm/{settings-BVWR244C.mjs.map → settings-DZU5PNXM.mjs.map} +0 -0
@@ -2,17 +2,92 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import { Match, type Schema as S } from 'effect';
6
+ import React, { type ChangeEvent, useCallback } from 'react';
6
7
 
8
+ import { debounce } from '@dxos/async';
9
+ import { Input, Select, Toolbar, useTranslation } from '@dxos/react-ui';
7
10
  import { StackItem } from '@dxos/react-ui-stack';
8
11
 
9
12
  import { TemplateEditor } from './TemplateEditor';
10
- import { type TemplateType } from '../types';
13
+ import { ASSISTANT_PLUGIN } from '../meta';
14
+ import { TemplateKinds, type TemplateKindSchema, type TemplateType } from '../types';
11
15
 
12
- // TODO(burdon): Attention.
13
16
  export const TemplateContainer = ({ template, role }: { template: TemplateType; role: string }) => {
17
+ const { t } = useTranslation(ASSISTANT_PLUGIN);
18
+
19
+ const handleKindChange = useCallback(
20
+ (value: string) => {
21
+ const kind = Match.type<string>().pipe(
22
+ Match.withReturnType<S.Schema.Type<typeof TemplateKindSchema>>(),
23
+ Match.when('always', () => ({ include: 'always' })),
24
+ Match.when('schema-matching', () => ({ include: 'schema-matching', typename: '' })),
25
+ Match.when('automatically', () => ({ include: 'automatically', description: '' })),
26
+ Match.orElse(() => ({ include: 'manual' })),
27
+ )(value);
28
+
29
+ template.kind = kind;
30
+ },
31
+ [template],
32
+ );
33
+
34
+ const handleTypenameChange = useCallback(
35
+ debounce((event: ChangeEvent<HTMLInputElement>) => {
36
+ if (template.kind.include === 'schema-matching') {
37
+ template.kind.typename = event.target.value;
38
+ }
39
+ }, 300),
40
+ [template.kind.include],
41
+ );
42
+
43
+ const handleDescriptionChange = useCallback(
44
+ debounce((event: ChangeEvent<HTMLInputElement>) => {
45
+ if (template.kind.include === 'automatically') {
46
+ template.kind.description = event.target.value;
47
+ }
48
+ }, 300),
49
+ [template.kind.include],
50
+ );
51
+
14
52
  return (
15
- <StackItem.Content toolbar={false} role={role} classNames='mli-auto w-full max-w-[50rem]'>
53
+ <StackItem.Content role={role} toolbar classNames='container-max-width'>
54
+ {/* TODO(wittjosiah): Move this toolbar into c11y sidebar. */}
55
+ <Toolbar.Root>
56
+ <Select.Root value={template.kind.include} onValueChange={handleKindChange}>
57
+ <Toolbar.Button asChild>
58
+ <Select.TriggerButton />
59
+ </Toolbar.Button>
60
+ <Select.Portal>
61
+ <Select.Content>
62
+ <Select.Viewport>
63
+ {TemplateKinds.map((kind) => (
64
+ <Select.Option key={kind} value={kind}>
65
+ {kind}
66
+ </Select.Option>
67
+ ))}
68
+ </Select.Viewport>
69
+ </Select.Content>
70
+ </Select.Portal>
71
+ </Select.Root>
72
+ {template.kind.include === 'schema-matching' && (
73
+ <Input.Root>
74
+ <Input.TextInput
75
+ placeholder={t('typename placeholder')}
76
+ defaultValue={template.kind.typename}
77
+ onChange={handleTypenameChange}
78
+ />
79
+ </Input.Root>
80
+ )}
81
+ {template.kind.include === 'automatically' && (
82
+ <Input.Root>
83
+ <Input.TextInput
84
+ placeholder={t('description placeholder')}
85
+ defaultValue={template.kind.description}
86
+ onChange={handleDescriptionChange}
87
+ />
88
+ </Input.Root>
89
+ )}
90
+ </Toolbar.Root>
16
91
  <TemplateEditor template={template} />
17
92
  </StackItem.Content>
18
93
  );
@@ -34,11 +34,11 @@ const TEMPLATE = [
34
34
  '',
35
35
  ].join('\n');
36
36
 
37
- const Render = ({ text }: TemplateEditorProps & { text: string }) => {
37
+ const DefaultStory = ({ text }: TemplateEditorProps & { text: string }) => {
38
38
  const client = useClient();
39
39
  const [template] = useState(() => {
40
40
  const space = client.spaces.default;
41
- return space.db.add(create(TemplateType, { source: text }));
41
+ return space.db.add(create(TemplateType, { source: text, kind: { include: 'manual' } }));
42
42
  });
43
43
 
44
44
  return (
@@ -48,10 +48,10 @@ const Render = ({ text }: TemplateEditorProps & { text: string }) => {
48
48
  );
49
49
  };
50
50
 
51
- const meta: Meta<typeof Render> = {
51
+ const meta: Meta<typeof DefaultStory> = {
52
52
  title: 'plugins/plugin-automation/TemplateEditor',
53
53
  component: TemplateEditor,
54
- render: Render,
54
+ render: DefaultStory,
55
55
  decorators: [
56
56
  withClientProvider({
57
57
  createIdentity: true,
@@ -68,7 +68,7 @@ const meta: Meta<typeof Render> = {
68
68
 
69
69
  export default meta;
70
70
 
71
- type Story = Meta<typeof Render>;
71
+ type Story = Meta<typeof DefaultStory>;
72
72
 
73
73
  export const Default: Story = {
74
74
  args: {
@@ -26,11 +26,11 @@ const TEMPLATE = [
26
26
  '{{input}}',
27
27
  ].join('\n');
28
28
 
29
- const Render = () => {
29
+ 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 }));
33
+ return space.db.add(create(TemplateType, { source: TEMPLATE, kind: { include: 'manual' } }));
34
34
  });
35
35
 
36
36
  return (
@@ -43,7 +43,7 @@ const Render = () => {
43
43
  const meta: Meta<typeof TemplateForm> = {
44
44
  title: 'plugins/plugin-automation/TemplateForm',
45
45
  component: TemplateForm,
46
- render: Render,
46
+ render: DefaultStory,
47
47
  decorators: [
48
48
  withClientProvider({
49
49
  createIdentity: true,
@@ -20,7 +20,7 @@ import translations from '../../translations';
20
20
 
21
21
  faker.seed(1);
22
22
 
23
- const Render = ({ messages: _messages, ...props }: ThreadProps) => {
23
+ const DefaultStory = ({ messages: _messages, ...props }: ThreadProps) => {
24
24
  const [processing, setProcessing] = useState(false);
25
25
  const [messages, setMessages] = useState<Message[]>(_messages ?? []);
26
26
  useEffect(() => {
@@ -70,7 +70,7 @@ const Render = ({ messages: _messages, ...props }: ThreadProps) => {
70
70
 
71
71
  const meta: Meta<ThreadProps> = {
72
72
  title: 'plugins/plugin-automation/Thread',
73
- render: Render,
73
+ render: DefaultStory,
74
74
  component: Thread,
75
75
  decorators: [
76
76
  withSignals,
@@ -207,6 +207,6 @@ export const Incremental: Story = {
207
207
  return () => clearInterval(interval);
208
208
  }, []);
209
209
 
210
- return <Render messages={messages} collapse />;
210
+ return <DefaultStory messages={messages} collapse />;
211
211
  },
212
212
  };
@@ -15,6 +15,13 @@ import { keyToFallback } from '@dxos/util';
15
15
  import { ThreadMessage, type ThreadMessageProps } from './ThreadMessage';
16
16
  import { messageReducer } from './reducer';
17
17
  import { PromptBar, type PromptBarProps } from '../Prompt';
18
+ import type { ReferenceData, ReferencesProvider } from '../Prompt/references';
19
+
20
+ export interface ContextProvider {
21
+ query({ query }: { query: string }): Promise<ReferenceData[]>;
22
+
23
+ resolveMetadata({ uri }: { uri: string }): Promise<ReferenceData | null>;
24
+ }
18
25
 
19
26
  export type ThreadProps = ThemedClassName<{
20
27
  space?: Space;
@@ -22,6 +29,7 @@ export type ThreadProps = ThemedClassName<{
22
29
  collapse?: boolean;
23
30
  transcription?: boolean;
24
31
  onOpenChange?: (open: boolean) => void;
32
+ contextProvider?: ContextProvider;
25
33
  }> &
26
34
  Pick<PromptBarProps, 'processing' | 'error' | 'onSubmit' | 'onSuggest' | 'onCancel'> &
27
35
  Pick<ThreadMessageProps, 'debug' | 'tools' | 'onPrompt' | 'onDelete'>;
@@ -40,6 +48,7 @@ export const Thread = ({
40
48
  onSubmit,
41
49
  onCancel,
42
50
  onOpenChange,
51
+ contextProvider,
43
52
  ...props
44
53
  }: ThreadProps) => {
45
54
  const scroller = useRef<ScrollController>(null);
@@ -68,6 +77,17 @@ export const Thread = ({
68
77
  }
69
78
  }, [messages, collapse]);
70
79
 
80
+ const references = useMemo<ReferencesProvider | undefined>(() => {
81
+ if (!contextProvider) {
82
+ return undefined;
83
+ }
84
+
85
+ return {
86
+ getReferences: async ({ query }: { query: string }) => contextProvider.query({ query }),
87
+ resolveReference: async ({ uri }: { uri: string }) => contextProvider.resolveMetadata({ uri }),
88
+ };
89
+ }, [contextProvider]);
90
+
71
91
  return (
72
92
  <div role='none' className={mx('flex flex-col grow overflow-hidden', classNames)}>
73
93
  <ScrollContainer ref={scroller} fade>
@@ -90,6 +110,7 @@ export const Thread = ({
90
110
  onSubmit={handleSubmit}
91
111
  onCancel={onCancel}
92
112
  onOpenChange={onOpenChange}
113
+ references={references}
93
114
  />
94
115
  )}
95
116
  </div>
@@ -21,7 +21,6 @@ import { Message, type Tool } from '@dxos/artifact';
21
21
  import { genericTools, localServiceEndpoints, type IsObject } from '@dxos/artifact-testing';
22
22
  import { AIServiceEdgeClient } from '@dxos/assistant';
23
23
  import { createStatic, ObjectId } from '@dxos/echo-schema';
24
- import { EdgeHttpClient } from '@dxos/edge-client';
25
24
  import { invariant } from '@dxos/invariant';
26
25
  import { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';
27
26
  import { ChessPlugin } from '@dxos/plugin-chess';
@@ -31,9 +30,8 @@ import { InboxPlugin } from '@dxos/plugin-inbox';
31
30
  import { MapPlugin } from '@dxos/plugin-map';
32
31
  import { SpacePlugin } from '@dxos/plugin-space';
33
32
  import { TablePlugin } from '@dxos/plugin-table';
34
- import { useSpace } from '@dxos/react-client/echo';
33
+ import { useQueue, useSpace } from '@dxos/react-client/echo';
35
34
  import { withClientProvider } from '@dxos/react-client/testing';
36
- import { useQueue } from '@dxos/react-edge-client';
37
35
  import { IconButton, Input, Toolbar } from '@dxos/react-ui';
38
36
  import { mx } from '@dxos/react-ui-theme';
39
37
  import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
@@ -51,16 +49,12 @@ type RenderProps = {
51
49
  } & Pick<ThreadProps, 'debug'>;
52
50
 
53
51
  // TODO(burdon): Use ChatContainer.
54
- const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
52
+ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) => {
55
53
  const space = useSpace();
56
54
  const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
57
- const tools = useMemo<Tool[]>(
58
- () => [...genericTools, ...artifactDefinitions.flatMap((definition) => definition.tools)],
59
- [genericTools, artifactDefinitions],
60
- );
55
+ const tools = useMemo<Tool[]>(() => [...genericTools], []);
61
56
 
62
57
  const [aiClient] = useState(() => new AIServiceEdgeClient({ endpoint: endpoints.ai }));
63
- const [edgeClient] = useState(() => new EdgeHttpClient(endpoints.edge));
64
58
  const { dispatchPromise: dispatch } = useIntentDispatcher();
65
59
 
66
60
  // TODO(burdon): Replace with useChatProcessor.
@@ -73,6 +67,7 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
73
67
  return new ChatProcessor(
74
68
  aiClient,
75
69
  tools,
70
+ artifactDefinitions,
76
71
  {
77
72
  space,
78
73
  dispatch,
@@ -82,8 +77,8 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
82
77
  }, [aiClient, tools, space, dispatch, artifactDefinitions]);
83
78
 
84
79
  // Queue.
85
- const [queueDxn, setQueueDxn] = useState(() => randomQueueDxn());
86
- const queue = useQueue<Message>(edgeClient, DXN.tryParse(queueDxn));
80
+ const [queueDxn, setQueueDxn] = useState<string>(() => randomQueueDxn());
81
+ const queue = useQueue<Message>(DXN.tryParse(queueDxn));
87
82
 
88
83
  useEffect(() => {
89
84
  if (queue?.items.length === 0 && !queue.isLoading && prompts.length > 0) {
@@ -209,9 +204,9 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
209
204
  const randomQueueDxn = () =>
210
205
  new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]).toString();
211
206
 
212
- const meta: Meta<typeof Render> = {
207
+ const meta: Meta<typeof DefaultStory> = {
213
208
  title: 'plugins/plugin-automation/ThreadContainer',
214
- render: Render,
209
+ render: DefaultStory,
215
210
  decorators: [
216
211
  withSignals,
217
212
  withClientProvider({
@@ -247,7 +242,7 @@ const meta: Meta<typeof Render> = {
247
242
 
248
243
  export default meta;
249
244
 
250
- type Story = StoryObj<typeof Render>;
245
+ type Story = StoryObj<typeof DefaultStory>;
251
246
 
252
247
  export const Default: Story = {
253
248
  args: {
@@ -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({
@@ -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';