@dxos/plugin-assistant 0.8.4-main.2e9d522 → 0.8.4-main.548089c

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 (473) hide show
  1. package/dist/lib/browser/BlueprintArticle-UGPRZRBG.mjs +36 -0
  2. package/dist/lib/browser/BlueprintArticle-UGPRZRBG.mjs.map +7 -0
  3. package/dist/lib/browser/ChatCompanion-BZGANK56.mjs +158 -0
  4. package/dist/lib/browser/ChatCompanion-BZGANK56.mjs.map +7 -0
  5. package/dist/lib/browser/ChatContainer-OG6Y3NHI.mjs +77 -0
  6. package/dist/lib/browser/ChatContainer-OG6Y3NHI.mjs.map +7 -0
  7. package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs → ChatDialog-NKNUCC3R.mjs} +30 -12
  8. package/dist/lib/browser/ChatDialog-NKNUCC3R.mjs.map +7 -0
  9. package/dist/lib/browser/PromptArticle-QNJAXD5Y.mjs +89 -0
  10. package/dist/lib/browser/PromptArticle-QNJAXD5Y.mjs.map +7 -0
  11. package/dist/lib/browser/ai-service-ERTZBTP3.mjs +19 -0
  12. package/dist/lib/browser/ai-service-ERTZBTP3.mjs.map +7 -0
  13. package/dist/lib/browser/app-graph-builder-CJ5ZUG5I.mjs +199 -0
  14. package/dist/lib/browser/app-graph-builder-CJ5ZUG5I.mjs.map +7 -0
  15. package/dist/lib/browser/blueprint-definition-5FT5JGPY.mjs +12 -0
  16. package/dist/lib/browser/blueprint-definition-5FT5JGPY.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-AO6XHMQ7.mjs +262 -0
  18. package/dist/lib/browser/chunk-AO6XHMQ7.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-BNTPFZ7O.mjs +229 -0
  20. package/dist/lib/browser/chunk-BNTPFZ7O.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-FJQ4ZRYJ.mjs +335 -0
  22. package/dist/lib/browser/chunk-FJQ4ZRYJ.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-IXIIS4QA.mjs +176 -0
  24. package/dist/lib/browser/chunk-IXIIS4QA.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  26. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-LRE4VEZV.mjs +16 -0
  28. package/dist/lib/browser/chunk-LRE4VEZV.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-WBG5PTSX.mjs +23 -0
  30. package/dist/lib/browser/chunk-WBG5PTSX.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-Y4C2CMME.mjs +1946 -0
  32. package/dist/lib/browser/chunk-Y4C2CMME.mjs.map +7 -0
  33. package/dist/lib/browser/edge-model-resolver-O6OFYIO2.mjs +18 -0
  34. package/dist/lib/browser/edge-model-resolver-O6OFYIO2.mjs.map +7 -0
  35. package/dist/lib/browser/index.mjs +218 -84
  36. package/dist/lib/browser/index.mjs.map +4 -4
  37. package/dist/lib/browser/intent-resolver-42A4SLIQ.mjs +143 -0
  38. package/dist/lib/browser/intent-resolver-42A4SLIQ.mjs.map +7 -0
  39. package/dist/lib/browser/local-model-resolver-34MVHRKD.mjs +17 -0
  40. package/dist/lib/browser/local-model-resolver-34MVHRKD.mjs.map +7 -0
  41. package/dist/lib/browser/meta.json +1 -1
  42. package/dist/lib/browser/react-surface-TULJF2Y3.mjs +98 -0
  43. package/dist/lib/browser/react-surface-TULJF2Y3.mjs.map +7 -0
  44. package/dist/lib/browser/{settings-2DGP3UTS.mjs → settings-NYJGNQ5I.mjs} +8 -7
  45. package/dist/lib/{node-esm/settings-47RYZOU4.mjs.map → browser/settings-NYJGNQ5I.mjs.map} +1 -1
  46. package/dist/lib/browser/state-GG7Z3NB7.mjs +25 -0
  47. package/dist/lib/browser/state-GG7Z3NB7.mjs.map +7 -0
  48. package/dist/lib/browser/toolkit-VYDAWNE4.mjs +17 -0
  49. package/dist/lib/browser/toolkit-VYDAWNE4.mjs.map +7 -0
  50. package/dist/lib/browser/types/index.mjs +7 -4
  51. package/dist/lib/node-esm/BlueprintArticle-RPZ2363K.mjs +37 -0
  52. package/dist/lib/node-esm/BlueprintArticle-RPZ2363K.mjs.map +7 -0
  53. package/dist/lib/node-esm/ChatCompanion-LKWZTSCI.mjs +159 -0
  54. package/dist/lib/node-esm/ChatCompanion-LKWZTSCI.mjs.map +7 -0
  55. package/dist/lib/node-esm/{ChatContainer-VZT74PO2.mjs → ChatContainer-HGAAKVB3.mjs} +38 -15
  56. package/dist/lib/node-esm/ChatContainer-HGAAKVB3.mjs.map +7 -0
  57. package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs → ChatDialog-QA545GGB.mjs} +30 -12
  58. package/dist/lib/node-esm/ChatDialog-QA545GGB.mjs.map +7 -0
  59. package/dist/lib/node-esm/PromptArticle-JW46XL4M.mjs +90 -0
  60. package/dist/lib/node-esm/PromptArticle-JW46XL4M.mjs.map +7 -0
  61. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs +20 -0
  62. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs.map +7 -0
  63. package/dist/lib/node-esm/app-graph-builder-XPQLG755.mjs +200 -0
  64. package/dist/lib/node-esm/app-graph-builder-XPQLG755.mjs.map +7 -0
  65. package/dist/lib/node-esm/blueprint-definition-XW6QQVLV.mjs +13 -0
  66. package/dist/lib/node-esm/blueprint-definition-XW6QQVLV.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-3YVWS6OI.mjs +264 -0
  68. package/dist/lib/node-esm/chunk-3YVWS6OI.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-AB74FOA2.mjs +230 -0
  70. package/dist/lib/node-esm/chunk-AB74FOA2.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  72. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-KJGD4EBJ.mjs +336 -0
  74. package/dist/lib/node-esm/chunk-KJGD4EBJ.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-UXTUHH24.mjs +178 -0
  76. package/dist/lib/node-esm/chunk-UXTUHH24.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-VI6S3Q5H.mjs +1947 -0
  78. package/dist/lib/node-esm/chunk-VI6S3Q5H.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-WE6KTH72.mjs +25 -0
  80. package/dist/lib/node-esm/chunk-WE6KTH72.mjs.map +7 -0
  81. package/dist/lib/node-esm/chunk-YWFWT57N.mjs +17 -0
  82. package/dist/lib/node-esm/chunk-YWFWT57N.mjs.map +7 -0
  83. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs +19 -0
  84. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs.map +7 -0
  85. package/dist/lib/node-esm/index.mjs +218 -84
  86. package/dist/lib/node-esm/index.mjs.map +4 -4
  87. package/dist/lib/node-esm/intent-resolver-Y6I3IDSI.mjs +144 -0
  88. package/dist/lib/node-esm/intent-resolver-Y6I3IDSI.mjs.map +7 -0
  89. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs +18 -0
  90. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs.map +7 -0
  91. package/dist/lib/node-esm/meta.json +1 -1
  92. package/dist/lib/node-esm/react-surface-C4WY3WRR.mjs +99 -0
  93. package/dist/lib/node-esm/react-surface-C4WY3WRR.mjs.map +7 -0
  94. package/dist/lib/node-esm/{settings-47RYZOU4.mjs → settings-RRHYI5KO.mjs} +8 -7
  95. package/dist/lib/{browser/settings-2DGP3UTS.mjs.map → node-esm/settings-RRHYI5KO.mjs.map} +1 -1
  96. package/dist/lib/node-esm/state-FSUHFMDM.mjs +26 -0
  97. package/dist/lib/node-esm/state-FSUHFMDM.mjs.map +7 -0
  98. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs +18 -0
  99. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs.map +7 -0
  100. package/dist/lib/node-esm/types/index.mjs +7 -4
  101. package/dist/types/src/AssistantPlugin.d.ts +1 -1
  102. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/ai-service.d.ts +4 -0
  104. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  106. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/blueprint-definition.d.ts +7 -0
  108. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/capabilities.d.ts +10 -0
  110. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/edge-model-resolver.d.ts +4 -0
  112. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/index.d.ts +11 -3
  114. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  116. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/local-model-resolver.d.ts +10 -0
  118. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  120. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/settings.d.ts +1 -1
  122. package/dist/types/src/capabilities/state.d.ts +4 -0
  123. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/toolkit.d.ts +4 -0
  125. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  126. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  127. package/dist/types/src/components/BlueprintArticle.d.ts +7 -0
  128. package/dist/types/src/components/BlueprintArticle.d.ts.map +1 -0
  129. package/dist/types/src/components/Chat/Chat.d.ts +35 -21
  130. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  131. package/dist/types/src/components/Chat/events.d.ts +9 -0
  132. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  133. package/dist/types/src/components/ChatCompanion.d.ts +13 -0
  134. package/dist/types/src/components/ChatCompanion.d.ts.map +1 -0
  135. package/dist/types/src/components/ChatContainer.d.ts +9 -6
  136. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  137. package/dist/types/src/components/ChatDialog.d.ts.map +1 -1
  138. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts +7 -0
  139. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts.map +1 -0
  140. package/dist/types/src/components/ChatProgress/index.d.ts +2 -0
  141. package/dist/types/src/components/ChatProgress/index.d.ts.map +1 -0
  142. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  143. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +20 -0
  144. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -0
  145. package/dist/types/src/components/ChatPrompt/ChatPresets.d.ts.map +1 -1
  146. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +4 -5
  147. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  148. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +6 -4
  149. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +1 -1
  150. package/dist/types/src/components/ChatPrompt/index.d.ts +1 -1
  151. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  152. package/dist/types/src/components/ChatThread/ChatThread.d.ts +12 -10
  153. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  154. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +164 -70
  155. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ChatThread/Link.d.ts +9 -0
  157. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -0
  158. package/dist/types/src/components/ChatThread/reducers.d.ts +40 -0
  159. package/dist/types/src/components/ChatThread/reducers.d.ts.map +1 -0
  160. package/dist/types/src/components/ChatThread/registry.d.ts +11 -0
  161. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -0
  162. package/dist/types/src/components/ChatThread/sync.d.ts +42 -0
  163. package/dist/types/src/components/ChatThread/sync.d.ts.map +1 -0
  164. package/dist/types/src/components/ChatThread/sync.test.d.ts +2 -0
  165. package/dist/types/src/components/ChatThread/sync.test.d.ts.map +1 -0
  166. package/dist/types/src/components/PromptArticle.d.ts +7 -0
  167. package/dist/types/src/components/PromptArticle.d.ts.map +1 -0
  168. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +3 -6
  169. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  170. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +312 -7
  171. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  172. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +3 -2
  173. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  174. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +309 -2
  175. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  176. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts +12 -0
  177. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +1 -0
  178. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts +3 -0
  179. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts.map +1 -0
  180. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts +8 -0
  181. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts.map +1 -0
  182. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +21 -0
  183. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -0
  184. package/dist/types/src/components/ToolBlock/ToolBlockWidget.d.ts +2 -0
  185. package/dist/types/src/components/ToolBlock/ToolBlockWidget.d.ts.map +1 -0
  186. package/dist/types/src/components/ToolBlock/index.d.ts +3 -0
  187. package/dist/types/src/components/ToolBlock/index.d.ts.map +1 -0
  188. package/dist/types/src/components/Toolbox/Toolbox.d.ts +6 -11
  189. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  190. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +313 -5
  191. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  192. package/dist/types/src/components/index.d.ts +4 -6
  193. package/dist/types/src/components/index.d.ts.map +1 -1
  194. package/dist/types/src/events.d.ts +1 -1
  195. package/dist/types/src/events.d.ts.map +1 -1
  196. package/dist/types/src/functions/analysis.d.ts +5 -0
  197. package/dist/types/src/functions/analysis.d.ts.map +1 -0
  198. package/dist/types/src/functions/index.d.ts +4 -0
  199. package/dist/types/src/functions/index.d.ts.map +1 -0
  200. package/dist/types/src/functions/object-list.d.ts +10 -0
  201. package/dist/types/src/functions/object-list.d.ts.map +1 -0
  202. package/dist/types/src/functions/object-load.d.ts +8 -0
  203. package/dist/types/src/functions/object-load.d.ts.map +1 -0
  204. package/dist/types/src/hooks/index.d.ts +8 -3
  205. package/dist/types/src/hooks/index.d.ts.map +1 -1
  206. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +25 -0
  207. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -0
  208. package/dist/types/src/hooks/useChatProcessor.d.ts +8 -19
  209. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  210. package/dist/types/src/hooks/useChatServices.d.ts +5 -6
  211. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  212. package/dist/types/src/hooks/useChatToolbarActions.d.ts +8 -0
  213. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -0
  214. package/dist/types/src/hooks/useContextBinder.d.ts +4 -0
  215. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -0
  216. package/dist/types/src/hooks/useContextObjects.d.ts +15 -0
  217. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -0
  218. package/dist/types/src/hooks/useFlush.d.ts +6 -0
  219. package/dist/types/src/hooks/useFlush.d.ts.map +1 -0
  220. package/dist/types/src/hooks/useItemTypes.d.ts +4 -0
  221. package/dist/types/src/hooks/useItemTypes.d.ts.map +1 -0
  222. package/dist/types/src/hooks/useOnline.d.ts +3 -0
  223. package/dist/types/src/hooks/useOnline.d.ts.map +1 -0
  224. package/dist/types/src/hooks/usePresets.d.ts +7 -0
  225. package/dist/types/src/hooks/usePresets.d.ts.map +1 -0
  226. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  227. package/dist/types/src/index.d.ts +2 -0
  228. package/dist/types/src/index.d.ts.map +1 -1
  229. package/dist/types/src/meta.d.ts +1 -2
  230. package/dist/types/src/meta.d.ts.map +1 -1
  231. package/dist/types/src/processor/index.d.ts +4 -0
  232. package/dist/types/src/processor/index.d.ts.map +1 -0
  233. package/dist/types/src/{hooks → processor}/presets.d.ts +3 -3
  234. package/dist/types/src/processor/presets.d.ts.map +1 -0
  235. package/dist/types/src/processor/processor.d.ts +74 -0
  236. package/dist/types/src/processor/processor.d.ts.map +1 -0
  237. package/dist/types/src/processor/processor.test.d.ts +2 -0
  238. package/dist/types/src/processor/processor.test.d.ts.map +1 -0
  239. package/dist/types/src/processor/update-name.d.ts +10 -0
  240. package/dist/types/src/processor/update-name.d.ts.map +1 -0
  241. package/dist/types/src/queue-logger.d.ts.map +1 -1
  242. package/dist/types/src/testing/index.d.ts +1 -1
  243. package/dist/types/src/testing/index.d.ts.map +1 -1
  244. package/dist/types/src/testing/test-generator.d.ts +7 -0
  245. package/dist/types/src/testing/test-generator.d.ts.map +1 -0
  246. package/dist/types/src/testing/test-sequence.d.ts +0 -4
  247. package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
  248. package/dist/types/src/testing/test-services.d.ts +2 -2
  249. package/dist/types/src/testing/test-services.d.ts.map +1 -1
  250. package/dist/types/src/translations.d.ts +257 -37
  251. package/dist/types/src/translations.d.ts.map +1 -1
  252. package/dist/types/src/types/Assistant.d.ts +48 -0
  253. package/dist/types/src/types/Assistant.d.ts.map +1 -0
  254. package/dist/types/src/types/AssistantAction.d.ts +132 -0
  255. package/dist/types/src/types/AssistantAction.d.ts.map +1 -0
  256. package/dist/types/src/types/defs.d.ts +2 -0
  257. package/dist/types/src/types/defs.d.ts.map +1 -0
  258. package/dist/types/src/types/index.d.ts +3 -1
  259. package/dist/types/src/types/index.d.ts.map +1 -1
  260. package/dist/types/src/types/service.d.ts +24 -18
  261. package/dist/types/src/types/service.d.ts.map +1 -1
  262. package/dist/types/tsconfig.tsbuildinfo +1 -1
  263. package/package.json +98 -93
  264. package/src/AssistantPlugin.tsx +169 -82
  265. package/src/capabilities/ai-service.ts +27 -0
  266. package/src/capabilities/app-graph-builder.ts +102 -145
  267. package/src/capabilities/blueprint-definition.ts +66 -0
  268. package/src/capabilities/capabilities.ts +17 -0
  269. package/src/capabilities/edge-model-resolver.ts +25 -0
  270. package/src/capabilities/index.ts +9 -0
  271. package/src/capabilities/intent-resolver.ts +103 -14
  272. package/src/capabilities/local-model-resolver.ts +30 -0
  273. package/src/capabilities/react-surface.tsx +26 -77
  274. package/src/capabilities/state.ts +22 -0
  275. package/src/capabilities/toolkit.ts +17 -0
  276. package/src/components/AssistantSettings/AssistantSettings.tsx +83 -76
  277. package/src/components/BlueprintArticle.tsx +29 -0
  278. package/src/components/Chat/Chat.tsx +260 -198
  279. package/src/components/Chat/events.ts +13 -0
  280. package/src/components/ChatCompanion.tsx +155 -0
  281. package/src/components/ChatContainer.tsx +36 -20
  282. package/src/components/ChatDialog.tsx +25 -14
  283. package/src/components/ChatProgress/ChatProgress.tsx +67 -0
  284. package/src/components/{SequenceEditor → ChatProgress}/index.ts +1 -1
  285. package/src/components/ChatPrompt/ChatActions.tsx +10 -26
  286. package/src/components/ChatPrompt/ChatOptions.tsx +228 -0
  287. package/src/components/ChatPrompt/ChatPresets.tsx +1 -0
  288. package/src/components/ChatPrompt/ChatReferences.tsx +31 -36
  289. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +25 -22
  290. package/src/components/ChatPrompt/index.ts +1 -1
  291. package/src/components/ChatThread/ChatThread.stories.tsx +120 -115
  292. package/src/components/ChatThread/ChatThread.tsx +65 -35
  293. package/src/components/ChatThread/Link.tsx +26 -0
  294. package/src/components/ChatThread/reducers.ts +151 -0
  295. package/src/components/ChatThread/registry.tsx +174 -0
  296. package/src/components/ChatThread/sync.test.ts +89 -0
  297. package/src/components/ChatThread/sync.ts +148 -0
  298. package/src/components/ChatThread/testing/thread.md +37 -0
  299. package/src/components/PromptArticle.tsx +85 -0
  300. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +40 -19
  301. package/src/components/TemplateEditor/TemplateEditor.tsx +29 -51
  302. package/src/components/TemplateEditor/TemplateForm.stories.tsx +18 -13
  303. package/src/components/TemplateEditor/TemplateForm.tsx +8 -5
  304. package/src/components/TemplateEditor/extensions/handlebars-extension.ts +269 -0
  305. package/src/components/TemplateEditor/extensions/index.ts +6 -0
  306. package/src/components/TemplateEditor/extensions/xml-extension.ts +64 -0
  307. package/src/components/ToolBlock/ToolBlock.tsx +143 -0
  308. package/src/components/ToolBlock/ToolBlockWidget.tsx +5 -0
  309. package/src/components/ToolBlock/index.ts +6 -0
  310. package/src/components/Toolbox/Toolbox.stories.tsx +14 -23
  311. package/src/components/Toolbox/Toolbox.tsx +25 -55
  312. package/src/components/index.ts +3 -7
  313. package/src/events.ts +2 -2
  314. package/src/functions/analysis.ts +22 -0
  315. package/src/functions/index.ts +7 -0
  316. package/src/functions/object-list.ts +48 -0
  317. package/src/functions/object-load.ts +45 -0
  318. package/src/hooks/index.ts +8 -4
  319. package/src/hooks/useBlueprintRegistry.ts +95 -0
  320. package/src/hooks/useChatProcessor.ts +35 -104
  321. package/src/hooks/useChatServices.ts +33 -73
  322. package/src/hooks/useChatToolbarActions.ts +122 -0
  323. package/src/hooks/useContextBinder.ts +30 -0
  324. package/src/hooks/useContextObjects.ts +58 -0
  325. package/src/hooks/useFlush.ts +35 -0
  326. package/src/hooks/useItemTypes.ts +37 -0
  327. package/src/hooks/useOnline.ts +10 -0
  328. package/src/hooks/usePresets.ts +44 -0
  329. package/src/hooks/useReferencesProvider.ts +13 -10
  330. package/src/index.ts +2 -0
  331. package/src/meta.ts +9 -6
  332. package/src/processor/index.ts +7 -0
  333. package/src/{hooks → processor}/presets.ts +16 -8
  334. package/src/processor/processor.test.ts +71 -0
  335. package/src/processor/processor.ts +277 -0
  336. package/src/processor/update-name.ts +56 -0
  337. package/src/queue-logger.ts +13 -17
  338. package/src/testing/index.ts +1 -1
  339. package/src/testing/test-generator.ts +261 -0
  340. package/src/testing/test-sequence.ts +2 -27
  341. package/src/testing/test-services.ts +2 -8
  342. package/src/translations.ts +44 -26
  343. package/src/types/Assistant.ts +63 -0
  344. package/src/types/AssistantAction.ts +79 -0
  345. package/src/types/defs.ts +5 -0
  346. package/src/types/index.ts +4 -1
  347. package/src/types/service.ts +17 -9
  348. package/src/vite-env.d.ts +30 -0
  349. package/dist/lib/browser/ChatContainer-M3IHQLRS.mjs +0 -54
  350. package/dist/lib/browser/ChatContainer-M3IHQLRS.mjs.map +0 -7
  351. package/dist/lib/browser/ChatDialog-X6VN6QZI.mjs.map +0 -7
  352. package/dist/lib/browser/SequenceContainer-3UDVKWPA.mjs +0 -162
  353. package/dist/lib/browser/SequenceContainer-3UDVKWPA.mjs.map +0 -7
  354. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs +0 -27
  355. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs.map +0 -7
  356. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs +0 -223
  357. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-AEAEKWOC.mjs +0 -98
  359. package/dist/lib/browser/chunk-AEAEKWOC.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-EQDW6BYQ.mjs +0 -108
  361. package/dist/lib/browser/chunk-EQDW6BYQ.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-FDCJSQYF.mjs +0 -40
  363. package/dist/lib/browser/chunk-FDCJSQYF.mjs.map +0 -7
  364. package/dist/lib/browser/chunk-JQBVLTM5.mjs +0 -158
  365. package/dist/lib/browser/chunk-JQBVLTM5.mjs.map +0 -7
  366. package/dist/lib/browser/chunk-OWY4CUQY.mjs +0 -2245
  367. package/dist/lib/browser/chunk-OWY4CUQY.mjs.map +0 -7
  368. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs +0 -60
  369. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs.map +0 -7
  370. package/dist/lib/browser/react-surface-66VY37YQ.mjs +0 -150
  371. package/dist/lib/browser/react-surface-66VY37YQ.mjs.map +0 -7
  372. package/dist/lib/node-esm/ChatContainer-VZT74PO2.mjs.map +0 -7
  373. package/dist/lib/node-esm/ChatDialog-RJ6FDX4Q.mjs.map +0 -7
  374. package/dist/lib/node-esm/SequenceContainer-RQQH5XOC.mjs +0 -163
  375. package/dist/lib/node-esm/SequenceContainer-RQQH5XOC.mjs.map +0 -7
  376. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs +0 -28
  377. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs.map +0 -7
  378. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs +0 -224
  379. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs.map +0 -7
  380. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs +0 -99
  381. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs.map +0 -7
  382. package/dist/lib/node-esm/chunk-BISJDTBK.mjs +0 -159
  383. package/dist/lib/node-esm/chunk-BISJDTBK.mjs.map +0 -7
  384. package/dist/lib/node-esm/chunk-E33DNNDW.mjs +0 -109
  385. package/dist/lib/node-esm/chunk-E33DNNDW.mjs.map +0 -7
  386. package/dist/lib/node-esm/chunk-QN2H2EHV.mjs +0 -41
  387. package/dist/lib/node-esm/chunk-QN2H2EHV.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-SENTQAEO.mjs +0 -2246
  389. package/dist/lib/node-esm/chunk-SENTQAEO.mjs.map +0 -7
  390. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs +0 -61
  391. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs.map +0 -7
  392. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs +0 -151
  393. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs.map +0 -7
  394. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts +0 -9
  395. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts.map +0 -1
  396. package/dist/types/src/components/ChatThread/ChatMessage.d.ts +0 -17
  397. package/dist/types/src/components/ChatThread/ChatMessage.d.ts.map +0 -1
  398. package/dist/types/src/components/ChatThread/ToolBlock.d.ts +0 -19
  399. package/dist/types/src/components/ChatThread/ToolBlock.d.ts.map +0 -1
  400. package/dist/types/src/components/ChatThread/reducer.d.ts +0 -12
  401. package/dist/types/src/components/ChatThread/reducer.d.ts.map +0 -1
  402. package/dist/types/src/components/PromptSettings.d.ts +0 -6
  403. package/dist/types/src/components/PromptSettings.d.ts.map +0 -1
  404. package/dist/types/src/components/SequenceContainer.d.ts +0 -8
  405. package/dist/types/src/components/SequenceContainer.d.ts.map +0 -1
  406. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts +0 -13
  407. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts.map +0 -1
  408. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts +0 -8
  409. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts.map +0 -1
  410. package/dist/types/src/components/SequenceEditor/index.d.ts +0 -2
  411. package/dist/types/src/components/SequenceEditor/index.d.ts.map +0 -1
  412. package/dist/types/src/components/TemplateContainer.d.ts +0 -8
  413. package/dist/types/src/components/TemplateContainer.d.ts.map +0 -1
  414. package/dist/types/src/hooks/chat-processor.d.ts +0 -86
  415. package/dist/types/src/hooks/chat-processor.d.ts.map +0 -1
  416. package/dist/types/src/hooks/chat-processor.test.d.ts +0 -2
  417. package/dist/types/src/hooks/chat-processor.test.d.ts.map +0 -1
  418. package/dist/types/src/hooks/presets.d.ts.map +0 -1
  419. package/dist/types/src/hooks/useBlueprints.d.ts +0 -9
  420. package/dist/types/src/hooks/useBlueprints.d.ts.map +0 -1
  421. package/dist/types/src/parser/filter-generator.d.ts +0 -4
  422. package/dist/types/src/parser/filter-generator.d.ts.map +0 -1
  423. package/dist/types/src/parser/filter-generator.test.d.ts +0 -2
  424. package/dist/types/src/parser/filter-generator.test.d.ts.map +0 -1
  425. package/dist/types/src/parser/index.d.ts +0 -4
  426. package/dist/types/src/parser/index.d.ts.map +0 -1
  427. package/dist/types/src/parser/query-parser.d.ts +0 -15
  428. package/dist/types/src/parser/query-parser.d.ts.map +0 -1
  429. package/dist/types/src/parser/query-parser.test.d.ts +0 -2
  430. package/dist/types/src/parser/query-parser.test.d.ts.map +0 -1
  431. package/dist/types/src/parser/types.d.ts +0 -24
  432. package/dist/types/src/parser/types.d.ts.map +0 -1
  433. package/dist/types/src/stories/Chat.stories.d.ts +0 -249
  434. package/dist/types/src/stories/Chat.stories.d.ts.map +0 -1
  435. package/dist/types/src/testing/test-functions.d.ts +0 -3
  436. package/dist/types/src/testing/test-functions.d.ts.map +0 -1
  437. package/dist/types/src/tools/function.d.ts +0 -5
  438. package/dist/types/src/tools/function.d.ts.map +0 -1
  439. package/dist/types/src/tools/index.d.ts +0 -3
  440. package/dist/types/src/tools/index.d.ts.map +0 -1
  441. package/dist/types/src/tools/openapi.d.ts +0 -10
  442. package/dist/types/src/tools/openapi.d.ts.map +0 -1
  443. package/dist/types/src/tools/openapi.test.d.ts +0 -2
  444. package/dist/types/src/tools/openapi.test.d.ts.map +0 -1
  445. package/dist/types/src/types/schema.d.ts +0 -88
  446. package/dist/types/src/types/schema.d.ts.map +0 -1
  447. package/src/components/ChatPrompt/ChatOptionsMenu.tsx +0 -52
  448. package/src/components/ChatThread/ChatMessage.tsx +0 -268
  449. package/src/components/ChatThread/ToolBlock.tsx +0 -121
  450. package/src/components/ChatThread/reducer.ts +0 -52
  451. package/src/components/PromptSettings.tsx +0 -89
  452. package/src/components/SequenceContainer.tsx +0 -132
  453. package/src/components/SequenceEditor/SequenceEditor.stories.tsx +0 -32
  454. package/src/components/SequenceEditor/SequenceEditor.tsx +0 -50
  455. package/src/components/TemplateContainer.tsx +0 -24
  456. package/src/hooks/chat-processor.test.ts +0 -16
  457. package/src/hooks/chat-processor.ts +0 -314
  458. package/src/hooks/useBlueprints.ts +0 -57
  459. package/src/parser/filter-generator.test.ts +0 -32
  460. package/src/parser/filter-generator.ts +0 -81
  461. package/src/parser/index.ts +0 -7
  462. package/src/parser/query-parser.test.ts +0 -139
  463. package/src/parser/query-parser.ts +0 -199
  464. package/src/parser/types.ts +0 -34
  465. package/src/shims.d.ts +0 -8
  466. package/src/stories/Chat.stories.tsx +0 -378
  467. package/src/testing/test-functions.ts +0 -11
  468. package/src/tools/function.ts +0 -46
  469. package/src/tools/index.ts +0 -6
  470. package/src/tools/openapi.test.ts +0 -217
  471. package/src/tools/openapi.ts +0 -338
  472. package/src/types/schema.ts +0 -95
  473. package/src/typings.d.ts +0 -9
@@ -4,17 +4,17 @@
4
4
 
5
5
  import { useMemo } from 'react';
6
6
 
7
- import { Capabilities, useCapabilities } from '@dxos/app-framework';
7
+ import { Capabilities } from '@dxos/app-framework';
8
+ import { useCapabilities } from '@dxos/app-framework/react';
8
9
  import { type Space } from '@dxos/client/echo';
9
- import { Filter, Obj, type Type } from '@dxos/echo';
10
+ import { Filter, Obj } from '@dxos/echo';
10
11
  import { type ReferencesProvider } from '@dxos/react-ui-chat';
11
12
 
12
13
  /**
13
14
  * Resolve references to objects in the space.
14
15
  */
15
16
  export const useReferencesProvider = (space?: Space): ReferencesProvider | undefined => {
16
- // TODO(burdon): Pass in.
17
- const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
17
+ const blueprints = useCapabilities(Capabilities.BlueprintDefinition);
18
18
 
19
19
  return useMemo<ReferencesProvider | undefined>((): ReferencesProvider | undefined => {
20
20
  if (!space) {
@@ -23,10 +23,13 @@ export const useReferencesProvider = (space?: Space): ReferencesProvider | undef
23
23
 
24
24
  return {
25
25
  getReferences: async ({ query }) => {
26
- const schemas = artifactDefinitions.map((artifact) => artifact.schema);
27
- const { objects } = await space.db
28
- .query(Filter.or(...schemas.map((schema) => Filter.type(schema as Type.Schema))))
29
- .run();
26
+ // TODO(burdon): Previously we filtered by types declared by the artifact definitions.
27
+ // const schemas = blueprints.map((blueprint) => blueprint.schema).flat();
28
+ // const { objects } = await space.db
29
+ // .query(Filter.or(...schemas.map((schema) => Filter.type(schema as Type.Schema))))
30
+ // .run();
31
+
32
+ const { objects } = await space.db.query(Filter.everything()).run();
30
33
 
31
34
  return (
32
35
  objects
@@ -39,7 +42,7 @@ export const useReferencesProvider = (space?: Space): ReferencesProvider | undef
39
42
  // TODO(dmaretskyi): `Type.getDXN` (at the point of writing) didn't work here as it was schema-only.
40
43
  .filter((object) => !!Obj.getDXN(object as Obj.Any))
41
44
  .map((object) => ({
42
- uri: Obj.getDXN(object as any)!.toString(),
45
+ uri: Obj.getDXN(object as any).toString(),
43
46
  label: Obj.getLabel(object as any) ?? '',
44
47
  }))
45
48
  );
@@ -49,7 +52,7 @@ export const useReferencesProvider = (space?: Space): ReferencesProvider | undef
49
52
  return { uri, label: Obj.getLabel(object) ?? '' };
50
53
  },
51
54
  } satisfies ReferencesProvider;
52
- }, [space, artifactDefinitions]);
55
+ }, [space, blueprints]);
53
56
  };
54
57
 
55
58
  const stringMatch = (query: string, label: string) => label.toLowerCase().startsWith(query.toLowerCase());
package/src/index.ts CHANGED
@@ -5,7 +5,9 @@
5
5
  export * from './capabilities';
6
6
  export * from './components';
7
7
  export * from './events';
8
+ export * from './hooks';
8
9
  export * from './meta';
10
+ export * from './translations';
9
11
  export * from './types';
10
12
 
11
13
  export * from './AssistantPlugin';
package/src/meta.ts CHANGED
@@ -3,16 +3,19 @@
3
3
  //
4
4
 
5
5
  import { type PluginMeta } from '@dxos/app-framework';
6
-
7
- export const ASSISTANT_PLUGIN = 'dxos.org/plugin/assistant';
8
-
9
- export const ASSISTANT_DIALOG = `${ASSISTANT_PLUGIN}/assistant/dialog`;
6
+ import { trim } from '@dxos/util';
10
7
 
11
8
  export const meta: PluginMeta = {
12
- id: ASSISTANT_PLUGIN,
9
+ id: 'dxos.org/plugin/assistant',
13
10
  name: 'Assistant',
14
- description: 'The Assistant tab allows you to chat with your spaces inside of Composer.',
11
+ description: trim`
12
+ Intelligent AI assistant that can analyze and interact with objects across your spaces.
13
+ Chat naturally to get insights, search content, and perform actions using AI-powered context awareness.
14
+ `,
15
15
  icon: 'ph--atom--regular',
16
+ iconHue: 'sky',
16
17
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-assistant',
17
18
  tags: ['labs'],
18
19
  };
20
+
21
+ export const ASSISTANT_DIALOG = `${meta.id}/assistant/dialog`;
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './presets';
6
+ export * from './processor';
7
+ export * from './update-name';
@@ -2,9 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
- import { type LLMModel } from '@dxos/ai';
7
+ import { type ModelName } from '@dxos/ai';
8
8
 
9
9
  const ModelProviders = ['dxos-local', 'dxos-remote', 'lm-studio'] as const;
10
10
 
@@ -14,11 +14,11 @@ type ModelProvider = Schema.Schema.Type<typeof ModelProvider>;
14
14
  export type AiServicePreset = {
15
15
  id: string;
16
16
  provider: ModelProvider;
17
- model: LLMModel;
17
+ model: ModelName;
18
18
  label?: string;
19
19
  };
20
20
 
21
- const createModelLabel = (model: LLMModel) => {
21
+ const createModelLabel = (model: ModelName) => {
22
22
  const parts = model.split('/');
23
23
  return parts[parts.length - 1];
24
24
  };
@@ -27,19 +27,27 @@ const createModelLabel = (model: LLMModel) => {
27
27
  export const AiServicePresets: AiServicePreset[] = [
28
28
  {
29
29
  provider: 'dxos-remote' as const,
30
- model: '@anthropic/claude-3-5-haiku-20241022' as const,
30
+ model: '@anthropic/claude-opus-4-0' as const,
31
31
  },
32
32
  {
33
33
  provider: 'dxos-remote' as const,
34
- model: '@anthropic/claude-opus-4-0' as const,
34
+ model: '@anthropic/claude-sonnet-4-0' as const,
35
+ },
36
+ {
37
+ provider: 'dxos-remote' as const,
38
+ model: '@anthropic/claude-3-5-haiku-20241022' as const,
35
39
  },
36
40
  {
37
41
  provider: 'lm-studio' as const,
38
- model: '@google/gemma-3-12b' as const,
42
+ model: '@google/gemma-3-27b' as const,
39
43
  },
40
44
  {
41
45
  provider: 'lm-studio' as const,
42
- model: '@mlx-community/llama-3.2-3b-instruct' as const,
46
+ model: '@meta/llama-3.2-3b-instruct' as const,
47
+ },
48
+ {
49
+ model: 'deepseek-r1:latest' as const,
50
+ provider: 'dxos-local' as const,
43
51
  },
44
52
  ].map(
45
53
  ({ model, provider }, i) =>
@@ -0,0 +1,71 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Tool from '@effect/ai/Tool';
6
+ import * as Toolkit from '@effect/ai/Toolkit';
7
+ import { describe, it } from '@effect/vitest';
8
+ import * as Effect from 'effect/Effect';
9
+ import * as Layer from 'effect/Layer';
10
+ import * as Schema from 'effect/Schema';
11
+
12
+ import { AiService } from '@dxos/ai';
13
+ import { AiServiceTestingPreset } from '@dxos/ai/testing';
14
+ import { AiConversation, makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';
15
+ import { TestHelpers, acquireReleaseResource } from '@dxos/effect';
16
+ import { CredentialsService, QueueService, TracingService } from '@dxos/functions';
17
+ import { FunctionInvocationServiceLayerTestMocked, TestDatabaseLayer } from '@dxos/functions-runtime/testing';
18
+ import { type Message } from '@dxos/types';
19
+
20
+ import { AiChatProcessor, type AiChatServices } from './processor';
21
+
22
+ const TestToolkit = Toolkit.make(
23
+ Tool.make('random', {
24
+ description: 'Random number generator',
25
+ parameters: {},
26
+ success: Schema.Number,
27
+ }),
28
+ );
29
+
30
+ // TODO(burdon): Create minimal toolkit.
31
+ const toolkit = Toolkit.merge(TestToolkit) as Toolkit.Toolkit<any>;
32
+
33
+ // TODO(burdon): Explain structure.
34
+ const TestServicesLayer = Layer.mergeAll(
35
+ TracingService.layerNoop,
36
+ AiServiceTestingPreset('direct'),
37
+ TestDatabaseLayer({
38
+ // indexing: { vector: true },
39
+ // types: [],
40
+ }),
41
+ // CredentialsService.configuredLayer([{ service: 'exa.ai', apiKey: EXA_API_KEY }]),
42
+ FunctionInvocationServiceLayerTestMocked({ functions: [] }).pipe(Layer.provideMerge(TracingService.layerNoop)),
43
+ );
44
+
45
+ const TestLayer: Layer.Layer<AiChatServices, never, never> = Layer.mergeAll(
46
+ AiService.model('@anthropic/claude-opus-4-0'),
47
+ makeToolResolverFromFunctions([], toolkit),
48
+ makeToolExecutionServiceFromFunctions(toolkit, toolkit.toLayer({}) as any),
49
+ CredentialsService.layerFromDatabase(),
50
+ ).pipe(Layer.provideMerge(TestServicesLayer), Layer.orDie);
51
+
52
+ // TODO(burdon): Create actual test with mock LLM.
53
+ describe('Chat processor', () => {
54
+ it.scoped(
55
+ 'basic',
56
+ Effect.fn(
57
+ function* ({ expect }) {
58
+ const services = yield* Effect.runtime<AiChatServices>();
59
+ const queue = yield* QueueService.createQueue<Message.Message>();
60
+ const conversation = yield* acquireReleaseResource(() => new AiConversation(queue));
61
+ const processor = new AiChatProcessor(conversation, async () => services);
62
+ const result = yield* Effect.promise(() => processor.request({ message: 'Hello' }));
63
+ void processor.cancel();
64
+ expect(processor.active).to.be.false;
65
+ expect(result).to.exist;
66
+ },
67
+ Effect.provide(TestLayer),
68
+ TestHelpers.taggedTest('llm'),
69
+ ),
70
+ );
71
+ });
@@ -0,0 +1,277 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Atom, Registry } from '@effect-atom/atom-react';
6
+ import * as Cause from 'effect/Cause';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Exit from 'effect/Exit';
9
+ import * as Fiber from 'effect/Fiber';
10
+ import * as Option from 'effect/Option';
11
+ import * as Runtime from 'effect/Runtime';
12
+
13
+ import {
14
+ AiService,
15
+ DEFAULT_EDGE_MODEL,
16
+ type ModelName,
17
+ type ModelRegistry,
18
+ type ToolExecutionService,
19
+ type ToolResolverService,
20
+ } from '@dxos/ai';
21
+ import {
22
+ type AiConversation,
23
+ type AiConversationRunParams,
24
+ ArtifactDiffResolver,
25
+ GenerationObserver,
26
+ createSystemPrompt,
27
+ } from '@dxos/assistant';
28
+ import { type Blueprint } from '@dxos/blueprints';
29
+ import { Obj } from '@dxos/echo';
30
+ import { throwCause } from '@dxos/effect';
31
+ import {
32
+ type CredentialsService,
33
+ type DatabaseService,
34
+ type FunctionInvocationService,
35
+ type QueueService,
36
+ type TracingService,
37
+ } from '@dxos/functions';
38
+ import { log } from '@dxos/log';
39
+ import { type ContentBlock, Message } from '@dxos/types';
40
+
41
+ import { type Assistant } from '../types';
42
+
43
+ import { updateName } from './update-name';
44
+
45
+ export type AiChatServices =
46
+ | CredentialsService
47
+ | DatabaseService
48
+ | QueueService
49
+ | FunctionInvocationService
50
+ | AiService.AiService
51
+ | ToolExecutionService
52
+ | ToolResolverService
53
+ | TracingService;
54
+
55
+ export type AiChatProcessorOptions = {
56
+ model?: ModelName;
57
+ modelRegistry?: ModelRegistry;
58
+ blueprintRegistry?: Blueprint.Registry;
59
+ observableRegistry?: Registry.Registry;
60
+ extensions?: ToolContextExtensions;
61
+ } & Pick<AiConversationRunParams, 'system'>;
62
+
63
+ const defaultOptions: Partial<AiChatProcessorOptions> = {
64
+ model: DEFAULT_EDGE_MODEL,
65
+ };
66
+
67
+ // TODO(burdon): Retry, timeout?
68
+ export type AiRequestOptions = {};
69
+
70
+ export type AiRequest = {
71
+ message: string;
72
+ options?: AiRequestOptions;
73
+ };
74
+
75
+ /**
76
+ * Handles interactions with the AI service.
77
+ * Handles streaming responses from the conversation.
78
+ */
79
+ export class AiChatProcessor {
80
+ private readonly _rx: Registry.Registry;
81
+
82
+ /** External observer. */
83
+ private readonly _observer: GenerationObserver;
84
+
85
+ /** Currently active request fiber. */
86
+ private _fiber: Fiber.Fiber<void, any> | undefined;
87
+
88
+ /** Last request (for retries). */
89
+ private _lastRequest: AiRequest | undefined;
90
+
91
+ /** Pending messages (incl. the current user request). */
92
+ private readonly _pending = Atom.make<Message.Message[]>([]);
93
+
94
+ /** Currently streaming message (from the AI service). */
95
+ private readonly _streaming = Atom.make<Option.Option<Message.Message>>(Option.none());
96
+
97
+ /** Streaming state. */
98
+ public readonly streaming = Atom.make<boolean>((get) => Option.isSome(get(this._streaming)));
99
+
100
+ /** Active state. */
101
+ public readonly active = Atom.make(false);
102
+
103
+ /** Array of Messages (incl. the current message being streamed). */
104
+ public readonly messages = Atom.make<Message.Message[]>((get) =>
105
+ Option.match(get(this._streaming), {
106
+ onNone: () => get(this._pending),
107
+ onSome: (streaming) => [...get(this._pending), streaming],
108
+ }),
109
+ );
110
+
111
+ /** Last error. */
112
+ public readonly error = Atom.make<Option.Option<Error>>(Option.none());
113
+
114
+ constructor(
115
+ private readonly _conversation: AiConversation,
116
+ // TODO(dmaretskyi): Replace this with effect's ManagedRuntime wrapping this layer.
117
+ private readonly _services: () => Promise<Runtime.Runtime<AiChatServices>>,
118
+ private readonly _options: AiChatProcessorOptions = defaultOptions,
119
+ ) {
120
+ // Initialize registries and defaults before using in other logic.
121
+ this._rx = this._options.observableRegistry ?? Registry.make();
122
+ this._observer = GenerationObserver.make({
123
+ onBlock: this._onBlock,
124
+ onMessage: this._onMessage,
125
+ });
126
+ if (this._options.model && !this._options.system) {
127
+ const capabilities = this._options.modelRegistry?.getCapabilities(this._options.model) ?? {};
128
+ this._options.system = createSystemPrompt(capabilities);
129
+ }
130
+ }
131
+
132
+ get context() {
133
+ return this._conversation.context;
134
+ }
135
+
136
+ get conversation() {
137
+ return this._conversation;
138
+ }
139
+
140
+ get blueprintRegistry() {
141
+ return this._options.blueprintRegistry;
142
+ }
143
+
144
+ /**
145
+ * Initiates a new request.
146
+ */
147
+ async request(requestParam: AiRequest): Promise<void> {
148
+ if (this._fiber) {
149
+ await this.cancel();
150
+ }
151
+
152
+ try {
153
+ this._lastRequest = requestParam;
154
+ this._rx.set(this.error, Option.none());
155
+ this._rx.set(this.active, true);
156
+
157
+ // Create request.
158
+ const request = this._conversation.createRequest({
159
+ system: this._options.system,
160
+ prompt: requestParam.message,
161
+ observer: this._observer,
162
+ });
163
+
164
+ const runtime = await this._services();
165
+
166
+ // Create fiber.
167
+ this._fiber = request.pipe(
168
+ Effect.provide(AiService.model(this._options.model ?? DEFAULT_EDGE_MODEL)),
169
+
170
+ // TODO(dmaretskyi): Move ArtifactDiffResolver upstream.
171
+ Effect.provideService(ArtifactDiffResolver, this._artifactDiffResolver),
172
+
173
+ Effect.asVoid,
174
+ Runtime.runFork(runtime), // Runs in the background.
175
+ );
176
+
177
+ // Execute request.
178
+ const response = await this._fiber.pipe(Fiber.join, Effect.runPromiseExit);
179
+ if (!Exit.isSuccess(response) && !Cause.isInterruptedOnly(response.cause)) {
180
+ throwCause(response.cause);
181
+ }
182
+
183
+ this._rx.set(this.error, Option.none());
184
+ this._lastRequest = undefined;
185
+ this._fiber = undefined;
186
+ } catch (error) {
187
+ log.error('request failed', { error });
188
+ this._rx.set(this.error, Option.some(new Error('AI service error', { cause: error })));
189
+ } finally {
190
+ this._fiber = undefined;
191
+ this._rx.set(this.active, false);
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Cancels the current request.
197
+ */
198
+ async cancel(): Promise<void> {
199
+ await Effect.runPromise(
200
+ Effect.gen(this, function* () {
201
+ if (this._fiber) {
202
+ yield* this._fiber.pipe(Fiber.interrupt);
203
+ }
204
+ }),
205
+ );
206
+
207
+ this._fiber = undefined;
208
+ this._rx.set(this.active, false);
209
+ }
210
+
211
+ /**
212
+ * Retry last failed request.
213
+ */
214
+ async retry(): Promise<void> {
215
+ if (this._lastRequest) {
216
+ return this.request(this._lastRequest);
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Update the current chat's name.
222
+ */
223
+ async updateName(chat: Assistant.Chat): Promise<void> {
224
+ const runtime = await this._services();
225
+ await updateName(runtime, this._conversation, chat, this._options.model);
226
+ }
227
+
228
+ // TODO(burdon): Fix/factor out.
229
+ private _artifactDiffResolver: ArtifactDiffResolver.Service = {
230
+ resolve: async (_artifacts) => {
231
+ const versions = new Map();
232
+ // await Promise.all(
233
+ // artifacts.map(async (artifact) => {
234
+ // const {
235
+ // objects: [object],
236
+ // } = await space.db.query(Filter.ids(artifact.id)).run();
237
+ // if (!object) {
238
+ // return;
239
+ // }
240
+
241
+ // versions.set(artifact.id, {
242
+ // version: getVersion(object),
243
+ // diff: `Current state: ${JSON.stringify(object)}`,
244
+ // });
245
+ // }),
246
+ // );
247
+
248
+ return versions;
249
+ },
250
+ };
251
+
252
+ private _onMessage = Effect.fn(
253
+ function* (this: AiChatProcessor, message: Message.Message) {
254
+ this._rx.set(this._streaming, Option.none());
255
+ this._rx.update(this._pending, (pending) => [...pending, message]);
256
+ }.bind(this),
257
+ );
258
+
259
+ private _onBlock = Effect.fn(
260
+ function* (this: AiChatProcessor, block: ContentBlock.Any) {
261
+ this._rx.update(this._streaming, (streaming) => {
262
+ const blocks = streaming.pipe(
263
+ Option.map((streaming) => streaming.blocks.filter((b: ContentBlock.Any) => !b.pending)),
264
+ Option.getOrElse(() => []),
265
+ );
266
+
267
+ return Option.some(
268
+ Obj.make(Message.Message, {
269
+ created: new Date().toISOString(),
270
+ sender: { role: 'assistant' },
271
+ blocks: [...blocks, block],
272
+ }),
273
+ );
274
+ });
275
+ }.bind(this),
276
+ );
277
+ }
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Exit from 'effect/Exit';
7
+ import * as Fiber from 'effect/Fiber';
8
+ import * as Runtime from 'effect/Runtime';
9
+
10
+ import { AiService, DEFAULT_EDGE_MODEL, type ModelName } from '@dxos/ai';
11
+ import { type AiConversation, AiSession } from '@dxos/assistant';
12
+ import { throwCause } from '@dxos/effect';
13
+ import { trim } from '@dxos/util';
14
+
15
+ import { type Assistant } from '../types';
16
+
17
+ import { type AiChatServices } from './processor';
18
+
19
+ /**
20
+ * Update the current chat's name.
21
+ */
22
+ // TODO(burdon): Convert this into a plugin tool.
23
+ export const updateName = async (
24
+ runtime: Runtime.Runtime<AiChatServices>,
25
+ conversation: AiConversation,
26
+ chat: Assistant.Chat,
27
+ model: ModelName = DEFAULT_EDGE_MODEL,
28
+ ): Promise<void> => {
29
+ const history = await conversation.getHistory();
30
+ const system = trim`
31
+ It is extremely important that you respond only with the title and nothing else.
32
+ If you cannot do this effectively respond with "New Chat".
33
+ `;
34
+ const prompt = 'Suggest a name for this chat';
35
+
36
+ const fiber = Effect.gen(this, function* () {
37
+ const session = new AiSession();
38
+ return yield* session.run({ system, prompt, history });
39
+ }).pipe(
40
+ Effect.provide(AiService.model(model)),
41
+ Effect.tap((messages) => {
42
+ // TODO(burdon): Parse response (should update via tool).
43
+ const message = messages.find((message) => message.sender.role === 'assistant');
44
+ const title = message?.blocks.find((block) => block._tag === 'text')?.text;
45
+ if (title) {
46
+ chat.name = title;
47
+ }
48
+ }),
49
+ Runtime.runFork(runtime), // Run in the background.
50
+ );
51
+
52
+ const response = await fiber.pipe(Fiber.join, Effect.runPromiseExit);
53
+ if (!Exit.isSuccess(response)) {
54
+ throwCause(response.cause);
55
+ }
56
+ };
@@ -2,17 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { getSpace, Ref, type Queue, type Space } from '@dxos/client/echo';
5
+ import { type Queue, Ref, type Space, getSpace } from '@dxos/client/echo';
6
6
  import { type Sequence, type SequenceEvent, type SequenceLogger } from '@dxos/conductor';
7
7
  import { DXN, Key, Obj } from '@dxos/echo';
8
- import {
9
- InvocationOutcome,
10
- InvocationTraceEndEvent,
11
- InvocationTraceEventType,
12
- InvocationTraceStartEvent,
13
- TraceEvent,
14
- type InvocationTraceEvent,
15
- } from '@dxos/functions';
8
+ import { InvocationTraceEndEvent, InvocationTraceEventType, InvocationTraceStartEvent } from '@dxos/functions-runtime';
9
+ import { TraceEvent } from '@dxos/functions-runtime';
10
+ import { InvocationOutcome } from '@dxos/functions-runtime';
11
+ import { type InvocationTraceEvent } from '@dxos/functions-runtime';
16
12
  import { invariant } from '@dxos/invariant';
17
13
  import { QueueSubspaceTags } from '@dxos/keys';
18
14
 
@@ -39,7 +35,7 @@ export class QueueLogger implements SequenceLogger {
39
35
  Obj.make(InvocationTraceStartEvent, {
40
36
  type: InvocationTraceEventType.START,
41
37
  invocationId: event.invocationId,
42
- timestampMs: Date.now(),
38
+ timestamp: Date.now(),
43
39
  input: {},
44
40
  invocationTraceQueue: Ref.fromDXN(this._getTraceQueueDxn(event.invocationId)),
45
41
  invocationTarget: Ref.make(this.sequence),
@@ -51,7 +47,7 @@ export class QueueLogger implements SequenceLogger {
51
47
  Obj.make(InvocationTraceEndEvent, {
52
48
  type: InvocationTraceEventType.END,
53
49
  invocationId: event.invocationId,
54
- timestampMs: Date.now(),
50
+ timestamp: Date.now(),
55
51
  outcome: InvocationOutcome.SUCCESS,
56
52
  }),
57
53
  ]);
@@ -62,10 +58,10 @@ export class QueueLogger implements SequenceLogger {
62
58
  Obj.make(TraceEvent, {
63
59
  outcome: event.type,
64
60
  truncated: false,
65
- ingestionTimestampMs: Date.now(),
61
+ ingestionTimestamp: Date.now(),
66
62
  logs: [
67
63
  {
68
- timestampMs: Date.now(),
64
+ timestamp: Date.now(),
69
65
  level: 'info',
70
66
  message: event.type,
71
67
  context: { step: event.step },
@@ -80,10 +76,10 @@ export class QueueLogger implements SequenceLogger {
80
76
  Obj.make(TraceEvent, {
81
77
  outcome: event.type,
82
78
  truncated: false,
83
- ingestionTimestampMs: Date.now(),
79
+ ingestionTimestamp: Date.now(),
84
80
  logs: [
85
81
  {
86
- timestampMs: Date.now(),
82
+ timestamp: Date.now(),
87
83
  level: 'info',
88
84
  message: event.type,
89
85
  context: { message: event.message },
@@ -98,10 +94,10 @@ export class QueueLogger implements SequenceLogger {
98
94
  Obj.make(TraceEvent, {
99
95
  outcome: event.type,
100
96
  truncated: false,
101
- ingestionTimestampMs: Date.now(),
97
+ ingestionTimestamp: Date.now(),
102
98
  logs: [
103
99
  {
104
- timestampMs: Date.now(),
100
+ timestamp: Date.now(),
105
101
  level: 'info',
106
102
  message: event.type,
107
103
  context: { block: event.block },
@@ -2,6 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ export * from './test-generator';
5
6
  export * from './test-sequence';
6
- export * from './test-functions';
7
7
  export * from './test-services';