@dxos/plugin-automation 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

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 (333) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/AutomationPanel-HI63JQ2X.mjs +11 -0
  4. package/dist/lib/neutral/AutomationPlugin.mjs +10 -0
  5. package/dist/lib/neutral/AutomationPlugin.node.mjs +1112 -0
  6. package/dist/lib/neutral/AutomationPlugin.node.mjs.map +7 -0
  7. package/dist/lib/neutral/AutomationSettings-LM5GSR4H.mjs +31 -0
  8. package/dist/lib/neutral/AutomationSettings-LM5GSR4H.mjs.map +7 -0
  9. package/dist/lib/neutral/FunctionsContainer-CEMKJIGV.mjs +38 -0
  10. package/dist/lib/neutral/FunctionsContainer-CEMKJIGV.mjs.map +7 -0
  11. package/dist/lib/neutral/FunctionsPanel-SVRKRUXZ.mjs +97 -0
  12. package/dist/lib/neutral/FunctionsPanel-SVRKRUXZ.mjs.map +7 -0
  13. package/dist/lib/neutral/FunctionsRegistry-7ITCFJCW.mjs +95 -0
  14. package/dist/lib/neutral/FunctionsRegistry-7ITCFJCW.mjs.map +7 -0
  15. package/dist/lib/neutral/TriggerSettings-XCHIZPOR.mjs +9 -0
  16. package/dist/lib/neutral/app-graph-builder-GDCGRYEP.mjs +75 -0
  17. package/dist/lib/neutral/app-graph-builder-GDCGRYEP.mjs.map +7 -0
  18. package/dist/lib/neutral/capabilities/index.mjs +15 -0
  19. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  20. package/dist/lib/neutral/capabilities/node.mjs +13 -0
  21. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  22. package/dist/lib/neutral/chunk-2JP77CMN.mjs +42 -0
  23. package/dist/lib/neutral/chunk-2JP77CMN.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-6CKX6RIL.mjs +270 -0
  25. package/dist/lib/neutral/chunk-6CKX6RIL.mjs.map +7 -0
  26. package/dist/lib/{browser/chunk-LZQFZO3B.mjs → neutral/chunk-ATECY555.mjs} +7 -4
  27. package/dist/lib/neutral/chunk-ATECY555.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-CNFKEN7S.mjs +37 -0
  29. package/dist/lib/neutral/chunk-CNFKEN7S.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-DSCOLDT5.mjs +93 -0
  31. package/dist/lib/neutral/chunk-DSCOLDT5.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  33. package/dist/lib/neutral/chunk-K3C5ZTZA.mjs +285 -0
  34. package/dist/lib/neutral/chunk-K3C5ZTZA.mjs.map +7 -0
  35. package/dist/lib/neutral/chunk-M3TIHFXN.mjs +8 -0
  36. package/dist/lib/neutral/chunk-M3TIHFXN.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-YV7TKOVL.mjs +12 -0
  38. package/dist/lib/neutral/chunk-YV7TKOVL.mjs.map +7 -0
  39. package/dist/lib/neutral/components/index.mjs +16 -0
  40. package/dist/lib/neutral/compute-runtime-D7MPZJ4R.mjs +222 -0
  41. package/dist/lib/neutral/compute-runtime-D7MPZJ4R.mjs.map +7 -0
  42. package/dist/lib/neutral/containers/index.mjs +13 -0
  43. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  44. package/dist/lib/neutral/create-trigger-from-template-7K3OYOHQ.mjs +68 -0
  45. package/dist/lib/neutral/create-trigger-from-template-7K3OYOHQ.mjs.map +7 -0
  46. package/dist/lib/neutral/hooks/index.mjs +129 -0
  47. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  48. package/dist/lib/neutral/index.mjs +20 -0
  49. package/dist/lib/neutral/meta.json +1 -0
  50. package/dist/lib/neutral/meta.mjs +8 -0
  51. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs +13 -0
  52. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs.map +7 -0
  53. package/dist/lib/neutral/operations/index.mjs +8 -0
  54. package/dist/lib/neutral/plugin.mjs +16 -0
  55. package/dist/lib/neutral/plugin.mjs.map +7 -0
  56. package/dist/lib/neutral/react-surface-3OGMAMKV.mjs +57 -0
  57. package/dist/lib/neutral/react-surface-3OGMAMKV.mjs.map +7 -0
  58. package/dist/lib/neutral/testing.mjs +8 -0
  59. package/dist/lib/neutral/testing.mjs.map +7 -0
  60. package/dist/lib/neutral/translations.mjs +47 -0
  61. package/dist/lib/neutral/translations.mjs.map +7 -0
  62. package/dist/lib/neutral/types/index.mjs +16 -0
  63. package/dist/lib/neutral/types/index.mjs.map +7 -0
  64. package/dist/types/src/AutomationPlugin.d.ts +3 -1
  65. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  66. package/dist/types/src/AutomationPlugin.node.d.ts +4 -0
  67. package/dist/types/src/AutomationPlugin.node.d.ts.map +1 -0
  68. package/dist/types/src/AutomationPlugin.test.d.ts +2 -0
  69. package/dist/types/src/AutomationPlugin.test.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  71. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/compute-runtime.d.ts +12 -3
  73. package/dist/types/src/capabilities/compute-runtime.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/index.d.ts +6 -5
  75. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/node.d.ts +6 -0
  77. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  79. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  81. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  82. package/dist/types/src/commands/index.d.ts +2 -0
  83. package/dist/types/src/commands/index.d.ts.map +1 -0
  84. package/dist/types/src/commands/trigger/create/index.d.ts +25 -0
  85. package/dist/types/src/commands/trigger/create/index.d.ts.map +1 -0
  86. package/dist/types/src/commands/trigger/create/queue.d.ts +13 -0
  87. package/dist/types/src/commands/trigger/create/queue.d.ts.map +1 -0
  88. package/dist/types/src/commands/trigger/create/subscription.d.ts +15 -0
  89. package/dist/types/src/commands/trigger/create/subscription.d.ts.map +1 -0
  90. package/dist/types/src/commands/trigger/create/timer.d.ts +13 -0
  91. package/dist/types/src/commands/trigger/create/timer.d.ts.map +1 -0
  92. package/dist/types/src/commands/trigger/index.d.ts +57 -0
  93. package/dist/types/src/commands/trigger/index.d.ts.map +1 -0
  94. package/dist/types/src/commands/trigger/list.d.ts +7 -0
  95. package/dist/types/src/commands/trigger/list.d.ts.map +1 -0
  96. package/dist/types/src/commands/trigger/options.d.ts +11 -0
  97. package/dist/types/src/commands/trigger/options.d.ts.map +1 -0
  98. package/dist/types/src/commands/trigger/remove.d.ts +8 -0
  99. package/dist/types/src/commands/trigger/remove.d.ts.map +1 -0
  100. package/dist/types/src/commands/trigger/update/index.d.ts +28 -0
  101. package/dist/types/src/commands/trigger/update/index.d.ts.map +1 -0
  102. package/dist/types/src/commands/trigger/update/queue.d.ts +12 -0
  103. package/dist/types/src/commands/trigger/update/queue.d.ts.map +1 -0
  104. package/dist/types/src/commands/trigger/update/subscription.d.ts +13 -0
  105. package/dist/types/src/commands/trigger/update/subscription.d.ts.map +1 -0
  106. package/dist/types/src/commands/trigger/update/timer.d.ts +11 -0
  107. package/dist/types/src/commands/trigger/update/timer.d.ts.map +1 -0
  108. package/dist/types/src/commands/trigger/util.d.ts +46 -0
  109. package/dist/types/src/commands/trigger/util.d.ts.map +1 -0
  110. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +5 -6
  111. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  112. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +32 -30
  113. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -1
  115. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  116. package/dist/types/src/components/FunctionsPanel/index.d.ts.map +1 -1
  117. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -1
  118. package/dist/types/src/components/FunctionsRegistry/index.d.ts +3 -1
  119. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -1
  120. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +12 -9
  121. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  122. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  123. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  124. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +8 -7
  125. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  126. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +104 -32
  127. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  128. package/dist/types/src/components/index.d.ts +3 -4
  129. package/dist/types/src/components/index.d.ts.map +1 -1
  130. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +6 -0
  131. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  132. package/dist/types/src/containers/AutomationSettings/index.d.ts +2 -0
  133. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -0
  134. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts +4 -0
  135. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -0
  136. package/dist/types/src/containers/FunctionsContainer/index.d.ts +2 -0
  137. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -0
  138. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -0
  139. package/dist/types/src/containers/TriggerSettings/index.d.ts +3 -0
  140. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -0
  141. package/dist/types/src/containers/index.d.ts +5 -0
  142. package/dist/types/src/containers/index.d.ts.map +1 -0
  143. package/dist/types/src/hooks/index.d.ts +2 -0
  144. package/dist/types/src/hooks/index.d.ts.map +1 -1
  145. package/dist/types/src/hooks/useComputeRuntime.d.ts +8 -0
  146. package/dist/types/src/hooks/useComputeRuntime.d.ts.map +1 -0
  147. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +4 -7
  148. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -1
  149. package/dist/types/src/hooks/useComputeRuntimeService.d.ts +17 -0
  150. package/dist/types/src/hooks/useComputeRuntimeService.d.ts.map +1 -0
  151. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +5 -4
  152. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  153. package/dist/types/src/index.d.ts +1 -5
  154. package/dist/types/src/index.d.ts.map +1 -1
  155. package/dist/types/src/meta.d.ts +2 -2
  156. package/dist/types/src/meta.d.ts.map +1 -1
  157. package/dist/types/src/operations/create-trigger-from-template.d.ts +5 -0
  158. package/dist/types/src/operations/create-trigger-from-template.d.ts.map +1 -0
  159. package/dist/types/src/operations/index.d.ts +3 -0
  160. package/dist/types/src/operations/index.d.ts.map +1 -0
  161. package/dist/types/src/plugin.d.ts +4 -0
  162. package/dist/types/src/plugin.d.ts.map +1 -0
  163. package/dist/types/src/testing/test-functions.d.ts +204 -3
  164. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  165. package/dist/types/src/testing.d.ts +2 -0
  166. package/dist/types/src/testing.d.ts.map +1 -0
  167. package/dist/types/src/translations.d.ts +32 -31
  168. package/dist/types/src/translations.d.ts.map +1 -1
  169. package/dist/types/src/types/AutomationCapabilities.d.ts +22 -0
  170. package/dist/types/src/types/AutomationCapabilities.d.ts.map +1 -0
  171. package/dist/types/src/types/AutomationEvents.d.ts +3 -0
  172. package/dist/types/src/types/AutomationEvents.d.ts.map +1 -0
  173. package/dist/types/src/types/AutomationOperation.d.ts +19 -0
  174. package/dist/types/src/types/AutomationOperation.d.ts.map +1 -0
  175. package/dist/types/src/types/index.d.ts +3 -0
  176. package/dist/types/src/types/index.d.ts.map +1 -1
  177. package/dist/types/src/types/schema.d.ts +11 -3
  178. package/dist/types/src/types/schema.d.ts.map +1 -1
  179. package/dist/types/tsconfig.tsbuildinfo +1 -1
  180. package/package.json +140 -70
  181. package/src/AutomationPlugin.node.ts +29 -0
  182. package/src/AutomationPlugin.test.ts +27 -0
  183. package/src/AutomationPlugin.tsx +20 -37
  184. package/src/capabilities/app-graph-builder.ts +59 -80
  185. package/src/capabilities/compute-runtime.ts +265 -66
  186. package/src/capabilities/index.ts +9 -7
  187. package/src/capabilities/node.ts +13 -0
  188. package/src/capabilities/operation-handler.ts +16 -0
  189. package/src/capabilities/react-surface.tsx +49 -46
  190. package/src/commands/index.ts +5 -0
  191. package/src/commands/trigger/create/index.ts +14 -0
  192. package/src/commands/trigger/create/queue.ts +86 -0
  193. package/src/commands/trigger/create/subscription.ts +125 -0
  194. package/src/commands/trigger/create/timer.ts +90 -0
  195. package/src/commands/trigger/index.ts +16 -0
  196. package/src/commands/trigger/list.ts +70 -0
  197. package/src/commands/trigger/options.ts +59 -0
  198. package/src/commands/trigger/remove.ts +44 -0
  199. package/src/commands/trigger/update/index.ts +14 -0
  200. package/src/commands/trigger/update/queue.ts +194 -0
  201. package/src/commands/trigger/update/subscription.ts +278 -0
  202. package/src/commands/trigger/update/timer.ts +193 -0
  203. package/src/commands/trigger/util.ts +412 -0
  204. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +15 -8
  205. package/src/components/AutomationPanel/AutomationPanel.tsx +190 -86
  206. package/src/components/FunctionsPanel/FunctionsPanel.tsx +43 -42
  207. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +38 -54
  208. package/src/components/FunctionsRegistry/index.ts +4 -1
  209. package/src/components/TriggerEditor/FunctionInputEditor.tsx +34 -33
  210. package/src/components/TriggerEditor/SpecSelector.tsx +25 -19
  211. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +87 -36
  212. package/src/components/TriggerEditor/TriggerEditor.tsx +89 -48
  213. package/src/components/index.ts +1 -2
  214. package/src/containers/AutomationSettings/AutomationSettings.tsx +31 -0
  215. package/src/containers/AutomationSettings/index.ts +5 -0
  216. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +33 -0
  217. package/src/containers/FunctionsContainer/index.ts +5 -0
  218. package/src/containers/TriggerSettings/TriggerSettings.tsx +48 -0
  219. package/src/containers/TriggerSettings/index.ts +6 -0
  220. package/src/containers/index.ts +9 -0
  221. package/src/hooks/index.ts +3 -0
  222. package/src/hooks/useComputeRuntime.ts +30 -0
  223. package/src/hooks/useComputeRuntimeCallback.ts +10 -47
  224. package/src/hooks/useComputeRuntimeService.ts +64 -0
  225. package/src/hooks/useTriggerRuntimeControls.ts +32 -15
  226. package/src/index.ts +1 -6
  227. package/src/meta.ts +5 -4
  228. package/src/operations/create-trigger-from-template.ts +71 -0
  229. package/src/operations/index.ts +7 -0
  230. package/src/plugin.ts +11 -0
  231. package/src/testing/test-functions.ts +12 -9
  232. package/src/testing.ts +7 -0
  233. package/src/translations.ts +39 -36
  234. package/src/types/AutomationCapabilities.ts +48 -0
  235. package/src/types/AutomationEvents.ts +11 -0
  236. package/src/types/AutomationOperation.ts +30 -0
  237. package/src/types/index.ts +4 -0
  238. package/src/types/schema.ts +5 -5
  239. package/dist/lib/browser/AutomationPanel-7OECLR5N.mjs +0 -11
  240. package/dist/lib/browser/AutomationSettings-KCZISXI6.mjs +0 -68
  241. package/dist/lib/browser/AutomationSettings-KCZISXI6.mjs.map +0 -7
  242. package/dist/lib/browser/FunctionsContainer-MIWEISRR.mjs +0 -151
  243. package/dist/lib/browser/FunctionsContainer-MIWEISRR.mjs.map +0 -7
  244. package/dist/lib/browser/FunctionsPanel-CRW6SJUN.mjs +0 -10
  245. package/dist/lib/browser/app-graph-builder-W7LLC6XW.mjs +0 -81
  246. package/dist/lib/browser/app-graph-builder-W7LLC6XW.mjs.map +0 -7
  247. package/dist/lib/browser/chunk-EPEXQP45.mjs +0 -14
  248. package/dist/lib/browser/chunk-EPEXQP45.mjs.map +0 -7
  249. package/dist/lib/browser/chunk-JW7XSPYW.mjs +0 -267
  250. package/dist/lib/browser/chunk-JW7XSPYW.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-LZQFZO3B.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-NAPXRXTY.mjs +0 -100
  253. package/dist/lib/browser/chunk-NAPXRXTY.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-QKFBHAGN.mjs +0 -184
  255. package/dist/lib/browser/chunk-QKFBHAGN.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-TWWFNOIR.mjs +0 -109
  257. package/dist/lib/browser/chunk-TWWFNOIR.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-XAKZ4ANY.mjs +0 -15
  259. package/dist/lib/browser/chunk-XAKZ4ANY.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-YBPJCY3F.mjs +0 -38
  261. package/dist/lib/browser/chunk-YBPJCY3F.mjs.map +0 -7
  262. package/dist/lib/browser/compute-runtime-EIQTHJFZ.mjs +0 -113
  263. package/dist/lib/browser/compute-runtime-EIQTHJFZ.mjs.map +0 -7
  264. package/dist/lib/browser/hooks/index.mjs +0 -13
  265. package/dist/lib/browser/index.mjs +0 -130
  266. package/dist/lib/browser/index.mjs.map +0 -7
  267. package/dist/lib/browser/intent-resolver-5HR7M7T6.mjs +0 -77
  268. package/dist/lib/browser/intent-resolver-5HR7M7T6.mjs.map +0 -7
  269. package/dist/lib/browser/meta.json +0 -1
  270. package/dist/lib/browser/react-surface-YQW7WCFW.mjs +0 -64
  271. package/dist/lib/browser/react-surface-YQW7WCFW.mjs.map +0 -7
  272. package/dist/lib/browser/types/index.mjs +0 -8
  273. package/dist/lib/node-esm/AutomationPanel-HCVFNHGQ.mjs +0 -12
  274. package/dist/lib/node-esm/AutomationSettings-UUUPVNUJ.mjs +0 -69
  275. package/dist/lib/node-esm/AutomationSettings-UUUPVNUJ.mjs.map +0 -7
  276. package/dist/lib/node-esm/FunctionsContainer-6OB3JN5O.mjs +0 -152
  277. package/dist/lib/node-esm/FunctionsContainer-6OB3JN5O.mjs.map +0 -7
  278. package/dist/lib/node-esm/FunctionsPanel-RVVCS6VH.mjs +0 -11
  279. package/dist/lib/node-esm/app-graph-builder-SLQOO7GH.mjs +0 -82
  280. package/dist/lib/node-esm/app-graph-builder-SLQOO7GH.mjs.map +0 -7
  281. package/dist/lib/node-esm/chunk-6YRKST6M.mjs +0 -185
  282. package/dist/lib/node-esm/chunk-6YRKST6M.mjs.map +0 -7
  283. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs +0 -19
  284. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs.map +0 -7
  285. package/dist/lib/node-esm/chunk-CPP35BE6.mjs +0 -16
  286. package/dist/lib/node-esm/chunk-CPP35BE6.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-ECJKIUBO.mjs +0 -39
  288. package/dist/lib/node-esm/chunk-ECJKIUBO.mjs.map +0 -7
  289. package/dist/lib/node-esm/chunk-KB7NFEYY.mjs +0 -16
  290. package/dist/lib/node-esm/chunk-KB7NFEYY.mjs.map +0 -7
  291. package/dist/lib/node-esm/chunk-PICJ2REN.mjs +0 -101
  292. package/dist/lib/node-esm/chunk-PICJ2REN.mjs.map +0 -7
  293. package/dist/lib/node-esm/chunk-RVK52XGK.mjs +0 -110
  294. package/dist/lib/node-esm/chunk-RVK52XGK.mjs.map +0 -7
  295. package/dist/lib/node-esm/chunk-W76WUTZY.mjs +0 -268
  296. package/dist/lib/node-esm/chunk-W76WUTZY.mjs.map +0 -7
  297. package/dist/lib/node-esm/compute-runtime-URROOC34.mjs +0 -114
  298. package/dist/lib/node-esm/compute-runtime-URROOC34.mjs.map +0 -7
  299. package/dist/lib/node-esm/hooks/index.mjs +0 -14
  300. package/dist/lib/node-esm/index.mjs +0 -131
  301. package/dist/lib/node-esm/index.mjs.map +0 -7
  302. package/dist/lib/node-esm/intent-resolver-KDRYB5BC.mjs +0 -78
  303. package/dist/lib/node-esm/intent-resolver-KDRYB5BC.mjs.map +0 -7
  304. package/dist/lib/node-esm/meta.json +0 -1
  305. package/dist/lib/node-esm/react-surface-NNHYNBO6.mjs +0 -65
  306. package/dist/lib/node-esm/react-surface-NNHYNBO6.mjs.map +0 -7
  307. package/dist/lib/node-esm/types/index.mjs +0 -9
  308. package/dist/types/src/capabilities/capabilities.d.ts +0 -20
  309. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  310. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  311. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  312. package/dist/types/src/components/AutomationSettings.d.ts +0 -5
  313. package/dist/types/src/components/AutomationSettings.d.ts.map +0 -1
  314. package/dist/types/src/components/FunctionsContainer.d.ts +0 -7
  315. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  316. package/dist/types/src/components/TriggerSettings.d.ts.map +0 -1
  317. package/dist/types/src/events.d.ts +0 -4
  318. package/dist/types/src/events.d.ts.map +0 -1
  319. package/src/capabilities/capabilities.ts +0 -41
  320. package/src/capabilities/intent-resolver.ts +0 -72
  321. package/src/components/AutomationSettings.tsx +0 -30
  322. package/src/components/FunctionsContainer.tsx +0 -36
  323. package/src/components/TriggerSettings.tsx +0 -25
  324. package/src/events.ts +0 -11
  325. /package/dist/lib/{browser/AutomationPanel-7OECLR5N.mjs.map → neutral/AutomationPanel-HI63JQ2X.mjs.map} +0 -0
  326. /package/dist/lib/{browser/FunctionsPanel-CRW6SJUN.mjs.map → neutral/AutomationPlugin.mjs.map} +0 -0
  327. /package/dist/lib/{browser/hooks/index.mjs.map → neutral/TriggerSettings-XCHIZPOR.mjs.map} +0 -0
  328. /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  329. /package/dist/lib/{node-esm/hooks → neutral/components}/index.mjs.map +0 -0
  330. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
  331. /package/dist/lib/{node-esm/AutomationPanel-HCVFNHGQ.mjs.map → neutral/meta.mjs.map} +0 -0
  332. /package/dist/lib/{node-esm/FunctionsPanel-RVVCS6VH.mjs.map → neutral/operations/index.mjs.map} +0 -0
  333. /package/dist/types/src/{components → containers/TriggerSettings}/TriggerSettings.d.ts +0 -0
@@ -4,60 +4,87 @@
4
4
 
5
5
  import React, { useCallback, useMemo } from 'react';
6
6
 
7
+ import { Operation, Script, Trigger } from '@dxos/compute';
7
8
  import { ComputeGraph } from '@dxos/conductor';
8
- import { type Query, Type } from '@dxos/echo';
9
- import { Function, Script, Trigger } from '@dxos/functions';
10
- import { Filter, Ref, type Space, useQuery } from '@dxos/react-client/echo';
9
+ import { type Database, DXN, Entity, Feed, Filter, Obj, type Query, Ref } from '@dxos/echo';
10
+ import { useQuery } from '@dxos/react-client/echo';
11
11
  import { Input } from '@dxos/react-ui';
12
12
  import { QueryForm, type QueryFormProps } from '@dxos/react-ui-components';
13
- import { type CustomInputMap, Form, InputHeader, SelectInput, useRefQueryLookupHandler } from '@dxos/react-ui-form';
14
-
15
- import { FunctionInputEditor, type FunctionInputEditorProps } from './FunctionInputEditor';
13
+ import {
14
+ type ExcludeId,
15
+ Form,
16
+ FormFieldLabel,
17
+ type FormFieldMap,
18
+ type FormRootProps,
19
+ SelectField,
20
+ omitId,
21
+ } from '@dxos/react-ui-form';
22
+
23
+ import { FunctionInputEditor } from './FunctionInputEditor';
16
24
  import { SpecSelector } from './SpecSelector';
17
25
 
26
+ type TriggerFormSchema = ExcludeId<typeof Trigger.Trigger>;
27
+
18
28
  export type TriggerEditorProps = {
19
- space: Space;
29
+ db: Database.Database;
20
30
  trigger: Trigger.Trigger;
21
31
  // TODO(wittjosiah): This needs to apply to whole spec but currently only applies to spec.kind & spec.query.
22
32
  readonlySpec?: boolean;
23
- onSave?: (trigger: Omit<Trigger.Trigger, 'id'>) => void;
24
- onCancel?: () => void;
25
- } & Pick<QueryFormProps, 'types' | 'tags'>;
26
-
27
- export const TriggerEditor = ({ space, trigger, readonlySpec, types, tags, onSave, onCancel }: TriggerEditorProps) => {
28
- const handleSave = ({ id: _, ...values }: Trigger.Trigger) => {
29
- onSave?.(values);
30
- };
33
+ } &
34
+ // prettier-ignore
35
+ Pick<QueryFormProps, 'types' | 'tags'> &
36
+ Pick<FormRootProps<TriggerFormSchema>, 'onSave' | 'onCancel'>;
37
+
38
+ export const TriggerEditor = ({ db, types, tags, readonlySpec, trigger, ...formProps }: TriggerEditorProps) => {
39
+ const fieldMap = useCustomInputs({ db, types, tags, readonlySpec });
40
+
41
+ const handleValuesChanged = useCallback(
42
+ (newValues: Partial<TriggerFormSchema>) => {
43
+ Obj.update(trigger, (trigger) => {
44
+ Object.assign(trigger, newValues);
45
+ });
46
+ },
47
+ [trigger],
48
+ );
31
49
 
32
- const handleRefQueryLookup = useRefQueryLookupHandler({ space });
33
- const Custom = useCustomInputs({ space, readonlySpec, types, tags, onQueryRefOptions: handleRefQueryLookup });
50
+ const triggerSchema = useMemo(() => omitId(Trigger.Trigger), []);
51
+ const defaultValues = useMemo(() => {
52
+ const { id: _, ...values } = trigger;
53
+ return values;
54
+ }, [trigger]);
34
55
 
35
56
  return (
36
- <Form
37
- outerSpacing={false}
38
- Custom={Custom}
39
- schema={Trigger.Trigger}
40
- values={trigger}
41
- onSave={handleSave}
42
- onCancel={onCancel}
43
- onQueryRefOptions={handleRefQueryLookup}
44
- />
57
+ <Form.Root<TriggerFormSchema>
58
+ {...formProps}
59
+ db={db}
60
+ schema={triggerSchema}
61
+ defaultValues={defaultValues}
62
+ fieldMap={fieldMap}
63
+ onValuesChanged={handleValuesChanged}
64
+ >
65
+ <Form.Viewport>
66
+ <Form.Content>
67
+ <Form.FieldSet />
68
+ <Form.Actions />
69
+ </Form.Content>
70
+ </Form.Viewport>
71
+ </Form.Root>
45
72
  );
46
73
  };
47
74
 
48
75
  type UseCustomInputsProps = {
49
- space: Space;
76
+ db: Database.Database;
50
77
  readonlySpec?: boolean;
51
- onQueryRefOptions: FunctionInputEditorProps['onQueryRefOptions'];
52
78
  } & Pick<QueryFormProps, 'types' | 'tags'>;
53
79
 
54
- const useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }: UseCustomInputsProps) => {
55
- const functions = useQuery(space, Filter.type(Function.Function));
56
- const workflows = useQuery(space, Filter.type(ComputeGraph));
57
- const scripts = useQuery(space, Filter.type(Script.Script));
80
+ const useCustomInputs = ({ db, readonlySpec, types, tags }: UseCustomInputsProps): FormFieldMap => {
81
+ const functions = useQuery(db, Filter.type(Operation.PersistentOperation));
82
+ const workflows = useQuery(db, Filter.type(ComputeGraph));
83
+ const scripts = useQuery(db, Filter.type(Script.Script));
84
+ const feeds = useQuery(db, Filter.type(Feed.Feed));
58
85
 
59
86
  return useMemo(
60
- (): CustomInputMap => ({
87
+ (): FormFieldMap => ({
61
88
  // Function selector.
62
89
  ['function' satisfies keyof Trigger.Trigger]: (props) => {
63
90
  const getValue = useCallback(() => {
@@ -70,17 +97,17 @@ const useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }
70
97
 
71
98
  const handleOnValueChange = useCallback(
72
99
  (_type: any, dxnString: string) => {
73
- const dxn = Type.DXN.parse(dxnString);
100
+ const dxn = DXN.parse(dxnString);
74
101
  if (dxn) {
75
102
  const ref = Ref.fromDXN(dxn);
76
- props.onValueChange('object', ref);
103
+ props.onValueChange(props.type, ref);
77
104
  }
78
105
  },
79
- [props.onValueChange],
106
+ [props.type, props.onValueChange],
80
107
  );
81
108
 
82
109
  return (
83
- <SelectInput
110
+ <SelectField
84
111
  {...props}
85
112
  getValue={getValue as any}
86
113
  onValueChange={handleOnValueChange}
@@ -90,30 +117,31 @@ const useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }
90
117
  },
91
118
 
92
119
  // Spec selector.
93
- ['spec.kind' as const]: (props) => <SpecSelector {...props} readonly={readonlySpec ? 'disabled-input' : false} />,
120
+ 'spec.kind': (props) => <SpecSelector {...props} readonly={readonlySpec} />,
121
+
122
+ // Queue feed selector with parent labels.
123
+ 'spec.queue': (props) => <SelectField {...props} options={getFeedQueueOptions(feeds)} />,
94
124
 
95
125
  // TODO(wittjosiah): Copied from ViewEditor.
96
126
  // Query input editor.
97
- ['spec.query' as const]: (props) => {
127
+ 'spec.query': (props) => {
98
128
  const handleChange = useCallback(
99
- (query: Query.Any) => props.onValueChange('object', { ast: query.ast }),
100
- [props.onValueChange],
129
+ (query: Query.Any) => props.onValueChange(props.type, { ast: query.ast }),
130
+ [props.type, props.onValueChange],
101
131
  );
102
132
 
103
133
  return (
104
134
  <Input.Root>
105
- <InputHeader label={props.label} />
135
+ <FormFieldLabel label={props.label} asChild />
106
136
  <QueryForm initialQuery={(props.getValue() as any).ast} types={types} tags={tags} onChange={handleChange} />
107
137
  </Input.Root>
108
138
  );
109
139
  },
110
140
 
111
141
  // Function input editor.
112
- ['input' as const]: (props) => (
113
- <FunctionInputEditor {...props} functions={functions} onQueryRefOptions={onQueryRefOptions} />
114
- ),
142
+ input: (props) => <FunctionInputEditor {...props} functions={functions} db={db} />,
115
143
  }),
116
- [workflows, scripts, functions, readonlySpec],
144
+ [workflows, scripts, functions, feeds, readonlySpec],
117
145
  );
118
146
  };
119
147
 
@@ -121,7 +149,20 @@ const getWorkflowOptions = (graphs: ComputeGraph[]) => {
121
149
  return graphs.map((graph) => ({ label: `compute-${graph.id}`, value: `dxn:echo:@:${graph.id}` }));
122
150
  };
123
151
 
124
- const getFunctionOptions = (scripts: Script.Script[], functions: Function.Function[]) => {
125
- const getLabel = (fn: Function.Function) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
152
+ const getFunctionOptions = (scripts: Script.Script[], functions: Operation.PersistentOperation[]) => {
153
+ const getLabel = (fn: Operation.PersistentOperation) =>
154
+ scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
126
155
  return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:echo:@:${fn.id}` }));
127
156
  };
157
+
158
+ const getFeedQueueOptions = (feeds: Feed.Feed[]) => {
159
+ return feeds.flatMap((feed) => {
160
+ const queueDXN = Feed.getQueueDxn(feed);
161
+ if (!queueDXN) {
162
+ return [];
163
+ }
164
+ const parent = Obj.getParent(feed);
165
+ const label = parent ? Entity.getLabel(parent) : Entity.getLabel(feed);
166
+ return [{ label: label ?? feed.id, value: queueDXN.toString() }];
167
+ });
168
+ };
@@ -7,6 +7,5 @@ import { lazy } from 'react';
7
7
  export * from './TriggerEditor';
8
8
 
9
9
  export const AutomationPanel = lazy(() => import('./AutomationPanel'));
10
- export const AutomationSettings = lazy(() => import('./AutomationSettings'));
11
- export const FunctionsContainer = lazy(() => import('./FunctionsContainer'));
12
10
  export const FunctionsPanel = lazy(() => import('./FunctionsPanel'));
11
+ export const FunctionsRegistry = lazy(() => import('./FunctionsRegistry'));
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { useTranslation } from '@dxos/react-ui';
9
+ import { Settings } from '@dxos/react-ui-form';
10
+
11
+ import { meta } from '#meta';
12
+
13
+ import { AutomationPanel, type AutomationPanelProps } from '../../components/AutomationPanel';
14
+ import { TriggersSettings } from '../TriggerSettings';
15
+
16
+ export type AutomationSettingsProps = AppSurface.SpaceArticleProps<Omit<AutomationPanelProps, 'space'>>;
17
+
18
+ export const AutomationSettings = (props: AutomationSettingsProps) => {
19
+ const { t } = useTranslation(meta.id);
20
+ return (
21
+ <Settings.Viewport>
22
+ <Settings.Section
23
+ title={t('automation-verbose.label', { ns: meta.id })}
24
+ description={t('automation.description', { ns: meta.id })}
25
+ >
26
+ <AutomationPanel {...props} />
27
+ <TriggersSettings space={props.space} />
28
+ </Settings.Section>
29
+ </Settings.Viewport>
30
+ );
31
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { AutomationSettings as default } from './AutomationSettings';
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { useTranslation } from '@dxos/react-ui';
9
+ import { Settings } from '@dxos/react-ui-form';
10
+
11
+ import { meta } from '#meta';
12
+
13
+ import { FunctionsPanel, FunctionsRegistry } from '../../components';
14
+
15
+ export const FunctionsContainer = ({ space }: AppSurface.SpaceArticleProps) => {
16
+ const { t } = useTranslation(meta.id);
17
+ return (
18
+ <Settings.Viewport>
19
+ <Settings.Section
20
+ title={t('functions-verbose.label', { ns: meta.id })}
21
+ description={t('functions.description', { ns: meta.id })}
22
+ >
23
+ <FunctionsPanel space={space} />
24
+ </Settings.Section>
25
+ <Settings.Section
26
+ title={t('functions-registry-verbose.label', { ns: meta.id })}
27
+ description={t('functions-registry.description', { ns: meta.id })}
28
+ >
29
+ <FunctionsRegistry space={space} />
30
+ </Settings.Section>
31
+ </Settings.Viewport>
32
+ );
33
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { FunctionsContainer as default } from './FunctionsContainer';
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { type ComputeEnvironment } from '@dxos/client-protocol';
8
+ import { useObject } from '@dxos/echo-react';
9
+ import { type Space } from '@dxos/react-client/echo';
10
+ import { DropdownMenu, IconButton, useTranslation } from '@dxos/react-ui';
11
+ import { Settings } from '@dxos/react-ui-form';
12
+
13
+ import { meta } from '#meta';
14
+
15
+ export const TriggersSettings = ({ space }: { space: Space }) => {
16
+ const { t } = useTranslation(meta.id);
17
+ const [properties, changeProperties] = useObject(space.properties);
18
+ const selected = properties.computeEnvironment ?? 'local';
19
+
20
+ const handleUpdate = (option: ComputeEnvironment) => {
21
+ changeProperties((draft) => {
22
+ draft.computeEnvironment = option;
23
+ });
24
+ };
25
+
26
+ return (
27
+ <div className='grid grid-cols-1 md:grid-cols-[1fr_min-content]'>
28
+ <Settings.Item title={t('runtime.label')} description={t('runtime.description')}>
29
+ <DropdownMenu.Root>
30
+ <DropdownMenu.Trigger asChild>
31
+ <IconButton iconEnd icon='ph--caret-down--regular' size={4} label={t(`runtime.${selected}.label`)} />
32
+ </DropdownMenu.Trigger>
33
+ <DropdownMenu.Portal>
34
+ <DropdownMenu.Content side='bottom'>
35
+ <DropdownMenu.Viewport>
36
+ <DropdownMenu.Item onClick={() => handleUpdate('disabled')}>
37
+ {t(`runtime.disabled.label`)}
38
+ </DropdownMenu.Item>
39
+ <DropdownMenu.Item onClick={() => handleUpdate('local')}>{t(`runtime.local.label`)}</DropdownMenu.Item>
40
+ <DropdownMenu.Item onClick={() => handleUpdate('edge')}>{t(`runtime.edge.label`)}</DropdownMenu.Item>
41
+ </DropdownMenu.Viewport>
42
+ </DropdownMenu.Content>
43
+ </DropdownMenu.Portal>
44
+ </DropdownMenu.Root>
45
+ </Settings.Item>
46
+ </div>
47
+ );
48
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { TriggersSettings } from './TriggerSettings';
6
+ export { TriggersSettings as default } from './TriggerSettings';
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export const AutomationSettings: ComponentType<any> = lazy(() => import('./AutomationSettings'));
8
+ export const FunctionsContainer: ComponentType<any> = lazy(() => import('./FunctionsContainer'));
9
+ export const TriggerSettings: ComponentType<any> = lazy(() => import('./TriggerSettings'));
@@ -2,5 +2,8 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ // TODO(wittjosiah): Factor out.
5
6
  export * from './useComputeRuntimeCallback';
6
7
  export * from './useTriggerRuntimeControls';
8
+ export * from './useComputeRuntime';
9
+ export * from './useComputeRuntimeService';
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect } from 'react';
6
+
7
+ import { useCapabilities } from '@dxos/app-framework/ui';
8
+ import { SpaceId } from '@dxos/keys';
9
+ import { log } from '@dxos/log';
10
+
11
+ import { AutomationCapabilities } from '../types';
12
+
13
+ /**
14
+ * Resolves the compute runtime for a space.
15
+ * Returns undefined if the AutomationPlugin is not loaded or spaceId is not provided.
16
+ */
17
+ export const useComputeRuntime = (id: SpaceId | undefined): AutomationCapabilities.ComputeRuntime | undefined => {
18
+ const [computeRuntime] = useCapabilities(AutomationCapabilities.ComputeRuntime);
19
+ // One log per change of (capability availability, spaceId) so we can see when
20
+ // the React subscription actually observes the contributed runtime.
21
+ useEffect(() => {
22
+ log('useComputeRuntime', { hasCapability: !!computeRuntime, spaceId: id });
23
+ }, [!!computeRuntime, id]);
24
+
25
+ if (!computeRuntime || id === undefined) {
26
+ return undefined;
27
+ }
28
+
29
+ return computeRuntime.getRuntime(id);
30
+ };
@@ -2,67 +2,30 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as Cause from 'effect/Cause';
6
5
  import * as Effect from 'effect/Effect';
7
- import * as Exit from 'effect/Exit';
8
- import { useCallback } from 'react';
6
+ import { type DependencyList, useCallback } from 'react';
9
7
 
10
- import { useCapability } from '@dxos/app-framework/react';
11
- import { type FunctionDefinition, FunctionInvocationService } from '@dxos/functions';
12
- import { InvocationTracer, TracingServiceExt } from '@dxos/functions-runtime';
13
- import { log } from '@dxos/log';
14
- import type { Space } from '@dxos/react-client/echo';
8
+ import { type Key } from '@dxos/echo';
15
9
 
16
- import { AutomationCapabilities } from '../capabilities';
10
+ import { AutomationCapabilities } from '#types';
11
+
12
+ import { useComputeRuntime } from './useComputeRuntime';
17
13
 
18
14
  /**
19
15
  * Create an effectful function that has access to compute services
20
16
  */
21
- // TODO(burdon): Factor out (figure out cross-plugin capabilities dependencies).
22
17
  export const useComputeRuntimeCallback = <T>(
23
- space: Space | undefined,
24
- fn: () => Effect.Effect<T, any, AutomationCapabilities.ComputeServices>,
25
- deps?: React.DependencyList,
18
+ id: Key.SpaceId | undefined,
19
+ operation: () => Effect.Effect<T, any, AutomationCapabilities.ComputeServices>,
20
+ deps?: DependencyList,
26
21
  ): (() => Promise<T>) => {
27
- const computeRuntime = useCapability(AutomationCapabilities.ComputeRuntime);
28
- const runtime = space !== undefined ? computeRuntime.getRuntime(space.id) : undefined;
22
+ const runtime = useComputeRuntime(id);
29
23
 
30
24
  return useCallback(() => {
31
25
  if (!runtime) {
32
26
  throw new TypeError('Space not provided to useComputeRuntimeCallback');
33
27
  }
34
28
 
35
- return runtime.runPromise(fn());
29
+ return runtime.runPromise(operation());
36
30
  }, [runtime, ...(deps ?? [])]);
37
31
  };
38
-
39
- // TODO(wittjosiah): Function invoking should automatically be traced (DX-647).
40
- export const invokeFunctionWithTracing = <I, O>(functionDef: FunctionDefinition<I, O>, inputData: I) =>
41
- Effect.gen(function* () {
42
- const tracer = yield* InvocationTracer;
43
- const trace = yield* tracer.traceInvocationStart({
44
- target: undefined,
45
- payload: {
46
- data: {},
47
- },
48
- });
49
-
50
- // Invoke the function.
51
- const result = yield* FunctionInvocationService.invokeFunction(functionDef, inputData).pipe(
52
- Effect.provide(TracingServiceExt.layerQueue(trace.invocationTraceQueue)),
53
- Effect.exit,
54
- );
55
-
56
- if (Exit.isFailure(result)) {
57
- const error = Cause.prettyErrors(result.cause)[0];
58
- log.error(error.message, error.cause ?? error.stack);
59
- }
60
-
61
- yield* tracer.traceInvocationEnd({
62
- trace,
63
- // TODO(dmaretskyi): Might miss errors.
64
- exception: Exit.isFailure(result) ? Cause.prettyErrors(result.cause)[0] : undefined,
65
- });
66
-
67
- return result;
68
- });
@@ -0,0 +1,64 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Context from 'effect/Context';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Exit from 'effect/Exit';
8
+ import { useEffect, useState } from 'react';
9
+
10
+ import { SpaceId } from '@dxos/keys';
11
+ import { log } from '@dxos/log';
12
+
13
+ import { useComputeRuntime } from './useComputeRuntime';
14
+
15
+ type ResolvedService<T extends Context.Tag<any, any>> = Context.Tag.Service<T> | undefined;
16
+
17
+ /**
18
+ * Resolves a service from the compute runtime for a given space.
19
+ *
20
+ * NOTE: Previously implemented via `use(useMemo(() => runtime.runPromiseExit(...)))`.
21
+ * React's `use()` is weird and unreliable in production builds — the Suspense
22
+ * boundary can stay pending indefinitely without the promise ever resolving
23
+ * from React's perspective (the runtime is built lazily on first invocation
24
+ * and one of its `acquire` steps can block). This `useState` + `useEffect`
25
+ * flavour avoids suspension entirely: the hook returns `undefined` while the
26
+ * service is being acquired or if acquisition fails / times out.
27
+ */
28
+ export const useComputeRuntimeService = <T extends Context.Tag<any, any>>(
29
+ tag: T,
30
+ spaceId?: SpaceId,
31
+ ): ResolvedService<T> => {
32
+ const runtime = useComputeRuntime(spaceId);
33
+ const [service, setService] = useState<ResolvedService<T>>(undefined);
34
+
35
+ useEffect(() => {
36
+ setService(undefined);
37
+ if (!runtime) {
38
+ return;
39
+ }
40
+ let cancelled = false;
41
+ void (async () => {
42
+ try {
43
+ const exit = await runtime.runPromiseExit(tag.pipe(Effect.timeout('30 seconds')));
44
+ if (cancelled) {
45
+ return;
46
+ }
47
+ if (Exit.isSuccess(exit)) {
48
+ setService(exit.value);
49
+ } else {
50
+ log.warn('useComputeRuntimeService: failed to acquire service', { cause: exit.cause });
51
+ }
52
+ } catch (error) {
53
+ if (!cancelled) {
54
+ log.catch(error);
55
+ }
56
+ }
57
+ })();
58
+ return () => {
59
+ cancelled = true;
60
+ };
61
+ }, [runtime, tag]);
62
+
63
+ return service;
64
+ };
@@ -2,51 +2,68 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import type * as Context from 'effect/Context';
5
7
  import * as Effect from 'effect/Effect';
8
+ import { useEffect, useState } from 'react';
6
9
 
7
- import { Filter } from '@dxos/echo';
8
- import { Trigger } from '@dxos/functions';
9
- import { TriggerDispatcher } from '@dxos/functions-runtime';
10
- import { type Space, useQuery } from '@dxos/react-client/echo';
11
- import { useAsyncState } from '@dxos/react-ui';
10
+ import { Trigger } from '@dxos/compute';
11
+ import { type Database, Filter, Query } from '@dxos/echo';
12
+ import { TriggerDispatcher, type TriggerDispatcherState } from '@dxos/functions-runtime';
13
+ import { useQuery } from '@dxos/react-client/echo';
12
14
 
13
15
  import { useComputeRuntimeCallback } from './useComputeRuntimeCallback';
14
16
 
15
17
  interface TriggerRuntimeControls {
16
18
  triggers: Trigger.Trigger[];
17
- isRunning: boolean;
19
+
20
+ state: TriggerDispatcherState | undefined;
21
+
18
22
  start: () => void;
19
23
  stop: () => void;
20
24
  }
21
25
 
22
- export const useTriggerRuntimeControls = (space: Space | undefined): TriggerRuntimeControls => {
23
- const triggers = useQuery(space, Filter.type(Trigger.Trigger));
26
+ export const useTriggerRuntimeControls = (db: Database.Database | undefined): TriggerRuntimeControls => {
27
+ const triggers = useQuery(
28
+ db,
29
+ Query.select(Filter.type(Trigger.Trigger)).debugLabel('plugin-automation.useTriggerRuntimeControls'),
30
+ );
24
31
 
25
- const [isRunningState, setIsRunningState] = useAsyncState(
26
- useComputeRuntimeCallback(space, () => TriggerDispatcher.pipe(Effect.map((t) => t.running))),
32
+ const [dispatcher, setDispatcher] = useState<Context.Tag.Service<TriggerDispatcher> | undefined>(undefined);
33
+
34
+ const init = useComputeRuntimeCallback(
35
+ db?.spaceId,
36
+ Effect.fnUntraced(function* () {
37
+ const dispatcher = yield* TriggerDispatcher;
38
+ setDispatcher(dispatcher);
39
+ }),
27
40
  );
28
41
 
42
+ useEffect(() => {
43
+ void init();
44
+ }, []);
45
+
46
+ const state = useAtomValue(dispatcher?.state ?? Atom.make(undefined));
47
+
29
48
  const start = useComputeRuntimeCallback(
30
- space,
49
+ db?.spaceId,
31
50
  Effect.fnUntraced(function* () {
32
51
  const dispatcher = yield* TriggerDispatcher;
33
52
  yield* dispatcher.start();
34
- setIsRunningState(true);
35
53
  }),
36
54
  );
37
55
 
38
56
  const stop = useComputeRuntimeCallback(
39
- space,
57
+ db?.spaceId,
40
58
  Effect.fnUntraced(function* () {
41
59
  const dispatcher = yield* TriggerDispatcher;
42
60
  yield* dispatcher.stop();
43
- setIsRunningState(false);
44
61
  }),
45
62
  );
46
63
 
47
64
  return {
48
65
  triggers,
49
- isRunning: isRunningState ?? false,
66
+ state,
50
67
  start: () => void start(),
51
68
  stop: () => void stop(),
52
69
  };
package/src/index.ts CHANGED
@@ -2,10 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { AutomationCapabilities } from './capabilities';
6
- export * from './components';
7
5
  export * from './meta';
8
- export * from './events';
9
- export * from './hooks';
10
-
11
- export * from './AutomationPlugin';
6
+ export * from './types';
package/src/meta.ts CHANGED
@@ -2,16 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
5
+ import { type Plugin } from '@dxos/app-framework';
6
6
  import { trim } from '@dxos/util';
7
7
 
8
- export const meta: PluginMeta = {
9
- id: 'dxos.org/plugin/automation',
8
+ export const meta: Plugin.Meta = {
9
+ id: 'org.dxos.plugin.automation',
10
10
  name: 'Automation',
11
11
  description: trim`
12
12
  Workflow automation engine that triggers custom actions based on object events and conditions.
13
13
  Create automated pipelines that respond to changes and streamline repetitive tasks.
14
14
  `,
15
- icon: 'ph--robot--regular',
15
+ icon: 'ph--atom--regular',
16
16
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-automation',
17
+ tags: ['system'],
17
18
  };