@dxos/plugin-automation 0.8.4-main.c85a9c8dae → 0.8.4-main.d9fc60f731

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 (386) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +428 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/AutomationPanel-OKF2MDLO.mjs +12 -0
  5. package/dist/lib/neutral/AutomationPlugin.mjs +10 -0
  6. package/dist/lib/{browser/cli/index.mjs → neutral/AutomationPlugin.node.mjs} +191 -186
  7. package/dist/lib/neutral/AutomationPlugin.node.mjs.map +7 -0
  8. package/dist/lib/neutral/AutomationPlugin.workerd.mjs +23 -0
  9. package/dist/lib/neutral/AutomationPlugin.workerd.mjs.map +7 -0
  10. package/dist/lib/neutral/AutomationSettings-GQF5UFM6.mjs +32 -0
  11. package/dist/lib/neutral/AutomationSettings-GQF5UFM6.mjs.map +7 -0
  12. package/dist/lib/neutral/FunctionsContainer-YBTQGCL3.mjs +38 -0
  13. package/dist/lib/neutral/FunctionsContainer-YBTQGCL3.mjs.map +7 -0
  14. package/dist/lib/{browser/chunk-U55ZXRYM.mjs → neutral/FunctionsPanel-L32Z67B7.mjs} +24 -25
  15. package/dist/lib/neutral/FunctionsPanel-L32Z67B7.mjs.map +7 -0
  16. package/dist/lib/{browser/chunk-XFXYU645.mjs → neutral/FunctionsRegistry-RTCY3LXE.mjs} +24 -25
  17. package/dist/lib/neutral/FunctionsRegistry-RTCY3LXE.mjs.map +7 -0
  18. package/dist/lib/neutral/TriggerSettings-XCHIZPOR.mjs +9 -0
  19. package/dist/lib/neutral/app-graph-builder-Q3LJLICE.mjs +75 -0
  20. package/dist/lib/neutral/app-graph-builder-Q3LJLICE.mjs.map +7 -0
  21. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  22. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  23. package/dist/lib/neutral/capabilities/node.mjs +17 -0
  24. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-2JP77CMN.mjs +42 -0
  26. package/dist/lib/neutral/chunk-2JP77CMN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-7YWISQOZ.mjs +54 -0
  28. package/dist/lib/neutral/chunk-7YWISQOZ.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-C7H62AU3.mjs +435 -0
  30. package/dist/lib/neutral/chunk-C7H62AU3.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-CMM3AFHR.mjs +111 -0
  32. package/dist/lib/neutral/chunk-CMM3AFHR.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  34. package/dist/lib/neutral/chunk-LRVJEKMN.mjs +40 -0
  35. package/dist/lib/neutral/chunk-LRVJEKMN.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-MBIODLCB.mjs +12 -0
  37. package/dist/lib/neutral/chunk-MBIODLCB.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-NCCFEPBZ.mjs +76 -0
  39. package/dist/lib/neutral/chunk-NCCFEPBZ.mjs.map +7 -0
  40. package/dist/lib/{browser/chunk-ZNI2CGQP.mjs → neutral/chunk-RCBE37YU.mjs} +158 -60
  41. package/dist/lib/neutral/chunk-RCBE37YU.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-TJOQNSS5.mjs +8 -0
  43. package/dist/lib/neutral/chunk-TJOQNSS5.mjs.map +7 -0
  44. package/dist/lib/neutral/components/index.mjs +16 -0
  45. package/dist/lib/neutral/containers/index.mjs +13 -0
  46. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  47. package/dist/lib/neutral/create-trigger-from-template-5YUHZOFA.mjs +68 -0
  48. package/dist/lib/neutral/create-trigger-from-template-5YUHZOFA.mjs.map +7 -0
  49. package/dist/lib/neutral/hooks/index.mjs +10 -0
  50. package/dist/lib/neutral/index.mjs +16 -0
  51. package/dist/lib/neutral/layer-specs-OXK75RDW.mjs +141 -0
  52. package/dist/lib/neutral/layer-specs-OXK75RDW.mjs.map +7 -0
  53. package/dist/lib/neutral/meta.json +1 -0
  54. package/dist/lib/neutral/meta.mjs +8 -0
  55. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs +13 -0
  56. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs.map +7 -0
  57. package/dist/lib/neutral/operations/index.mjs +8 -0
  58. package/dist/lib/neutral/plugin.mjs +16 -0
  59. package/dist/lib/neutral/plugin.mjs.map +7 -0
  60. package/dist/lib/neutral/react-surface-FOOBGYNG.mjs +57 -0
  61. package/dist/lib/neutral/react-surface-FOOBGYNG.mjs.map +7 -0
  62. package/dist/lib/neutral/registry-sync-JYDDTBAE.mjs +82 -0
  63. package/dist/lib/neutral/registry-sync-JYDDTBAE.mjs.map +7 -0
  64. package/dist/lib/neutral/testing.mjs +8 -0
  65. package/dist/lib/neutral/translations.mjs +60 -0
  66. package/dist/lib/neutral/translations.mjs.map +7 -0
  67. package/dist/lib/neutral/trigger-runtime-controller-BOEJYGWC.mjs +77 -0
  68. package/dist/lib/neutral/trigger-runtime-controller-BOEJYGWC.mjs.map +7 -0
  69. package/dist/lib/neutral/types/index.mjs +12 -0
  70. package/dist/lib/neutral/types/index.mjs.map +7 -0
  71. package/dist/types/src/AutomationPlugin.d.ts +1 -0
  72. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  73. package/dist/types/src/{cli/plugin.d.ts → AutomationPlugin.node.d.ts} +2 -1
  74. package/dist/types/src/AutomationPlugin.node.d.ts.map +1 -0
  75. package/dist/types/src/AutomationPlugin.test.d.ts +2 -0
  76. package/dist/types/src/AutomationPlugin.test.d.ts.map +1 -0
  77. package/dist/types/src/AutomationPlugin.workerd.d.ts +4 -0
  78. package/dist/types/src/AutomationPlugin.workerd.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/index.d.ts +8 -4
  81. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/layer-specs.d.ts +6 -0
  83. package/dist/types/src/capabilities/layer-specs.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/node.d.ts +8 -0
  85. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  86. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  87. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/registry-sync.d.ts +21 -0
  90. package/dist/types/src/capabilities/registry-sync.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts +5 -0
  92. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/trigger-runtime-controller.test.d.ts +2 -0
  94. package/dist/types/src/capabilities/trigger-runtime-controller.test.d.ts.map +1 -0
  95. package/dist/types/src/commands/index.d.ts.map +1 -0
  96. package/dist/types/src/{cli/commands → commands}/trigger/create/index.d.ts +6 -6
  97. package/dist/types/src/commands/trigger/create/index.d.ts.map +1 -0
  98. package/dist/types/src/{cli/commands → commands}/trigger/create/queue.d.ts +2 -2
  99. package/dist/types/src/commands/trigger/create/queue.d.ts.map +1 -0
  100. package/dist/types/src/{cli/commands → commands}/trigger/create/subscription.d.ts +1 -1
  101. package/dist/types/src/commands/trigger/create/subscription.d.ts.map +1 -0
  102. package/dist/types/src/{cli/commands → commands}/trigger/create/timer.d.ts +1 -1
  103. package/dist/types/src/commands/trigger/create/timer.d.ts.map +1 -0
  104. package/dist/types/src/{cli/commands → commands}/trigger/index.d.ts +8 -8
  105. package/dist/types/src/commands/trigger/index.d.ts.map +1 -0
  106. package/dist/types/src/{cli/commands → commands}/trigger/list.d.ts +1 -1
  107. package/dist/types/src/commands/trigger/list.d.ts.map +1 -0
  108. package/dist/types/src/{cli/commands → commands}/trigger/options.d.ts +1 -2
  109. package/dist/types/src/commands/trigger/options.d.ts.map +1 -0
  110. package/dist/types/src/{cli/commands → commands}/trigger/remove.d.ts +1 -1
  111. package/dist/types/src/commands/trigger/remove.d.ts.map +1 -0
  112. package/dist/types/src/{cli/commands → commands}/trigger/update/index.d.ts +5 -5
  113. package/dist/types/src/commands/trigger/update/index.d.ts.map +1 -0
  114. package/dist/types/src/{cli/commands → commands}/trigger/update/queue.d.ts +2 -3
  115. package/dist/types/src/commands/trigger/update/queue.d.ts.map +1 -0
  116. package/dist/types/src/commands/trigger/update/subscription.d.ts.map +1 -0
  117. package/dist/types/src/commands/trigger/update/timer.d.ts.map +1 -0
  118. package/dist/types/src/commands/trigger/util.d.ts +85 -0
  119. package/dist/types/src/commands/trigger/util.d.ts.map +1 -0
  120. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -1
  121. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  122. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +45 -32
  123. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/AutomationPanel/TriggerEdgeMetadata.d.ts +18 -0
  125. package/dist/types/src/components/AutomationPanel/TriggerEdgeMetadata.d.ts.map +1 -0
  126. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -1
  127. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  128. package/dist/types/src/components/FunctionsPanel/index.d.ts.map +1 -1
  129. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -1
  130. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -1
  131. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +6 -6
  132. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  133. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +4 -4
  134. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  135. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -1
  136. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  137. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +109 -93
  138. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/TriggerEditor/util.d.ts +14 -0
  140. package/dist/types/src/components/TriggerEditor/util.d.ts.map +1 -0
  141. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +3 -1
  142. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -1
  143. package/dist/types/src/containers/AutomationSettings/index.d.ts +1 -2
  144. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -1
  145. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts +2 -4
  146. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -1
  147. package/dist/types/src/containers/FunctionsContainer/index.d.ts +1 -2
  148. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -1
  149. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts +3 -3
  150. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -1
  151. package/dist/types/src/containers/TriggerSettings/index.d.ts +2 -2
  152. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -1
  153. package/dist/types/src/hooks/index.d.ts +1 -1
  154. package/dist/types/src/hooks/index.d.ts.map +1 -1
  155. package/dist/types/src/hooks/useEdgeTriggersDispatcherStatus.d.ts +13 -0
  156. package/dist/types/src/hooks/useEdgeTriggersDispatcherStatus.d.ts.map +1 -0
  157. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +1 -1
  158. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  159. package/dist/types/src/index.d.ts +0 -3
  160. package/dist/types/src/index.d.ts.map +1 -1
  161. package/dist/types/src/meta.d.ts +1 -1
  162. package/dist/types/src/meta.d.ts.map +1 -1
  163. package/dist/types/src/operations/create-trigger-from-template.d.ts +5 -0
  164. package/dist/types/src/operations/create-trigger-from-template.d.ts.map +1 -0
  165. package/dist/types/src/operations/index.d.ts +3 -0
  166. package/dist/types/src/operations/index.d.ts.map +1 -0
  167. package/dist/types/src/plugin.d.ts +4 -0
  168. package/dist/types/src/plugin.d.ts.map +1 -0
  169. package/dist/types/src/testing/test-functions.d.ts +162 -46
  170. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  171. package/dist/types/src/testing.d.ts +2 -0
  172. package/dist/types/src/testing.d.ts.map +1 -0
  173. package/dist/types/src/translations.d.ts +45 -33
  174. package/dist/types/src/translations.d.ts.map +1 -1
  175. package/dist/types/src/types/AutomationOperation.d.ts +21 -0
  176. package/dist/types/src/types/AutomationOperation.d.ts.map +1 -0
  177. package/dist/types/src/types/index.d.ts +1 -2
  178. package/dist/types/src/types/index.d.ts.map +1 -1
  179. package/dist/types/src/types/schema.d.ts +11 -32
  180. package/dist/types/src/types/schema.d.ts.map +1 -1
  181. package/dist/types/tsconfig.tsbuildinfo +1 -1
  182. package/package.json +124 -75
  183. package/src/AutomationPlugin.node.ts +35 -0
  184. package/src/AutomationPlugin.test.ts +27 -0
  185. package/src/AutomationPlugin.tsx +33 -11
  186. package/src/AutomationPlugin.workerd.ts +18 -0
  187. package/src/capabilities/app-graph-builder.ts +66 -0
  188. package/src/capabilities/index.ts +15 -4
  189. package/src/capabilities/layer-specs.ts +197 -0
  190. package/src/capabilities/node.ts +18 -0
  191. package/src/capabilities/operation-handler.ts +16 -0
  192. package/src/capabilities/react-surface.tsx +59 -0
  193. package/src/capabilities/registry-sync.ts +110 -0
  194. package/src/capabilities/trigger-runtime-controller.test.ts +103 -0
  195. package/src/capabilities/trigger-runtime-controller.ts +126 -0
  196. package/src/{cli/commands → commands}/trigger/create/queue.ts +14 -16
  197. package/src/{cli/commands → commands}/trigger/create/subscription.ts +8 -11
  198. package/src/{cli/commands → commands}/trigger/create/timer.ts +4 -7
  199. package/src/{cli/commands → commands}/trigger/list.ts +7 -4
  200. package/src/{cli/commands → commands}/trigger/options.ts +3 -15
  201. package/src/{cli/commands → commands}/trigger/remove.ts +5 -5
  202. package/src/{cli/commands → commands}/trigger/update/queue.ts +39 -43
  203. package/src/{cli/commands → commands}/trigger/update/subscription.ts +22 -21
  204. package/src/{cli/commands → commands}/trigger/update/timer.ts +22 -20
  205. package/src/{cli/commands → commands}/trigger/util.ts +53 -38
  206. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +12 -5
  207. package/src/components/AutomationPanel/AutomationPanel.tsx +120 -58
  208. package/src/components/AutomationPanel/TriggerEdgeMetadata.tsx +148 -0
  209. package/src/components/FunctionsPanel/FunctionsPanel.tsx +35 -27
  210. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +32 -23
  211. package/src/components/TriggerEditor/FunctionInputEditor.tsx +9 -13
  212. package/src/components/TriggerEditor/SpecSelector.tsx +18 -14
  213. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +36 -18
  214. package/src/components/TriggerEditor/TriggerEditor.tsx +120 -25
  215. package/src/components/TriggerEditor/util.ts +51 -0
  216. package/src/containers/AutomationSettings/AutomationSettings.tsx +12 -8
  217. package/src/containers/AutomationSettings/index.ts +1 -3
  218. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +11 -11
  219. package/src/containers/FunctionsContainer/index.ts +1 -3
  220. package/src/containers/TriggerSettings/TriggerSettings.tsx +32 -10
  221. package/src/containers/TriggerSettings/index.ts +2 -3
  222. package/src/hooks/index.ts +2 -1
  223. package/src/hooks/useEdgeTriggersDispatcherStatus.ts +78 -0
  224. package/src/hooks/useTriggerRuntimeControls.ts +13 -8
  225. package/src/index.ts +0 -4
  226. package/src/meta.ts +27 -7
  227. package/src/operations/create-trigger-from-template.ts +70 -0
  228. package/src/operations/index.ts +7 -0
  229. package/src/plugin.ts +11 -0
  230. package/src/testing/test-functions.ts +38 -4
  231. package/src/testing.ts +7 -0
  232. package/src/translations.ts +52 -39
  233. package/src/types/AutomationOperation.ts +39 -0
  234. package/src/types/index.ts +2 -2
  235. package/src/types/schema.ts +4 -25
  236. package/src/vite-env.d.ts +10 -0
  237. package/dist/lib/browser/AutomationPanel-EHRSV2DL.mjs +0 -11
  238. package/dist/lib/browser/AutomationSettings-TJYG77L6.mjs +0 -37
  239. package/dist/lib/browser/AutomationSettings-TJYG77L6.mjs.map +0 -7
  240. package/dist/lib/browser/FunctionsContainer-XHEQSNNO.mjs +0 -43
  241. package/dist/lib/browser/FunctionsContainer-XHEQSNNO.mjs.map +0 -7
  242. package/dist/lib/browser/FunctionsPanel-5WPUZGRB.mjs +0 -10
  243. package/dist/lib/browser/FunctionsRegistry-XRXIZRLL.mjs +0 -10
  244. package/dist/lib/browser/TriggerSettings-HUQT53SV.mjs +0 -13
  245. package/dist/lib/browser/TriggerSettings-HUQT53SV.mjs.map +0 -7
  246. package/dist/lib/browser/app-graph-builder-HLARI3VW.mjs +0 -85
  247. package/dist/lib/browser/app-graph-builder-HLARI3VW.mjs.map +0 -7
  248. package/dist/lib/browser/chunk-3P4R5WNC.mjs +0 -8
  249. package/dist/lib/browser/chunk-3P4R5WNC.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-4EY2KMCM.mjs +0 -272
  251. package/dist/lib/browser/chunk-4EY2KMCM.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-PZNBEKO5.mjs +0 -17
  253. package/dist/lib/browser/chunk-PZNBEKO5.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-QPG3AKFX.mjs +0 -93
  255. package/dist/lib/browser/chunk-QPG3AKFX.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-SEG5OCGB.mjs +0 -31
  257. package/dist/lib/browser/chunk-SEG5OCGB.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-U55ZXRYM.mjs.map +0 -7
  259. package/dist/lib/browser/chunk-WOBCY2FQ.mjs +0 -83
  260. package/dist/lib/browser/chunk-WOBCY2FQ.mjs.map +0 -7
  261. package/dist/lib/browser/chunk-XFXYU645.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-ZNI2CGQP.mjs.map +0 -7
  263. package/dist/lib/browser/cli/index.mjs.map +0 -7
  264. package/dist/lib/browser/compute-runtime-L2RVWXY2.mjs +0 -124
  265. package/dist/lib/browser/compute-runtime-L2RVWXY2.mjs.map +0 -7
  266. package/dist/lib/browser/hooks/index.mjs +0 -13
  267. package/dist/lib/browser/index.mjs +0 -123
  268. package/dist/lib/browser/index.mjs.map +0 -7
  269. package/dist/lib/browser/meta.json +0 -1
  270. package/dist/lib/browser/operation-resolver-2U6ZQVXR.mjs +0 -83
  271. package/dist/lib/browser/operation-resolver-2U6ZQVXR.mjs.map +0 -7
  272. package/dist/lib/browser/react-surface-U6FAYV42.mjs +0 -69
  273. package/dist/lib/browser/react-surface-U6FAYV42.mjs.map +0 -7
  274. package/dist/lib/browser/types/index.mjs +0 -14
  275. package/dist/lib/node-esm/AutomationPanel-F7MPUR7U.mjs +0 -12
  276. package/dist/lib/node-esm/AutomationSettings-5AHJMILI.mjs +0 -38
  277. package/dist/lib/node-esm/AutomationSettings-5AHJMILI.mjs.map +0 -7
  278. package/dist/lib/node-esm/FunctionsContainer-U5UVRKVT.mjs +0 -44
  279. package/dist/lib/node-esm/FunctionsContainer-U5UVRKVT.mjs.map +0 -7
  280. package/dist/lib/node-esm/FunctionsPanel-UFL5LT2R.mjs +0 -11
  281. package/dist/lib/node-esm/FunctionsRegistry-574OBZ5T.mjs +0 -11
  282. package/dist/lib/node-esm/TriggerSettings-RDIJHUKK.mjs +0 -14
  283. package/dist/lib/node-esm/TriggerSettings-RDIJHUKK.mjs.map +0 -7
  284. package/dist/lib/node-esm/app-graph-builder-Z2TMQHVX.mjs +0 -86
  285. package/dist/lib/node-esm/app-graph-builder-Z2TMQHVX.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-2X564LII.mjs +0 -10
  287. package/dist/lib/node-esm/chunk-2X564LII.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-34HGM46Z.mjs +0 -32
  289. package/dist/lib/node-esm/chunk-34HGM46Z.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-4DK33JDH.mjs +0 -84
  291. package/dist/lib/node-esm/chunk-4DK33JDH.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-5FXNN3MV.mjs +0 -19
  293. package/dist/lib/node-esm/chunk-5FXNN3MV.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-7AIKTEAX.mjs +0 -273
  295. package/dist/lib/node-esm/chunk-7AIKTEAX.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-CMZ4NKSK.mjs +0 -271
  297. package/dist/lib/node-esm/chunk-CMZ4NKSK.mjs.map +0 -7
  298. package/dist/lib/node-esm/chunk-GXFQR3KI.mjs +0 -99
  299. package/dist/lib/node-esm/chunk-GXFQR3KI.mjs.map +0 -7
  300. package/dist/lib/node-esm/chunk-QNPYY3XZ.mjs +0 -94
  301. package/dist/lib/node-esm/chunk-QNPYY3XZ.mjs.map +0 -7
  302. package/dist/lib/node-esm/chunk-RTEXGGBX.mjs +0 -97
  303. package/dist/lib/node-esm/chunk-RTEXGGBX.mjs.map +0 -7
  304. package/dist/lib/node-esm/cli/index.mjs +0 -1109
  305. package/dist/lib/node-esm/cli/index.mjs.map +0 -7
  306. package/dist/lib/node-esm/compute-runtime-XD6A5Q7Q.mjs +0 -125
  307. package/dist/lib/node-esm/compute-runtime-XD6A5Q7Q.mjs.map +0 -7
  308. package/dist/lib/node-esm/hooks/index.mjs +0 -14
  309. package/dist/lib/node-esm/index.mjs +0 -124
  310. package/dist/lib/node-esm/index.mjs.map +0 -7
  311. package/dist/lib/node-esm/meta.json +0 -1
  312. package/dist/lib/node-esm/operation-resolver-XWJGBHJZ.mjs +0 -84
  313. package/dist/lib/node-esm/operation-resolver-XWJGBHJZ.mjs.map +0 -7
  314. package/dist/lib/node-esm/react-surface-BVNHCWQ7.mjs +0 -70
  315. package/dist/lib/node-esm/react-surface-BVNHCWQ7.mjs.map +0 -7
  316. package/dist/lib/node-esm/types/index.mjs +0 -15
  317. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  318. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  319. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  320. package/dist/types/src/capabilities/compute-runtime/compute-runtime.d.ts +0 -6
  321. package/dist/types/src/capabilities/compute-runtime/compute-runtime.d.ts.map +0 -1
  322. package/dist/types/src/capabilities/compute-runtime/index.d.ts +0 -3
  323. package/dist/types/src/capabilities/compute-runtime/index.d.ts.map +0 -1
  324. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  325. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  326. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  327. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  328. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  329. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  330. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  331. package/dist/types/src/cli/commands/index.d.ts.map +0 -1
  332. package/dist/types/src/cli/commands/trigger/create/index.d.ts.map +0 -1
  333. package/dist/types/src/cli/commands/trigger/create/queue.d.ts.map +0 -1
  334. package/dist/types/src/cli/commands/trigger/create/subscription.d.ts.map +0 -1
  335. package/dist/types/src/cli/commands/trigger/create/timer.d.ts.map +0 -1
  336. package/dist/types/src/cli/commands/trigger/index.d.ts.map +0 -1
  337. package/dist/types/src/cli/commands/trigger/list.d.ts.map +0 -1
  338. package/dist/types/src/cli/commands/trigger/options.d.ts.map +0 -1
  339. package/dist/types/src/cli/commands/trigger/remove.d.ts.map +0 -1
  340. package/dist/types/src/cli/commands/trigger/update/index.d.ts.map +0 -1
  341. package/dist/types/src/cli/commands/trigger/update/queue.d.ts.map +0 -1
  342. package/dist/types/src/cli/commands/trigger/update/subscription.d.ts.map +0 -1
  343. package/dist/types/src/cli/commands/trigger/update/timer.d.ts.map +0 -1
  344. package/dist/types/src/cli/commands/trigger/util.d.ts +0 -46
  345. package/dist/types/src/cli/commands/trigger/util.d.ts.map +0 -1
  346. package/dist/types/src/cli/index.d.ts +0 -2
  347. package/dist/types/src/cli/index.d.ts.map +0 -1
  348. package/dist/types/src/cli/plugin.d.ts.map +0 -1
  349. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +0 -12
  350. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +0 -1
  351. package/dist/types/src/types/capabilities.d.ts +0 -22
  352. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  353. package/dist/types/src/types/events.d.ts +0 -5
  354. package/dist/types/src/types/events.d.ts.map +0 -1
  355. package/src/capabilities/app-graph-builder/app-graph-builder.ts +0 -72
  356. package/src/capabilities/app-graph-builder/index.ts +0 -7
  357. package/src/capabilities/compute-runtime/compute-runtime.ts +0 -146
  358. package/src/capabilities/compute-runtime/index.ts +0 -7
  359. package/src/capabilities/operation-resolver/index.ts +0 -7
  360. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -80
  361. package/src/capabilities/react-surface/index.ts +0 -7
  362. package/src/capabilities/react-surface/react-surface.tsx +0 -61
  363. package/src/cli/index.ts +0 -5
  364. package/src/cli/plugin.ts +0 -24
  365. package/src/hooks/useComputeRuntimeCallback.ts +0 -67
  366. package/src/types/capabilities.ts +0 -43
  367. package/src/types/events.ts +0 -11
  368. /package/dist/lib/{browser/AutomationPanel-EHRSV2DL.mjs.map → neutral/AutomationPanel-OKF2MDLO.mjs.map} +0 -0
  369. /package/dist/lib/{browser/FunctionsPanel-5WPUZGRB.mjs.map → neutral/AutomationPlugin.mjs.map} +0 -0
  370. /package/dist/lib/{browser/FunctionsRegistry-XRXIZRLL.mjs.map → neutral/TriggerSettings-XCHIZPOR.mjs.map} +0 -0
  371. /package/dist/lib/{browser/hooks/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  372. /package/dist/lib/{browser/types → neutral/components}/index.mjs.map +0 -0
  373. /package/dist/lib/{node-esm → neutral}/hooks/index.mjs.map +0 -0
  374. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
  375. /package/dist/lib/{node-esm/AutomationPanel-F7MPUR7U.mjs.map → neutral/meta.mjs.map} +0 -0
  376. /package/dist/lib/{node-esm/FunctionsPanel-UFL5LT2R.mjs.map → neutral/operations/index.mjs.map} +0 -0
  377. /package/dist/lib/{node-esm/FunctionsRegistry-574OBZ5T.mjs.map → neutral/testing.mjs.map} +0 -0
  378. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  379. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
  380. /package/dist/types/src/{cli/commands → commands}/index.d.ts +0 -0
  381. /package/dist/types/src/{cli/commands → commands}/trigger/update/subscription.d.ts +0 -0
  382. /package/dist/types/src/{cli/commands → commands}/trigger/update/timer.d.ts +0 -0
  383. /package/src/{cli/commands → commands}/index.ts +0 -0
  384. /package/src/{cli/commands → commands}/trigger/create/index.ts +0 -0
  385. /package/src/{cli/commands → commands}/trigger/index.ts +0 -0
  386. /package/src/{cli/commands → commands}/trigger/update/index.ts +0 -0
@@ -0,0 +1,197 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Registry as AtomRegistry } from '@effect-atom/atom';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Layer from 'effect/Layer';
8
+
9
+ import { OpaqueToolkit } from '@dxos/ai';
10
+ import { Capabilities, Capability } from '@dxos/app-framework';
11
+ import { AppCapabilities } from '@dxos/app-toolkit';
12
+ import { ClientService } from '@dxos/client';
13
+ import { LayerSpec, OperationHandlerSet, OperationRegistry } from '@dxos/compute';
14
+ import { ProcessManager } from '@dxos/compute-runtime';
15
+ import { Database, Feed, Registry } from '@dxos/echo';
16
+ import {
17
+ AgentService,
18
+ FeedTraceSink,
19
+ RemoteFunctionExecutionService,
20
+ TriggerDispatcher,
21
+ TriggerStateStore,
22
+ } from '@dxos/functions-runtime';
23
+ import { invariant } from '@dxos/invariant';
24
+
25
+ //
26
+ // Capability Module
27
+ //
28
+ // Contributes application- and space-affinity `Capabilities.LayerSpec` entries
29
+ // that together replace the former monolithic `AutomationCapabilities.ComputeRuntime`.
30
+ //
31
+ // Specs are declared at module level; runtime state (the `Client`, contributed
32
+ // capability lists, etc.) is resolved via Effect-level requirements rather
33
+ // than captured from an outer scope.
34
+ //
35
+
36
+ /**
37
+ * Gathers contributed {@link Capabilities.OperationHandler} sets from the
38
+ * {@link Capability.Service} and exposes them through the
39
+ * {@link OperationHandlerSet.OperationHandlerProvider} tag so space-affinity
40
+ * specs (e.g. {@link OperationRegistrySpec}) can consume them through the
41
+ * normal LayerStack resolution path.
42
+ */
43
+ const OperationHandlerProviderSpec = LayerSpec.make(
44
+ {
45
+ affinity: 'application',
46
+ requires: [Capability.Service],
47
+ provides: [OperationHandlerSet.OperationHandlerProvider],
48
+ },
49
+ () =>
50
+ Layer.unwrapEffect(
51
+ Effect.gen(function* () {
52
+ const operationHandlerSets = yield* Capability.getAll(Capabilities.OperationHandler);
53
+ const mergedOperationHandlers =
54
+ operationHandlerSets.length === 0
55
+ ? OperationHandlerSet.empty
56
+ : OperationHandlerSet.merge(...operationHandlerSets);
57
+ return OperationHandlerSet.provide(mergedOperationHandlers);
58
+ }),
59
+ ),
60
+ );
61
+
62
+ const RegistrySpec = LayerSpec.make(
63
+ {
64
+ affinity: 'application',
65
+ requires: [ClientService],
66
+ provides: [Registry.Service],
67
+ },
68
+ () =>
69
+ Layer.unwrapEffect(
70
+ Effect.gen(function* () {
71
+ const client = yield* ClientService;
72
+ return Layer.succeed(Registry.Service, client.graph.registry);
73
+ }),
74
+ ),
75
+ );
76
+
77
+ const OpaqueToolkitSpec = LayerSpec.make(
78
+ {
79
+ affinity: 'application',
80
+ requires: [Capability.Service],
81
+ provides: [OpaqueToolkit.OpaqueToolkitProvider],
82
+ },
83
+ () =>
84
+ Layer.unwrapEffect(
85
+ Effect.gen(function* () {
86
+ const capabilities = yield* Capability.Service;
87
+ return Layer.succeed(OpaqueToolkit.OpaqueToolkitProvider, {
88
+ getToolkit: () => {
89
+ const toolkits = capabilities.getAll(AppCapabilities.Toolkit);
90
+ return OpaqueToolkit.merge(...toolkits);
91
+ },
92
+ });
93
+ }),
94
+ ),
95
+ );
96
+
97
+ const AgentServiceSpec = LayerSpec.make(
98
+ {
99
+ affinity: 'application',
100
+ requires: [ProcessManager.ProcessManagerService],
101
+ provides: [AgentService.AgentService],
102
+ },
103
+ () => AgentService.layer(),
104
+ );
105
+
106
+ const OperationRegistrySpec = LayerSpec.make(
107
+ {
108
+ affinity: 'space',
109
+ requires: [Database.Service, OperationHandlerSet.OperationHandlerProvider],
110
+ provides: [OperationRegistry.Service],
111
+ },
112
+ () => OperationRegistry.layer,
113
+ );
114
+
115
+ /**
116
+ * In-memory trigger state. Loses state across restarts but works in both
117
+ * browser and CLI/Node contexts. Hosts that need durable storage should
118
+ * contribute a replacement LayerSpec that provides {@link TriggerStateStore}
119
+ * backed by a persistent `KeyValueStore` (e.g. `BrowserKeyValueStore` or
120
+ * `BunKeyValueStore`).
121
+ */
122
+ const TriggerStateStoreSpec = LayerSpec.make(
123
+ {
124
+ affinity: 'application',
125
+ requires: [],
126
+ provides: [TriggerStateStore],
127
+ },
128
+ () => TriggerStateStore.layerMemory,
129
+ );
130
+
131
+ //
132
+ // Space-affinity specs.
133
+ //
134
+
135
+ const FeedTraceSinkSpec = LayerSpec.make(
136
+ {
137
+ affinity: 'space',
138
+ requires: [Database.Service, Feed.FeedService],
139
+ provides: [FeedTraceSink.FeedTraceSink],
140
+ },
141
+ () => FeedTraceSink.layerLive,
142
+ );
143
+
144
+ /**
145
+ * Space-scoped `RemoteFunctionExecutionService`. When edge agents are enabled
146
+ * (`runtime.client.edgeFeatures.agents`) functions are invoked without a space
147
+ * binding (the edge routes them); otherwise they are scoped to the space. The
148
+ * config is read inside the factory — at slice-materialisation time, once
149
+ * `ClientService` is available — so the owning module does not need the client
150
+ * at activation time and can activate on `SetupProcessManager`.
151
+ */
152
+ const RemoteFunctionExecutionSpec = LayerSpec.make(
153
+ {
154
+ affinity: 'space',
155
+ requires: [ClientService],
156
+ provides: [RemoteFunctionExecutionService],
157
+ },
158
+ (context) =>
159
+ Layer.unwrapEffect(
160
+ Effect.gen(function* () {
161
+ invariant(context.space, 'space context required for RemoteFunctionExecutionService');
162
+ const client = yield* ClientService;
163
+ const edgeAgents = client.config.get('runtime.client.edgeFeatures.agents');
164
+ return RemoteFunctionExecutionService.fromClient(client, edgeAgents ? undefined : context.space);
165
+ }),
166
+ ),
167
+ );
168
+
169
+ const TriggerDispatcherSpec = LayerSpec.make(
170
+ {
171
+ affinity: 'space',
172
+ requires: [
173
+ Database.Service,
174
+ Feed.FeedService,
175
+ TriggerStateStore,
176
+ ProcessManager.ProcessManagerService,
177
+ AtomRegistry.AtomRegistry,
178
+ ],
179
+ provides: [TriggerDispatcher],
180
+ },
181
+ () => TriggerDispatcher.layer({ timeControl: 'natural' }),
182
+ );
183
+
184
+ export default Capability.makeModule(() =>
185
+ Effect.succeed([
186
+ Capability.contributes(Capabilities.LayerSpec, OperationHandlerProviderSpec),
187
+ Capability.contributes(Capabilities.LayerSpec, RegistrySpec),
188
+ Capability.contributes(Capabilities.LayerSpec, OpaqueToolkitSpec),
189
+ Capability.contributes(Capabilities.LayerSpec, AgentServiceSpec),
190
+ Capability.contributes(Capabilities.LayerSpec, OperationRegistrySpec),
191
+ Capability.contributes(Capabilities.LayerSpec, TriggerStateStoreSpec),
192
+ Capability.contributes(Capabilities.LayerSpec, FeedTraceSinkSpec),
193
+ Capability.contributes(Capabilities.LayerSpec, TriggerDispatcherSpec),
194
+ Capability.contributes(Capabilities.LayerSpec, RemoteFunctionExecutionSpec),
195
+ Capability.contributes(Capabilities.TraceSink, ({ resolver }) => FeedTraceSink.makeRoutingSink({ resolver })),
196
+ ]),
197
+ );
@@ -0,0 +1,18 @@
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 LayerSpecs = Capability.lazy<void, Capability.Any[]>('LayerSpecs', () => import('./layer-specs'));
10
+ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
11
+ 'OperationHandler',
12
+ () => import('./operation-handler'),
13
+ );
14
+ export const RegistrySync = Capability.lazy('RegistrySync', () => import('./registry-sync'));
15
+ export const TriggerRuntimeController = Capability.lazy(
16
+ 'TriggerRuntimeController',
17
+ () => import('./trigger-runtime-controller'),
18
+ );
@@ -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
+ );
@@ -0,0 +1,59 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import React from 'react';
7
+
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';
12
+
13
+ import { AutomationSettings, FunctionsContainer } from '#containers';
14
+ import { meta } from '#meta';
15
+
16
+ export default Capability.makeModule(() =>
17
+ Effect.succeed(
18
+ Capability.contributes(Capabilities.ReactSurface, [
19
+ Surface.create({
20
+ id: 'spaceSettingsFunctions',
21
+ filter: AppSurface.literal(AppSurface.Article, `${meta.id}.space-settings-functions`),
22
+ component: () => {
23
+ const space = useActiveSpace();
24
+ if (!space) {
25
+ return null;
26
+ }
27
+
28
+ return <FunctionsContainer space={space} />;
29
+ },
30
+ }),
31
+ Surface.create({
32
+ id: 'spaceSettingsAutomation',
33
+ filter: AppSurface.literal(AppSurface.Article, `${meta.id}.space-settings-automation`),
34
+ component: () => {
35
+ const space = useActiveSpace();
36
+ if (!space) {
37
+ return null;
38
+ }
39
+
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,110 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities } from '@dxos/app-toolkit';
9
+ import { Blueprint, Operation } from '@dxos/compute';
10
+ import { log } from '@dxos/log';
11
+ import { ClientCapabilities } from '@dxos/plugin-client';
12
+
13
+ /**
14
+ * Syncs plugin capability contributions into `client.graph.registry`.
15
+ *
16
+ * Watches two capability atoms and imperatively adds entities to the
17
+ * hypergraph registry when they change:
18
+ * - {@link AppCapabilities.BlueprintDefinition} → instantiates each blueprint via `def.make()`.
19
+ * - {@link Capabilities.OperationHandler} → serializes each handler via `Operation.serialize`.
20
+ *
21
+ * Blueprint DB copies (stored in a space when a blueprint is "enabled") are treated as
22
+ * user forks and are not overwritten. The registry is always used as the source of truth
23
+ * for blueprint instructions at request time — see `formatSystemPrompt` in `@dxos/assistant`.
24
+ *
25
+ * Note: the plugin framework does not yet expose a teardown hook for capability
26
+ * modules (see the TODO in process-manager-capability.ts), so the subscriptions
27
+ * are not explicitly cancelled. They are effectively scoped to the client's lifetime.
28
+ */
29
+ export default Capability.makeModule(
30
+ Effect.fnUntraced(function* () {
31
+ const client = yield* Capability.get(ClientCapabilities.Client);
32
+ const atomRegistry = yield* Capability.get(Capabilities.AtomRegistry);
33
+ const capabilityManager = yield* Capability.Service;
34
+
35
+ //
36
+ // Blueprint registration.
37
+ //
38
+
39
+ const blueprintDefinitionsAtom = capabilityManager.atom(AppCapabilities.BlueprintDefinition);
40
+ const prevBlueprintKeys = new Set<string>();
41
+
42
+ atomRegistry.subscribe(
43
+ blueprintDefinitionsAtom,
44
+ (definitions) => {
45
+ const fresh: Blueprint.Blueprint[] = [];
46
+ for (const def of definitions) {
47
+ if (!prevBlueprintKeys.has(def.key)) {
48
+ prevBlueprintKeys.add(def.key);
49
+ fresh.push(def.make());
50
+ }
51
+ }
52
+ if (fresh.length > 0) {
53
+ client.graph.registry.add(fresh);
54
+ }
55
+ },
56
+ { immediate: true },
57
+ );
58
+
59
+ //
60
+ // Operation registration.
61
+ //
62
+
63
+ const operationHandlersAtom = capabilityManager.atom(Capabilities.OperationHandler);
64
+ const prevOperationKeys = new Set<string>();
65
+
66
+ atomRegistry.subscribe(
67
+ operationHandlersAtom,
68
+ async (handlerSets) => {
69
+ try {
70
+ const handlers = (await Promise.all(handlerSets.map((set) => set.getHandlers()))).flat();
71
+ const seenKeys = new Set<string>();
72
+ const batch: Operation.PersistentOperation[] = [];
73
+ for (const handler of handlers) {
74
+ const key = handler.meta.key;
75
+ if (!key) {
76
+ log.warn('skipping operation handler without key');
77
+ continue;
78
+ }
79
+ if (seenKeys.has(key)) {
80
+ log('skipping duplicate operation', { key });
81
+ continue;
82
+ }
83
+ seenKeys.add(key);
84
+ if (prevOperationKeys.has(key)) {
85
+ continue;
86
+ }
87
+ try {
88
+ batch.push(Operation.serialize(handler));
89
+ } catch {
90
+ log.verbose('skipping operation with unserializable schema', { key });
91
+ prevOperationKeys.add(key);
92
+ }
93
+ }
94
+ if (batch.length > 0) {
95
+ client.graph.registry.add(batch);
96
+ for (const operation of batch) {
97
+ const operationKey = Operation.getKey(operation);
98
+ if (operationKey) {
99
+ prevOperationKeys.add(operationKey);
100
+ }
101
+ }
102
+ }
103
+ } catch (error) {
104
+ log.catch(error);
105
+ }
106
+ },
107
+ { immediate: true },
108
+ );
109
+ }),
110
+ );
@@ -0,0 +1,103 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import { describe, test } from 'vitest';
7
+
8
+ import { ServiceResolver } from '@dxos/compute';
9
+ import { Feed, Obj } from '@dxos/echo';
10
+ import { runAndForwardErrors } from '@dxos/effect';
11
+ import { TriggerDispatcher } from '@dxos/functions-runtime';
12
+ import type { SpaceId } from '@dxos/keys';
13
+ import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
14
+ import { ClientPlugin, initializeIdentity } from '@dxos/plugin-client/testing';
15
+ import { createComposerTestApp } from '@dxos/plugin-testing/harness';
16
+
17
+ import { AutomationPlugin } from '#plugin';
18
+
19
+ /**
20
+ * Resolve the per-space {@link TriggerDispatcher} from the harness'
21
+ * process-manager runtime. The `LayerStack` caches dispatchers per
22
+ * `{ space }` context, so the returned instance is the same one the
23
+ * controller is driving.
24
+ */
25
+ const getDispatcher = (harness: Awaited<ReturnType<typeof createComposerTestApp>>, spaceId: SpaceId) =>
26
+ harness.runPromise(
27
+ Effect.flatMap(TriggerDispatcher, Effect.succeed).pipe(
28
+ Effect.provide(ServiceResolver.provide({ space: spaceId }, TriggerDispatcher)),
29
+ ),
30
+ );
31
+
32
+ describe('TriggerRuntimeController', () => {
33
+ test('toggles the per-space TriggerDispatcher as computeEnvironment changes', async ({ expect }) => {
34
+ await using harness = await createComposerTestApp({
35
+ plugins: [ClientPlugin({ types: [Feed.Feed] }), AutomationPlugin()],
36
+ });
37
+
38
+ // Creating identity also creates the personal space and emits SpacesReady,
39
+ // which is what gates the TriggerRuntimeController module's activation.
40
+ const { personalSpace } = await runAndForwardErrors(initializeIdentity(harness.get(ClientCapabilities.Client)));
41
+ await harness.waitForEvent(ClientEvents.SpacesReady);
42
+
43
+ const dispatcher = await getDispatcher(harness, personalSpace.id);
44
+
45
+ // Observe the dispatcher's `state` atom (the same surface the UI hook
46
+ // exposes through `useTriggerRuntimeControls`).
47
+ const observedStates: boolean[] = [];
48
+ const unsubscribe = harness.registry.subscribe(dispatcher.state, (state) => observedStates.push(state.enabled), {
49
+ immediate: true,
50
+ });
51
+ try {
52
+ // Default `computeEnvironment` is `local`, so the controller should
53
+ // start the dispatcher shortly after the space becomes ready.
54
+ await expect.poll(() => harness.registry.get(dispatcher.state).enabled, { timeout: 5_000 }).toBe(true);
55
+
56
+ // `disabled` → dispatcher should stop.
57
+ Obj.update(personalSpace.properties, (properties) => {
58
+ properties.computeEnvironment = 'disabled';
59
+ });
60
+ await expect.poll(() => harness.registry.get(dispatcher.state).enabled, { timeout: 5_000 }).toBe(false);
61
+
62
+ // Back to `local` → dispatcher should start again.
63
+ Obj.update(personalSpace.properties, (properties) => {
64
+ properties.computeEnvironment = 'local';
65
+ });
66
+ await expect.poll(() => harness.registry.get(dispatcher.state).enabled, { timeout: 5_000 }).toBe(true);
67
+
68
+ // `edge` → dispatcher should stop (triggers run on the edge instead).
69
+ Obj.update(personalSpace.properties, (properties) => {
70
+ properties.computeEnvironment = 'edge';
71
+ });
72
+ await expect.poll(() => harness.registry.get(dispatcher.state).enabled, { timeout: 5_000 }).toBe(false);
73
+
74
+ // The atom subscription should have witnessed every transition.
75
+ expect(observedStates).toEqual(expect.arrayContaining([true, false, true, false]));
76
+ } finally {
77
+ unsubscribe();
78
+ }
79
+ });
80
+
81
+ test('does not re-issue start when computeEnvironment is reasserted to the same value', async ({ expect }) => {
82
+ await using harness = await createComposerTestApp({
83
+ plugins: [ClientPlugin({ types: [Feed.Feed] }), AutomationPlugin()],
84
+ });
85
+
86
+ const { personalSpace } = await runAndForwardErrors(initializeIdentity(harness.get(ClientCapabilities.Client)));
87
+ await harness.waitForEvent(ClientEvents.SpacesReady);
88
+
89
+ const dispatcher = await getDispatcher(harness, personalSpace.id);
90
+
91
+ await expect.poll(() => harness.registry.get(dispatcher.state).enabled, { timeout: 5_000 }).toBe(true);
92
+
93
+ // Writing the same `local` value should be a no-op: the controller
94
+ // dedupes via its `lastEnvironment` tracker so the dispatcher stays
95
+ // running without an intervening stop/start flicker.
96
+ Obj.update(personalSpace.properties, (properties) => {
97
+ properties.computeEnvironment = 'local';
98
+ });
99
+ // Give any spurious transition a chance to land before we check.
100
+ await new Promise((resolve) => setTimeout(resolve, 100));
101
+ expect(harness.registry.get(dispatcher.state).enabled).toBe(true);
102
+ });
103
+ });
@@ -0,0 +1,126 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Fiber from 'effect/Fiber';
7
+
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { type ComputeEnvironment } from '@dxos/client-protocol';
10
+ import { ServiceResolver } from '@dxos/compute';
11
+ import { Obj } from '@dxos/echo';
12
+ import { TriggerDispatcher } from '@dxos/functions-runtime';
13
+ import { type SpaceId } from '@dxos/keys';
14
+ import { log } from '@dxos/log';
15
+ import { ClientCapabilities } from '@dxos/plugin-client';
16
+ import { type Space } from '@dxos/react-client/echo';
17
+
18
+ //
19
+ // Capability Module
20
+ //
21
+ // Watches `space.properties.computeEnvironment` for every space and toggles
22
+ // the per-space {@link TriggerDispatcher} accordingly:
23
+ //
24
+ // - `local` → `dispatcher.start()`
25
+ // - `edge` / `disabled` → `dispatcher.stop()`
26
+ //
27
+ // Replaces the in-line watcher that used to live inside the removed
28
+ // `compute-runtime.ts` per-space layer. The dispatcher itself is now
29
+ // contributed unconditionally via `TriggerDispatcherSpec` in `layer-specs.ts`,
30
+ // so this capability is only responsible for driving its lifecycle.
31
+ //
32
+
33
+ /** Trigger execution location the dispatcher should run locally. */
34
+ const LOCAL_ENVIRONMENT: ComputeEnvironment = 'local';
35
+
36
+ export default Capability.makeModule(
37
+ Effect.fnUntraced(function* () {
38
+ const client = yield* Capability.get(ClientCapabilities.Client);
39
+ const runtime = yield* Capability.get(Capabilities.ProcessManagerRuntime);
40
+
41
+ /** Per-space property-subscription unsubscribe, last-seen environment, and in-flight transition fiber. */
42
+ type Tracker = {
43
+ unsubscribe: () => void;
44
+ lastEnvironment?: ComputeEnvironment;
45
+ inFlight?: Fiber.RuntimeFiber<unknown, unknown>;
46
+ };
47
+ const trackers = new Map<SpaceId, Tracker>();
48
+
49
+ /**
50
+ * Resolve the per-space `TriggerDispatcher` from the process-manager
51
+ * runtime and invoke `start()` / `stop()` according to the requested
52
+ * environment. Returns a fiber so the caller can cancel a pending
53
+ * transition when a new one supersedes it.
54
+ */
55
+ const transition = (spaceId: SpaceId, environment: ComputeEnvironment) =>
56
+ runtime.runFork(
57
+ Effect.gen(function* () {
58
+ const dispatcher = yield* TriggerDispatcher;
59
+ yield* environment === LOCAL_ENVIRONMENT ? dispatcher.start() : dispatcher.stop();
60
+ }).pipe(
61
+ Effect.provide(ServiceResolver.provide({ space: spaceId }, TriggerDispatcher)),
62
+ Effect.tapErrorCause((cause) =>
63
+ Effect.sync(() => log.warn('trigger dispatcher transition failed', { spaceId, environment, cause })),
64
+ ),
65
+ ),
66
+ );
67
+
68
+ const apply = (tracker: Tracker, spaceId: SpaceId, environment: ComputeEnvironment): void => {
69
+ if (tracker.lastEnvironment === environment) {
70
+ return;
71
+ }
72
+ tracker.lastEnvironment = environment;
73
+ if (tracker.inFlight) {
74
+ runtime.runFork(Fiber.interrupt(tracker.inFlight));
75
+ }
76
+ tracker.inFlight = transition(spaceId, environment);
77
+ };
78
+
79
+ const install = (space: Space): void => {
80
+ if (trackers.has(space.id)) {
81
+ return;
82
+ }
83
+ // Reserve the slot synchronously so concurrent `client.spaces.subscribe`
84
+ // notifications (e.g. spaces array churn while we await readiness) don't
85
+ // wire a second subscriber for the same space.
86
+ const tracker: Tracker = { unsubscribe: () => {} };
87
+ trackers.set(space.id, tracker);
88
+
89
+ void space
90
+ .waitUntilReady()
91
+ .then(() => {
92
+ // The capability could have been torn down between `set` and the
93
+ // promise resolving; bail out without subscribing in that case.
94
+ if (trackers.get(space.id) !== tracker) {
95
+ return;
96
+ }
97
+ const readEnvironment = (): ComputeEnvironment => space.properties.computeEnvironment ?? LOCAL_ENVIRONMENT;
98
+ tracker.unsubscribe = Obj.subscribe(space.properties, () => apply(tracker, space.id, readEnvironment()));
99
+ apply(tracker, space.id, readEnvironment());
100
+ })
101
+ .catch((err) => log.catch(err));
102
+ };
103
+
104
+ const installAll = (spaces: readonly Space[]): void => {
105
+ for (const space of spaces) {
106
+ install(space);
107
+ }
108
+ };
109
+
110
+ const spacesSubscription = client.spaces.subscribe(installAll);
111
+ installAll(client.spaces.get());
112
+
113
+ return Capability.contributes(Capabilities.Null, null, () =>
114
+ Effect.sync(() => {
115
+ spacesSubscription.unsubscribe();
116
+ for (const tracker of trackers.values()) {
117
+ tracker.unsubscribe();
118
+ if (tracker.inFlight) {
119
+ runtime.runFork(Fiber.interrupt(tracker.inFlight));
120
+ }
121
+ }
122
+ trackers.clear();
123
+ }),
124
+ );
125
+ }),
126
+ );