@dxos/plugin-assistant 0.8.4-main.2e9d522 → 0.8.4-main.3c1ae3b

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 (481) hide show
  1. package/dist/lib/browser/BlueprintArticle-BWSLH6LG.mjs +36 -0
  2. package/dist/lib/browser/BlueprintArticle-BWSLH6LG.mjs.map +7 -0
  3. package/dist/lib/browser/ChatCompanion-U7VMDYO6.mjs +159 -0
  4. package/dist/lib/browser/ChatCompanion-U7VMDYO6.mjs.map +7 -0
  5. package/dist/lib/browser/ChatContainer-JXDZQ2EY.mjs +79 -0
  6. package/dist/lib/browser/ChatContainer-JXDZQ2EY.mjs.map +7 -0
  7. package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs → ChatDialog-5NNGCRKJ.mjs} +30 -12
  8. package/dist/lib/browser/ChatDialog-5NNGCRKJ.mjs.map +7 -0
  9. package/dist/lib/browser/PromptArticle-Q7JYGFQV.mjs +59 -0
  10. package/dist/lib/browser/PromptArticle-Q7JYGFQV.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-ADZRPJ3V.mjs +199 -0
  14. package/dist/lib/browser/app-graph-builder-ADZRPJ3V.mjs.map +7 -0
  15. package/dist/lib/browser/blueprint-definition-7HPQPCL7.mjs +12 -0
  16. package/dist/lib/browser/blueprint-definition-7HPQPCL7.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-5JZRYQZL.mjs +229 -0
  18. package/dist/lib/browser/chunk-5JZRYQZL.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-7ZJIXQ2Y.mjs +335 -0
  20. package/dist/lib/browser/chunk-7ZJIXQ2Y.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-F6YX2HHA.mjs +262 -0
  22. package/dist/lib/browser/chunk-F6YX2HHA.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  24. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-LRE4VEZV.mjs +16 -0
  26. package/dist/lib/browser/chunk-LRE4VEZV.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-SWEOO227.mjs +1930 -0
  28. package/dist/lib/browser/chunk-SWEOO227.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-YDSFERCV.mjs +178 -0
  32. package/dist/lib/browser/chunk-YDSFERCV.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 +227 -101
  36. package/dist/lib/browser/index.mjs.map +4 -4
  37. package/dist/lib/browser/intent-resolver-Q7TX3MV7.mjs +143 -0
  38. package/dist/lib/browser/intent-resolver-Q7TX3MV7.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-VXXS6ZVC.mjs +100 -0
  43. package/dist/lib/browser/react-surface-VXXS6ZVC.mjs.map +7 -0
  44. package/dist/lib/browser/repair-3MZXLUHO.mjs +44 -0
  45. package/dist/lib/browser/repair-3MZXLUHO.mjs.map +7 -0
  46. package/dist/lib/browser/{settings-2DGP3UTS.mjs → settings-HD5WA24I.mjs} +8 -7
  47. package/dist/lib/{node-esm/settings-47RYZOU4.mjs.map → browser/settings-HD5WA24I.mjs.map} +1 -1
  48. package/dist/lib/browser/state-GG7Z3NB7.mjs +25 -0
  49. package/dist/lib/browser/state-GG7Z3NB7.mjs.map +7 -0
  50. package/dist/lib/browser/toolkit-VYDAWNE4.mjs +17 -0
  51. package/dist/lib/browser/toolkit-VYDAWNE4.mjs.map +7 -0
  52. package/dist/lib/browser/types/index.mjs +7 -4
  53. package/dist/lib/node-esm/BlueprintArticle-R2XYBRCK.mjs +37 -0
  54. package/dist/lib/node-esm/BlueprintArticle-R2XYBRCK.mjs.map +7 -0
  55. package/dist/lib/node-esm/ChatCompanion-O4T7PMMC.mjs +160 -0
  56. package/dist/lib/node-esm/ChatCompanion-O4T7PMMC.mjs.map +7 -0
  57. package/dist/lib/node-esm/ChatContainer-OWAZI6ZF.mjs +80 -0
  58. package/dist/lib/node-esm/ChatContainer-OWAZI6ZF.mjs.map +7 -0
  59. package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs → ChatDialog-IBXH5FRI.mjs} +30 -12
  60. package/dist/lib/node-esm/ChatDialog-IBXH5FRI.mjs.map +7 -0
  61. package/dist/lib/node-esm/PromptArticle-IV7O5UZ3.mjs +60 -0
  62. package/dist/lib/node-esm/PromptArticle-IV7O5UZ3.mjs.map +7 -0
  63. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs +20 -0
  64. package/dist/lib/node-esm/ai-service-MUYLV3NT.mjs.map +7 -0
  65. package/dist/lib/node-esm/app-graph-builder-26KXQ5ZY.mjs +200 -0
  66. package/dist/lib/node-esm/app-graph-builder-26KXQ5ZY.mjs.map +7 -0
  67. package/dist/lib/node-esm/blueprint-definition-S3DNWJFV.mjs +13 -0
  68. package/dist/lib/node-esm/blueprint-definition-S3DNWJFV.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-CKW4IYLY.mjs +336 -0
  70. package/dist/lib/node-esm/chunk-CKW4IYLY.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-E4JSYCWZ.mjs +230 -0
  72. package/dist/lib/node-esm/chunk-E4JSYCWZ.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-GWKWQSEQ.mjs +264 -0
  74. package/dist/lib/node-esm/chunk-GWKWQSEQ.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  76. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-VGSP5WMV.mjs +180 -0
  78. package/dist/lib/node-esm/chunk-VGSP5WMV.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/chunk-ZNSHGWE4.mjs +1931 -0
  84. package/dist/lib/node-esm/chunk-ZNSHGWE4.mjs.map +7 -0
  85. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs +19 -0
  86. package/dist/lib/node-esm/edge-model-resolver-2ARXDOYS.mjs.map +7 -0
  87. package/dist/lib/node-esm/index.mjs +227 -101
  88. package/dist/lib/node-esm/index.mjs.map +4 -4
  89. package/dist/lib/node-esm/intent-resolver-LTKMN3YB.mjs +144 -0
  90. package/dist/lib/node-esm/intent-resolver-LTKMN3YB.mjs.map +7 -0
  91. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs +18 -0
  92. package/dist/lib/node-esm/local-model-resolver-TP2NTSAX.mjs.map +7 -0
  93. package/dist/lib/node-esm/meta.json +1 -1
  94. package/dist/lib/node-esm/react-surface-AOBQALOV.mjs +101 -0
  95. package/dist/lib/node-esm/react-surface-AOBQALOV.mjs.map +7 -0
  96. package/dist/lib/node-esm/repair-RER5H7Y6.mjs +45 -0
  97. package/dist/lib/node-esm/repair-RER5H7Y6.mjs.map +7 -0
  98. package/dist/lib/node-esm/{settings-47RYZOU4.mjs → settings-YJQVKHH5.mjs} +8 -7
  99. package/dist/lib/{browser/settings-2DGP3UTS.mjs.map → node-esm/settings-YJQVKHH5.mjs.map} +1 -1
  100. package/dist/lib/node-esm/state-FSUHFMDM.mjs +26 -0
  101. package/dist/lib/node-esm/state-FSUHFMDM.mjs.map +7 -0
  102. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs +18 -0
  103. package/dist/lib/node-esm/toolkit-HFJZLVIR.mjs.map +7 -0
  104. package/dist/lib/node-esm/types/index.mjs +7 -4
  105. package/dist/types/src/AssistantPlugin.d.ts +1 -1
  106. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/ai-service.d.ts +4 -0
  108. package/dist/types/src/capabilities/ai-service.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  110. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/blueprint-definition.d.ts +7 -0
  112. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/capabilities.d.ts +10 -0
  114. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/edge-model-resolver.d.ts +4 -0
  116. package/dist/types/src/capabilities/edge-model-resolver.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/index.d.ts +12 -3
  118. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  120. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/local-model-resolver.d.ts +10 -0
  122. package/dist/types/src/capabilities/local-model-resolver.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  124. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  125. package/dist/types/src/capabilities/repair.d.ts +4 -0
  126. package/dist/types/src/capabilities/repair.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/settings.d.ts +1 -1
  128. package/dist/types/src/capabilities/state.d.ts +4 -0
  129. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/toolkit.d.ts +4 -0
  131. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  132. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  133. package/dist/types/src/components/BlueprintArticle.d.ts +7 -0
  134. package/dist/types/src/components/BlueprintArticle.d.ts.map +1 -0
  135. package/dist/types/src/components/Chat/Chat.d.ts +35 -21
  136. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  137. package/dist/types/src/components/Chat/events.d.ts +9 -0
  138. package/dist/types/src/components/Chat/events.d.ts.map +1 -1
  139. package/dist/types/src/components/ChatCompanion.d.ts +13 -0
  140. package/dist/types/src/components/ChatCompanion.d.ts.map +1 -0
  141. package/dist/types/src/components/ChatContainer.d.ts +14 -6
  142. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  143. package/dist/types/src/components/ChatDialog.d.ts.map +1 -1
  144. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts +7 -0
  145. package/dist/types/src/components/ChatProgress/ChatProgress.d.ts.map +1 -0
  146. package/dist/types/src/components/ChatProgress/index.d.ts +2 -0
  147. package/dist/types/src/components/ChatProgress/index.d.ts.map +1 -0
  148. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  149. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts +20 -0
  150. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -0
  151. package/dist/types/src/components/ChatPrompt/ChatPresets.d.ts.map +1 -1
  152. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts +4 -5
  153. package/dist/types/src/components/ChatPrompt/ChatReferences.d.ts.map +1 -1
  154. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts +6 -4
  155. package/dist/types/src/components/ChatPrompt/ChatStatusIndicator.d.ts.map +1 -1
  156. package/dist/types/src/components/ChatPrompt/index.d.ts +1 -1
  157. package/dist/types/src/components/ChatPrompt/index.d.ts.map +1 -1
  158. package/dist/types/src/components/ChatThread/ChatThread.d.ts +12 -10
  159. package/dist/types/src/components/ChatThread/ChatThread.d.ts.map +1 -1
  160. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +170 -70
  161. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/ChatThread/Link.d.ts +9 -0
  163. package/dist/types/src/components/ChatThread/Link.d.ts.map +1 -0
  164. package/dist/types/src/components/ChatThread/reducers.d.ts +40 -0
  165. package/dist/types/src/components/ChatThread/reducers.d.ts.map +1 -0
  166. package/dist/types/src/components/ChatThread/registry.d.ts +11 -0
  167. package/dist/types/src/components/ChatThread/registry.d.ts.map +1 -0
  168. package/dist/types/src/components/ChatThread/sync.d.ts +42 -0
  169. package/dist/types/src/components/ChatThread/sync.d.ts.map +1 -0
  170. package/dist/types/src/components/ChatThread/sync.test.d.ts +2 -0
  171. package/dist/types/src/components/ChatThread/sync.test.d.ts.map +1 -0
  172. package/dist/types/src/components/PromptArticle.d.ts +7 -0
  173. package/dist/types/src/components/PromptArticle.d.ts.map +1 -0
  174. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +3 -6
  175. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  176. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +317 -7
  177. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +3 -2
  179. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  180. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +314 -2
  181. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts +12 -0
  183. package/dist/types/src/components/TemplateEditor/extensions/handlebars-extension.d.ts.map +1 -0
  184. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts +3 -0
  185. package/dist/types/src/components/TemplateEditor/extensions/index.d.ts.map +1 -0
  186. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts +8 -0
  187. package/dist/types/src/components/TemplateEditor/extensions/xml-extension.d.ts.map +1 -0
  188. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts +21 -0
  189. package/dist/types/src/components/ToolBlock/ToolBlock.d.ts.map +1 -0
  190. package/dist/types/src/components/ToolBlock/ToolBlockWidget.d.ts +2 -0
  191. package/dist/types/src/components/ToolBlock/ToolBlockWidget.d.ts.map +1 -0
  192. package/dist/types/src/components/ToolBlock/index.d.ts +3 -0
  193. package/dist/types/src/components/ToolBlock/index.d.ts.map +1 -0
  194. package/dist/types/src/components/Toolbox/Toolbox.d.ts +6 -11
  195. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -1
  196. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +318 -5
  197. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -1
  198. package/dist/types/src/components/index.d.ts +9 -6
  199. package/dist/types/src/components/index.d.ts.map +1 -1
  200. package/dist/types/src/events.d.ts +1 -1
  201. package/dist/types/src/events.d.ts.map +1 -1
  202. package/dist/types/src/functions/analysis.d.ts +5 -0
  203. package/dist/types/src/functions/analysis.d.ts.map +1 -0
  204. package/dist/types/src/functions/index.d.ts +4 -0
  205. package/dist/types/src/functions/index.d.ts.map +1 -0
  206. package/dist/types/src/functions/object-list.d.ts +10 -0
  207. package/dist/types/src/functions/object-list.d.ts.map +1 -0
  208. package/dist/types/src/functions/object-load.d.ts +8 -0
  209. package/dist/types/src/functions/object-load.d.ts.map +1 -0
  210. package/dist/types/src/hooks/index.d.ts +8 -3
  211. package/dist/types/src/hooks/index.d.ts.map +1 -1
  212. package/dist/types/src/hooks/useBlueprintRegistry.d.ts +25 -0
  213. package/dist/types/src/hooks/useBlueprintRegistry.d.ts.map +1 -0
  214. package/dist/types/src/hooks/useChatProcessor.d.ts +8 -19
  215. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  216. package/dist/types/src/hooks/useChatServices.d.ts +5 -6
  217. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  218. package/dist/types/src/hooks/useChatToolbarActions.d.ts +8 -0
  219. package/dist/types/src/hooks/useChatToolbarActions.d.ts.map +1 -0
  220. package/dist/types/src/hooks/useContextBinder.d.ts +4 -0
  221. package/dist/types/src/hooks/useContextBinder.d.ts.map +1 -0
  222. package/dist/types/src/hooks/useContextObjects.d.ts +15 -0
  223. package/dist/types/src/hooks/useContextObjects.d.ts.map +1 -0
  224. package/dist/types/src/hooks/useFilteredTypes.d.ts +4 -0
  225. package/dist/types/src/hooks/useFilteredTypes.d.ts.map +1 -0
  226. package/dist/types/src/hooks/useFlush.d.ts +6 -0
  227. package/dist/types/src/hooks/useFlush.d.ts.map +1 -0
  228. package/dist/types/src/hooks/useOnline.d.ts +3 -0
  229. package/dist/types/src/hooks/useOnline.d.ts.map +1 -0
  230. package/dist/types/src/hooks/usePresets.d.ts +7 -0
  231. package/dist/types/src/hooks/usePresets.d.ts.map +1 -0
  232. package/dist/types/src/hooks/useReferencesProvider.d.ts.map +1 -1
  233. package/dist/types/src/index.d.ts +2 -0
  234. package/dist/types/src/index.d.ts.map +1 -1
  235. package/dist/types/src/meta.d.ts +1 -2
  236. package/dist/types/src/meta.d.ts.map +1 -1
  237. package/dist/types/src/processor/index.d.ts +4 -0
  238. package/dist/types/src/processor/index.d.ts.map +1 -0
  239. package/dist/types/src/{hooks → processor}/presets.d.ts +3 -3
  240. package/dist/types/src/processor/presets.d.ts.map +1 -0
  241. package/dist/types/src/processor/processor.d.ts +75 -0
  242. package/dist/types/src/processor/processor.d.ts.map +1 -0
  243. package/dist/types/src/processor/processor.test.d.ts +2 -0
  244. package/dist/types/src/processor/processor.test.d.ts.map +1 -0
  245. package/dist/types/src/processor/update-name.d.ts +10 -0
  246. package/dist/types/src/processor/update-name.d.ts.map +1 -0
  247. package/dist/types/src/queue-logger.d.ts.map +1 -1
  248. package/dist/types/src/testing/index.d.ts +1 -1
  249. package/dist/types/src/testing/index.d.ts.map +1 -1
  250. package/dist/types/src/testing/test-generator.d.ts +8 -0
  251. package/dist/types/src/testing/test-generator.d.ts.map +1 -0
  252. package/dist/types/src/testing/test-sequence.d.ts +0 -4
  253. package/dist/types/src/testing/test-sequence.d.ts.map +1 -1
  254. package/dist/types/src/testing/test-services.d.ts +2 -2
  255. package/dist/types/src/testing/test-services.d.ts.map +1 -1
  256. package/dist/types/src/translations.d.ts +262 -37
  257. package/dist/types/src/translations.d.ts.map +1 -1
  258. package/dist/types/src/types/Assistant.d.ts +45 -0
  259. package/dist/types/src/types/Assistant.d.ts.map +1 -0
  260. package/dist/types/src/types/AssistantAction.d.ts +129 -0
  261. package/dist/types/src/types/AssistantAction.d.ts.map +1 -0
  262. package/dist/types/src/types/defs.d.ts +2 -0
  263. package/dist/types/src/types/defs.d.ts.map +1 -0
  264. package/dist/types/src/types/index.d.ts +3 -1
  265. package/dist/types/src/types/index.d.ts.map +1 -1
  266. package/dist/types/src/types/service.d.ts +135 -85
  267. package/dist/types/src/types/service.d.ts.map +1 -1
  268. package/dist/types/tsconfig.tsbuildinfo +1 -1
  269. package/package.json +99 -93
  270. package/src/AssistantPlugin.tsx +151 -85
  271. package/src/capabilities/ai-service.ts +27 -0
  272. package/src/capabilities/app-graph-builder.ts +104 -149
  273. package/src/capabilities/blueprint-definition.ts +66 -0
  274. package/src/capabilities/capabilities.ts +17 -0
  275. package/src/capabilities/edge-model-resolver.ts +25 -0
  276. package/src/capabilities/index.ts +10 -0
  277. package/src/capabilities/intent-resolver.ts +92 -15
  278. package/src/capabilities/local-model-resolver.ts +30 -0
  279. package/src/capabilities/react-surface.tsx +27 -78
  280. package/src/capabilities/repair.ts +49 -0
  281. package/src/capabilities/state.ts +22 -0
  282. package/src/capabilities/toolkit.ts +17 -0
  283. package/src/components/AssistantSettings/AssistantSettings.tsx +83 -76
  284. package/src/components/BlueprintArticle.tsx +29 -0
  285. package/src/components/Chat/Chat.tsx +260 -217
  286. package/src/components/Chat/events.ts +13 -0
  287. package/src/components/ChatCompanion.tsx +166 -0
  288. package/src/components/ChatContainer.tsx +39 -22
  289. package/src/components/ChatDialog.tsx +25 -14
  290. package/src/components/ChatProgress/ChatProgress.tsx +67 -0
  291. package/src/components/{SequenceEditor → ChatProgress}/index.ts +1 -1
  292. package/src/components/ChatPrompt/ChatActions.tsx +10 -26
  293. package/src/components/ChatPrompt/ChatOptions.tsx +234 -0
  294. package/src/components/ChatPrompt/ChatPresets.tsx +1 -0
  295. package/src/components/ChatPrompt/ChatReferences.tsx +31 -36
  296. package/src/components/ChatPrompt/ChatStatusIndicator.tsx +25 -22
  297. package/src/components/ChatPrompt/index.ts +1 -1
  298. package/src/components/ChatThread/ChatThread.stories.tsx +122 -116
  299. package/src/components/ChatThread/ChatThread.tsx +65 -35
  300. package/src/components/ChatThread/Link.tsx +26 -0
  301. package/src/components/ChatThread/reducers.ts +151 -0
  302. package/src/components/ChatThread/registry.tsx +174 -0
  303. package/src/components/ChatThread/sync.test.ts +89 -0
  304. package/src/components/ChatThread/sync.ts +148 -0
  305. package/src/components/ChatThread/testing/thread.md +37 -0
  306. package/src/components/PromptArticle.tsx +51 -0
  307. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +40 -19
  308. package/src/components/TemplateEditor/TemplateEditor.tsx +30 -52
  309. package/src/components/TemplateEditor/TemplateForm.stories.tsx +19 -14
  310. package/src/components/TemplateEditor/TemplateForm.tsx +8 -5
  311. package/src/components/TemplateEditor/extensions/handlebars-extension.ts +269 -0
  312. package/src/components/TemplateEditor/extensions/index.ts +6 -0
  313. package/src/components/TemplateEditor/extensions/xml-extension.ts +64 -0
  314. package/src/components/ToolBlock/ToolBlock.tsx +143 -0
  315. package/src/components/ToolBlock/ToolBlockWidget.tsx +5 -0
  316. package/src/components/ToolBlock/index.ts +6 -0
  317. package/src/components/Toolbox/Toolbox.stories.tsx +14 -23
  318. package/src/components/Toolbox/Toolbox.tsx +25 -55
  319. package/src/components/index.ts +3 -7
  320. package/src/events.ts +2 -2
  321. package/src/functions/analysis.ts +22 -0
  322. package/src/functions/index.ts +7 -0
  323. package/src/functions/object-list.ts +49 -0
  324. package/src/functions/object-load.ts +46 -0
  325. package/src/hooks/index.ts +8 -4
  326. package/src/hooks/useBlueprintRegistry.ts +95 -0
  327. package/src/hooks/useChatProcessor.ts +35 -104
  328. package/src/hooks/useChatServices.ts +33 -73
  329. package/src/hooks/useChatToolbarActions.ts +122 -0
  330. package/src/hooks/useContextBinder.ts +30 -0
  331. package/src/hooks/useContextObjects.ts +58 -0
  332. package/src/hooks/useFilteredTypes.ts +38 -0
  333. package/src/hooks/useFlush.ts +35 -0
  334. package/src/hooks/useOnline.ts +10 -0
  335. package/src/hooks/usePresets.ts +44 -0
  336. package/src/hooks/useReferencesProvider.ts +14 -11
  337. package/src/index.ts +2 -0
  338. package/src/meta.ts +9 -6
  339. package/src/processor/index.ts +7 -0
  340. package/src/{hooks → processor}/presets.ts +16 -8
  341. package/src/processor/processor.test.ts +72 -0
  342. package/src/processor/processor.ts +277 -0
  343. package/src/processor/update-name.ts +56 -0
  344. package/src/queue-logger.ts +13 -17
  345. package/src/testing/index.ts +1 -1
  346. package/src/testing/test-generator.ts +262 -0
  347. package/src/testing/test-sequence.ts +2 -27
  348. package/src/testing/test-services.ts +2 -8
  349. package/src/translations.ts +48 -26
  350. package/src/types/Assistant.ts +63 -0
  351. package/src/types/AssistantAction.ts +79 -0
  352. package/src/types/defs.ts +5 -0
  353. package/src/types/index.ts +4 -1
  354. package/src/types/service.ts +17 -9
  355. package/src/vite-env.d.ts +30 -0
  356. package/dist/lib/browser/ChatContainer-M3IHQLRS.mjs +0 -54
  357. package/dist/lib/browser/ChatContainer-M3IHQLRS.mjs.map +0 -7
  358. package/dist/lib/browser/ChatDialog-X6VN6QZI.mjs.map +0 -7
  359. package/dist/lib/browser/SequenceContainer-3UDVKWPA.mjs +0 -162
  360. package/dist/lib/browser/SequenceContainer-3UDVKWPA.mjs.map +0 -7
  361. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs +0 -27
  362. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs.map +0 -7
  363. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs +0 -223
  364. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs.map +0 -7
  365. package/dist/lib/browser/chunk-AEAEKWOC.mjs +0 -98
  366. package/dist/lib/browser/chunk-AEAEKWOC.mjs.map +0 -7
  367. package/dist/lib/browser/chunk-EQDW6BYQ.mjs +0 -108
  368. package/dist/lib/browser/chunk-EQDW6BYQ.mjs.map +0 -7
  369. package/dist/lib/browser/chunk-FDCJSQYF.mjs +0 -40
  370. package/dist/lib/browser/chunk-FDCJSQYF.mjs.map +0 -7
  371. package/dist/lib/browser/chunk-JQBVLTM5.mjs +0 -158
  372. package/dist/lib/browser/chunk-JQBVLTM5.mjs.map +0 -7
  373. package/dist/lib/browser/chunk-OWY4CUQY.mjs +0 -2245
  374. package/dist/lib/browser/chunk-OWY4CUQY.mjs.map +0 -7
  375. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs +0 -60
  376. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs.map +0 -7
  377. package/dist/lib/browser/react-surface-66VY37YQ.mjs +0 -150
  378. package/dist/lib/browser/react-surface-66VY37YQ.mjs.map +0 -7
  379. package/dist/lib/node-esm/ChatContainer-VZT74PO2.mjs +0 -55
  380. package/dist/lib/node-esm/ChatContainer-VZT74PO2.mjs.map +0 -7
  381. package/dist/lib/node-esm/ChatDialog-RJ6FDX4Q.mjs.map +0 -7
  382. package/dist/lib/node-esm/SequenceContainer-RQQH5XOC.mjs +0 -163
  383. package/dist/lib/node-esm/SequenceContainer-RQQH5XOC.mjs.map +0 -7
  384. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs +0 -28
  385. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs.map +0 -7
  386. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs +0 -224
  387. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs +0 -99
  389. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-BISJDTBK.mjs +0 -159
  391. package/dist/lib/node-esm/chunk-BISJDTBK.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-E33DNNDW.mjs +0 -109
  393. package/dist/lib/node-esm/chunk-E33DNNDW.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-QN2H2EHV.mjs +0 -41
  395. package/dist/lib/node-esm/chunk-QN2H2EHV.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-SENTQAEO.mjs +0 -2246
  397. package/dist/lib/node-esm/chunk-SENTQAEO.mjs.map +0 -7
  398. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs +0 -61
  399. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs.map +0 -7
  400. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs +0 -151
  401. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs.map +0 -7
  402. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts +0 -9
  403. package/dist/types/src/components/ChatPrompt/ChatOptionsMenu.d.ts.map +0 -1
  404. package/dist/types/src/components/ChatThread/ChatMessage.d.ts +0 -17
  405. package/dist/types/src/components/ChatThread/ChatMessage.d.ts.map +0 -1
  406. package/dist/types/src/components/ChatThread/ToolBlock.d.ts +0 -19
  407. package/dist/types/src/components/ChatThread/ToolBlock.d.ts.map +0 -1
  408. package/dist/types/src/components/ChatThread/reducer.d.ts +0 -12
  409. package/dist/types/src/components/ChatThread/reducer.d.ts.map +0 -1
  410. package/dist/types/src/components/PromptSettings.d.ts +0 -6
  411. package/dist/types/src/components/PromptSettings.d.ts.map +0 -1
  412. package/dist/types/src/components/SequenceContainer.d.ts +0 -8
  413. package/dist/types/src/components/SequenceContainer.d.ts.map +0 -1
  414. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts +0 -13
  415. package/dist/types/src/components/SequenceEditor/SequenceEditor.d.ts.map +0 -1
  416. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts +0 -8
  417. package/dist/types/src/components/SequenceEditor/SequenceEditor.stories.d.ts.map +0 -1
  418. package/dist/types/src/components/SequenceEditor/index.d.ts +0 -2
  419. package/dist/types/src/components/SequenceEditor/index.d.ts.map +0 -1
  420. package/dist/types/src/components/TemplateContainer.d.ts +0 -8
  421. package/dist/types/src/components/TemplateContainer.d.ts.map +0 -1
  422. package/dist/types/src/hooks/chat-processor.d.ts +0 -86
  423. package/dist/types/src/hooks/chat-processor.d.ts.map +0 -1
  424. package/dist/types/src/hooks/chat-processor.test.d.ts +0 -2
  425. package/dist/types/src/hooks/chat-processor.test.d.ts.map +0 -1
  426. package/dist/types/src/hooks/presets.d.ts.map +0 -1
  427. package/dist/types/src/hooks/useBlueprints.d.ts +0 -9
  428. package/dist/types/src/hooks/useBlueprints.d.ts.map +0 -1
  429. package/dist/types/src/parser/filter-generator.d.ts +0 -4
  430. package/dist/types/src/parser/filter-generator.d.ts.map +0 -1
  431. package/dist/types/src/parser/filter-generator.test.d.ts +0 -2
  432. package/dist/types/src/parser/filter-generator.test.d.ts.map +0 -1
  433. package/dist/types/src/parser/index.d.ts +0 -4
  434. package/dist/types/src/parser/index.d.ts.map +0 -1
  435. package/dist/types/src/parser/query-parser.d.ts +0 -15
  436. package/dist/types/src/parser/query-parser.d.ts.map +0 -1
  437. package/dist/types/src/parser/query-parser.test.d.ts +0 -2
  438. package/dist/types/src/parser/query-parser.test.d.ts.map +0 -1
  439. package/dist/types/src/parser/types.d.ts +0 -24
  440. package/dist/types/src/parser/types.d.ts.map +0 -1
  441. package/dist/types/src/stories/Chat.stories.d.ts +0 -249
  442. package/dist/types/src/stories/Chat.stories.d.ts.map +0 -1
  443. package/dist/types/src/testing/test-functions.d.ts +0 -3
  444. package/dist/types/src/testing/test-functions.d.ts.map +0 -1
  445. package/dist/types/src/tools/function.d.ts +0 -5
  446. package/dist/types/src/tools/function.d.ts.map +0 -1
  447. package/dist/types/src/tools/index.d.ts +0 -3
  448. package/dist/types/src/tools/index.d.ts.map +0 -1
  449. package/dist/types/src/tools/openapi.d.ts +0 -10
  450. package/dist/types/src/tools/openapi.d.ts.map +0 -1
  451. package/dist/types/src/tools/openapi.test.d.ts +0 -2
  452. package/dist/types/src/tools/openapi.test.d.ts.map +0 -1
  453. package/dist/types/src/types/schema.d.ts +0 -88
  454. package/dist/types/src/types/schema.d.ts.map +0 -1
  455. package/src/components/ChatPrompt/ChatOptionsMenu.tsx +0 -52
  456. package/src/components/ChatThread/ChatMessage.tsx +0 -268
  457. package/src/components/ChatThread/ToolBlock.tsx +0 -121
  458. package/src/components/ChatThread/reducer.ts +0 -52
  459. package/src/components/PromptSettings.tsx +0 -89
  460. package/src/components/SequenceContainer.tsx +0 -132
  461. package/src/components/SequenceEditor/SequenceEditor.stories.tsx +0 -32
  462. package/src/components/SequenceEditor/SequenceEditor.tsx +0 -50
  463. package/src/components/TemplateContainer.tsx +0 -24
  464. package/src/hooks/chat-processor.test.ts +0 -16
  465. package/src/hooks/chat-processor.ts +0 -314
  466. package/src/hooks/useBlueprints.ts +0 -57
  467. package/src/parser/filter-generator.test.ts +0 -32
  468. package/src/parser/filter-generator.ts +0 -81
  469. package/src/parser/index.ts +0 -7
  470. package/src/parser/query-parser.test.ts +0 -139
  471. package/src/parser/query-parser.ts +0 -199
  472. package/src/parser/types.ts +0 -34
  473. package/src/shims.d.ts +0 -8
  474. package/src/stories/Chat.stories.tsx +0 -378
  475. package/src/testing/test-functions.ts +0 -11
  476. package/src/tools/function.ts +0 -46
  477. package/src/tools/index.ts +0 -6
  478. package/src/tools/openapi.test.ts +0 -217
  479. package/src/tools/openapi.ts +0 -338
  480. package/src/types/schema.ts +0 -95
  481. package/src/typings.d.ts +0 -9
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Dispatch, type SetStateAction, useState } from 'react';
6
+
7
+ export const useOnline = (): [boolean, Dispatch<SetStateAction<boolean>>] => {
8
+ const [online, setOnline] = useState(true);
9
+ return [online, setOnline];
10
+ };
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ import { type ChatPromptProps } from '../components';
8
+ import { type AiServicePreset, AiServicePresets } from '../processor';
9
+
10
+ export type UsePresets = {
11
+ preset: AiServicePreset | undefined;
12
+ } & Pick<ChatPromptProps, 'presets' | 'onPresetChange'>;
13
+
14
+ export const usePresets = (online: boolean): UsePresets => {
15
+ // TODO(burdon): Memo preset for provider.
16
+ const [preset, setPreset] = useState<AiServicePreset>();
17
+ const presets = useMemo(
18
+ () => AiServicePresets.filter((preset) => online === (preset.provider === 'dxos-remote')),
19
+ [online],
20
+ );
21
+ const presetOptions = useMemo(
22
+ () => presets.map(({ id, model, label }) => ({ id, label: label ?? model })),
23
+ [presets],
24
+ );
25
+ useEffect(() => {
26
+ setPreset(presets[0]);
27
+ }, [presets]);
28
+
29
+ const handlePresetChange = useCallback<NonNullable<ChatPromptProps['onPresetChange']>>(
30
+ (id) => {
31
+ const preset = presets.find((preset) => preset.id === id);
32
+ if (preset) {
33
+ setPreset(preset);
34
+ }
35
+ },
36
+ [presets],
37
+ );
38
+
39
+ return {
40
+ preset: preset,
41
+ presets: presetOptions,
42
+ onPresetChange: handlePresetChange,
43
+ };
44
+ };
@@ -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,17 +42,17 @@ 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
  );
46
49
  },
47
50
  resolveReference: async ({ uri }) => {
48
- const object = await space.db.query(Filter.ids(uri)).first();
51
+ const object = await space.db.query(Filter.id(uri)).first();
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,72 @@
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 { acquireReleaseResource } from '@dxos/effect';
16
+ import { TestHelpers } from '@dxos/effect/testing';
17
+ import { CredentialsService, QueueService, TracingService } from '@dxos/functions';
18
+ import { FunctionInvocationServiceLayerTestMocked, TestDatabaseLayer } from '@dxos/functions-runtime/testing';
19
+ import { type Message } from '@dxos/types';
20
+
21
+ import { AiChatProcessor, type AiChatServices } from './processor';
22
+
23
+ const TestToolkit = Toolkit.make(
24
+ Tool.make('random', {
25
+ description: 'Random number generator',
26
+ parameters: {},
27
+ success: Schema.Number,
28
+ }),
29
+ );
30
+
31
+ // TODO(burdon): Create minimal toolkit.
32
+ const toolkit = Toolkit.merge(TestToolkit) as Toolkit.Toolkit<any>;
33
+
34
+ // TODO(burdon): Explain structure.
35
+ const TestServicesLayer = Layer.mergeAll(
36
+ TracingService.layerNoop,
37
+ AiServiceTestingPreset('direct'),
38
+ TestDatabaseLayer({
39
+ // indexing: { vector: true },
40
+ // types: [],
41
+ }),
42
+ // CredentialsService.configuredLayer([{ service: 'exa.ai', apiKey: EXA_API_KEY }]),
43
+ FunctionInvocationServiceLayerTestMocked({ functions: [] }).pipe(Layer.provideMerge(TracingService.layerNoop)),
44
+ );
45
+
46
+ const TestLayer: Layer.Layer<AiChatServices, never, never> = Layer.mergeAll(
47
+ AiService.model('@anthropic/claude-opus-4-0'),
48
+ makeToolResolverFromFunctions([], toolkit),
49
+ makeToolExecutionServiceFromFunctions(toolkit, toolkit.toLayer({}) as any),
50
+ CredentialsService.layerFromDatabase(),
51
+ ).pipe(Layer.provideMerge(TestServicesLayer), Layer.orDie);
52
+
53
+ // TODO(burdon): Create actual test with mock LLM.
54
+ describe('Chat processor', () => {
55
+ it.scoped(
56
+ 'basic',
57
+ Effect.fn(
58
+ function* ({ expect }) {
59
+ const services = yield* Effect.runtime<AiChatServices>();
60
+ const queue = yield* QueueService.createQueue<Message.Message>();
61
+ const conversation = yield* acquireReleaseResource(() => new AiConversation(queue));
62
+ const processor = new AiChatProcessor(conversation, async () => services);
63
+ const result = yield* Effect.promise(() => processor.request({ message: 'Hello' }));
64
+ void processor.cancel();
65
+ expect(processor.active).to.be.false;
66
+ expect(result).to.exist;
67
+ },
68
+ Effect.provide(TestLayer),
69
+ TestHelpers.taggedTest('llm'),
70
+ ),
71
+ );
72
+ });
@@ -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 { type Database } from '@dxos/echo';
31
+ import { throwCause } from '@dxos/effect';
32
+ import {
33
+ type CredentialsService,
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
+ | Database.Service
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 _registry: 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._registry = 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._registry.set(this.error, Option.none());
155
+ this._registry.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._registry.set(this.error, Option.none());
184
+ this._lastRequest = undefined;
185
+ this._fiber = undefined;
186
+ } catch (error) {
187
+ log.error('request failed', { error });
188
+ this._registry.set(this.error, Option.some(new Error('AI service error', { cause: error })));
189
+ } finally {
190
+ this._fiber = undefined;
191
+ this._registry.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._registry.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.id(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._registry.set(this._streaming, Option.none());
255
+ this._registry.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._registry.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
+ };