@dxos/plugin-automation 0.7.5-main.9d2a38b → 0.7.5-main.b19bfc8

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 (370) hide show
  1. package/dist/lib/browser/AssistantDialog-V67OWLRP.mjs +116 -0
  2. package/dist/lib/browser/AssistantDialog-V67OWLRP.mjs.map +7 -0
  3. package/dist/lib/browser/AutomationPanel-NCKK3CFN.mjs +8 -0
  4. package/dist/lib/browser/AutomationPanel-NCKK3CFN.mjs.map +7 -0
  5. package/dist/lib/browser/ChatContainer-5BS6THNV.mjs +33 -0
  6. package/dist/lib/browser/ChatContainer-5BS6THNV.mjs.map +7 -0
  7. package/dist/lib/browser/TemplateContainer-HJJV44CE.mjs +23 -0
  8. package/dist/lib/browser/TemplateContainer-HJJV44CE.mjs.map +7 -0
  9. package/dist/lib/browser/ai-client-T2PBJISL.mjs +22 -0
  10. package/dist/lib/browser/ai-client-T2PBJISL.mjs.map +7 -0
  11. package/dist/lib/browser/app-graph-builder-IR3CGVM6.mjs +110 -0
  12. package/dist/lib/browser/app-graph-builder-IR3CGVM6.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-62E2AEXF.mjs +162 -0
  14. package/dist/lib/browser/chunk-62E2AEXF.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-67KDIIM6.mjs +15 -0
  16. package/dist/lib/browser/chunk-67KDIIM6.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-BQ4WHY4D.mjs +1818 -0
  18. package/dist/lib/browser/chunk-BQ4WHY4D.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-HKX3D3ZP.mjs → chunk-HZSTXZWK.mjs} +4 -2
  20. package/dist/lib/browser/chunk-HZSTXZWK.mjs.map +7 -0
  21. package/dist/lib/{node-esm/AutomationPanel-R3D6CRF5.mjs → browser/chunk-LJ7F4KDM.mjs} +31 -21
  22. package/dist/lib/browser/chunk-LJ7F4KDM.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-QH5E22EL.mjs +108 -0
  24. package/dist/lib/browser/chunk-QH5E22EL.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-XAIWETH6.mjs +81 -0
  26. package/dist/lib/browser/chunk-XAIWETH6.mjs.map +7 -0
  27. package/dist/lib/browser/index.mjs +163 -273
  28. package/dist/lib/browser/index.mjs.map +4 -4
  29. package/dist/lib/browser/intent-resolver-ICLE6FSI.mjs +44 -0
  30. package/dist/lib/browser/intent-resolver-ICLE6FSI.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/react-surface-KEKVLCPQ.mjs +80 -0
  33. package/dist/lib/browser/react-surface-KEKVLCPQ.mjs.map +7 -0
  34. package/dist/lib/browser/settings-FE5DDWOE.mjs +22 -0
  35. package/dist/lib/browser/settings-FE5DDWOE.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +20 -9
  37. package/dist/lib/node/AssistantDialog-E62O72KI.cjs +140 -0
  38. package/dist/lib/node/AssistantDialog-E62O72KI.cjs.map +7 -0
  39. package/dist/lib/node/AutomationPanel-6COLKRIB.cjs +26 -0
  40. package/dist/lib/node/AutomationPanel-6COLKRIB.cjs.map +7 -0
  41. package/dist/lib/node/{react-surface-DVAU4MGD.cjs → ChatContainer-4QTLL7TH.cjs} +30 -26
  42. package/dist/lib/node/ChatContainer-4QTLL7TH.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-25AQIF3L.cjs → TemplateContainer-3YCM6XPU.cjs} +21 -11
  44. package/dist/lib/node/TemplateContainer-3YCM6XPU.cjs.map +7 -0
  45. package/dist/lib/node/ai-client-L5GUSAER.cjs +38 -0
  46. package/dist/lib/node/ai-client-L5GUSAER.cjs.map +7 -0
  47. package/dist/lib/node/app-graph-builder-ECNVGTRT.cjs +122 -0
  48. package/dist/lib/node/app-graph-builder-ECNVGTRT.cjs.map +7 -0
  49. package/dist/lib/node/chunk-3QSK6IPK.cjs +133 -0
  50. package/dist/lib/node/chunk-3QSK6IPK.cjs.map +7 -0
  51. package/dist/lib/node/chunk-76F5BCJE.cjs +111 -0
  52. package/dist/lib/node/chunk-76F5BCJE.cjs.map +7 -0
  53. package/dist/lib/node/chunk-B37JIAOP.cjs +1795 -0
  54. package/dist/lib/node/chunk-B37JIAOP.cjs.map +7 -0
  55. package/dist/lib/node/{chunk-5VF5JKUN.cjs → chunk-BAQRBGOJ.cjs} +8 -5
  56. package/dist/lib/node/chunk-BAQRBGOJ.cjs.map +7 -0
  57. package/dist/lib/node/chunk-UVWK2XJE.cjs +183 -0
  58. package/dist/lib/node/chunk-UVWK2XJE.cjs.map +7 -0
  59. package/dist/lib/node/{AutomationPanel-PPODB5XA.cjs → chunk-V4L7LTWM.cjs} +39 -24
  60. package/dist/lib/node/chunk-V4L7LTWM.cjs.map +7 -0
  61. package/dist/lib/node/chunk-VNBYGJ4K.cjs +34 -0
  62. package/dist/lib/node/chunk-VNBYGJ4K.cjs.map +7 -0
  63. package/dist/lib/node/index.cjs +166 -292
  64. package/dist/lib/node/index.cjs.map +4 -4
  65. package/dist/lib/node/intent-resolver-4MQZULXW.cjs +58 -0
  66. package/dist/lib/node/intent-resolver-4MQZULXW.cjs.map +7 -0
  67. package/dist/lib/node/meta.json +1 -1
  68. package/dist/lib/node/react-surface-4RVHY6WI.cjs +95 -0
  69. package/dist/lib/node/react-surface-4RVHY6WI.cjs.map +7 -0
  70. package/dist/lib/node/settings-GOIB2WJQ.cjs +36 -0
  71. package/dist/lib/node/settings-GOIB2WJQ.cjs.map +7 -0
  72. package/dist/lib/node/types/index.cjs +20 -9
  73. package/dist/lib/node/types/index.cjs.map +2 -2
  74. package/dist/lib/node-esm/AssistantDialog-IPRBJKWA.mjs +117 -0
  75. package/dist/lib/node-esm/AssistantDialog-IPRBJKWA.mjs.map +7 -0
  76. package/dist/lib/node-esm/AutomationPanel-3MPIAO7R.mjs +9 -0
  77. package/dist/lib/node-esm/AutomationPanel-3MPIAO7R.mjs.map +7 -0
  78. package/dist/lib/node-esm/ChatContainer-4IWUGMGM.mjs +34 -0
  79. package/dist/lib/node-esm/ChatContainer-4IWUGMGM.mjs.map +7 -0
  80. package/dist/lib/node-esm/TemplateContainer-YJIXR24Z.mjs +24 -0
  81. package/dist/lib/node-esm/TemplateContainer-YJIXR24Z.mjs.map +7 -0
  82. package/dist/lib/node-esm/ai-client-45LZLW7V.mjs +23 -0
  83. package/dist/lib/node-esm/ai-client-45LZLW7V.mjs.map +7 -0
  84. package/dist/lib/node-esm/app-graph-builder-HMRKSZ2X.mjs +111 -0
  85. package/dist/lib/node-esm/app-graph-builder-HMRKSZ2X.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-5BKKHYO5.mjs +163 -0
  87. package/dist/lib/node-esm/chunk-5BKKHYO5.mjs.map +7 -0
  88. package/dist/lib/{browser/AutomationPanel-IHZ4JKVS.mjs → node-esm/chunk-AWAU4BHR.mjs} +32 -20
  89. package/dist/lib/node-esm/chunk-AWAU4BHR.mjs.map +7 -0
  90. package/dist/lib/node-esm/chunk-CAWPHOY4.mjs +82 -0
  91. package/dist/lib/node-esm/chunk-CAWPHOY4.mjs.map +7 -0
  92. package/dist/lib/node-esm/chunk-I32H7MCF.mjs +109 -0
  93. package/dist/lib/node-esm/chunk-I32H7MCF.mjs.map +7 -0
  94. package/dist/lib/node-esm/{chunk-X3LPRWIL.mjs → chunk-IG4GSWZN.mjs} +4 -2
  95. package/dist/lib/node-esm/chunk-IG4GSWZN.mjs.map +7 -0
  96. package/dist/lib/node-esm/chunk-QHKP5HT2.mjs +1819 -0
  97. package/dist/lib/node-esm/chunk-QHKP5HT2.mjs.map +7 -0
  98. package/dist/lib/node-esm/chunk-SS7U6GCX.mjs +16 -0
  99. package/dist/lib/node-esm/chunk-SS7U6GCX.mjs.map +7 -0
  100. package/dist/lib/node-esm/index.mjs +163 -273
  101. package/dist/lib/node-esm/index.mjs.map +4 -4
  102. package/dist/lib/node-esm/intent-resolver-ZS7XTYLG.mjs +45 -0
  103. package/dist/lib/node-esm/intent-resolver-ZS7XTYLG.mjs.map +7 -0
  104. package/dist/lib/node-esm/meta.json +1 -1
  105. package/dist/lib/node-esm/react-surface-5ILD642V.mjs +81 -0
  106. package/dist/lib/node-esm/react-surface-5ILD642V.mjs.map +7 -0
  107. package/dist/lib/node-esm/settings-ANNQPPRY.mjs +23 -0
  108. package/dist/lib/node-esm/settings-ANNQPPRY.mjs.map +7 -0
  109. package/dist/lib/node-esm/types/index.mjs +20 -9
  110. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/ai-client.d.ts +5 -0
  112. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/app-graph-builder.d.ts +111 -110
  114. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  116. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/index.d.ts +117 -113
  118. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  120. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  122. package/dist/types/src/capabilities/settings.d.ts +4 -0
  123. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  124. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts +7 -0
  125. package/dist/types/src/components/AmbientDialog/AmbientDialog.d.ts.map +1 -0
  126. package/dist/types/src/components/AmbientDialog/AmbientDialog.stories.d.ts +8 -0
  127. package/dist/types/src/components/AmbientDialog/AmbientDialog.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/AmbientDialog/index.d.ts +2 -0
  129. package/dist/types/src/components/AmbientDialog/index.d.ts.map +1 -0
  130. package/dist/types/src/components/AssistantDialog.d.ts +7 -0
  131. package/dist/types/src/components/AssistantDialog.d.ts.map +1 -0
  132. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -2
  133. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  134. package/dist/types/src/components/AutomationSettings/AutomationSettings.d.ts +5 -0
  135. package/dist/types/src/components/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  136. package/dist/types/src/components/AutomationSettings/index.d.ts +2 -0
  137. package/dist/types/src/components/AutomationSettings/index.d.ts.map +1 -0
  138. package/dist/types/src/components/ChatContainer.d.ts +7 -0
  139. package/dist/types/src/components/ChatContainer.d.ts.map +1 -0
  140. package/dist/types/src/components/Prompt/Prompt.d.ts +17 -0
  141. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -0
  142. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +9 -0
  143. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -0
  144. package/dist/types/src/components/Prompt/PromptBar.d.ts +10 -0
  145. package/dist/types/src/components/Prompt/PromptBar.d.ts.map +1 -0
  146. package/dist/types/src/components/Prompt/autocomplete.d.ts +21 -0
  147. package/dist/types/src/components/Prompt/autocomplete.d.ts.map +1 -0
  148. package/dist/types/src/components/Prompt/index.d.ts +3 -0
  149. package/dist/types/src/components/Prompt/index.d.ts.map +1 -0
  150. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +5 -0
  151. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -0
  152. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +8 -0
  153. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +1 -0
  154. package/dist/types/src/components/ServiceRegistry/index.d.ts +2 -0
  155. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +1 -0
  156. package/dist/types/src/components/TemplateContainer.d.ts +7 -0
  157. package/dist/types/src/components/TemplateContainer.d.ts.map +1 -0
  158. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +12 -0
  159. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -0
  160. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts +8 -0
  161. package/dist/types/src/components/TemplateEditor/TemplateEditor.stories.d.ts.map +1 -0
  162. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +10 -0
  163. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -0
  164. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts +8 -0
  165. package/dist/types/src/components/TemplateEditor/TemplateForm.stories.d.ts.map +1 -0
  166. package/dist/types/src/components/TemplateEditor/index.d.ts +2 -0
  167. package/dist/types/src/components/TemplateEditor/index.d.ts.map +1 -0
  168. package/dist/types/src/components/TemplateEditor/types.d.ts.map +1 -0
  169. package/dist/types/src/components/Thread/Thread.d.ts +17 -0
  170. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -0
  171. package/dist/types/src/components/Thread/Thread.stories.d.ts +11 -0
  172. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -0
  173. package/dist/types/src/components/Thread/ThreadContainer.d.ts +10 -0
  174. package/dist/types/src/components/Thread/ThreadContainer.d.ts.map +1 -0
  175. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts +15 -0
  176. package/dist/types/src/components/Thread/ThreadContainer.stories.d.ts.map +1 -0
  177. package/dist/types/src/components/Thread/ThreadMessage.d.ts +13 -0
  178. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -0
  179. package/dist/types/src/components/Thread/ToolInvocations.d.ts +13 -0
  180. package/dist/types/src/components/Thread/ToolInvocations.d.ts.map +1 -0
  181. package/dist/types/src/components/Thread/index.d.ts +3 -0
  182. package/dist/types/src/components/Thread/index.d.ts.map +1 -0
  183. package/dist/types/src/components/Thread/reducer.d.ts +12 -0
  184. package/dist/types/src/components/Thread/reducer.d.ts.map +1 -0
  185. package/dist/types/src/components/Toolbox/Toolbox.d.ts +19 -0
  186. package/dist/types/src/components/Toolbox/Toolbox.d.ts.map +1 -0
  187. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts +8 -0
  188. package/dist/types/src/components/Toolbox/Toolbox.stories.d.ts.map +1 -0
  189. package/dist/types/src/components/Toolbox/index.d.ts +2 -0
  190. package/dist/types/src/components/Toolbox/index.d.ts.map +1 -0
  191. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
  192. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  193. package/dist/types/src/components/index.d.ts +19 -2
  194. package/dist/types/src/components/index.d.ts.map +1 -1
  195. package/dist/types/src/hooks/index.d.ts +5 -0
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/processor.d.ts +75 -0
  198. package/dist/types/src/hooks/processor.d.ts.map +1 -0
  199. package/dist/types/src/hooks/processor.test.d.ts +2 -0
  200. package/dist/types/src/hooks/processor.test.d.ts.map +1 -0
  201. package/dist/types/src/hooks/useChatProcessor.d.ts +8 -0
  202. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -0
  203. package/dist/types/src/hooks/useMessageQueue.d.ts +41 -0
  204. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -0
  205. package/dist/types/src/hooks/useServices.d.ts +7 -0
  206. package/dist/types/src/hooks/useServices.d.ts.map +1 -0
  207. package/dist/types/src/hooks/useTextInputEvents.d.ts +13 -0
  208. package/dist/types/src/hooks/useTextInputEvents.d.ts.map +1 -0
  209. package/dist/types/src/index.d.ts +1 -2
  210. package/dist/types/src/index.d.ts.map +1 -1
  211. package/dist/types/src/meta.d.ts +1 -0
  212. package/dist/types/src/meta.d.ts.map +1 -1
  213. package/dist/types/src/testing/index.d.ts +2 -1
  214. package/dist/types/src/testing/index.d.ts.map +1 -1
  215. package/dist/types/src/testing/{testing.d.ts → test-functions.d.ts} +3 -1
  216. package/dist/types/src/testing/test-functions.d.ts.map +1 -0
  217. package/dist/types/src/testing/test-services.d.ts +5 -0
  218. package/dist/types/src/testing/test-services.d.ts.map +1 -0
  219. package/dist/types/src/tools/function.d.ts +5 -0
  220. package/dist/types/src/tools/function.d.ts.map +1 -0
  221. package/dist/types/src/tools/index.d.ts +3 -0
  222. package/dist/types/src/tools/index.d.ts.map +1 -0
  223. package/dist/types/src/tools/openapi.d.ts +10 -0
  224. package/dist/types/src/tools/openapi.d.ts.map +1 -0
  225. package/dist/types/src/tools/openapi.test.d.ts +2 -0
  226. package/dist/types/src/tools/openapi.test.d.ts.map +1 -0
  227. package/dist/types/src/translations.d.ts +110 -2
  228. package/dist/types/src/translations.d.ts.map +1 -1
  229. package/dist/types/src/types/chat.d.ts +12 -0
  230. package/dist/types/src/types/chat.d.ts.map +1 -0
  231. package/dist/types/src/types/index.d.ts +4 -1
  232. package/dist/types/src/types/index.d.ts.map +1 -1
  233. package/dist/types/src/types/service.d.ts +160 -0
  234. package/dist/types/src/types/service.d.ts.map +1 -0
  235. package/dist/types/src/types/template.d.ts +40 -0
  236. package/dist/types/src/types/template.d.ts.map +1 -0
  237. package/dist/types/src/types/types.d.ts +37 -0
  238. package/dist/types/src/types/types.d.ts.map +1 -0
  239. package/package.json +62 -40
  240. package/src/AutomationPlugin.tsx +68 -21
  241. package/src/capabilities/ai-client.ts +19 -0
  242. package/src/capabilities/app-graph-builder.ts +82 -110
  243. package/src/capabilities/capabilities.ts +12 -0
  244. package/src/capabilities/index.ts +5 -0
  245. package/src/capabilities/intent-resolver.ts +38 -0
  246. package/src/capabilities/react-surface.tsx +42 -6
  247. package/src/capabilities/settings.ts +19 -0
  248. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +81 -0
  249. package/src/components/AmbientDialog/AmbientDialog.tsx +103 -0
  250. package/src/components/AmbientDialog/index.ts +5 -0
  251. package/src/components/AssistantDialog.tsx +33 -0
  252. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +2 -2
  253. package/src/components/AutomationSettings/AutomationSettings.tsx +49 -0
  254. package/src/components/AutomationSettings/index.ts +5 -0
  255. package/src/components/ChatContainer.tsx +29 -0
  256. package/src/components/Prompt/Prompt.stories.tsx +79 -0
  257. package/src/components/Prompt/Prompt.tsx +100 -0
  258. package/src/components/Prompt/PromptBar.tsx +100 -0
  259. package/src/components/Prompt/autocomplete.ts +212 -0
  260. package/src/components/Prompt/index.ts +6 -0
  261. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +49 -0
  262. package/src/components/ServiceRegistry/ServiceRegistry.tsx +76 -0
  263. package/src/components/ServiceRegistry/index.ts +5 -0
  264. package/src/components/TemplateContainer.tsx +21 -0
  265. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +72 -0
  266. package/src/components/TemplateEditor/TemplateEditor.tsx +76 -0
  267. package/src/components/TemplateEditor/TemplateForm.stories.tsx +65 -0
  268. package/src/components/TemplateEditor/TemplateForm.tsx +184 -0
  269. package/src/components/{PromptEditor → TemplateEditor}/index.ts +1 -1
  270. package/src/components/Thread/Thread.stories.tsx +212 -0
  271. package/src/components/Thread/Thread.tsx +97 -0
  272. package/src/components/Thread/ThreadContainer.stories.tsx +258 -0
  273. package/src/components/Thread/ThreadContainer.tsx +78 -0
  274. package/src/components/Thread/ThreadMessage.tsx +187 -0
  275. package/src/components/Thread/ToolInvocations.tsx +93 -0
  276. package/src/components/Thread/index.ts +6 -0
  277. package/src/components/Thread/reducer.ts +52 -0
  278. package/src/components/Toolbox/Toolbox.stories.tsx +65 -0
  279. package/src/components/Toolbox/Toolbox.tsx +117 -0
  280. package/src/components/Toolbox/index.ts +5 -0
  281. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +2 -2
  282. package/src/components/TriggerEditor/TriggerEditor.tsx +25 -18
  283. package/src/components/index.ts +11 -1
  284. package/src/hooks/index.ts +6 -0
  285. package/src/hooks/processor.test.ts +15 -0
  286. package/src/hooks/processor.ts +219 -0
  287. package/src/hooks/useChatProcessor.tsx +77 -0
  288. package/src/hooks/useMessageQueue.ts +23 -0
  289. package/src/hooks/useServices.ts +28 -0
  290. package/src/hooks/useTextInputEvents.ts +49 -0
  291. package/src/index.ts +2 -2
  292. package/src/meta.ts +4 -1
  293. package/src/testing/index.ts +2 -1
  294. package/src/testing/{testing.ts → test-functions.ts} +9 -2
  295. package/src/testing/test-services.ts +131 -0
  296. package/src/tools/function.ts +47 -0
  297. package/src/tools/index.ts +6 -0
  298. package/src/tools/openapi.test.ts +224 -0
  299. package/src/tools/openapi.ts +331 -0
  300. package/src/translations.ts +27 -2
  301. package/src/types/chat.ts +11 -0
  302. package/src/types/index.ts +4 -1
  303. package/src/types/service.ts +102 -0
  304. package/src/types/template.ts +34 -0
  305. package/src/types/types.ts +41 -0
  306. package/src/typings.d.ts +9 -0
  307. package/dist/lib/browser/AssistantPanel-N276BTPV.mjs +0 -339
  308. package/dist/lib/browser/AssistantPanel-N276BTPV.mjs.map +0 -7
  309. package/dist/lib/browser/AutomationPanel-IHZ4JKVS.mjs.map +0 -7
  310. package/dist/lib/browser/app-graph-builder-IJTTULDP.mjs +0 -131
  311. package/dist/lib/browser/app-graph-builder-IJTTULDP.mjs.map +0 -7
  312. package/dist/lib/browser/chunk-4AIMDHKY.mjs +0 -10
  313. package/dist/lib/browser/chunk-4AIMDHKY.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-DL6LB2NI.mjs +0 -43
  315. package/dist/lib/browser/chunk-DL6LB2NI.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-HKX3D3ZP.mjs.map +0 -7
  317. package/dist/lib/browser/react-surface-LL72F3F4.mjs +0 -34
  318. package/dist/lib/browser/react-surface-LL72F3F4.mjs.map +0 -7
  319. package/dist/lib/node/AssistantPanel-Z4GVHUF3.cjs +0 -359
  320. package/dist/lib/node/AssistantPanel-Z4GVHUF3.cjs.map +0 -7
  321. package/dist/lib/node/AutomationPanel-PPODB5XA.cjs.map +0 -7
  322. package/dist/lib/node/app-graph-builder-MF5M4QRS.cjs +0 -147
  323. package/dist/lib/node/app-graph-builder-MF5M4QRS.cjs.map +0 -7
  324. package/dist/lib/node/chunk-25AQIF3L.cjs.map +0 -7
  325. package/dist/lib/node/chunk-5VF5JKUN.cjs.map +0 -7
  326. package/dist/lib/node/chunk-JNDMZQH7.cjs +0 -68
  327. package/dist/lib/node/chunk-JNDMZQH7.cjs.map +0 -7
  328. package/dist/lib/node/react-surface-DVAU4MGD.cjs.map +0 -7
  329. package/dist/lib/node-esm/AssistantPanel-DDCQHBJX.mjs +0 -340
  330. package/dist/lib/node-esm/AssistantPanel-DDCQHBJX.mjs.map +0 -7
  331. package/dist/lib/node-esm/AutomationPanel-R3D6CRF5.mjs.map +0 -7
  332. package/dist/lib/node-esm/app-graph-builder-5N7OK23B.mjs +0 -132
  333. package/dist/lib/node-esm/app-graph-builder-5N7OK23B.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-GIAYUM5I.mjs +0 -45
  335. package/dist/lib/node-esm/chunk-GIAYUM5I.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-X3LPRWIL.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-XW7TEQA3.mjs +0 -12
  338. package/dist/lib/node-esm/chunk-XW7TEQA3.mjs.map +0 -7
  339. package/dist/lib/node-esm/react-surface-4BED2PZ4.mjs +0 -35
  340. package/dist/lib/node-esm/react-surface-4BED2PZ4.mjs.map +0 -7
  341. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts +0 -8
  342. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +0 -1
  343. package/dist/types/src/components/AssistantPanel/index.d.ts +0 -3
  344. package/dist/types/src/components/AssistantPanel/index.d.ts.map +0 -1
  345. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts +0 -6
  346. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts.map +0 -1
  347. package/dist/types/src/components/PromptEditor/PromptEditor.d.ts +0 -10
  348. package/dist/types/src/components/PromptEditor/PromptEditor.d.ts.map +0 -1
  349. package/dist/types/src/components/PromptEditor/PromptEditor.stories.d.ts +0 -6
  350. package/dist/types/src/components/PromptEditor/PromptEditor.stories.d.ts.map +0 -1
  351. package/dist/types/src/components/PromptEditor/index.d.ts +0 -2
  352. package/dist/types/src/components/PromptEditor/index.d.ts.map +0 -1
  353. package/dist/types/src/components/PromptEditor/prompt-extension.d.ts +0 -4
  354. package/dist/types/src/components/PromptEditor/prompt-extension.d.ts.map +0 -1
  355. package/dist/types/src/components/PromptEditor/types.d.ts.map +0 -1
  356. package/dist/types/src/presets.d.ts +0 -9
  357. package/dist/types/src/presets.d.ts.map +0 -1
  358. package/dist/types/src/testing/testing.d.ts.map +0 -1
  359. package/dist/types/src/types/schema.d.ts +0 -63
  360. package/dist/types/src/types/schema.d.ts.map +0 -1
  361. package/src/components/AssistantPanel/AssistantPanel.tsx +0 -230
  362. package/src/components/AssistantPanel/index.ts +0 -7
  363. package/src/components/AssistantPanel/system-instructions.ts +0 -166
  364. package/src/components/PromptEditor/PromptEditor.stories.tsx +0 -64
  365. package/src/components/PromptEditor/PromptEditor.tsx +0 -222
  366. package/src/components/PromptEditor/prompt-extension.ts +0 -43
  367. package/src/presets.ts +0 -248
  368. package/src/types/schema.ts +0 -38
  369. /package/dist/types/src/components/{PromptEditor → TemplateEditor}/types.d.ts +0 -0
  370. /package/src/components/{PromptEditor → TemplateEditor}/types.tsx +0 -0
@@ -0,0 +1,65 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type Meta } from '@storybook/react';
8
+ import React from 'react';
9
+
10
+ import { IntentPlugin, Capabilities, useCapabilities, SettingsPlugin } from '@dxos/app-framework';
11
+ import { withPluginManager } from '@dxos/app-framework/testing';
12
+ import { capabilities } from '@dxos/artifact-testing';
13
+ import { ChessPlugin } from '@dxos/plugin-chess';
14
+ import { ClientPlugin } from '@dxos/plugin-client';
15
+ import { MapPlugin } from '@dxos/plugin-map';
16
+ import { SpacePlugin } from '@dxos/plugin-space';
17
+ import { TablePlugin } from '@dxos/plugin-table';
18
+ import { withLayout, withSignals, withTheme } from '@dxos/storybook-utils';
19
+
20
+ import { Toolbox } from './Toolbox';
21
+
22
+ const Render = () => {
23
+ const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
24
+ return (
25
+ <Toolbox artifacts={artifactDefinitions} classNames='w-[30rem] h-[15rem] rounded-md border border-separator' />
26
+ );
27
+ };
28
+
29
+ const meta: Meta<typeof Toolbox> = {
30
+ title: 'plugins/plugin-automation/Toolbox',
31
+ component: Toolbox,
32
+ render: Render,
33
+ decorators: [
34
+ withSignals,
35
+ withPluginManager({
36
+ plugins: [
37
+ ClientPlugin({
38
+ onClientInitialized: async (_, client) => {
39
+ await client.halo.createIdentity();
40
+ },
41
+ }),
42
+ SpacePlugin({ observability: false }),
43
+ SettingsPlugin(),
44
+ IntentPlugin(),
45
+ ChessPlugin(),
46
+ MapPlugin(),
47
+ TablePlugin(),
48
+ ],
49
+ capabilities,
50
+ }),
51
+ withTheme,
52
+ withLayout({ tooltips: true }),
53
+ ],
54
+ parameters: {
55
+ layout: 'centered',
56
+ },
57
+ };
58
+
59
+ export default meta;
60
+
61
+ type Story = Meta<typeof Toolbox>;
62
+
63
+ export const Default: Story = {
64
+ args: {},
65
+ };
@@ -0,0 +1,117 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useState, useEffect, Fragment } from 'react';
6
+
7
+ import { Capabilities, useCapabilities } from '@dxos/app-framework';
8
+ import { type ArtifactDefinition, type Tool } from '@dxos/artifact';
9
+ import { FunctionType } from '@dxos/functions';
10
+ import { log } from '@dxos/log';
11
+ import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
12
+ import { type ThemedClassName } from '@dxos/react-ui';
13
+ import { mx } from '@dxos/react-ui-theme';
14
+
15
+ import { createToolsFromService } from '../../tools';
16
+ import { ServiceType } from '../../types';
17
+
18
+ export type ToolboxProps = ThemedClassName<{
19
+ artifacts?: ArtifactDefinition[];
20
+ functions?: FunctionType[];
21
+ services?: { service: ServiceType; tools: Tool[] }[];
22
+ striped?: boolean;
23
+ }>;
24
+
25
+ const stripeClassNames = 'odd:bg-neutral-50 dark:odd:bg-neutral-800';
26
+
27
+ export const Toolbox = ({ classNames, artifacts, functions, services, striped }: ToolboxProps) => {
28
+ const gridClassNames = 'grid grid-cols-[8rem_8rem_1fr]';
29
+ const subGridClassNames = mx('col-span-full grid grid-cols-subgrid text-xs px-2', striped && stripeClassNames);
30
+
31
+ return (
32
+ <div className={mx('flex flex-col overflow-y-auto box-content', classNames)}>
33
+ {artifacts && artifacts.length > 0 && (
34
+ <div>
35
+ <h1 className='px-2 text-sm'>Artifacts</h1>
36
+ <div className={gridClassNames}>
37
+ {artifacts.map(({ id, description, tools }) => (
38
+ <Fragment key={id}>
39
+ <div className={subGridClassNames}>
40
+ <div className='text-primary-500 truncate'>{id}</div>
41
+ <div className='col-span-2 line-clamp-2'>{description}</div>
42
+ </div>
43
+ {tools.map(({ name, description }, i) => (
44
+ <div key={`${name}-${i}`} className={subGridClassNames}>
45
+ <div />
46
+ <div className='truncate'>{name}</div>
47
+ <div className='text-subdued line-clamp-3'>{description}</div>
48
+ </div>
49
+ ))}
50
+ </Fragment>
51
+ ))}
52
+ </div>
53
+ </div>
54
+ )}
55
+
56
+ {services && services.length > 0 && (
57
+ <div>
58
+ <h1 className='px-2 text-sm'>Services</h1>
59
+ <div className={gridClassNames}>
60
+ {services.map(({ service, tools }) => (
61
+ <Fragment key={service.serviceId}>
62
+ <div className={subGridClassNames}>
63
+ <div className='text-primary-500 truncate'>{service.name ?? service.serviceId}</div>
64
+ <div className='col-span-2 line-clamp-2'>{service.description}</div>
65
+ </div>
66
+ {tools.map(({ name, description }, i) => (
67
+ <div key={name} className={mx(subGridClassNames, striped && stripeClassNames)}>
68
+ <div className='text-primary-500 truncate'>{i === 0 && service.serviceId}</div>
69
+ <div className='truncate'>{name}</div>
70
+ <div className='truncate'>{description}</div>
71
+ </div>
72
+ ))}
73
+ </Fragment>
74
+ ))}
75
+ </div>
76
+ </div>
77
+ )}
78
+
79
+ {functions && functions.length > 0 && (
80
+ <div>
81
+ <h1 className='px-2 text-sm'>Functions</h1>
82
+ <div className={gridClassNames}>
83
+ {functions.map(({ name, description }) => (
84
+ <div key={name} className={mx(subGridClassNames, striped && stripeClassNames)}>
85
+ <div className='text-primary-500 truncate'>function</div>
86
+ <div className='truncate'>{name}</div>
87
+ <div className='truncate'>{description}</div>
88
+ </div>
89
+ ))}
90
+ </div>
91
+ </div>
92
+ )}
93
+ </div>
94
+ );
95
+ };
96
+
97
+ export const ToolboxContainer = ({ classNames, space }: ThemedClassName<{ space?: Space }>) => {
98
+ const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
99
+ const functions = useQuery(space, Filter.schema(FunctionType));
100
+ const services = useQuery(space, Filter.schema(ServiceType));
101
+
102
+ const [serviceTools, setServiceTools] = useState<{ service: ServiceType; tools: Tool[] }[]>([]);
103
+ useEffect(() => {
104
+ log('creating service tools...');
105
+ queueMicrotask(async () => {
106
+ const tools = await Promise.all(
107
+ services.map(async (service) => ({ service, tools: await createToolsFromService(service) })),
108
+ );
109
+
110
+ setServiceTools(tools);
111
+ });
112
+ }, [services]);
113
+
114
+ return (
115
+ <Toolbox classNames={classNames} artifacts={artifactDefinitions} functions={functions} services={serviceTools} />
116
+ );
117
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Toolbox';
@@ -16,7 +16,7 @@ import { withLayout, withTheme } from '@dxos/storybook-utils';
16
16
  import { TriggerEditor } from './TriggerEditor';
17
17
  import { functions } from '../../testing';
18
18
  import translations from '../../translations';
19
- import { ChainPromptType } from '../../types';
19
+ import { TemplateType } from '../../types';
20
20
 
21
21
  const DefaultStory = () => {
22
22
  const spaces = useSpaces();
@@ -50,7 +50,7 @@ const meta: Meta = {
50
50
  withClientProvider({
51
51
  createIdentity: true,
52
52
  createSpace: true,
53
- types: [FunctionType, FunctionTrigger, ChainPromptType],
53
+ types: [FunctionType, FunctionTrigger, TemplateType],
54
54
  onSpaceCreated: ({ space }) => {
55
55
  for (const fn of functions) {
56
56
  space.db.add(create(FunctionType, fn));
@@ -2,8 +2,9 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useState } from 'react';
5
+ import React, { useEffect, useState } from 'react';
6
6
 
7
+ import { ComputeGraph } from '@dxos/conductor';
7
8
  import {
8
9
  FunctionType,
9
10
  FunctionTriggerSchema,
@@ -29,6 +30,7 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
29
30
  const { t } = useTranslation(AUTOMATION_PLUGIN);
30
31
 
31
32
  const functions = useQuery(space, Filter.schema(FunctionType));
33
+ const workflows = useQuery(space, Filter.schema(ComputeGraph));
32
34
  const scripts = useQuery(space, Filter.schema(ScriptType));
33
35
 
34
36
  const handleSave = (values: FunctionTriggerType) => {
@@ -43,16 +45,13 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
43
45
  onCancel={onCancel}
44
46
  Custom={{
45
47
  ['function' satisfies keyof FunctionTriggerType]: (props) => (
46
- <SelectInput<FunctionTriggerType>
48
+ <SelectInput
47
49
  {...props}
48
- options={functions.map((fn) => ({
49
- value: fn.name,
50
- label: getFunctionName(scripts, fn),
51
- }))}
50
+ options={getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))}
52
51
  />
53
52
  ),
54
53
  ['spec.type' as const]: (props) => (
55
- <SelectInput<FunctionTriggerType>
54
+ <SelectInput
56
55
  {...props}
57
56
  options={Object.values(TriggerKind).map((kind) => ({
58
57
  value: kind,
@@ -61,12 +60,10 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
61
60
  />
62
61
  ),
63
62
  ['meta' as const]: (props) => {
64
- const meta = props.getValue('meta')!;
65
-
63
+ const meta = props.getValue()!;
64
+ useEffect(() => props.onValueChange('object', { ...meta }), []);
66
65
  const [newMetaFieldName, setNewMetaFieldName] = useState('');
67
66
 
68
- React.useEffect(() => props.onValueChange('meta', 'object', { ...meta }), []);
69
-
70
67
  return (
71
68
  <>
72
69
  <div>{props.label}</div>
@@ -75,7 +72,12 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
75
72
  return (
76
73
  <div key={compositeKey} role='none' className='flex items-center mt-2 gap-1'>
77
74
  <div role='none' className='flex-1'>
78
- <TextInput {...props} property={compositeKey} type={'string'} label={key} />
75
+ <TextInput
76
+ {...props}
77
+ getValue={() => (props.getValue() as any)[key]}
78
+ type={'string'}
79
+ label={key}
80
+ />
79
81
  </div>
80
82
  <IconButton
81
83
  icon='ph--trash--regular'
@@ -83,9 +85,9 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
83
85
  classNames={'mt-6'}
84
86
  label={t('trigger meta remove')}
85
87
  onClick={() => {
86
- const newValues: any = { ...props.getValue('meta') };
88
+ const newValues: any = { ...props.getValue() };
87
89
  delete newValues[key];
88
- props.onValueChange('meta', 'object', newValues);
90
+ props.onValueChange('object', newValues);
89
91
  }}
90
92
  />
91
93
  </div>
@@ -107,10 +109,10 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
107
109
  label={t('trigger meta add')}
108
110
  onClick={() => {
109
111
  if (newMetaFieldName.length) {
110
- const meta = props.getValue('meta') ?? {};
112
+ const meta = props.getValue() ?? {};
111
113
  const metaWithNewProp = { ...meta, [newMetaFieldName]: '' };
112
114
  setNewMetaFieldName('');
113
- props.onValueChange('meta', 'object', metaWithNewProp);
115
+ props.onValueChange('object', metaWithNewProp);
114
116
  }
115
117
  }}
116
118
  />
@@ -123,6 +125,11 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
123
125
  );
124
126
  };
125
127
 
126
- const getFunctionName = (scripts: ScriptType[], fn: FunctionType) => {
127
- return scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
128
+ const getWorkflowOptions = (graphs: ComputeGraph[]) => {
129
+ return graphs.map((graph) => ({ label: `compute-${graph.id}`, value: `dxn:echo:@:${graph.id}` }));
130
+ };
131
+
132
+ const getFunctionOptions = (scripts: ScriptType[], functions: FunctionType[]) => {
133
+ const getLabel = (fn: FunctionType) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
134
+ return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:worker:${fn.name}` }));
128
135
  };
@@ -4,5 +4,15 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
- export const AssistantPanel = lazy(() => import('./AssistantPanel'));
7
+ export * from './AutomationPanel';
8
+ export * from './AutomationSettings';
9
+ export * from './ServiceRegistry';
10
+ export * from './TemplateEditor';
11
+ export * from './Thread';
12
+ export * from './TriggerEditor';
13
+ export * from './Toolbox';
14
+
15
+ export const AssistantDialog = lazy(() => import('./AssistantDialog'));
8
16
  export const AutomationPanel = lazy(() => import('./AutomationPanel'));
17
+ export const ChatContainer = lazy(() => import('./ChatContainer'));
18
+ export const TemplateContainer = lazy(() => import('./TemplateContainer'));
@@ -2,4 +2,10 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ export * from './processor';
6
+
7
+ export * from './useChatProcessor';
5
8
  export * from './useLocalTriggerManager';
9
+ export * from './useMessageQueue';
10
+ export * from './useServices';
11
+ export * from './useTextInputEvents';
@@ -0,0 +1,15 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, it } from 'vitest';
6
+
7
+ import { ChatProcessor } from './processor';
8
+
9
+ describe('ChatProcessor', () => {
10
+ it('should be instantiable', ({ expect }) => {
11
+ const client = {} as any; // TODO(burdon): Create mock.
12
+ const processor = new ChatProcessor(client);
13
+ expect(processor).toBeDefined();
14
+ });
15
+ });
@@ -0,0 +1,219 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Signal, batch, computed, signal } from '@preact/signals-core';
6
+
7
+ import { type PromiseIntentDispatcher } from '@dxos/app-framework';
8
+ import { type Tool, Message, type MessageContentBlock } from '@dxos/artifact';
9
+ import {
10
+ isToolUse,
11
+ runTools,
12
+ type AIServiceClientImpl,
13
+ type GenerateRequest,
14
+ type GenerationStream,
15
+ MixedStreamParser,
16
+ DEFAULT_LLM_MODEL,
17
+ } from '@dxos/assistant';
18
+ import { createStatic } from '@dxos/echo-schema';
19
+ import { invariant } from '@dxos/invariant';
20
+ import { log } from '@dxos/log';
21
+ import { type Space } from '@dxos/react-client/echo';
22
+
23
+ // TODO(burdon): Factor out.
24
+ declare global {
25
+ interface ToolContextExtensions {
26
+ space?: Space;
27
+ dispatch?: PromiseIntentDispatcher;
28
+ }
29
+ }
30
+
31
+ type RequestOptions = {
32
+ history?: Message[];
33
+ onComplete?: (messages: Message[]) => void;
34
+ };
35
+
36
+ export type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;
37
+
38
+ const defaultOptions: ChatProcessorOptions = {
39
+ model: DEFAULT_LLM_MODEL,
40
+ systemPrompt: 'you are a helpful assistant',
41
+ };
42
+
43
+ /**
44
+ * Handles interactions with the AI service.
45
+ * Maintains a queue of messages and handles streaming responses from the AI service.
46
+ * Executes tools based on AI responses.
47
+ * Supports cancellation of in-progress requests.
48
+ */
49
+ export class ChatProcessor {
50
+ /** SSE stream parser. */
51
+ private readonly _parser = new MixedStreamParser();
52
+
53
+ /** Current streaming response (iterator). */
54
+ private _stream: GenerationStream | undefined;
55
+
56
+ /** Pending messages (incl. the user request). */
57
+ private readonly _pending: Signal<Message[]> = signal([]);
58
+
59
+ /** Current streaming block (from the AI service). */
60
+ private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);
61
+
62
+ /** Prior history from queue. */
63
+ private _history: Message[] = [];
64
+
65
+ /**
66
+ * Streaming state.
67
+ * @reactive
68
+ */
69
+ public readonly streaming: Signal<boolean> = computed(() => this._block.value !== undefined);
70
+
71
+ /**
72
+ * Last error.
73
+ * @reactive
74
+ */
75
+ public readonly error: Signal<Error | undefined> = signal(undefined);
76
+
77
+ /**
78
+ * Array of Messages (incl. the current message being streamed).
79
+ * @reactive
80
+ */
81
+ public readonly messages: Signal<Message[]> = computed(() => {
82
+ const messages = [...this._pending.value];
83
+ if (this._block.value) {
84
+ const current = messages.pop();
85
+ invariant(current);
86
+ const { content, ...rest } = current;
87
+ const message = { ...rest, content: [...content, this._block.value] };
88
+ messages.push(message);
89
+ }
90
+
91
+ return messages;
92
+ });
93
+
94
+ constructor(
95
+ private readonly _client: AIServiceClientImpl,
96
+ private _tools?: Tool[],
97
+ private readonly _extensions?: ToolContextExtensions,
98
+ private readonly _options: ChatProcessorOptions = defaultOptions,
99
+ ) {
100
+ // Message complete.
101
+ this._parser.message.on((message) => {
102
+ batch(() => {
103
+ this._pending.value = [...this._pending.value, message];
104
+ this._block.value = undefined;
105
+ });
106
+ });
107
+
108
+ // Streaming update (happens before message complete).
109
+ this._parser.update.on((block) => {
110
+ batch(() => {
111
+ this._block.value = block;
112
+ });
113
+ });
114
+ }
115
+
116
+ /**
117
+ * Update tools.
118
+ */
119
+ setTools(tools: Tool[]) {
120
+ this._tools = tools;
121
+ }
122
+
123
+ /**
124
+ * Make GPT request.
125
+ */
126
+ async request(message: string, options: RequestOptions = {}): Promise<Message[]> {
127
+ batch(() => {
128
+ this._history = options.history ?? [];
129
+ this._pending.value = [
130
+ createStatic(Message, {
131
+ role: 'user',
132
+ content: [{ type: 'text', text: message }],
133
+ }),
134
+ ];
135
+ this._block.value = undefined;
136
+ });
137
+
138
+ await this._generate();
139
+ options.onComplete?.(this._pending.value);
140
+ return this._reset();
141
+ }
142
+
143
+ /**
144
+ * Cancel pending requests.
145
+ * @returns Pending requests (incl. the request message).
146
+ */
147
+ async cancel(): Promise<Message[]> {
148
+ log.info('cancelling...');
149
+ this._stream?.abort();
150
+ return this._reset();
151
+ }
152
+
153
+ private async _reset(): Promise<Message[]> {
154
+ const messages = this._pending.value;
155
+ batch(() => {
156
+ this._history = [];
157
+ this._pending.value = [];
158
+ this._block.value = undefined;
159
+ });
160
+
161
+ return messages;
162
+ }
163
+
164
+ /**
165
+ * Generate a response from the AI service.
166
+ * Iterates over tool requests.
167
+ */
168
+ private async _generate() {
169
+ try {
170
+ let more = false;
171
+ do {
172
+ log.info('requesting', { history: this._history.length, messages: this._pending.value.length });
173
+ this._stream = await this._client.generate({
174
+ ...this._options,
175
+ // TODO(burdon): Rename messages or separate history/message.
176
+ history: [...this._history, ...this._pending.value],
177
+ tools: this._tools,
178
+ });
179
+
180
+ // Wait until complete.
181
+ await this._parser.parse(this._stream);
182
+ await this._stream.complete();
183
+
184
+ // Add messages.
185
+ log.info('response', { messages: this._pending.value });
186
+
187
+ // Resolve tool use locally.
188
+ more = false;
189
+ const message = this._pending.value.at(-1);
190
+ invariant(message);
191
+ if (isToolUse(message)) {
192
+ log.info('tool request...');
193
+ const response = await runTools({
194
+ message: this._pending.value.at(-1)!,
195
+ tools: this._tools ?? [],
196
+ extensions: this._extensions,
197
+ });
198
+
199
+ log.info('tool response', { response });
200
+ switch (response.type) {
201
+ case 'continue': {
202
+ this._pending.value = [...this._pending.value, response.message];
203
+ more = true;
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ } while (more);
209
+
210
+ log.info('done');
211
+ } catch (err) {
212
+ log.catch(err);
213
+ this.error.value = new Error('AI service error', { cause: err });
214
+ } finally {
215
+ this._stream = undefined;
216
+ this.error.value = undefined;
217
+ }
218
+ }
219
+ }
@@ -0,0 +1,77 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useMemo, useState } from 'react';
6
+
7
+ import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { createSystemPrompt, type Tool } from '@dxos/artifact';
9
+ import { DEFAULT_LLM_MODEL } from '@dxos/assistant';
10
+ import { FunctionType } from '@dxos/functions';
11
+ import { log } from '@dxos/log';
12
+ import { useConfig } from '@dxos/react-client';
13
+ import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
14
+ import { isNonNullable } from '@dxos/util';
15
+
16
+ import { AutomationCapabilities } from '../capabilities';
17
+ import { ChatProcessor } from '../hooks';
18
+ import { covertFunctionToTool, createToolsFromService } from '../tools';
19
+ import { type AutomationSettingsProps, ServiceType } from '../types';
20
+
21
+ /**
22
+ * Configure and create ChatProcessor.
23
+ */
24
+ export const useChatProcessor = (space?: Space, settings?: AutomationSettingsProps): ChatProcessor => {
25
+ const aiClient = useCapability(AutomationCapabilities.AiClient);
26
+ const globalTools = useCapabilities(Capabilities.Tools);
27
+ const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
28
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
29
+
30
+ // Services.
31
+ const services = useQuery(space, Filter.schema(ServiceType));
32
+ const [serviceTools, setServiceTools] = useState<Tool[]>([]);
33
+ useEffect(() => {
34
+ log('creating service tools...');
35
+ queueMicrotask(async () => {
36
+ const tools = await Promise.all(services.map((service) => createToolsFromService(service)));
37
+ setServiceTools(tools.flat());
38
+ });
39
+ }, [services]);
40
+
41
+ // Tools and context.
42
+ const config = useConfig();
43
+ const functions = useQuery(space, Filter.schema(FunctionType));
44
+ const [tools, extensions] = useMemo(() => {
45
+ log('creating tools...');
46
+ const tools = [
47
+ ...globalTools.flat(),
48
+ ...artifactDefinitions.flatMap((definition) => definition.tools),
49
+ ...serviceTools,
50
+ ...functions
51
+ .map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))
52
+ .filter(isNonNullable),
53
+ ];
54
+ const extensions = { space, dispatch };
55
+ return [tools, extensions];
56
+ }, [dispatch, globalTools, artifactDefinitions, space, serviceTools, functions]);
57
+
58
+ // Prompt.
59
+ const systemPrompt = useMemo(
60
+ () => createSystemPrompt({ artifacts: artifactDefinitions.map((definition) => definition.instructions) }),
61
+ [artifactDefinitions],
62
+ );
63
+
64
+ // Create processor.
65
+ // TODO(burdon): Updated on each query update above. Should just update current processor.
66
+ const processor = useMemo(() => {
67
+ log('creating processor...', { settings });
68
+ return new ChatProcessor(aiClient, tools, extensions, {
69
+ // TODO(burdon): Remove defualt (let backend decide if not specified).
70
+ model: settings?.llmModel ?? DEFAULT_LLM_MODEL,
71
+ // TOOD(burdon): Query.
72
+ systemPrompt,
73
+ });
74
+ }, [aiClient, tools, extensions, systemPrompt, settings?.llmModel]);
75
+
76
+ return processor;
77
+ };
@@ -0,0 +1,23 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useMemo } from 'react';
6
+
7
+ import { type Message } from '@dxos/artifact';
8
+ import { DXN, QueueSubspaceTags } from '@dxos/keys';
9
+ import { getSpace } from '@dxos/react-client/echo';
10
+ import { useEdgeClient, useQueue } from '@dxos/react-edge-client';
11
+
12
+ import { type AIChatType } from '../types';
13
+
14
+ export const useMessageQueue = (chat?: AIChatType) => {
15
+ const space = getSpace(chat);
16
+ const queueDxn = useMemo(() => {
17
+ const dxn = space && chat?.queue.dxn;
18
+ return dxn ? new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space.id, dxn.parts.at(-1)!]) : undefined;
19
+ }, [space, chat?.queue.dxn]);
20
+
21
+ const edgeClient = useEdgeClient();
22
+ return useQueue<Message>(edgeClient, queueDxn);
23
+ };