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