@dxos/plugin-automation 0.7.5-main.9d26e3a → 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 (364) 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/ChatContainer-5BS6THNV.mjs +33 -0
  5. package/dist/lib/browser/ChatContainer-5BS6THNV.mjs.map +7 -0
  6. package/dist/lib/browser/TemplateContainer-HJJV44CE.mjs +23 -0
  7. package/dist/lib/browser/TemplateContainer-HJJV44CE.mjs.map +7 -0
  8. package/dist/lib/browser/ai-client-T2PBJISL.mjs +22 -0
  9. package/dist/lib/browser/ai-client-T2PBJISL.mjs.map +7 -0
  10. package/dist/lib/browser/app-graph-builder-IR3CGVM6.mjs +110 -0
  11. package/dist/lib/browser/app-graph-builder-IR3CGVM6.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-62E2AEXF.mjs +162 -0
  13. package/dist/lib/browser/chunk-62E2AEXF.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-67KDIIM6.mjs +15 -0
  15. package/dist/lib/browser/chunk-67KDIIM6.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-BQ4WHY4D.mjs +1818 -0
  17. package/dist/lib/browser/chunk-BQ4WHY4D.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-X5KMOH3I.mjs → chunk-HZSTXZWK.mjs} +6 -4
  19. package/dist/lib/browser/chunk-HZSTXZWK.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-LJ7F4KDM.mjs +243 -0
  21. package/dist/lib/browser/chunk-LJ7F4KDM.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-QH5E22EL.mjs +108 -0
  23. package/dist/lib/browser/chunk-QH5E22EL.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-XAIWETH6.mjs +81 -0
  25. package/dist/lib/browser/chunk-XAIWETH6.mjs.map +7 -0
  26. package/dist/lib/browser/index.mjs +210 -467
  27. package/dist/lib/browser/index.mjs.map +4 -4
  28. package/dist/lib/browser/intent-resolver-ICLE6FSI.mjs +44 -0
  29. package/dist/lib/browser/intent-resolver-ICLE6FSI.mjs.map +7 -0
  30. package/dist/lib/browser/meta.json +1 -1
  31. package/dist/lib/browser/react-surface-KEKVLCPQ.mjs +80 -0
  32. package/dist/lib/browser/react-surface-KEKVLCPQ.mjs.map +7 -0
  33. package/dist/lib/browser/settings-FE5DDWOE.mjs +22 -0
  34. package/dist/lib/browser/settings-FE5DDWOE.mjs.map +7 -0
  35. package/dist/lib/browser/types/index.mjs +18 -9
  36. package/dist/lib/node/AssistantDialog-E62O72KI.cjs +140 -0
  37. package/dist/lib/node/AssistantDialog-E62O72KI.cjs.map +7 -0
  38. package/dist/lib/node/{meta.cjs → AutomationPanel-6COLKRIB.cjs} +7 -11
  39. package/dist/lib/node/AutomationPanel-6COLKRIB.cjs.map +7 -0
  40. package/dist/lib/node/ChatContainer-4QTLL7TH.cjs +61 -0
  41. package/dist/lib/node/ChatContainer-4QTLL7TH.cjs.map +7 -0
  42. package/dist/lib/node/TemplateContainer-3YCM6XPU.cjs +53 -0
  43. package/dist/lib/node/TemplateContainer-3YCM6XPU.cjs.map +7 -0
  44. package/dist/lib/node/ai-client-L5GUSAER.cjs +38 -0
  45. package/dist/lib/node/ai-client-L5GUSAER.cjs.map +7 -0
  46. package/dist/lib/node/app-graph-builder-ECNVGTRT.cjs +122 -0
  47. package/dist/lib/node/app-graph-builder-ECNVGTRT.cjs.map +7 -0
  48. package/dist/lib/node/chunk-3QSK6IPK.cjs +133 -0
  49. package/dist/lib/node/chunk-3QSK6IPK.cjs.map +7 -0
  50. package/dist/lib/node/chunk-76F5BCJE.cjs +111 -0
  51. package/dist/lib/node/chunk-76F5BCJE.cjs.map +7 -0
  52. package/dist/lib/node/chunk-B37JIAOP.cjs +1795 -0
  53. package/dist/lib/node/chunk-B37JIAOP.cjs.map +7 -0
  54. package/dist/lib/node/{chunk-DTJ7XVO2.cjs → chunk-BAQRBGOJ.cjs} +11 -8
  55. package/dist/lib/node/chunk-BAQRBGOJ.cjs.map +7 -0
  56. package/dist/lib/node/chunk-UVWK2XJE.cjs +183 -0
  57. package/dist/lib/node/chunk-UVWK2XJE.cjs.map +7 -0
  58. package/dist/lib/node/chunk-V4L7LTWM.cjs +267 -0
  59. package/dist/lib/node/chunk-V4L7LTWM.cjs.map +7 -0
  60. package/dist/lib/node/chunk-VNBYGJ4K.cjs +34 -0
  61. package/dist/lib/node/chunk-VNBYGJ4K.cjs.map +7 -0
  62. package/dist/lib/node/index.cjs +201 -473
  63. package/dist/lib/node/index.cjs.map +4 -4
  64. package/dist/lib/node/intent-resolver-4MQZULXW.cjs +58 -0
  65. package/dist/lib/node/intent-resolver-4MQZULXW.cjs.map +7 -0
  66. package/dist/lib/node/meta.json +1 -1
  67. package/dist/lib/node/react-surface-4RVHY6WI.cjs +95 -0
  68. package/dist/lib/node/react-surface-4RVHY6WI.cjs.map +7 -0
  69. package/dist/lib/node/settings-GOIB2WJQ.cjs +36 -0
  70. package/dist/lib/node/settings-GOIB2WJQ.cjs.map +7 -0
  71. package/dist/lib/node/types/index.cjs +19 -10
  72. package/dist/lib/node/types/index.cjs.map +2 -2
  73. package/dist/lib/node-esm/AssistantDialog-IPRBJKWA.mjs +117 -0
  74. package/dist/lib/node-esm/AssistantDialog-IPRBJKWA.mjs.map +7 -0
  75. package/dist/lib/node-esm/AutomationPanel-3MPIAO7R.mjs +9 -0
  76. package/dist/lib/node-esm/ChatContainer-4IWUGMGM.mjs +34 -0
  77. package/dist/lib/node-esm/ChatContainer-4IWUGMGM.mjs.map +7 -0
  78. package/dist/lib/node-esm/TemplateContainer-YJIXR24Z.mjs +24 -0
  79. package/dist/lib/node-esm/TemplateContainer-YJIXR24Z.mjs.map +7 -0
  80. package/dist/lib/node-esm/ai-client-45LZLW7V.mjs +23 -0
  81. package/dist/lib/node-esm/ai-client-45LZLW7V.mjs.map +7 -0
  82. package/dist/lib/node-esm/app-graph-builder-HMRKSZ2X.mjs +111 -0
  83. package/dist/lib/node-esm/app-graph-builder-HMRKSZ2X.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-5BKKHYO5.mjs +163 -0
  85. package/dist/lib/node-esm/chunk-5BKKHYO5.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-AWAU4BHR.mjs +244 -0
  87. package/dist/lib/node-esm/chunk-AWAU4BHR.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-CAWPHOY4.mjs +82 -0
  89. package/dist/lib/node-esm/chunk-CAWPHOY4.mjs.map +7 -0
  90. package/dist/lib/node-esm/chunk-I32H7MCF.mjs +109 -0
  91. package/dist/lib/node-esm/chunk-I32H7MCF.mjs.map +7 -0
  92. package/dist/lib/node-esm/{chunk-HNOBZHWK.mjs → chunk-IG4GSWZN.mjs} +6 -4
  93. package/dist/lib/node-esm/chunk-IG4GSWZN.mjs.map +7 -0
  94. package/dist/lib/node-esm/chunk-QHKP5HT2.mjs +1819 -0
  95. package/dist/lib/node-esm/chunk-QHKP5HT2.mjs.map +7 -0
  96. package/dist/lib/node-esm/chunk-SS7U6GCX.mjs +16 -0
  97. package/dist/lib/node-esm/chunk-SS7U6GCX.mjs.map +7 -0
  98. package/dist/lib/node-esm/index.mjs +210 -467
  99. package/dist/lib/node-esm/index.mjs.map +4 -4
  100. package/dist/lib/node-esm/intent-resolver-ZS7XTYLG.mjs +45 -0
  101. package/dist/lib/node-esm/intent-resolver-ZS7XTYLG.mjs.map +7 -0
  102. package/dist/lib/node-esm/meta.json +1 -1
  103. package/dist/lib/node-esm/react-surface-5ILD642V.mjs +81 -0
  104. package/dist/lib/node-esm/react-surface-5ILD642V.mjs.map +7 -0
  105. package/dist/lib/node-esm/settings-ANNQPPRY.mjs +23 -0
  106. package/dist/lib/node-esm/settings-ANNQPPRY.mjs.map +7 -0
  107. package/dist/lib/node-esm/types/index.mjs +18 -9
  108. package/dist/types/src/AutomationPlugin.d.ts +1 -3
  109. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/ai-client.d.ts +5 -0
  111. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/app-graph-builder.d.ts +181 -0
  113. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  115. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/index.d.ts +183 -0
  117. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  119. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  121. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  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 -3
  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 +2 -4
  210. package/dist/types/src/index.d.ts.map +1 -1
  211. package/dist/types/src/meta.d.ts +2 -2
  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 +117 -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 +3 -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 +35 -5
  238. package/dist/types/src/types/types.d.ts.map +1 -1
  239. package/dist/types/tsconfig.tsbuildinfo +1 -1
  240. package/package.json +62 -48
  241. package/src/AutomationPlugin.tsx +102 -193
  242. package/src/capabilities/ai-client.ts +19 -0
  243. package/src/capabilities/app-graph-builder.ts +99 -0
  244. package/src/capabilities/capabilities.ts +12 -0
  245. package/src/capabilities/index.ts +13 -0
  246. package/src/capabilities/intent-resolver.ts +38 -0
  247. package/src/capabilities/react-surface.tsx +63 -0
  248. package/src/capabilities/settings.ts +19 -0
  249. package/src/components/AmbientDialog/AmbientDialog.stories.tsx +81 -0
  250. package/src/components/AmbientDialog/AmbientDialog.tsx +103 -0
  251. package/src/components/AmbientDialog/index.ts +5 -0
  252. package/src/components/AssistantDialog.tsx +33 -0
  253. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +2 -2
  254. package/src/components/AutomationPanel/AutomationPanel.tsx +54 -37
  255. package/src/components/AutomationSettings/AutomationSettings.tsx +49 -0
  256. package/src/components/AutomationSettings/index.ts +5 -0
  257. package/src/components/ChatContainer.tsx +29 -0
  258. package/src/components/Prompt/Prompt.stories.tsx +79 -0
  259. package/src/components/Prompt/Prompt.tsx +100 -0
  260. package/src/components/Prompt/PromptBar.tsx +100 -0
  261. package/src/components/Prompt/autocomplete.ts +212 -0
  262. package/src/components/Prompt/index.ts +6 -0
  263. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +49 -0
  264. package/src/components/ServiceRegistry/ServiceRegistry.tsx +76 -0
  265. package/src/components/ServiceRegistry/index.ts +5 -0
  266. package/src/components/TemplateContainer.tsx +21 -0
  267. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +72 -0
  268. package/src/components/TemplateEditor/TemplateEditor.tsx +76 -0
  269. package/src/components/TemplateEditor/TemplateForm.stories.tsx +65 -0
  270. package/src/components/TemplateEditor/TemplateForm.tsx +184 -0
  271. package/src/components/{PromptEditor → TemplateEditor}/index.ts +1 -1
  272. package/src/components/Thread/Thread.stories.tsx +212 -0
  273. package/src/components/Thread/Thread.tsx +97 -0
  274. package/src/components/Thread/ThreadContainer.stories.tsx +258 -0
  275. package/src/components/Thread/ThreadContainer.tsx +78 -0
  276. package/src/components/Thread/ThreadMessage.tsx +187 -0
  277. package/src/components/Thread/ToolInvocations.tsx +93 -0
  278. package/src/components/Thread/index.ts +6 -0
  279. package/src/components/Thread/reducer.ts +52 -0
  280. package/src/components/Toolbox/Toolbox.stories.tsx +65 -0
  281. package/src/components/Toolbox/Toolbox.tsx +117 -0
  282. package/src/components/Toolbox/index.ts +5 -0
  283. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +2 -2
  284. package/src/components/TriggerEditor/TriggerEditor.tsx +78 -14
  285. package/src/components/index.ts +11 -1
  286. package/src/hooks/index.ts +6 -0
  287. package/src/hooks/processor.test.ts +15 -0
  288. package/src/hooks/processor.ts +219 -0
  289. package/src/hooks/useChatProcessor.tsx +77 -0
  290. package/src/hooks/useMessageQueue.ts +23 -0
  291. package/src/hooks/useServices.ts +28 -0
  292. package/src/hooks/useTextInputEvents.ts +49 -0
  293. package/src/index.ts +3 -6
  294. package/src/meta.ts +5 -2
  295. package/src/testing/index.ts +2 -1
  296. package/src/testing/{testing.ts → test-functions.ts} +9 -2
  297. package/src/testing/test-services.ts +131 -0
  298. package/src/tools/function.ts +47 -0
  299. package/src/tools/index.ts +6 -0
  300. package/src/tools/openapi.test.ts +224 -0
  301. package/src/tools/openapi.ts +331 -0
  302. package/src/translations.ts +36 -2
  303. package/src/types/chat.ts +11 -0
  304. package/src/types/index.ts +3 -1
  305. package/src/types/service.ts +102 -0
  306. package/src/types/template.ts +34 -0
  307. package/src/types/types.ts +34 -20
  308. package/src/typings.d.ts +9 -0
  309. package/dist/lib/browser/AssistantPanel-32FH2RA6.mjs +0 -339
  310. package/dist/lib/browser/AssistantPanel-32FH2RA6.mjs.map +0 -7
  311. package/dist/lib/browser/AutomationPanel-ABGPG5LE.mjs +0 -151
  312. package/dist/lib/browser/AutomationPanel-ABGPG5LE.mjs.map +0 -7
  313. package/dist/lib/browser/chunk-DN5M2QL5.mjs +0 -49
  314. package/dist/lib/browser/chunk-DN5M2QL5.mjs.map +0 -7
  315. package/dist/lib/browser/chunk-X5KMOH3I.mjs.map +0 -7
  316. package/dist/lib/browser/meta.mjs +0 -9
  317. package/dist/lib/node/AssistantPanel-XANI7YNV.cjs +0 -359
  318. package/dist/lib/node/AssistantPanel-XANI7YNV.cjs.map +0 -7
  319. package/dist/lib/node/AutomationPanel-VADY3HMP.cjs +0 -171
  320. package/dist/lib/node/AutomationPanel-VADY3HMP.cjs.map +0 -7
  321. package/dist/lib/node/chunk-DTJ7XVO2.cjs.map +0 -7
  322. package/dist/lib/node/chunk-NIL4TP6U.cjs +0 -73
  323. package/dist/lib/node/chunk-NIL4TP6U.cjs.map +0 -7
  324. package/dist/lib/node/meta.cjs.map +0 -7
  325. package/dist/lib/node-esm/AssistantPanel-5M6O6JV7.mjs +0 -340
  326. package/dist/lib/node-esm/AssistantPanel-5M6O6JV7.mjs.map +0 -7
  327. package/dist/lib/node-esm/AutomationPanel-EETYIDPA.mjs +0 -152
  328. package/dist/lib/node-esm/AutomationPanel-EETYIDPA.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-GCHXTXVT.mjs +0 -51
  330. package/dist/lib/node-esm/chunk-GCHXTXVT.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-HNOBZHWK.mjs.map +0 -7
  332. package/dist/lib/node-esm/meta.mjs +0 -10
  333. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts +0 -8
  334. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +0 -1
  335. package/dist/types/src/components/AssistantPanel/index.d.ts +0 -3
  336. package/dist/types/src/components/AssistantPanel/index.d.ts.map +0 -1
  337. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts +0 -6
  338. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts.map +0 -1
  339. package/dist/types/src/components/PromptEditor/PromptEditor.d.ts +0 -10
  340. package/dist/types/src/components/PromptEditor/PromptEditor.d.ts.map +0 -1
  341. package/dist/types/src/components/PromptEditor/PromptEditor.stories.d.ts +0 -6
  342. package/dist/types/src/components/PromptEditor/PromptEditor.stories.d.ts.map +0 -1
  343. package/dist/types/src/components/PromptEditor/index.d.ts +0 -2
  344. package/dist/types/src/components/PromptEditor/index.d.ts.map +0 -1
  345. package/dist/types/src/components/PromptEditor/prompt-extension.d.ts +0 -4
  346. package/dist/types/src/components/PromptEditor/prompt-extension.d.ts.map +0 -1
  347. package/dist/types/src/components/PromptEditor/types.d.ts.map +0 -1
  348. package/dist/types/src/presets.d.ts +0 -9
  349. package/dist/types/src/presets.d.ts.map +0 -1
  350. package/dist/types/src/testing/testing.d.ts.map +0 -1
  351. package/dist/types/src/types/schema.d.ts +0 -63
  352. package/dist/types/src/types/schema.d.ts.map +0 -1
  353. package/src/components/AssistantPanel/AssistantPanel.tsx +0 -230
  354. package/src/components/AssistantPanel/index.ts +0 -7
  355. package/src/components/AssistantPanel/system-instructions.ts +0 -166
  356. package/src/components/PromptEditor/PromptEditor.stories.tsx +0 -64
  357. package/src/components/PromptEditor/PromptEditor.tsx +0 -222
  358. package/src/components/PromptEditor/prompt-extension.ts +0 -43
  359. package/src/presets.ts +0 -248
  360. package/src/types/schema.ts +0 -38
  361. /package/dist/lib/browser/{meta.mjs.map → AutomationPanel-NCKK3CFN.mjs.map} +0 -0
  362. /package/dist/lib/node-esm/{meta.mjs.map → AutomationPanel-3MPIAO7R.mjs.map} +0 -0
  363. /package/dist/types/src/components/{PromptEditor → TemplateEditor}/types.d.ts +0 -0
  364. /package/src/components/{PromptEditor → TemplateEditor}/types.tsx +0 -0
@@ -0,0 +1,63 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
+ import { SettingsStore } from '@dxos/local-storage';
9
+ import { getSpace, isEchoObject, isSpace, type ReactiveEchoObject } from '@dxos/react-client/echo';
10
+
11
+ import {
12
+ AssistantDialog,
13
+ AutomationPanel,
14
+ AutomationSettings,
15
+ ChatContainer,
16
+ ServiceRegistry,
17
+ TemplateContainer,
18
+ } from '../components';
19
+ import { AUTOMATION_PLUGIN, ASSISTANT_DIALOG } from '../meta';
20
+ import { AIChatType, type AutomationSettingsProps, TemplateType } from '../types';
21
+
22
+ export default () =>
23
+ contributes(Capabilities.ReactSurface, [
24
+ createSurface({
25
+ id: `${AUTOMATION_PLUGIN}/settings`,
26
+ role: 'article',
27
+ filter: (data): data is { subject: SettingsStore<AutomationSettingsProps> } =>
28
+ data.subject instanceof SettingsStore && data.subject.prefix === AUTOMATION_PLUGIN,
29
+ component: ({ data: { subject } }) => <AutomationSettings settings={subject.value} />,
30
+ }),
31
+ createSurface({
32
+ id: ASSISTANT_DIALOG,
33
+ role: 'dialog',
34
+ filter: (data): data is { props: { chat: AIChatType } } => data.component === ASSISTANT_DIALOG,
35
+ component: ({ data }) => <AssistantDialog {...data.props} />,
36
+ }),
37
+ createSurface({
38
+ id: `${AUTOMATION_PLUGIN}/chat`,
39
+ role: 'article',
40
+ filter: (data): data is { subject: AIChatType } => data.subject instanceof AIChatType,
41
+ component: ({ data, role }) => <ChatContainer role={role} chat={data.subject} />,
42
+ }),
43
+ createSurface({
44
+ id: `${AUTOMATION_PLUGIN}/template`,
45
+ role: 'article',
46
+ filter: (data): data is { subject: TemplateType } => data.subject instanceof TemplateType,
47
+ component: ({ data, role }) => <TemplateContainer role={role} template={data.subject} />,
48
+ }),
49
+ createSurface({
50
+ id: `${AUTOMATION_PLUGIN}/automation`,
51
+ role: 'complementary--automation',
52
+ filter: (data): data is { subject: ReactiveEchoObject<any> } =>
53
+ isEchoObject(data.subject) && !!getSpace(data.subject),
54
+ component: ({ data }) => <AutomationPanel space={getSpace(data.subject)!} object={data.subject} />,
55
+ }),
56
+ createSurface({
57
+ id: `${AUTOMATION_PLUGIN}/service-registry`,
58
+ role: 'complementary--service-registry',
59
+ component: ({ data }) => (
60
+ <ServiceRegistry space={isSpace(data.subject) ? data.subject : getSpace(data.subject)!} />
61
+ ),
62
+ }),
63
+ ]);
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capabilities, contributes } from '@dxos/app-framework';
6
+ import { create } from '@dxos/live-object';
7
+
8
+ import { AUTOMATION_PLUGIN } from '../meta';
9
+ import { type AutomationSettingsProps, AutomationSettingsSchema } from '../types';
10
+
11
+ export default () => {
12
+ const settings = create<AutomationSettingsProps>({});
13
+
14
+ return contributes(Capabilities.Settings, {
15
+ schema: AutomationSettingsSchema,
16
+ prefix: AUTOMATION_PLUGIN,
17
+ value: settings,
18
+ });
19
+ };
@@ -0,0 +1,81 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type StoryObj, type Meta } from '@storybook/react';
8
+ import React, { useState } from 'react';
9
+
10
+ import { IntentPlugin } from '@dxos/app-framework';
11
+ import { withPluginManager } from '@dxos/app-framework/testing';
12
+ import { Config } from '@dxos/client';
13
+ import { faker } from '@dxos/random';
14
+ import { withClientProvider } from '@dxos/react-client/testing';
15
+ import { Dialog, Toolbar, Button } from '@dxos/react-ui';
16
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
17
+
18
+ import { AmbientDialog } from './AmbientDialog';
19
+ import translations from '../../translations';
20
+
21
+ const meta: Meta<typeof AmbientDialog> = {
22
+ title: 'plugins/plugin-automation/AmbientDialog',
23
+ component: AmbientDialog,
24
+ render: () => {
25
+ const [open, setOpen] = useState(true);
26
+ const [items, setItems] = useState<string[]>([]);
27
+ return (
28
+ <>
29
+ <div>
30
+ <Toolbar.Root>
31
+ <Toolbar.Button onClick={() => setOpen(true)}>Open</Toolbar.Button>
32
+ </Toolbar.Root>
33
+ </div>
34
+ <Dialog.Root open={open} onOpenChange={setOpen}>
35
+ <AmbientDialog>
36
+ <div className='flex flex-col h-full overflow-hidden'>
37
+ <div className='flex flex-col h-full gap-2 overflow-auto'>
38
+ {items.map((item) => (
39
+ <div key={item} className='px-2'>
40
+ {item}
41
+ </div>
42
+ ))}
43
+ {items.length > 0 && <div className='pbe-2' />}
44
+ </div>
45
+ <div className='shrink-0 h-[40px]'>
46
+ <Button onClick={() => setItems([...items, faker.lorem.word()])}>Add</Button>
47
+ </div>
48
+ </div>
49
+ </AmbientDialog>
50
+ </Dialog.Root>
51
+ </>
52
+ );
53
+ },
54
+ decorators: [
55
+ withClientProvider({
56
+ config: new Config({
57
+ runtime: {
58
+ client: { edgeFeatures: { signaling: true } },
59
+ services: {
60
+ edge: { url: 'https://edge.dxos.workers.dev/' },
61
+ iceProviders: [{ urls: 'https://edge.dxos.workers.dev/ice' }],
62
+ },
63
+ },
64
+ }),
65
+ createIdentity: true,
66
+ createSpace: true,
67
+ }),
68
+ withPluginManager({ plugins: [IntentPlugin()] }),
69
+ withTheme,
70
+ withLayout({ fullscreen: true, tooltips: true }),
71
+ ],
72
+ parameters: {
73
+ translations,
74
+ },
75
+ };
76
+
77
+ export default meta;
78
+
79
+ type Story = StoryObj<typeof AmbientDialog>;
80
+
81
+ export const Default: Story = {};
@@ -0,0 +1,103 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren, useCallback, useEffect, useState } from 'react';
6
+
7
+ import { Dialog, Icon, IconButton } from '@dxos/react-ui';
8
+ import { resizeAttributes, ResizeHandle, type Size, sizeStyle } from '@dxos/react-ui-dnd';
9
+ import { mx } from '@dxos/react-ui-theme';
10
+
11
+ const preventDefault = (event: Event) => event.preventDefault();
12
+
13
+ const minSize = 5;
14
+
15
+ // TODO(burdon): Factor out.
16
+ export const AmbientDialog = ({
17
+ children,
18
+ open: _open,
19
+ title,
20
+ onOpenChange,
21
+ }: PropsWithChildren<{ open?: boolean; onOpenChange?: (open: boolean) => void; title?: string }>) => {
22
+ const [resizeKey, setReizeKey] = useState(0);
23
+ const [size, setSize] = useState<Size>('min-content');
24
+ const [open, setOpen] = useState(_open);
25
+
26
+ // Update controlled value.
27
+ useEffect(() => {
28
+ setOpen(_open);
29
+ }, [_open]);
30
+
31
+ // Update size and key.
32
+ useEffect(() => {
33
+ setSize(open ? 'min-content' : minSize);
34
+ setReizeKey((key) => key + 1);
35
+ }, [open]);
36
+
37
+ // TODO(burdon): Animate open/close.
38
+ // NOTE: We set the min size to 5rem (80px), and the header and prompt bar to 40px (i.e., the rail-size) each.
39
+ // The dialog has no vertical padding and has box-content so that when closed it collapses to the size of the header and prompt bar.
40
+ const handleToggle = useCallback(() => {
41
+ setOpen((open) => {
42
+ onOpenChange?.(!open);
43
+ return !open;
44
+ });
45
+ }, []);
46
+
47
+ return (
48
+ <div role='none' className='dx-dialog__overlay bg-transparent pointer-events-none' data-block-align='end'>
49
+ <Dialog.Content
50
+ classNames='relative box-content py-0 px-2 md:is-[35rem] md:max-is-none overflow-hidden pointer-events-auto transition-[block-size] ease-in-out duration-0 [&:not([data-dx-resizing="true"])]:duration-200'
51
+ inOverlayLayout
52
+ {...resizeAttributes}
53
+ style={{
54
+ ...sizeStyle(size, 'vertical', true),
55
+ maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 8rem)',
56
+ }}
57
+ onInteractOutside={preventDefault}
58
+ >
59
+ <ResizeHandle
60
+ key={resizeKey}
61
+ side='block-start'
62
+ defaultSize='min-content'
63
+ minSize={minSize}
64
+ fallbackSize={minSize}
65
+ iconPosition='center'
66
+ onSizeChange={setSize}
67
+ />
68
+
69
+ <DialogHeader open={open} title={title} onToggle={handleToggle} />
70
+
71
+ {children}
72
+ </Dialog.Content>
73
+ </div>
74
+ );
75
+ };
76
+
77
+ /**
78
+ * Matches same layout grid as PromptBar.
79
+ */
80
+ const DialogHeader = ({ open, title, onToggle }: { open?: boolean; title?: string; onToggle: () => void }) => {
81
+ return (
82
+ <div className='flex shrink-0 w-full grid grid-cols-[var(--rail-action)_1fr_var(--rail-action)] items-center overflow-hidden'>
83
+ <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>
84
+ <Dialog.Close>
85
+ <Icon icon='ph--x--regular' />
86
+ </Dialog.Close>
87
+ </div>
88
+ <div className='grow'>
89
+ <Dialog.Title classNames='flex justify-center text-xs text-subdued'>{title}</Dialog.Title>
90
+ </div>
91
+ <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>
92
+ <IconButton
93
+ variant='ghost'
94
+ icon={'ph--caret-up--regular'}
95
+ classNames={mx('[&>svg]:transition [&>svg]:duration-200', open && '[&>svg]:rotate-180')}
96
+ iconOnly
97
+ label='Shrink'
98
+ onClick={onToggle}
99
+ />
100
+ </div>
101
+ </div>
102
+ );
103
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './AmbientDialog';
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type FC, useState } from 'react';
6
+
7
+ import { useCapability, Capabilities, useCapabilities } from '@dxos/app-framework';
8
+ import { TranscriptionCapabilities } from '@dxos/plugin-transcription';
9
+ import { useTranslation } from '@dxos/react-ui';
10
+
11
+ import { AmbientDialog } from './AmbientDialog';
12
+ import { ThreadContainer } from './Thread';
13
+ import { AUTOMATION_PLUGIN } from '../meta';
14
+ import { type AutomationSettingsProps, type AIChatType } from '../types';
15
+
16
+ export const AssistantDialog: FC<{ chat?: AIChatType }> = ({ chat }) => {
17
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
18
+ const transcription = useCapabilities(TranscriptionCapabilities.Transcription).length > 0;
19
+ const settings = useCapability(Capabilities.SettingsStore).getStore<AutomationSettingsProps>(
20
+ AUTOMATION_PLUGIN,
21
+ )?.value;
22
+
23
+ // TODO(burdon): Refocus when open.
24
+ const [open, setOpen] = useState(false);
25
+
26
+ return (
27
+ <AmbientDialog open={open} onOpenChange={setOpen} title={t('assistant dialog title')}>
28
+ <ThreadContainer chat={chat} onOpenChange={setOpen} settings={settings} transcription={transcription} />
29
+ </AmbientDialog>
30
+ );
31
+ };
32
+
33
+ export default AssistantDialog;
@@ -15,7 +15,7 @@ import { withLayout, withTheme } from '@dxos/storybook-utils';
15
15
  import { AutomationPanel } from './AutomationPanel';
16
16
  import { functions } from '../../testing';
17
17
  import translations from '../../translations';
18
- import { ChainPromptType } from '../../types';
18
+ import { TemplateType } from '../../types';
19
19
 
20
20
  const DefaultStory = () => {
21
21
  const spaces = useSpaces();
@@ -36,7 +36,7 @@ const meta: Meta = {
36
36
  withClientProvider({
37
37
  createIdentity: true,
38
38
  createSpace: true,
39
- types: [FunctionType, FunctionTrigger, ChainPromptType],
39
+ types: [FunctionType, FunctionTrigger, TemplateType],
40
40
  onSpaceCreated: ({ space }) => {
41
41
  for (const fn of functions) {
42
42
  space.db.add(create(FunctionType, fn));
@@ -9,6 +9,7 @@ import {
9
9
  FunctionType,
10
10
  FunctionTrigger,
11
11
  FunctionTriggerSchema,
12
+ TriggerKind,
12
13
  type FunctionTriggerType,
13
14
  ScriptType,
14
15
  } from '@dxos/functions';
@@ -29,7 +30,7 @@ export type AutomationPanelProps = {
29
30
  };
30
31
 
31
32
  // TODO(burdon): Factor out common layout with ViewEditor.
32
- export const AutomationPanel = ({ space }: AutomationPanelProps) => {
33
+ export const AutomationPanel = ({ space, object }: AutomationPanelProps) => {
33
34
  const { t } = useTranslation(AUTOMATION_PLUGIN);
34
35
  const client = useClient();
35
36
  const triggers = useQuery(space, Filter.schema(FunctionTrigger));
@@ -46,7 +47,7 @@ export const AutomationPanel = ({ space }: AutomationPanelProps) => {
46
47
  };
47
48
 
48
49
  const handleAdd = () => {
49
- setTrigger(create(FunctionTriggerSchema, {}));
50
+ setTrigger(create(FunctionTriggerSchema, { meta: {} }));
50
51
  setSelected(undefined);
51
52
  };
52
53
 
@@ -76,43 +77,46 @@ export const AutomationPanel = ({ space }: AutomationPanelProps) => {
76
77
  <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>
77
78
  {({ items: triggers }) => (
78
79
  <div role='list' className='flex flex-col w-full'>
79
- {triggers?.map((trigger) => (
80
- <List.Item<FunctionTrigger>
81
- key={trigger.id}
82
- item={trigger}
83
- classNames={mx(grid, ghostHover, 'items-center')}
84
- >
85
- <Input.Root>
86
- <Input.Switch checked={trigger.enabled} onCheckedChange={(checked) => (trigger.enabled = checked)} />
87
- </Input.Root>
88
-
89
- <div className={'flex'}>
90
- <List.ItemTitle classNames='px-2 cursor-pointer w-0 shrink' onClick={() => handleSelect(trigger)}>
91
- {getFunctionName(scripts, functions, trigger)}
92
- </List.ItemTitle>
93
-
94
- {/* TODO: a better way to expose URL copy action */}
95
- <Button onClick={() => navigator.clipboard.writeText(getWebhookUrl(client, trigger))}>
96
- Copy URL
97
- </Button>
98
- </div>
99
-
100
- <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />
101
- </List.Item>
102
- ))}
80
+ {triggers?.map((trigger) => {
81
+ const copyAction = getCopyAction(client, trigger);
82
+ return (
83
+ <List.Item<FunctionTrigger>
84
+ key={trigger.id}
85
+ item={trigger}
86
+ classNames={mx(grid, ghostHover, 'items-center', 'px-2')}
87
+ >
88
+ <Input.Root>
89
+ <Input.Switch
90
+ checked={trigger.enabled}
91
+ onCheckedChange={(checked) => (trigger.enabled = checked)}
92
+ />
93
+ </Input.Root>
94
+
95
+ <div className={'flex'}>
96
+ <List.ItemTitle
97
+ classNames='px-1 cursor-pointer w-0 shrink truncate'
98
+ onClick={() => handleSelect(trigger)}
99
+ >
100
+ {getFunctionName(scripts, functions, trigger) ?? '∅'}
101
+ </List.ItemTitle>
102
+
103
+ {/* TODO: a better way to expose copy action */}
104
+ {copyAction && (
105
+ <Button onClick={() => navigator.clipboard.writeText(copyAction.contentProvider())}>
106
+ {t(copyAction.translationKey)}
107
+ </Button>
108
+ )}
109
+ </div>
110
+
111
+ <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />
112
+ </List.Item>
113
+ );
114
+ })}
103
115
  </div>
104
116
  )}
105
117
  </List.Root>
106
118
 
107
- {trigger && (
108
- <TriggerEditor
109
- space={space}
110
- storedTrigger={selected}
111
- trigger={trigger}
112
- onSave={handleSave}
113
- onCancel={handleCancel}
114
- />
115
- )}
119
+ {trigger && <TriggerEditor space={space} trigger={trigger} onSave={handleSave} onCancel={handleCancel} />}
116
120
 
117
121
  {!trigger && (
118
122
  <div className='flex p-2 justify-center'>
@@ -123,6 +127,18 @@ export const AutomationPanel = ({ space }: AutomationPanelProps) => {
123
127
  );
124
128
  };
125
129
 
130
+ const getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {
131
+ if (trigger?.spec?.type === TriggerKind.Email) {
132
+ return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };
133
+ }
134
+
135
+ if (trigger?.spec?.type === TriggerKind.Webhook) {
136
+ return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };
137
+ }
138
+
139
+ return undefined;
140
+ };
141
+
126
142
  const getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {
127
143
  const spaceId = getSpace(trigger)!.id;
128
144
  const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);
@@ -132,9 +148,10 @@ const getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {
132
148
  };
133
149
 
134
150
  const getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigger: FunctionTriggerType) => {
151
+ const shortId = trigger.function && `${trigger.function?.slice(0, 16)}…`;
135
152
  const functionObject = functions.find((fn) => fn.name === trigger.function);
136
153
  if (!functionObject) {
137
- return trigger.function;
154
+ return shortId;
138
155
  }
139
- return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? functionObject.name;
156
+ return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
140
157
  };
@@ -0,0 +1,49 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { DEFAULT_LLM_MODELS } from '@dxos/assistant';
8
+ import { Input, Select, useTranslation } from '@dxos/react-ui';
9
+ import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
10
+
11
+ import { AUTOMATION_PLUGIN } from '../../meta';
12
+ import { type AutomationSettingsProps } from '../../types';
13
+
14
+ export const AutomationSettings = ({ settings }: { settings: AutomationSettingsProps }) => {
15
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
16
+
17
+ return (
18
+ <DeprecatedFormContainer>
19
+ <DeprecatedFormInput label={t('settings custom prompts label')}>
20
+ <Input.Switch
21
+ checked={!!settings.customPrompts}
22
+ onCheckedChange={(checked) => (settings.customPrompts = checked)}
23
+ />
24
+ </DeprecatedFormInput>
25
+
26
+ <DeprecatedFormInput label={t('settings llm model label')}>
27
+ <Select.Root
28
+ value={settings.llmModel ?? 'default'}
29
+ onValueChange={(value) => {
30
+ settings.llmModel = value;
31
+ }}
32
+ >
33
+ <Select.TriggerButton placeholder={t('settings default llm model label')} />
34
+ <Select.Portal>
35
+ <Select.Content>
36
+ <Select.Viewport>
37
+ {DEFAULT_LLM_MODELS.map((model) => (
38
+ <Select.Option key={model} value={model}>
39
+ {model}
40
+ </Select.Option>
41
+ ))}
42
+ </Select.Viewport>
43
+ </Select.Content>
44
+ </Select.Portal>
45
+ </Select.Root>
46
+ </DeprecatedFormInput>
47
+ </DeprecatedFormContainer>
48
+ );
49
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './AutomationSettings';
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { Capabilities, useCapabilities, useCapability } from '@dxos/app-framework';
8
+ import { TranscriptionCapabilities } from '@dxos/plugin-transcription';
9
+ import { StackItem } from '@dxos/react-ui-stack';
10
+
11
+ import { ThreadContainer } from './Thread';
12
+ import { AUTOMATION_PLUGIN } from '../meta';
13
+ import { type AutomationSettingsProps, type AIChatType } from '../types';
14
+
15
+ // TODO(burdon): Attention.
16
+ export const ChatContainer = ({ chat, role }: { chat: AIChatType; role: string }) => {
17
+ const transcription = useCapabilities(TranscriptionCapabilities.Transcription).length > 0;
18
+ const settings = useCapability(Capabilities.SettingsStore).getStore<AutomationSettingsProps>(
19
+ AUTOMATION_PLUGIN,
20
+ )?.value;
21
+
22
+ return (
23
+ <StackItem.Content toolbar={false} role={role} classNames='mli-auto w-full max-w-[50rem]'>
24
+ <ThreadContainer chat={chat} settings={settings} transcription={transcription} />
25
+ </StackItem.Content>
26
+ );
27
+ };
28
+
29
+ export default ChatContainer;
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type StoryObj, type Meta } from '@storybook/react';
8
+ import React, { useEffect, useState } from 'react';
9
+
10
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+
12
+ import { Prompt } from './Prompt';
13
+ import { PromptBar } from './PromptBar';
14
+ import translations from '../../translations';
15
+
16
+ const meta: Meta<typeof Prompt> = {
17
+ title: 'plugins/plugin-automation/Prompt',
18
+ component: Prompt,
19
+ decorators: [withTheme, withLayout({ tooltips: true })],
20
+ parameters: {
21
+ layout: 'centered',
22
+ translations,
23
+ },
24
+ };
25
+
26
+ export default meta;
27
+
28
+ type Story = StoryObj<typeof Prompt>;
29
+
30
+ export const Default: Story = {
31
+ args: {
32
+ classNames: 'w-96 p-4 rounded outline outline-gray-200',
33
+ autoFocus: true,
34
+ onSubmit: (text) => {
35
+ console.log('onEnter', text);
36
+ },
37
+ onSuggest: (text) => {
38
+ const trimmed = text.trim().toLowerCase();
39
+ if (trimmed.length < 2) {
40
+ return [];
41
+ }
42
+
43
+ const suggestions = [
44
+ 'Create a kanban board',
45
+ 'Create a new project',
46
+ 'Find flights to Tokyo',
47
+ "Let's play chess",
48
+ 'Show me Paris on a map',
49
+ ];
50
+
51
+ return suggestions.filter((s) => s.toLowerCase().startsWith(text));
52
+ },
53
+ },
54
+ };
55
+
56
+ export const Toolbar: Story = {
57
+ render: (args) => {
58
+ const [processing, setProcessing] = useState(false);
59
+ useEffect(() => {
60
+ let t: NodeJS.Timeout;
61
+ if (processing) {
62
+ t = setTimeout(() => setProcessing(false), 10_000);
63
+ }
64
+ return () => clearTimeout(t);
65
+ }, [processing]);
66
+ console.log('processing', processing);
67
+
68
+ return (
69
+ <PromptBar
70
+ classNames='w-[25rem] p-1 overflow-hidden border border-gray-200 rounded'
71
+ microphone
72
+ processing={processing}
73
+ onSubmit={() => setProcessing(true)}
74
+ onCancel={() => setProcessing(false)}
75
+ {...args}
76
+ />
77
+ );
78
+ },
79
+ };