@dxos/plugin-automation 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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 (287) hide show
  1. package/dist/lib/browser/chunk-CHUTFU3D.mjs +54 -0
  2. package/dist/lib/browser/chunk-CHUTFU3D.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  4. package/dist/lib/browser/chunk-RE64VLSV.mjs +44 -0
  5. package/dist/lib/browser/chunk-RE64VLSV.mjs.map +7 -0
  6. package/dist/lib/browser/create-trigger-from-template-JLBSJRVB.mjs +70 -0
  7. package/dist/lib/browser/create-trigger-from-template-JLBSJRVB.mjs.map +7 -0
  8. package/dist/lib/browser/hooks/index.mjs +123 -6
  9. package/dist/lib/browser/hooks/index.mjs.map +4 -4
  10. package/dist/lib/browser/index.mjs +17 -102
  11. package/dist/lib/browser/index.mjs.map +4 -4
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/operations/index.mjs +14 -0
  14. package/dist/lib/browser/operations/index.mjs.map +7 -0
  15. package/dist/lib/browser/translations.mjs +47 -0
  16. package/dist/lib/browser/translations.mjs.map +7 -0
  17. package/dist/lib/browser/types/index.mjs +10 -4
  18. package/dist/lib/node-esm/chunk-HHIHREME.mjs +45 -0
  19. package/dist/lib/node-esm/chunk-HHIHREME.mjs.map +7 -0
  20. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  21. package/dist/lib/node-esm/chunk-NWQMBY32.mjs +56 -0
  22. package/dist/lib/node-esm/chunk-NWQMBY32.mjs.map +7 -0
  23. package/dist/lib/node-esm/create-trigger-from-template-FUQ3LUIF.mjs +71 -0
  24. package/dist/lib/node-esm/create-trigger-from-template-FUQ3LUIF.mjs.map +7 -0
  25. package/dist/lib/node-esm/hooks/index.mjs +123 -6
  26. package/dist/lib/node-esm/hooks/index.mjs.map +4 -4
  27. package/dist/lib/node-esm/index.mjs +17 -102
  28. package/dist/lib/node-esm/index.mjs.map +4 -4
  29. package/dist/lib/node-esm/meta.json +1 -1
  30. package/dist/lib/node-esm/operations/index.mjs +15 -0
  31. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  32. package/dist/lib/node-esm/translations.mjs +48 -0
  33. package/dist/lib/node-esm/translations.mjs.map +7 -0
  34. package/dist/lib/node-esm/types/index.mjs +10 -4
  35. package/dist/types/src/AutomationPlugin.d.ts +3 -1
  36. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  37. package/dist/types/src/AutomationPlugin.node.d.ts +4 -0
  38. package/dist/types/src/AutomationPlugin.node.d.ts.map +1 -0
  39. package/dist/types/src/AutomationPlugin.test.d.ts +2 -0
  40. package/dist/types/src/AutomationPlugin.test.d.ts.map +1 -0
  41. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  42. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/compute-runtime.d.ts +12 -3
  44. package/dist/types/src/capabilities/compute-runtime.d.ts.map +1 -1
  45. package/dist/types/src/capabilities/index.d.ts +6 -5
  46. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/node.d.ts +6 -0
  48. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  49. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  50. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  52. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  53. package/dist/types/src/commands/index.d.ts +2 -0
  54. package/dist/types/src/commands/index.d.ts.map +1 -0
  55. package/dist/types/src/commands/trigger/create/index.d.ts +25 -0
  56. package/dist/types/src/commands/trigger/create/index.d.ts.map +1 -0
  57. package/dist/types/src/commands/trigger/create/queue.d.ts +13 -0
  58. package/dist/types/src/commands/trigger/create/queue.d.ts.map +1 -0
  59. package/dist/types/src/commands/trigger/create/subscription.d.ts +15 -0
  60. package/dist/types/src/commands/trigger/create/subscription.d.ts.map +1 -0
  61. package/dist/types/src/commands/trigger/create/timer.d.ts +13 -0
  62. package/dist/types/src/commands/trigger/create/timer.d.ts.map +1 -0
  63. package/dist/types/src/commands/trigger/index.d.ts +57 -0
  64. package/dist/types/src/commands/trigger/index.d.ts.map +1 -0
  65. package/dist/types/src/commands/trigger/list.d.ts +7 -0
  66. package/dist/types/src/commands/trigger/list.d.ts.map +1 -0
  67. package/dist/types/src/commands/trigger/options.d.ts +11 -0
  68. package/dist/types/src/commands/trigger/options.d.ts.map +1 -0
  69. package/dist/types/src/commands/trigger/remove.d.ts +8 -0
  70. package/dist/types/src/commands/trigger/remove.d.ts.map +1 -0
  71. package/dist/types/src/commands/trigger/update/index.d.ts +28 -0
  72. package/dist/types/src/commands/trigger/update/index.d.ts.map +1 -0
  73. package/dist/types/src/commands/trigger/update/queue.d.ts +12 -0
  74. package/dist/types/src/commands/trigger/update/queue.d.ts.map +1 -0
  75. package/dist/types/src/commands/trigger/update/subscription.d.ts +13 -0
  76. package/dist/types/src/commands/trigger/update/subscription.d.ts.map +1 -0
  77. package/dist/types/src/commands/trigger/update/timer.d.ts +11 -0
  78. package/dist/types/src/commands/trigger/update/timer.d.ts.map +1 -0
  79. package/dist/types/src/commands/trigger/util.d.ts +46 -0
  80. package/dist/types/src/commands/trigger/util.d.ts.map +1 -0
  81. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +6 -7
  82. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  83. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +32 -27
  84. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -1
  86. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  87. package/dist/types/src/components/FunctionsPanel/index.d.ts.map +1 -1
  88. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts +8 -0
  89. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -0
  90. package/dist/types/src/components/FunctionsRegistry/index.d.ts +4 -0
  91. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -0
  92. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +12 -9
  93. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  94. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  95. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  96. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +11 -8
  97. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  98. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +106 -30
  99. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/index.d.ts +3 -4
  101. package/dist/types/src/components/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +6 -0
  103. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  104. package/dist/types/src/containers/AutomationSettings/index.d.ts +2 -0
  105. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -0
  106. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts +4 -0
  107. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -0
  108. package/dist/types/src/containers/FunctionsContainer/index.d.ts +2 -0
  109. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -0
  110. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -0
  111. package/dist/types/src/containers/TriggerSettings/index.d.ts +3 -0
  112. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -0
  113. package/dist/types/src/containers/index.d.ts +5 -0
  114. package/dist/types/src/containers/index.d.ts.map +1 -0
  115. package/dist/types/src/hooks/index.d.ts +2 -0
  116. package/dist/types/src/hooks/index.d.ts.map +1 -1
  117. package/dist/types/src/hooks/useComputeRuntime.d.ts +8 -0
  118. package/dist/types/src/hooks/useComputeRuntime.d.ts.map +1 -0
  119. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +5 -4
  120. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -1
  121. package/dist/types/src/hooks/useComputeRuntimeService.d.ts +17 -0
  122. package/dist/types/src/hooks/useComputeRuntimeService.d.ts.map +1 -0
  123. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +6 -5
  124. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  125. package/dist/types/src/index.d.ts +3 -4
  126. package/dist/types/src/index.d.ts.map +1 -1
  127. package/dist/types/src/meta.d.ts +2 -2
  128. package/dist/types/src/meta.d.ts.map +1 -1
  129. package/dist/types/src/operations/create-trigger-from-template.d.ts +5 -0
  130. package/dist/types/src/operations/create-trigger-from-template.d.ts.map +1 -0
  131. package/dist/types/src/operations/definitions.d.ts +19 -0
  132. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  133. package/dist/types/src/operations/index.d.ts +4 -0
  134. package/dist/types/src/operations/index.d.ts.map +1 -0
  135. package/dist/types/src/testing/test-functions.d.ts +204 -3
  136. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  137. package/dist/types/src/translations.d.ts +32 -28
  138. package/dist/types/src/translations.d.ts.map +1 -1
  139. package/dist/types/src/types/capabilities.d.ts +24 -0
  140. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  141. package/dist/types/src/types/events.d.ts +5 -0
  142. package/dist/types/src/types/events.d.ts.map +1 -0
  143. package/dist/types/src/types/index.d.ts +2 -0
  144. package/dist/types/src/types/index.d.ts.map +1 -1
  145. package/dist/types/src/types/schema.d.ts +12 -4
  146. package/dist/types/src/types/schema.d.ts.map +1 -1
  147. package/dist/types/tsconfig.tsbuildinfo +1 -1
  148. package/package.json +99 -56
  149. package/src/AutomationPlugin.node.ts +29 -0
  150. package/src/AutomationPlugin.test.ts +27 -0
  151. package/src/AutomationPlugin.tsx +20 -35
  152. package/src/capabilities/app-graph-builder.ts +59 -79
  153. package/src/capabilities/compute-runtime.ts +272 -83
  154. package/src/capabilities/index.ts +9 -7
  155. package/src/capabilities/node.ts +13 -0
  156. package/src/capabilities/operation-handler.ts +16 -0
  157. package/src/capabilities/react-surface.tsx +49 -46
  158. package/src/commands/index.ts +5 -0
  159. package/src/commands/trigger/create/index.ts +14 -0
  160. package/src/commands/trigger/create/queue.ts +86 -0
  161. package/src/commands/trigger/create/subscription.ts +125 -0
  162. package/src/commands/trigger/create/timer.ts +90 -0
  163. package/src/commands/trigger/index.ts +16 -0
  164. package/src/commands/trigger/list.ts +70 -0
  165. package/src/commands/trigger/options.ts +59 -0
  166. package/src/commands/trigger/remove.ts +45 -0
  167. package/src/commands/trigger/update/index.ts +14 -0
  168. package/src/commands/trigger/update/queue.ts +194 -0
  169. package/src/commands/trigger/update/subscription.ts +278 -0
  170. package/src/commands/trigger/update/timer.ts +193 -0
  171. package/src/commands/trigger/util.ts +410 -0
  172. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +7 -7
  173. package/src/components/AutomationPanel/AutomationPanel.tsx +249 -81
  174. package/src/components/FunctionsPanel/FunctionsPanel.tsx +50 -31
  175. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +114 -0
  176. package/src/components/FunctionsRegistry/index.ts +8 -0
  177. package/src/components/TriggerEditor/FunctionInputEditor.tsx +42 -35
  178. package/src/components/TriggerEditor/SpecSelector.tsx +28 -16
  179. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +116 -29
  180. package/src/components/TriggerEditor/TriggerEditor.tsx +109 -42
  181. package/src/components/index.ts +1 -2
  182. package/src/containers/AutomationSettings/AutomationSettings.tsx +31 -0
  183. package/src/containers/AutomationSettings/index.ts +5 -0
  184. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +33 -0
  185. package/src/containers/FunctionsContainer/index.ts +5 -0
  186. package/src/containers/TriggerSettings/TriggerSettings.tsx +48 -0
  187. package/src/containers/TriggerSettings/index.ts +6 -0
  188. package/src/containers/index.ts +9 -0
  189. package/src/hooks/index.ts +3 -0
  190. package/src/hooks/useComputeRuntime.ts +30 -0
  191. package/src/hooks/useComputeRuntimeCallback.ts +11 -9
  192. package/src/hooks/useComputeRuntimeService.ts +64 -0
  193. package/src/hooks/useTriggerRuntimeControls.ts +34 -16
  194. package/src/index.ts +5 -4
  195. package/src/meta.ts +9 -6
  196. package/src/operations/create-trigger-from-template.ts +71 -0
  197. package/src/operations/definitions.ts +28 -0
  198. package/src/operations/index.ts +9 -0
  199. package/src/testing/test-functions.ts +10 -7
  200. package/src/translations.ts +39 -33
  201. package/src/types/capabilities.ts +47 -0
  202. package/src/types/events.ts +11 -0
  203. package/src/types/index.ts +2 -0
  204. package/src/types/schema.ts +6 -6
  205. package/dist/lib/browser/AutomationPanel-4QA5G3ZY.mjs +0 -11
  206. package/dist/lib/browser/AutomationSettings-6XLG2PCK.mjs +0 -69
  207. package/dist/lib/browser/AutomationSettings-6XLG2PCK.mjs.map +0 -7
  208. package/dist/lib/browser/FunctionsContainer-BQ6VBDIG.mjs +0 -36
  209. package/dist/lib/browser/FunctionsContainer-BQ6VBDIG.mjs.map +0 -7
  210. package/dist/lib/browser/FunctionsPanel-QBTOFFNU.mjs +0 -10
  211. package/dist/lib/browser/app-graph-builder-6TP6ZNYG.mjs +0 -80
  212. package/dist/lib/browser/app-graph-builder-6TP6ZNYG.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-BDJPBZGC.mjs +0 -14
  214. package/dist/lib/browser/chunk-BDJPBZGC.mjs.map +0 -7
  215. package/dist/lib/browser/chunk-EAQL33PI.mjs +0 -94
  216. package/dist/lib/browser/chunk-EAQL33PI.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-F4K5EMWL.mjs +0 -38
  218. package/dist/lib/browser/chunk-F4K5EMWL.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-IN2YC7NY.mjs +0 -230
  220. package/dist/lib/browser/chunk-IN2YC7NY.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-LNMCGQC2.mjs +0 -143
  222. package/dist/lib/browser/chunk-LNMCGQC2.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-M2WQCY2T.mjs +0 -53
  224. package/dist/lib/browser/chunk-M2WQCY2T.mjs.map +0 -7
  225. package/dist/lib/browser/chunk-U66KBK53.mjs +0 -14
  226. package/dist/lib/browser/chunk-U66KBK53.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-WWURMV25.mjs +0 -13
  228. package/dist/lib/browser/chunk-WWURMV25.mjs.map +0 -7
  229. package/dist/lib/browser/chunk-ZTXBAXUT.mjs +0 -15
  230. package/dist/lib/browser/chunk-ZTXBAXUT.mjs.map +0 -7
  231. package/dist/lib/browser/compute-runtime-OFQPXD5I.mjs +0 -158
  232. package/dist/lib/browser/compute-runtime-OFQPXD5I.mjs.map +0 -7
  233. package/dist/lib/browser/intent-resolver-JXVWRAAH.mjs +0 -77
  234. package/dist/lib/browser/intent-resolver-JXVWRAAH.mjs.map +0 -7
  235. package/dist/lib/browser/react-surface-NG3MJCDH.mjs +0 -64
  236. package/dist/lib/browser/react-surface-NG3MJCDH.mjs.map +0 -7
  237. package/dist/lib/node-esm/AutomationPanel-WMVR3IST.mjs +0 -12
  238. package/dist/lib/node-esm/AutomationPanel-WMVR3IST.mjs.map +0 -7
  239. package/dist/lib/node-esm/AutomationSettings-4IW7RGMN.mjs +0 -70
  240. package/dist/lib/node-esm/AutomationSettings-4IW7RGMN.mjs.map +0 -7
  241. package/dist/lib/node-esm/FunctionsContainer-LHUUOLA5.mjs +0 -37
  242. package/dist/lib/node-esm/FunctionsContainer-LHUUOLA5.mjs.map +0 -7
  243. package/dist/lib/node-esm/FunctionsPanel-SHTQIMDV.mjs +0 -11
  244. package/dist/lib/node-esm/FunctionsPanel-SHTQIMDV.mjs.map +0 -7
  245. package/dist/lib/node-esm/app-graph-builder-3A2NIPR5.mjs +0 -81
  246. package/dist/lib/node-esm/app-graph-builder-3A2NIPR5.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-2L2X4JMP.mjs +0 -16
  248. package/dist/lib/node-esm/chunk-2L2X4JMP.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs +0 -15
  250. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs.map +0 -7
  251. package/dist/lib/node-esm/chunk-B6O6UBS7.mjs +0 -16
  252. package/dist/lib/node-esm/chunk-B6O6UBS7.mjs.map +0 -7
  253. package/dist/lib/node-esm/chunk-CEWZ2CDM.mjs +0 -39
  254. package/dist/lib/node-esm/chunk-CEWZ2CDM.mjs.map +0 -7
  255. package/dist/lib/node-esm/chunk-DSEZPWSO.mjs +0 -54
  256. package/dist/lib/node-esm/chunk-DSEZPWSO.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-MN5S5J4O.mjs +0 -144
  258. package/dist/lib/node-esm/chunk-MN5S5J4O.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-N7NES6SZ.mjs +0 -231
  260. package/dist/lib/node-esm/chunk-N7NES6SZ.mjs.map +0 -7
  261. package/dist/lib/node-esm/chunk-PBULJE4B.mjs +0 -95
  262. package/dist/lib/node-esm/chunk-PBULJE4B.mjs.map +0 -7
  263. package/dist/lib/node-esm/chunk-UTZIMYCX.mjs +0 -16
  264. package/dist/lib/node-esm/chunk-UTZIMYCX.mjs.map +0 -7
  265. package/dist/lib/node-esm/compute-runtime-W5UJNSQY.mjs +0 -159
  266. package/dist/lib/node-esm/compute-runtime-W5UJNSQY.mjs.map +0 -7
  267. package/dist/lib/node-esm/intent-resolver-ROEBZXSS.mjs +0 -78
  268. package/dist/lib/node-esm/intent-resolver-ROEBZXSS.mjs.map +0 -7
  269. package/dist/lib/node-esm/react-surface-A4KTYX6Z.mjs +0 -65
  270. package/dist/lib/node-esm/react-surface-A4KTYX6Z.mjs.map +0 -7
  271. package/dist/types/src/capabilities/capabilities.d.ts +0 -18
  272. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  273. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  274. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  275. package/dist/types/src/components/AutomationSettings.d.ts +0 -5
  276. package/dist/types/src/components/AutomationSettings.d.ts.map +0 -1
  277. package/dist/types/src/components/FunctionsContainer.d.ts +0 -7
  278. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  279. package/dist/types/src/components/TriggerSettings.d.ts.map +0 -1
  280. package/src/capabilities/capabilities.ts +0 -47
  281. package/src/capabilities/intent-resolver.ts +0 -72
  282. package/src/components/AutomationSettings.tsx +0 -30
  283. package/src/components/FunctionsContainer.tsx +0 -29
  284. package/src/components/TriggerSettings.tsx +0 -25
  285. /package/dist/lib/browser/{AutomationPanel-4QA5G3ZY.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  286. /package/dist/lib/{browser/FunctionsPanel-QBTOFFNU.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  287. /package/dist/types/src/{components → containers/TriggerSettings}/TriggerSettings.d.ts +0 -0
@@ -2,135 +2,324 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Toolkit } from '@effect/ai';
6
- import { BrowserKeyValueStore } from '@effect/platform-browser';
7
- import { Effect, Layer, ManagedRuntime } from 'effect';
5
+ import { Registry } from '@effect-atom/atom';
6
+ import * as BrowserKeyValueStore from '@effect/platform-browser/BrowserKeyValueStore';
7
+ import * as KeyValueStore from '@effect/platform/KeyValueStore';
8
+ import * as Context from 'effect/Context';
9
+ import * as Effect from 'effect/Effect';
10
+ import * as Fiber from 'effect/Fiber';
11
+ import * as Layer from 'effect/Layer';
12
+ import * as ManagedRuntime from 'effect/ManagedRuntime';
8
13
 
9
- import { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';
10
- import { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';
14
+ import { AiService, OpaqueToolkit } from '@dxos/ai';
15
+ import { Capabilities, Capability, type CapabilityManager } from '@dxos/app-framework';
16
+ import { AppCapabilities } from '@dxos/app-toolkit';
17
+ import { AiContextBinder, AiContextService, AiSession, AiSessionService } from '@dxos/assistant';
18
+ import { McpServer } from '@dxos/assistant-toolkit';
19
+ import { ClientService } from '@dxos/client';
20
+ import { SpaceProperties } from '@dxos/client-protocol';
21
+ import {
22
+ Blueprint,
23
+ Credential,
24
+ Operation,
25
+ OperationHandlerSet,
26
+ OperationRegistry,
27
+ ServiceNotAvailableError,
28
+ } from '@dxos/compute';
11
29
  import { Resource } from '@dxos/context';
12
- import { Query, Ref } from '@dxos/echo';
30
+ import { Database, DXN, Feed, Filter, Obj } from '@dxos/echo';
31
+ import { AtomObj } from '@dxos/echo-atom';
32
+ import { createFeedServiceLayer } from '@dxos/echo-db';
33
+ import { acquireReleaseResource, asyncTaskTaggingLayer } from '@dxos/effect';
13
34
  import {
14
- CredentialsService,
15
- DatabaseService,
16
- FunctionImplementationResolver,
17
35
  FunctionInvocationService,
18
- InvocationTracer,
19
- LocalFunctionExecutionService,
36
+ feedServiceFromQueueServiceLayer,
20
37
  QueueService,
38
+ credentialsLayerFromDatabase,
39
+ } from '@dxos/functions';
40
+ import { AgentService } from '@dxos/functions-runtime';
41
+ import {
42
+ FeedTraceSink,
43
+ FunctionImplementationResolver,
44
+ FunctionInvocationServiceLayerWithLocalLoopbackExecutor,
45
+ ProcessManager,
21
46
  RemoteFunctionExecutionService,
47
+ ServiceResolver,
22
48
  TriggerDispatcher,
23
- } from '@dxos/functions';
24
- import { TriggerStateStore } from '@dxos/functions';
49
+ TriggerStateStore,
50
+ } from '@dxos/functions-runtime';
25
51
  import { invariant } from '@dxos/invariant';
26
52
  import { type SpaceId } from '@dxos/keys';
27
- import { ClientCapabilities } from '@dxos/plugin-client';
28
- import { PropertiesType } from '@dxos/react-client/echo';
53
+ import { log } from '@dxos/log';
54
+ import { ClientCapabilities } from '@dxos/plugin-client/types';
55
+
56
+ import { AutomationCapabilities } from '#types';
57
+
58
+ export default Capability.makeModule(
59
+ Effect.fnUntraced(function* () {
60
+ const capabilities = yield* Capability.Service;
61
+ const provider = yield* Effect.tryPromise(() => new ComputeRuntimeProviderImpl(capabilities).open());
62
+ return Capability.contributes(AutomationCapabilities.ComputeRuntime, provider, () =>
63
+ Effect.tryPromise(() => provider.close()),
64
+ );
65
+ }),
66
+ );
29
67
 
30
- import { AutomationCapabilities } from './capabilities';
68
+ declare global {
69
+ interface ImportMeta {
70
+ env: ImportMetaEnv;
71
+ }
31
72
 
32
- export default async (context: PluginContext) => {
33
- const provider = await new ComputeRuntimeProviderImpl(context).open();
34
- return contributes(AutomationCapabilities.ComputeRuntime, provider, async () => {
35
- await provider.close();
36
- });
37
- };
73
+ interface ImportMetaEnv {
74
+ DEV: boolean;
75
+ }
76
+ }
38
77
 
78
+ const isDev = import.meta.env.DEV ?? false;
79
+
80
+ /** Node / test environments have no `localStorage`; browser keeps persistent trigger state. */
81
+ const triggerStateStoreLayer =
82
+ typeof globalThis.localStorage !== 'undefined'
83
+ ? TriggerStateStore.layerKv.pipe(Layer.provide(BrowserKeyValueStore.layerLocalStorage))
84
+ : TriggerStateStore.layerMemory;
85
+
86
+ /**
87
+ * Adapts plugin capabilities to runtime layers.
88
+ */
39
89
  class ComputeRuntimeProviderImpl extends Resource implements AutomationCapabilities.ComputeRuntimeProvider {
40
- readonly #runtimes = new Map<SpaceId, ManagedRuntime.ManagedRuntime<AutomationCapabilities.ComputeServices, never>>();
41
- readonly #context: PluginContext;
90
+ readonly #runtimes = new Map<SpaceId, AutomationCapabilities.ComputeRuntime>();
91
+ readonly #subscriptions = new Map<SpaceId, () => void>();
92
+ readonly #capabilities: CapabilityManager.CapabilityManager;
42
93
 
43
- constructor(context: PluginContext) {
94
+ constructor(capabilities: CapabilityManager.CapabilityManager) {
44
95
  super();
45
- this.#context = context;
96
+ this.#capabilities = capabilities;
46
97
  }
47
98
 
48
99
  protected override async _open() {}
49
100
 
50
101
  protected override async _close() {
102
+ for (const unsubscribe of this.#subscriptions.values()) {
103
+ unsubscribe();
104
+ }
105
+ this.#subscriptions.clear();
51
106
  await Promise.all(Array.from(this.#runtimes.values()).map((rt) => rt.dispose()));
52
107
  this.#runtimes.clear();
53
108
  }
54
109
 
55
- getRuntime(spaceId: SpaceId): ManagedRuntime.ManagedRuntime<AutomationCapabilities.ComputeServices, never> {
110
+ getRuntime(spaceId: SpaceId): AutomationCapabilities.ComputeRuntime {
56
111
  if (this.#runtimes.has(spaceId)) {
112
+ log('getRuntime cache hit', { spaceId });
57
113
  return this.#runtimes.get(spaceId)!;
58
114
  }
115
+ log('getRuntime building', { spaceId });
59
116
 
60
- const layer = Layer.unwrapEffect(
117
+ const layer = Layer.unwrapScoped(
61
118
  Effect.gen(this, function* () {
62
- const client = this.#context.getCapability(ClientCapabilities.Client);
63
- const serviceLayer =
64
- this.#context.getCapability(Capabilities.AiServiceLayer) ?? Layer.die('AiService not found');
119
+ log('compute runtime layer build: start', { spaceId });
120
+ const client = this.#capabilities.get(ClientCapabilities.Client);
121
+ const aiServiceLayer =
122
+ this.#capabilities.get(AppCapabilities.AiServiceLayer) ?? Layer.die('AiService not found');
123
+ const registry = this.#capabilities.get(Capabilities.AtomRegistry);
124
+
125
+ // TODO(dmaretskyi): Make these reactive.
126
+ const operationHandlers = OperationHandlerSet.merge(
127
+ ...this.#capabilities.getAll(Capabilities.OperationHandler),
128
+ );
65
129
 
66
- // TODO(dmaretskyi): Make those reactive.
67
- const functions = this.#context.getCapabilities(Capabilities.Functions);
68
- const toolkits = this.#context.getCapabilities(Capabilities.Toolkit);
69
- const handlers = this.#context.getCapabilities(Capabilities.ToolkitHandler);
130
+ const opaqueToolkitProvider = Layer.succeed(OpaqueToolkit.OpaqueToolkitProvider, {
131
+ getToolkit: () => {
132
+ const toolkits = this.#capabilities.getAll(AppCapabilities.Toolkit);
133
+ return OpaqueToolkit.merge(...toolkits);
134
+ },
135
+ });
70
136
 
71
- const allFunctions = functions.flat();
72
- // TODO(wittjosiah): Don't cast.
73
- const toolkit = Toolkit.merge(...toolkits) as Toolkit.Toolkit<any>;
74
- const handlersLayer = Layer.mergeAll(Layer.empty, ...handlers);
137
+ const blueprints = this.#capabilities
138
+ .getAll(AppCapabilities.BlueprintDefinition)
139
+ .flatMap((blueprint) => blueprint.make());
75
140
 
76
141
  const space = client.spaces.get(spaceId);
77
- invariant(space);
142
+ invariant(space, `Invalid space: ${spaceId}`);
143
+ log('compute runtime layer build: waiting for space ready', { spaceId });
144
+ const waitStarted = Date.now();
78
145
  yield* Effect.promise(() => space.waitUntilReady());
146
+ log('compute runtime layer build: space ready', { spaceId, waitMs: Date.now() - waitStarted });
147
+
148
+ // Maintain a live query of space-level MCP server configs.
149
+ const mcpQuery = space.db.query(Filter.type(McpServer.McpServer));
150
+ this.#subscriptions.set(spaceId, mcpQuery.subscribe());
79
151
 
80
- return Layer.mergeAll(TriggerDispatcher.layer({ timeControl: 'natural' })).pipe(
81
- Layer.provideMerge(
82
- Layer.mergeAll(
83
- InvocationTracerLive,
84
- TriggerStateStore.layerKv.pipe(Layer.provide(BrowserKeyValueStore.layerLocalStorage)),
85
- makeToolResolverFromFunctions(allFunctions, toolkit),
86
- makeToolExecutionServiceFromFunctions(toolkit, handlersLayer),
152
+ log('compute runtime layer build: composing inner layer', { spaceId });
153
+ return Layer.scopedDiscard(
154
+ Effect.gen(function* () {
155
+ log('compute runtime inner layer: acquiring services', { spaceId });
156
+ const registry = yield* Registry.AtomRegistry;
157
+ const triggerDispatcher = yield* TriggerDispatcher;
158
+ log('compute runtime inner layer: services acquired', { spaceId });
159
+ // Track the in-flight start/stop so a new transition cancels the previous one
160
+ // (preserving ordering on rapid toggles) and surfaces failures via the Effect logger.
161
+ let inFlight: Fiber.RuntimeFiber<unknown, unknown> | undefined;
162
+ const transition = (effect: Effect.Effect<unknown, unknown>) => {
163
+ if (inFlight) {
164
+ Effect.runFork(Fiber.interrupt(inFlight));
165
+ }
166
+ inFlight = Effect.runFork(
167
+ effect.pipe(
168
+ Effect.tapErrorCause((cause) => Effect.logError('trigger dispatcher transition failed', cause)),
169
+ ),
170
+ );
171
+ };
172
+ const unsubscribe = registry.subscribe(
173
+ AtomObj.make(space.properties),
174
+ (properties: Obj.Snapshot<SpaceProperties>) => {
175
+ const computeEnvironment = properties.computeEnvironment ?? 'local';
176
+ transition(computeEnvironment === 'local' ? triggerDispatcher.start() : triggerDispatcher.stop());
177
+ },
178
+ { immediate: true },
179
+ );
180
+ yield* Effect.addFinalizer(() =>
181
+ Effect.sync(() => {
182
+ log('compute runtime inner layer: finalize', { spaceId });
183
+ unsubscribe();
184
+ if (inFlight) {
185
+ Effect.runFork(Fiber.interrupt(inFlight));
186
+ }
187
+ }),
188
+ );
189
+ log('compute runtime inner layer: acquire complete', { spaceId });
190
+ }),
191
+ )
192
+ .pipe(
193
+ Layer.provideMerge(TriggerDispatcher.layer({ timeControl: 'natural' })),
194
+ Layer.provideMerge(
195
+ AgentService.layer({
196
+ getMcpServers: () =>
197
+ mcpQuery.results
198
+ .filter(Obj.instanceOf(McpServer.McpServer))
199
+ .filter((server) => server.enabled !== false)
200
+ .map(({ url, protocol, apiKey }) => ({ url, protocol, apiKey })),
201
+ }),
202
+ ),
203
+ Layer.provideMerge(ProcessManager.ProcessOperationInvoker.layer),
204
+ Layer.provideMerge(ProcessManager.layer()),
205
+ // TODO(dmaretskyi): Duped in assistant testing layer.
206
+ Layer.provideMerge(
207
+ // TODO(dmaretskyi): Refactor to be able to merge resovler layers, also consider service mesh achitecture.
208
+ Layer.effect(
209
+ ServiceResolver.ServiceResolver,
210
+ Effect.gen(function* () {
211
+ const services = yield* Effect.context<Database.Service | Feed.FeedService>().pipe(
212
+ Effect.map(Context.pick(Database.Service, Feed.FeedService)),
213
+ Effect.map(Layer.succeedContext),
214
+ );
215
+ // AiContextBinder.
216
+ return ServiceResolver.compose(
217
+ ServiceResolver.succeed(AiContextService, (context) =>
218
+ Effect.gen(function* () {
219
+ if (!context.conversation) {
220
+ return yield* Effect.fail(new ServiceNotAvailableError(AiContextService.key));
221
+ }
222
+ const feed = yield* Database.resolve(DXN.parse(context.conversation), Feed.Feed).pipe(
223
+ Effect.orDie,
224
+ );
225
+ const runtime = yield* Effect.runtime<Feed.FeedService>();
226
+ const binder = yield* acquireReleaseResource(
227
+ () =>
228
+ new AiContextBinder({
229
+ feed,
230
+ runtime,
231
+ }),
232
+ );
233
+ return { binder };
234
+ }).pipe(Effect.provide(services)),
235
+ ),
236
+ // AiSessionService.
237
+ ServiceResolver.succeed(AiSessionService, (context) =>
238
+ Effect.gen(function* () {
239
+ if (!context.conversation) {
240
+ return yield* Effect.fail(new ServiceNotAvailableError(AiSessionService.key));
241
+ }
242
+ const feed = yield* Database.resolve(DXN.parse(context.conversation), Feed.Feed).pipe(
243
+ Effect.orDie,
244
+ );
245
+ const runtime = yield* Effect.runtime<Feed.FeedService>();
246
+ const session = yield* acquireReleaseResource(
247
+ () =>
248
+ new AiSession({
249
+ feed,
250
+ runtime,
251
+ }),
252
+ );
253
+ return session;
254
+ }).pipe(Effect.provide(services)),
255
+ ),
256
+ yield* ServiceResolver.fromRequirements(
257
+ Database.Service,
258
+ OpaqueToolkit.OpaqueToolkitProvider,
259
+ Feed.FeedService,
260
+ QueueService,
261
+ AiService.AiService,
262
+ OperationRegistry.Service,
263
+ Blueprint.RegistryService,
264
+ Credential.CredentialsService,
265
+ ),
266
+ );
267
+ }),
268
+ ),
269
+ ),
270
+ Layer.provideMerge(Layer.succeed(Blueprint.RegistryService, new Blueprint.Registry(blueprints))),
271
+ Layer.provideMerge(Layer.succeed(Capability.Service, this.#capabilities)),
272
+ Layer.provideMerge(Layer.succeed(Registry.AtomRegistry, registry)),
273
+ Layer.provideMerge(
274
+ Layer.mergeAll(FeedTraceSink.layerLive, triggerStateStoreLayer, KeyValueStore.layerMemory),
87
275
  ),
88
- ),
89
- Layer.provideMerge(
90
- Layer.mergeAll(
91
- FunctionInvocationService.layer.pipe(
276
+ Layer.provideMerge(OperationRegistry.layer),
277
+ Layer.provideMerge(feedServiceFromQueueServiceLayer),
278
+ Layer.provideMerge(OperationHandlerSet.provide(operationHandlers)),
279
+ Layer.provideMerge(
280
+ Layer.effect(
281
+ Operation.Service,
282
+ Effect.gen(function* () {
283
+ const fis = yield* FunctionInvocationService;
284
+ return {
285
+ invoke: (op: any, ...args: any[]) => (fis.invokeFunction as any)(op, args[0]),
286
+ schedule: (op: any, ...args: any[]) =>
287
+ (fis.invokeFunction as any)(op, args[0]).pipe(Effect.fork, Effect.asVoid),
288
+ invokePromise: async () => ({ error: new Error('Not implemented') }),
289
+ } as unknown as Operation.OperationService;
290
+ }),
291
+ ),
292
+ ),
293
+ Layer.provideMerge(
294
+ FunctionInvocationServiceLayerWithLocalLoopbackExecutor.pipe(
295
+ Layer.provideMerge(FunctionImplementationResolver.layerTest({ functions: operationHandlers })),
92
296
  Layer.provideMerge(
93
- LocalFunctionExecutionService.layerLive.pipe(
94
- Layer.provideMerge(FunctionImplementationResolver.layerTest({ functions: allFunctions })),
95
- Layer.provideMerge(
96
- RemoteFunctionExecutionService.fromClient(
97
- client.edge.baseUrl,
98
- // If agent is not enabled do not provide spaceId because space context will be unavailable on EDGE.
297
+ client.config.values.runtime?.services?.edge?.url
298
+ ? RemoteFunctionExecutionService.fromClient(
299
+ client,
99
300
  client.config.get('runtime.client.edgeFeatures.agents') ? spaceId : undefined,
100
- ),
101
- ),
102
- Layer.provideMerge(serviceLayer),
103
- Layer.provideMerge(CredentialsService.layerFromDatabase()),
104
- Layer.provideMerge(space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable),
105
- Layer.provideMerge(space ? QueueService.layer(space.queues) : QueueService.notAvailable),
106
- ),
301
+ )
302
+ : RemoteFunctionExecutionService.layerMock,
107
303
  ),
108
304
  ),
109
305
  ),
110
- ),
111
- );
306
+ Layer.provideMerge(opaqueToolkitProvider),
307
+ Layer.provideMerge(aiServiceLayer),
308
+ Layer.provideMerge(credentialsLayerFromDatabase()),
309
+ Layer.provideMerge(ClientService.fromClient(client)),
310
+ Layer.provideMerge(space ? Database.layer(space.db) : Database.notAvailable),
311
+ )
312
+ .pipe(
313
+ Layer.provideMerge(space ? QueueService.layer(space.queues) : QueueService.notAvailable),
314
+ Layer.provideMerge(space ? createFeedServiceLayer(space.queues) : Feed.notAvailable),
315
+ Layer.provideMerge(isDev ? asyncTaskTaggingLayer() : Layer.empty),
316
+ );
112
317
  }),
113
318
  );
114
319
 
115
320
  const runtime = ManagedRuntime.make(layer);
321
+ log('getRuntime ready (managed runtime created)', { spaceId });
116
322
  this.#runtimes.set(spaceId, runtime);
117
-
118
323
  return runtime;
119
324
  }
120
325
  }
121
-
122
- const InvocationTracerLive = Layer.unwrapEffect(
123
- Effect.gen(function* () {
124
- const {
125
- objects: [properties],
126
- } = yield* DatabaseService.runQuery(Query.type(PropertiesType));
127
- invariant(properties);
128
- if (!properties.invocationTraceQueue) {
129
- const queue = yield* QueueService.createQueue({ subspaceTag: 'trace' });
130
- properties.invocationTraceQueue = Ref.fromDXN(queue.dxn);
131
- }
132
- const queue = properties.invocationTraceQueue.target;
133
- invariant(queue);
134
- return InvocationTracer.layerLive({ invocationTraceQueue: queue });
135
- }),
136
- );
@@ -2,11 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from '@dxos/app-framework';
5
+ import { Capability } from '@dxos/app-framework';
6
+ import { OperationHandlerSet } from '@dxos/compute';
6
7
 
7
- export const AppGraphBuilder = lazy(() => import('./app-graph-builder'));
8
- export const ComputeRuntime = lazy(() => import('./compute-runtime'));
9
- export const IntentResolver = lazy(() => import('./intent-resolver'));
10
- export const ReactSurface = lazy(() => import('./react-surface'));
11
-
12
- export * from './capabilities';
8
+ export const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));
9
+ export const ComputeRuntime = Capability.lazy('ComputeRuntime', () => import('./compute-runtime'));
10
+ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
11
+ 'OperationHandler',
12
+ () => import('./operation-handler'),
13
+ );
14
+ export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
@@ -0,0 +1,13 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capability } from '@dxos/app-framework';
6
+ import { OperationHandlerSet } from '@dxos/compute';
7
+
8
+ export const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));
9
+ export const ComputeRuntime = Capability.lazy('ComputeRuntime', () => import('./compute-runtime'));
10
+ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
11
+ 'OperationHandler',
12
+ () => import('./operation-handler'),
13
+ );
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import type { OperationHandlerSet } from '@dxos/compute';
9
+
10
+ import { AutomationOperationHandlerSet } from '#operations';
11
+
12
+ export default Capability.makeModule<OperationHandlerSet.OperationHandlerSet>(
13
+ Effect.fnUntraced(function* () {
14
+ return Capability.contributes(Capabilities.OperationHandler, AutomationOperationHandlerSet);
15
+ }),
16
+ );
@@ -2,55 +2,58 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import * as Effect from 'effect/Effect';
5
6
  import React from 'react';
6
7
 
7
- import { Capabilities, contributes, createSurface, useLayout } from '@dxos/app-framework';
8
- import { Obj } from '@dxos/echo';
9
- import { ScriptType } from '@dxos/functions';
10
- import { getSpace, parseId, useSpace } from '@dxos/react-client/echo';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { Surface } from '@dxos/app-framework/ui';
10
+ import { AppSurface, useActiveSpace } from '@dxos/app-toolkit/ui';
11
+ import { getSpace } from '@dxos/react-client/echo';
11
12
 
12
- import { AutomationSettings, FunctionsContainer } from '../components';
13
- import { meta } from '../meta';
13
+ import { AutomationSettings, FunctionsContainer } from '#containers';
14
+ import { meta } from '#meta';
14
15
 
15
- export default () =>
16
- contributes(Capabilities.ReactSurface, [
17
- createSurface({
18
- id: `${meta.id}/space-settings-functions`,
19
- role: 'article',
20
- filter: (data): data is { subject: string } => data.subject === `${meta.id}/space-settings-functions`,
21
- component: () => {
22
- const layout = useLayout();
23
- const { spaceId } = parseId(layout.workspace);
24
- const space = useSpace(spaceId);
25
- if (!space) {
26
- return null;
27
- }
16
+ export default Capability.makeModule(() =>
17
+ Effect.succeed(
18
+ Capability.contributes(Capabilities.ReactSurface, [
19
+ Surface.create({
20
+ id: 'space-settings-functions',
21
+ filter: AppSurface.literal(AppSurface.Article, `${meta.id}.space-settings-functions`),
22
+ component: () => {
23
+ const space = useActiveSpace();
24
+ if (!space) {
25
+ return null;
26
+ }
28
27
 
29
- return <FunctionsContainer space={space} />;
30
- },
31
- }),
32
- createSurface({
33
- id: `${meta.id}/space-settings-automation`,
34
- role: 'article',
35
- filter: (data): data is { subject: string } => data.subject === `${meta.id}/space-settings-automation`,
36
- component: () => {
37
- const layout = useLayout();
38
- const { spaceId } = parseId(layout.workspace);
39
- const space = useSpace(spaceId);
40
- if (!space) {
41
- return null;
42
- }
28
+ return <FunctionsContainer space={space} />;
29
+ },
30
+ }),
31
+ Surface.create({
32
+ id: 'space-settings-automation',
33
+ filter: AppSurface.literal(AppSurface.Article, `${meta.id}.space-settings-automation`),
34
+ component: () => {
35
+ const space = useActiveSpace();
36
+ if (!space) {
37
+ return null;
38
+ }
43
39
 
44
- return <AutomationSettings space={space} />;
45
- },
46
- }),
47
- createSurface({
48
- id: `${meta.id}/companion/automation`,
49
- role: 'article',
50
- filter: (data): data is { companionTo: ScriptType; subject: 'automation' } =>
51
- Obj.instanceOf(ScriptType, data.companionTo) && data.subject === 'automation',
52
- component: ({ data }) => {
53
- return <AutomationSettings space={getSpace(data.companionTo)!} object={data.companionTo} />;
54
- },
55
- }),
56
- ]);
40
+ return <AutomationSettings space={space} />;
41
+ },
42
+ }),
43
+ Surface.create({
44
+ id: 'companion.automation',
45
+ filter: AppSurface.allOf(
46
+ AppSurface.literal(AppSurface.Article, 'automation'),
47
+ AppSurface.companion(AppSurface.Article),
48
+ ),
49
+ component: ({ data }) => {
50
+ const space = getSpace(data.companionTo);
51
+ if (!space) {
52
+ return null;
53
+ }
54
+ return <AutomationSettings space={space} object={data.companionTo} />;
55
+ },
56
+ }),
57
+ ]),
58
+ ),
59
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './trigger';
@@ -0,0 +1,14 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Command from '@effect/cli/Command';
6
+
7
+ import { queue } from './queue';
8
+ import { subscription } from './subscription';
9
+ import { timer } from './timer';
10
+
11
+ export const create = Command.make('create').pipe(
12
+ Command.withDescription('Create a trigger.'),
13
+ Command.withSubcommands([subscription, timer, queue]),
14
+ );