@dxos/plugin-assistant 0.8.0 → 0.8.1-main.81238a8

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 (234) hide show
  1. package/dist/lib/browser/{AssistantDialog-TX6YYBUG.mjs → AssistantDialog-L5RHNMU4.mjs} +6 -5
  2. package/dist/lib/browser/{AssistantDialog-TX6YYBUG.mjs.map → AssistantDialog-L5RHNMU4.mjs.map} +3 -3
  3. package/dist/lib/browser/{ChatContainer-AT3OAUT3.mjs → ChatContainer-EEEVE62F.mjs} +5 -5
  4. package/dist/lib/browser/TemplateContainer-7IQ6V5AD.mjs +78 -0
  5. package/dist/lib/browser/TemplateContainer-7IQ6V5AD.mjs.map +7 -0
  6. package/dist/lib/browser/ai-client-BAPVMSNX.mjs +35 -0
  7. package/dist/lib/browser/ai-client-BAPVMSNX.mjs.map +7 -0
  8. package/dist/lib/browser/{app-graph-builder-AXAIFOGV.mjs → app-graph-builder-DTCUWBKB.mjs} +57 -13
  9. package/dist/lib/browser/app-graph-builder-DTCUWBKB.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-G7B54APW.mjs → chunk-5RMJYOT7.mjs} +34 -12
  11. package/dist/lib/browser/chunk-5RMJYOT7.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-EUMPBC4T.mjs → chunk-6FTPLBSC.mjs} +2 -2
  13. package/dist/lib/browser/{chunk-NV7SVHMV.mjs → chunk-AF7VQAKS.mjs} +1 -1
  14. package/dist/lib/browser/{chunk-NV7SVHMV.mjs.map → chunk-AF7VQAKS.mjs.map} +2 -2
  15. package/dist/lib/browser/{chunk-VZ4W6SHE.mjs → chunk-SVUCJXGN.mjs} +2 -2
  16. package/dist/lib/browser/chunk-SVUCJXGN.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-FRIKXDDQ.mjs → chunk-X6ALDUA5.mjs} +26 -4
  18. package/dist/lib/browser/chunk-X6ALDUA5.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-NFVIZS3B.mjs → chunk-XFUCWOMV.mjs} +287 -70
  20. package/dist/lib/browser/chunk-XFUCWOMV.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +21 -11
  22. package/dist/lib/browser/index.mjs.map +3 -3
  23. package/dist/lib/browser/{intent-resolver-QRVRZL6K.mjs → intent-resolver-U57FXP3I.mjs} +6 -3
  24. package/dist/lib/browser/{intent-resolver-QRVRZL6K.mjs.map → intent-resolver-U57FXP3I.mjs.map} +3 -3
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/{react-surface-JLXNWOI6.mjs → react-surface-KFLHNDNR.mjs} +10 -9
  27. package/dist/lib/browser/react-surface-KFLHNDNR.mjs.map +7 -0
  28. package/dist/lib/browser/{settings-JTT62IHD.mjs → settings-VAW6UWFL.mjs} +3 -3
  29. package/dist/lib/browser/types/index.mjs +6 -2
  30. package/dist/lib/node/{AssistantDialog-U4GBPZD6.cjs → AssistantDialog-VIB7GPQN.cjs} +12 -11
  31. package/dist/lib/node/{AssistantDialog-U4GBPZD6.cjs.map → AssistantDialog-VIB7GPQN.cjs.map} +3 -3
  32. package/dist/lib/node/{ChatContainer-CVHXNHGA.cjs → ChatContainer-BPI3GEZS.cjs} +10 -10
  33. package/dist/lib/node/TemplateContainer-VPAZRFQA.cjs +104 -0
  34. package/dist/lib/node/TemplateContainer-VPAZRFQA.cjs.map +7 -0
  35. package/dist/lib/node/{ai-client-YANJEPO3.cjs → ai-client-5ESLYXAV.cjs} +19 -8
  36. package/dist/lib/node/ai-client-5ESLYXAV.cjs.map +7 -0
  37. package/dist/lib/node/{app-graph-builder-D7SHQTZS.cjs → app-graph-builder-3P6WSON2.cjs} +63 -20
  38. package/dist/lib/node/app-graph-builder-3P6WSON2.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-37GI4NYH.cjs → chunk-KLSNCP34.cjs} +33 -9
  40. package/dist/lib/node/chunk-KLSNCP34.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-NV4TQQSU.cjs → chunk-N3SW6DJ6.cjs} +6 -6
  42. package/dist/lib/node/{chunk-XUTDR7HI.cjs → chunk-OJJ4F6KP.cjs} +291 -78
  43. package/dist/lib/node/chunk-OJJ4F6KP.cjs.map +7 -0
  44. package/dist/lib/node/{chunk-GNPXCHFT.cjs → chunk-U6J2GO7I.cjs} +4 -4
  45. package/dist/lib/node/{chunk-GNPXCHFT.cjs.map → chunk-U6J2GO7I.cjs.map} +2 -2
  46. package/dist/lib/node/{chunk-ZGH6F5YA.cjs → chunk-VRXFIS4X.cjs} +6 -6
  47. package/dist/lib/node/chunk-VRXFIS4X.cjs.map +7 -0
  48. package/dist/lib/node/{chunk-IXJCGW7U.cjs → chunk-WFVOWPKV.cjs} +40 -18
  49. package/dist/lib/node/chunk-WFVOWPKV.cjs.map +7 -0
  50. package/dist/lib/node/index.cjs +73 -63
  51. package/dist/lib/node/index.cjs.map +3 -3
  52. package/dist/lib/node/{intent-resolver-YMMAFVOB.cjs → intent-resolver-YIFAMM3B.cjs} +13 -10
  53. package/dist/lib/node/{intent-resolver-YMMAFVOB.cjs.map → intent-resolver-YIFAMM3B.cjs.map} +3 -3
  54. package/dist/lib/node/meta.json +1 -1
  55. package/dist/lib/node/{react-surface-BSUZQ3HZ.cjs → react-surface-REI6G6B3.cjs} +25 -24
  56. package/dist/lib/node/react-surface-REI6G6B3.cjs.map +7 -0
  57. package/dist/lib/node/{settings-4YEO7KXF.cjs → settings-2FEYGLYU.cjs} +8 -8
  58. package/dist/lib/node/types/index.cjs +15 -11
  59. package/dist/lib/node/types/index.cjs.map +2 -2
  60. package/dist/lib/node-esm/{AssistantDialog-5AT5JAZL.mjs → AssistantDialog-R3EPF2KL.mjs} +6 -5
  61. package/dist/lib/node-esm/{AssistantDialog-5AT5JAZL.mjs.map → AssistantDialog-R3EPF2KL.mjs.map} +3 -3
  62. package/dist/lib/node-esm/{ChatContainer-VR766C4M.mjs → ChatContainer-UJ7MV7GU.mjs} +5 -5
  63. package/dist/lib/node-esm/TemplateContainer-YLA6BJY6.mjs +79 -0
  64. package/dist/lib/node-esm/TemplateContainer-YLA6BJY6.mjs.map +7 -0
  65. package/dist/lib/node-esm/ai-client-XYZ5N7CR.mjs +36 -0
  66. package/dist/lib/node-esm/ai-client-XYZ5N7CR.mjs.map +7 -0
  67. package/dist/lib/node-esm/{app-graph-builder-H2GC2AZA.mjs → app-graph-builder-PMAQLTTN.mjs} +57 -13
  68. package/dist/lib/node-esm/app-graph-builder-PMAQLTTN.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-77ARTFBA.mjs → chunk-2CIYX3SD.mjs} +2 -2
  70. package/dist/lib/node-esm/chunk-2CIYX3SD.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-AMQMVQJO.mjs → chunk-6GBMQIW7.mjs} +34 -12
  72. package/dist/lib/node-esm/chunk-6GBMQIW7.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-7JENJTLB.mjs → chunk-AMTHOYNB.mjs} +287 -70
  74. package/dist/lib/node-esm/chunk-AMTHOYNB.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs → chunk-J63VQFQO.mjs} +2 -2
  76. package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs → chunk-N6BVC2C2.mjs} +1 -1
  77. package/dist/lib/node-esm/{chunk-7SV6X6XU.mjs.map → chunk-N6BVC2C2.mjs.map} +2 -2
  78. package/dist/lib/node-esm/{chunk-CJ4Y3QW5.mjs → chunk-NMMRHHAR.mjs} +26 -4
  79. package/dist/lib/node-esm/chunk-NMMRHHAR.mjs.map +7 -0
  80. package/dist/lib/node-esm/index.mjs +21 -11
  81. package/dist/lib/node-esm/index.mjs.map +3 -3
  82. package/dist/lib/node-esm/{intent-resolver-MR7BOKEW.mjs → intent-resolver-SQ4HLL5L.mjs} +6 -3
  83. package/dist/lib/node-esm/{intent-resolver-MR7BOKEW.mjs.map → intent-resolver-SQ4HLL5L.mjs.map} +3 -3
  84. package/dist/lib/node-esm/meta.json +1 -1
  85. package/dist/lib/node-esm/{react-surface-IGVYAOGL.mjs → react-surface-LE57AGPI.mjs} +10 -9
  86. package/dist/lib/node-esm/react-surface-LE57AGPI.mjs.map +7 -0
  87. package/dist/lib/node-esm/{settings-S7P5RWQI.mjs → settings-VHR5KT4J.mjs} +3 -3
  88. package/dist/lib/node-esm/types/index.mjs +6 -2
  89. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/ai-client.d.ts +2 -2
  91. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/capabilities.d.ts +3 -2
  94. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/index.d.ts +1 -1
  96. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  98. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +2 -2
  99. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -1
  100. package/dist/types/src/components/AssistantDialog.d.ts.map +1 -1
  101. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts +2 -1
  102. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  103. package/dist/types/src/components/ChatContainer.d.ts +2 -1
  104. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  105. package/dist/types/src/components/Prompt/Prompt.d.ts +3 -0
  106. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  107. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +1 -0
  108. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/Prompt/PromptBar.d.ts +3 -2
  110. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -1
  111. package/dist/types/src/components/Prompt/references.d.ts +30 -0
  112. package/dist/types/src/components/Prompt/references.d.ts.map +1 -0
  113. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +2 -1
  114. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -1
  115. package/dist/types/src/components/TemplateContainer.d.ts +2 -1
  116. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -1
  117. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -1
  118. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  119. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +2 -1
  120. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +3 -2
  122. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  123. package/dist/types/src/components/Thread/Thread.d.ts +12 -1
  124. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  125. package/dist/types/src/components/Thread/ThreadContainer.d.ts +1 -0
  126. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -1
  127. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +2 -1
  128. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  130. package/dist/types/src/components/Toolbox/Toolbox.d.ts +4 -3
  131. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  132. package/dist/types/src/components/index.d.ts +2 -2
  133. package/dist/types/src/components/index.d.ts.map +1 -1
  134. package/dist/types/src/hooks/index.d.ts +1 -0
  135. package/dist/types/src/hooks/index.d.ts.map +1 -1
  136. package/dist/types/src/hooks/invocation-handler.d.ts +1 -1
  137. package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
  138. package/dist/types/src/hooks/processor.d.ts +8 -5
  139. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  140. package/dist/types/src/hooks/useChatProcessor.d.ts +9 -2
  141. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  142. package/dist/types/src/hooks/useContextProvider.d.ts +17 -0
  143. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -0
  144. package/dist/types/src/hooks/useMessageQueue.d.ts +4 -4
  145. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -1
  146. package/dist/types/src/meta.d.ts +2 -8
  147. package/dist/types/src/meta.d.ts.map +1 -1
  148. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  149. package/dist/types/src/tools/function.d.ts +1 -1
  150. package/dist/types/src/tools/function.d.ts.map +1 -1
  151. package/dist/types/src/translations.d.ts +21 -6
  152. package/dist/types/src/translations.d.ts.map +1 -1
  153. package/dist/types/src/types/service.d.ts +1 -1
  154. package/dist/types/src/types/service.d.ts.map +1 -1
  155. package/dist/types/src/types/template.d.ts +36 -0
  156. package/dist/types/src/types/template.d.ts.map +1 -1
  157. package/dist/types/src/types/types.d.ts +3 -1
  158. package/dist/types/src/types/types.d.ts.map +1 -1
  159. package/package.json +56 -56
  160. package/src/AssistantPlugin.tsx +11 -2
  161. package/src/capabilities/ai-client.ts +23 -4
  162. package/src/capabilities/app-graph-builder.ts +48 -4
  163. package/src/capabilities/capabilities.ts +4 -2
  164. package/src/capabilities/intent-resolver.ts +1 -1
  165. package/src/capabilities/react-surface.tsx +3 -2
  166. package/src/components/AssistantDialog.tsx +7 -1
  167. package/src/components/AssistantSettings/AssistantSettings.tsx +39 -5
  168. package/src/components/Prompt/Prompt.stories.tsx +34 -0
  169. package/src/components/Prompt/Prompt.tsx +9 -2
  170. package/src/components/Prompt/PromptBar.tsx +18 -7
  171. package/src/components/Prompt/references.ts +180 -0
  172. package/src/components/TemplateContainer.tsx +79 -4
  173. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +1 -1
  174. package/src/components/TemplateEditor/TemplateForm.stories.tsx +1 -1
  175. package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
  176. package/src/components/Thread/Thread.tsx +21 -0
  177. package/src/components/Thread/ThreadContainer.stories.tsx +5 -8
  178. package/src/components/Thread/ThreadContainer.tsx +7 -4
  179. package/src/components/Thread/ThreadMessage.tsx +17 -9
  180. package/src/components/Toolbox/Toolbox.tsx +1 -1
  181. package/src/components/index.ts +3 -0
  182. package/src/hooks/index.ts +1 -0
  183. package/src/hooks/invocation-handler.ts +3 -5
  184. package/src/hooks/processor.ts +18 -9
  185. package/src/hooks/useChatProcessor.tsx +24 -15
  186. package/src/hooks/useContextProvider.ts +55 -0
  187. package/src/hooks/useLocalTriggerManager.ts +1 -1
  188. package/src/hooks/useMessageQueue.ts +2 -4
  189. package/src/meta.ts +2 -2
  190. package/src/testing/test-functions.ts +2 -2
  191. package/src/tools/function.ts +2 -2
  192. package/src/tools/openapi.test.ts +4 -4
  193. package/src/translations.ts +8 -3
  194. package/src/types/service.ts +1 -1
  195. package/src/types/template.ts +22 -0
  196. package/src/types/types.ts +3 -1
  197. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs +0 -23
  198. package/dist/lib/browser/TemplateContainer-B7MQNUPY.mjs.map +0 -7
  199. package/dist/lib/browser/ai-client-RTCGRKZE.mjs +0 -22
  200. package/dist/lib/browser/ai-client-RTCGRKZE.mjs.map +0 -7
  201. package/dist/lib/browser/app-graph-builder-AXAIFOGV.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-FRIKXDDQ.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-G7B54APW.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-NFVIZS3B.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-VZ4W6SHE.mjs.map +0 -7
  206. package/dist/lib/browser/react-surface-JLXNWOI6.mjs.map +0 -7
  207. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs +0 -53
  208. package/dist/lib/node/TemplateContainer-R4BZZP3E.cjs.map +0 -7
  209. package/dist/lib/node/ai-client-YANJEPO3.cjs.map +0 -7
  210. package/dist/lib/node/app-graph-builder-D7SHQTZS.cjs.map +0 -7
  211. package/dist/lib/node/chunk-37GI4NYH.cjs.map +0 -7
  212. package/dist/lib/node/chunk-IXJCGW7U.cjs.map +0 -7
  213. package/dist/lib/node/chunk-XUTDR7HI.cjs.map +0 -7
  214. package/dist/lib/node/chunk-ZGH6F5YA.cjs.map +0 -7
  215. package/dist/lib/node/react-surface-BSUZQ3HZ.cjs.map +0 -7
  216. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs +0 -24
  217. package/dist/lib/node-esm/TemplateContainer-WSHTZBB5.mjs.map +0 -7
  218. package/dist/lib/node-esm/ai-client-66IBZVCX.mjs +0 -23
  219. package/dist/lib/node-esm/ai-client-66IBZVCX.mjs.map +0 -7
  220. package/dist/lib/node-esm/app-graph-builder-H2GC2AZA.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-77ARTFBA.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-7JENJTLB.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-AMQMVQJO.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-CJ4Y3QW5.mjs.map +0 -7
  225. package/dist/lib/node-esm/react-surface-IGVYAOGL.mjs.map +0 -7
  226. /package/dist/lib/browser/{ChatContainer-AT3OAUT3.mjs.map → ChatContainer-EEEVE62F.mjs.map} +0 -0
  227. /package/dist/lib/browser/{chunk-EUMPBC4T.mjs.map → chunk-6FTPLBSC.mjs.map} +0 -0
  228. /package/dist/lib/browser/{settings-JTT62IHD.mjs.map → settings-VAW6UWFL.mjs.map} +0 -0
  229. /package/dist/lib/node/{ChatContainer-CVHXNHGA.cjs.map → ChatContainer-BPI3GEZS.cjs.map} +0 -0
  230. /package/dist/lib/node/{chunk-NV4TQQSU.cjs.map → chunk-N3SW6DJ6.cjs.map} +0 -0
  231. /package/dist/lib/node/{settings-4YEO7KXF.cjs.map → settings-2FEYGLYU.cjs.map} +0 -0
  232. /package/dist/lib/node-esm/{ChatContainer-VR766C4M.mjs.map → ChatContainer-UJ7MV7GU.mjs.map} +0 -0
  233. /package/dist/lib/node-esm/{chunk-LBQGJE5T.mjs.map → chunk-J63VQFQO.mjs.map} +0 -0
  234. /package/dist/lib/node-esm/{settings-S7P5RWQI.mjs.map → settings-VHR5KT4J.mjs.map} +0 -0
@@ -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>
@@ -19,9 +19,8 @@ import {
19
19
  import { withPluginManager } from '@dxos/app-framework/testing';
20
20
  import { Message, type Tool } from '@dxos/artifact';
21
21
  import { genericTools, localServiceEndpoints, type IsObject } from '@dxos/artifact-testing';
22
- import { AIServiceClientImpl } from '@dxos/assistant';
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';
@@ -59,8 +57,7 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
59
57
  [genericTools, artifactDefinitions],
60
58
  );
61
59
 
62
- const [aiClient] = useState(() => new AIServiceClientImpl({ endpoint: endpoints.ai }));
63
- const [edgeClient] = useState(() => new EdgeHttpClient(endpoints.edge));
60
+ const [aiClient] = useState(() => new AIServiceEdgeClient({ endpoint: endpoints.ai }));
64
61
  const { dispatchPromise: dispatch } = useIntentDispatcher();
65
62
 
66
63
  // TODO(burdon): Replace with useChatProcessor.
@@ -82,8 +79,8 @@ const Render = ({ items: _items, prompts = [], ...props }: RenderProps) => {
82
79
  }, [aiClient, tools, space, dispatch, artifactDefinitions]);
83
80
 
84
81
  // Queue.
85
- const [queueDxn, setQueueDxn] = useState(() => randomQueueDxn());
86
- const queue = useQueue<Message>(edgeClient, DXN.tryParse(queueDxn));
82
+ const [queueDxn, setQueueDxn] = useState<string>(() => randomQueueDxn());
83
+ const queue = useQueue<Message>(DXN.tryParse(queueDxn));
87
84
 
88
85
  useEffect(() => {
89
86
  if (queue?.items.length === 0 && !queue.isLoading && prompts.length > 0) {
@@ -2,7 +2,7 @@
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
7
  import { invariant } from '@dxos/invariant';
8
8
  import { log } from '@dxos/log';
@@ -10,12 +10,13 @@ import { getSpace } from '@dxos/react-client/echo';
10
10
  import { type ThemedClassName } from '@dxos/react-ui';
11
11
 
12
12
  import { Thread, type ThreadProps } from './Thread';
13
- import { useChatProcessor, useMessageQueue } from '../../hooks';
13
+ import { useChatProcessor, useContextProvider, useMessageQueue } from '../../hooks';
14
14
  import { type AIChatType, type AssistantSettingsProps } from '../../types';
15
15
 
16
16
  export type ThreadContainerProps = {
17
17
  chat?: AIChatType;
18
18
  settings?: AssistantSettingsProps;
19
+ part?: 'deck' | 'dialog';
19
20
  } & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange'>;
20
21
 
21
22
  // TODO(burdon): Since this only wraps Thread, just separate out hook?
@@ -23,12 +24,13 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
23
24
  classNames,
24
25
  chat,
25
26
  settings,
27
+ part,
26
28
  onOpenChange,
27
29
  ...props
28
30
  }) => {
29
- // Push up capabilities hooks out of components.
30
31
  const space = getSpace(chat);
31
- const processor = useChatProcessor(space, settings);
32
+ const contextProvider = useContextProvider(space);
33
+ const processor = useChatProcessor({ chat, space, settings, part });
32
34
  const messageQueue = useMessageQueue(chat);
33
35
  const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];
34
36
 
@@ -73,6 +75,7 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
73
75
  onCancel={handleCancel}
74
76
  onPrompt={handleSubmit}
75
77
  onOpenChange={onOpenChange}
78
+ contextProvider={contextProvider}
76
79
  {...props}
77
80
  />
78
81
  );
@@ -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
 
@@ -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
 
@@ -12,8 +12,8 @@ import {
12
12
  type GenerateRequest,
13
13
  type GenerationStream,
14
14
  MixedStreamParser,
15
- DEFAULT_LLM_MODEL,
16
- type AIService,
15
+ DEFAULT_EDGE_MODEL,
16
+ type AIServiceClient,
17
17
  } from '@dxos/assistant';
18
18
  import { createStatic } from '@dxos/echo-schema';
19
19
  import { invariant } from '@dxos/invariant';
@@ -36,7 +36,7 @@ type RequestOptions = {
36
36
  export type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;
37
37
 
38
38
  const defaultOptions: ChatProcessorOptions = {
39
- model: DEFAULT_LLM_MODEL,
39
+ model: DEFAULT_EDGE_MODEL,
40
40
  systemPrompt: 'you are a helpful assistant',
41
41
  };
42
42
 
@@ -50,15 +50,15 @@ export class ChatProcessor {
50
50
  /** SSE stream parser. */
51
51
  private readonly _parser = new MixedStreamParser();
52
52
 
53
- /** Current streaming response. */
54
- private _stream: GenerationStream | undefined;
55
-
56
53
  /** Pending messages (incl. the current user request). */
57
54
  private readonly _pending: Signal<Message[]> = signal([]);
58
55
 
59
56
  /** Current streaming block (from the AI service). */
60
57
  private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);
61
58
 
59
+ /** Current streaming response. */
60
+ private _stream: GenerationStream | undefined;
61
+
62
62
  /** Prior history from queue. */
63
63
  private _history: Message[] = [];
64
64
 
@@ -92,7 +92,7 @@ export class ChatProcessor {
92
92
  });
93
93
 
94
94
  constructor(
95
- private readonly _service: AIService,
95
+ private readonly _ai: AIServiceClient,
96
96
  private _tools?: Tool[],
97
97
  private readonly _extensions?: ToolContextExtensions,
98
98
  private readonly _options: ChatProcessorOptions = defaultOptions,
@@ -180,7 +180,7 @@ export class ChatProcessor {
180
180
  });
181
181
 
182
182
  // Open request stream.
183
- this._stream = await this._service.exec({
183
+ this._stream = await this._ai.exec({
184
184
  ...this._options,
185
185
  // TODO(burdon): Rename messages or separate history/message.
186
186
  history: [...this._history, ...this._pending.value],
@@ -220,9 +220,18 @@ export class ChatProcessor {
220
220
  this.error.value = undefined;
221
221
  } catch (err) {
222
222
  log.catch(err);
223
- this.error.value = new Error('AI service error', { cause: err });
223
+ if (err instanceof Error && err.message.includes('Overloaded')) {
224
+ this.error.value = new AIServiecOverloadedError('AI service overloaded', { cause: err });
225
+ } else {
226
+ this.error.value = new Error('AI service error', { cause: err });
227
+ }
224
228
  } finally {
225
229
  this._stream = undefined;
226
230
  }
227
231
  }
228
232
  }
233
+
234
+ // TODO(wittjosiah): Refactor.
235
+ export class AIServiecOverloadedError extends Error {
236
+ code = 'AI_SERVICE_OVERLOADED';
237
+ }
@@ -6,22 +6,29 @@ import { useEffect, useMemo, useState } from 'react';
6
6
 
7
7
  import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { createSystemPrompt, type Tool } from '@dxos/artifact';
9
- import { DEFAULT_LLM_MODEL } from '@dxos/assistant';
10
- import { FunctionType } from '@dxos/functions';
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
17
  import { ChatProcessor } 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
+ };
20
27
 
21
28
  /**
22
29
  * Configure and create ChatProcessor.
23
30
  */
24
- export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProps): ChatProcessor => {
31
+ export const useChatProcessor = ({ chat, space, settings, part = 'deck' }: UseChatProcessorProps): ChatProcessor => {
25
32
  const aiClient = useCapability(AssistantCapabilities.AiClient);
26
33
  const globalTools = useCapabilities(Capabilities.Tools);
27
34
  const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
@@ -41,6 +48,7 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
41
48
  // Tools and context.
42
49
  const config = useConfig();
43
50
  const functions = useQuery(space, Filter.schema(FunctionType));
51
+ const chatId = useMemo(() => (chat ? fullyQualifiedId(chat) : undefined), [chat]);
44
52
  const [tools, extensions] = useMemo(() => {
45
53
  log('creating tools...');
46
54
  const tools = [
@@ -51,9 +59,9 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
51
59
  .map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))
52
60
  .filter(isNonNullable),
53
61
  ];
54
- const extensions = { space, dispatch };
62
+ const extensions = { space, dispatch, pivotId: chatId, part };
55
63
  return [tools, extensions];
56
- }, [dispatch, globalTools, artifactDefinitions, space, serviceTools, functions]);
64
+ }, [dispatch, globalTools, artifactDefinitions, space, chatId, serviceTools, functions]);
57
65
 
58
66
  // Prompt.
59
67
  const systemPrompt = useMemo(
@@ -64,17 +72,18 @@ export const useChatProcessor = (space?: Space, settings?: AssistantSettingsProp
64
72
  [artifactDefinitions],
65
73
  );
66
74
 
75
+ // TODO(burdon): Remove default (let backend decide if not specified).
76
+ const model =
77
+ settings?.llmProvider === 'ollama'
78
+ ? settings?.ollamaModel ?? DEFAULT_OLLAMA_MODEL
79
+ : settings?.edgeModel ?? DEFAULT_EDGE_MODEL;
80
+
67
81
  // Create processor.
68
- // TODO(burdon): Updated on each query update above. Should just update current processor.
82
+ // TODO(burdon): Updated on each query update above; should just update current processor.
69
83
  const processor = useMemo(() => {
70
84
  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]);
85
+ return new ChatProcessor(aiClient.value, tools, extensions, { model, systemPrompt });
86
+ }, [aiClient.value, tools, extensions, model, systemPrompt]);
78
87
 
79
88
  return processor;
80
89
  };
@@ -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,8 +6,7 @@ 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
 
@@ -18,6 +17,5 @@ export const useMessageQueue = (chat?: AIChatType) => {
18
17
  return dxn ? new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space.id, dxn.parts.at(-1)!]) : undefined;
19
18
  }, [space, chat?.queue.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';
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { describe, expect, test } from 'vitest';
6
6
 
7
- import { AIServiceClientImpl } from '@dxos/assistant';
7
+ import { AIServiceEdgeClient } from '@dxos/assistant';
8
8
  import { AI_SERVICE_ENDPOINT } from '@dxos/assistant/testing';
9
9
  import { log } from '@dxos/log';
10
10
 
@@ -72,7 +72,7 @@ describe.skip('openapi', () => {
72
72
  authorization: AMADEUS_AUTH,
73
73
  });
74
74
 
75
- const client = new AIServiceClientImpl({
75
+ const client = new AIServiceEdgeClient({
76
76
  endpoint: AI_SERVICE_ENDPOINT.LOCAL,
77
77
  });
78
78
  const processor = new ChatProcessor(client, tools);
@@ -87,7 +87,7 @@ describe.skip('openapi', () => {
87
87
  test('amadeus hotel name autocomplete', { timeout: 60_000 }, async () => {
88
88
  const tools = await createToolsFromApi(HOTEL_NAME_AUTOCOMPLETE_API, { authorization: AMADEUS_AUTH });
89
89
 
90
- const client = new AIServiceClientImpl({
90
+ const client = new AIServiceEdgeClient({
91
91
  endpoint: AI_SERVICE_ENDPOINT.LOCAL,
92
92
  });
93
93
  const processor = new ChatProcessor(client, tools);
@@ -102,7 +102,7 @@ describe.skip('openapi', () => {
102
102
  instructions: WEATHER_INSTRUCTIONS,
103
103
  });
104
104
 
105
- const client = new AIServiceClientImpl({
105
+ const client = new AIServiceEdgeClient({
106
106
  endpoint: AI_SERVICE_ENDPOINT.LOCAL,
107
107
  });
108
108
  const processor = new ChatProcessor(client, tools);
@@ -16,6 +16,7 @@ export default [
16
16
  },
17
17
  [ASSISTANT_PLUGIN]: {
18
18
  'chat title placeholder': 'AI Chat',
19
+ 'templates label': 'Templates',
19
20
  'template title placeholder': 'Template',
20
21
 
21
22
  'open ambient chat label': 'Open AI chat',
@@ -27,6 +28,8 @@ export default [
27
28
  'command placeholder': 'Enter slash command...',
28
29
  'template placeholder': 'Enter template...',
29
30
  'value placeholder': 'Enter value...',
31
+ 'typename placeholder': 'Enter typename of objects which this template is for',
32
+ 'description placeholder': 'Enter description of when this template should be used',
30
33
  'select preset template placeholder': 'Select preset',
31
34
  'service registry label': 'Service Registry',
32
35
 
@@ -40,9 +43,11 @@ export default [
40
43
  'microphone button': 'Click to speak',
41
44
  'cancel processing button': 'Stop processing',
42
45
 
43
- 'settings custom prompts label': 'Custom prompts',
44
- 'settings llm model label': 'LLM model',
45
- 'settings default llm model label': 'Default Model',
46
+ 'settings default label': 'Default',
47
+ 'settings custom prompts label': 'Use custom prompts',
48
+ 'settings llm provider label': 'Enable Ollama integration',
49
+ 'settings edge llm model label': 'Remote language model',
50
+ 'settings ollama llm model label': 'Ollama language model',
46
51
  },
47
52
  },
48
53
  },
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { ComputeGraph } from '@dxos/conductor';
6
6
  import { Ref, S, TypedObject, type Ref$ } from '@dxos/echo-schema';
7
- import { FunctionType } from '@dxos/functions';
7
+ import { FunctionType } from '@dxos/functions/types';
8
8
 
9
9
  const ApiAuthorizationKey = S.Struct({
10
10
  type: S.Literal('api-key'),