@dxos/plugin-automation 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (282) hide show
  1. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  2. package/dist/lib/browser/chunk-POEIL4RN.mjs +44 -0
  3. package/dist/lib/browser/chunk-POEIL4RN.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-WQLEMRPU.mjs +54 -0
  5. package/dist/lib/browser/chunk-WQLEMRPU.mjs.map +7 -0
  6. package/dist/lib/browser/cli/index.mjs +1122 -0
  7. package/dist/lib/browser/cli/index.mjs.map +7 -0
  8. package/dist/lib/browser/create-trigger-from-template-JPF5BFMX.mjs +77 -0
  9. package/dist/lib/browser/create-trigger-from-template-JPF5BFMX.mjs.map +7 -0
  10. package/dist/lib/browser/hooks/index.mjs +79 -7
  11. package/dist/lib/browser/hooks/index.mjs.map +4 -4
  12. package/dist/lib/browser/index.mjs +72 -112
  13. package/dist/lib/browser/index.mjs.map +4 -4
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/operations/index.mjs +14 -0
  16. package/dist/lib/browser/operations/index.mjs.map +7 -0
  17. package/dist/lib/browser/types/index.mjs +10 -4
  18. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  19. package/dist/lib/node-esm/{chunk-ECJKIUBO.mjs → chunk-JWZAVQLF.mjs} +24 -7
  20. package/dist/lib/node-esm/chunk-JWZAVQLF.mjs.map +7 -0
  21. package/dist/lib/node-esm/chunk-SP3P4OUI.mjs +45 -0
  22. package/dist/lib/node-esm/chunk-SP3P4OUI.mjs.map +7 -0
  23. package/dist/lib/node-esm/cli/index.mjs +1123 -0
  24. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  25. package/dist/lib/node-esm/create-trigger-from-template-FT75A4SF.mjs +78 -0
  26. package/dist/lib/node-esm/create-trigger-from-template-FT75A4SF.mjs.map +7 -0
  27. package/dist/lib/node-esm/hooks/index.mjs +79 -7
  28. package/dist/lib/node-esm/hooks/index.mjs.map +4 -4
  29. package/dist/lib/node-esm/index.mjs +72 -112
  30. package/dist/lib/node-esm/index.mjs.map +4 -4
  31. package/dist/lib/node-esm/meta.json +1 -1
  32. package/dist/lib/node-esm/operations/index.mjs +15 -0
  33. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  34. package/dist/lib/node-esm/types/index.mjs +10 -4
  35. package/dist/types/src/AutomationPlugin.d.ts +2 -1
  36. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  38. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/compute-runtime.d.ts +4 -3
  40. package/dist/types/src/capabilities/compute-runtime.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/index.d.ts +6 -5
  42. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/node.d.ts +3 -0
  44. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  45. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  46. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  47. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  48. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  49. package/dist/types/src/cli/commands/index.d.ts +2 -0
  50. package/dist/types/src/cli/commands/index.d.ts.map +1 -0
  51. package/dist/types/src/cli/commands/trigger/create/index.d.ts +25 -0
  52. package/dist/types/src/cli/commands/trigger/create/index.d.ts.map +1 -0
  53. package/dist/types/src/cli/commands/trigger/create/queue.d.ts +13 -0
  54. package/dist/types/src/cli/commands/trigger/create/queue.d.ts.map +1 -0
  55. package/dist/types/src/cli/commands/trigger/create/subscription.d.ts +15 -0
  56. package/dist/types/src/cli/commands/trigger/create/subscription.d.ts.map +1 -0
  57. package/dist/types/src/cli/commands/trigger/create/timer.d.ts +13 -0
  58. package/dist/types/src/cli/commands/trigger/create/timer.d.ts.map +1 -0
  59. package/dist/types/src/cli/commands/trigger/index.d.ts +57 -0
  60. package/dist/types/src/cli/commands/trigger/index.d.ts.map +1 -0
  61. package/dist/types/src/cli/commands/trigger/list.d.ts +7 -0
  62. package/dist/types/src/cli/commands/trigger/list.d.ts.map +1 -0
  63. package/dist/types/src/cli/commands/trigger/options.d.ts +11 -0
  64. package/dist/types/src/cli/commands/trigger/options.d.ts.map +1 -0
  65. package/dist/types/src/cli/commands/trigger/remove.d.ts +8 -0
  66. package/dist/types/src/cli/commands/trigger/remove.d.ts.map +1 -0
  67. package/dist/types/src/cli/commands/trigger/update/index.d.ts +28 -0
  68. package/dist/types/src/cli/commands/trigger/update/index.d.ts.map +1 -0
  69. package/dist/types/src/cli/commands/trigger/update/queue.d.ts +12 -0
  70. package/dist/types/src/cli/commands/trigger/update/queue.d.ts.map +1 -0
  71. package/dist/types/src/cli/commands/trigger/update/subscription.d.ts +13 -0
  72. package/dist/types/src/cli/commands/trigger/update/subscription.d.ts.map +1 -0
  73. package/dist/types/src/cli/commands/trigger/update/timer.d.ts +11 -0
  74. package/dist/types/src/cli/commands/trigger/update/timer.d.ts.map +1 -0
  75. package/dist/types/src/cli/commands/trigger/util.d.ts +46 -0
  76. package/dist/types/src/cli/commands/trigger/util.d.ts.map +1 -0
  77. package/dist/types/src/cli/index.d.ts +2 -0
  78. package/dist/types/src/cli/index.d.ts.map +1 -0
  79. package/dist/types/src/cli/plugin.d.ts +3 -0
  80. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  81. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +4 -5
  82. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  83. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +28 -29
  84. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  86. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -1
  87. package/dist/types/src/components/FunctionsRegistry/index.d.ts +3 -1
  88. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -1
  89. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +12 -9
  90. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  91. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  92. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  93. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +7 -6
  94. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  95. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +98 -31
  96. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/index.d.ts +3 -4
  98. package/dist/types/src/components/index.d.ts.map +1 -1
  99. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +4 -0
  100. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  101. package/dist/types/src/containers/AutomationSettings/index.d.ts +2 -0
  102. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -0
  103. package/dist/types/src/{components → containers/FunctionsContainer}/FunctionsContainer.d.ts +0 -1
  104. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -0
  105. package/dist/types/src/containers/FunctionsContainer/index.d.ts +2 -0
  106. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -0
  107. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts +6 -0
  108. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -0
  109. package/dist/types/src/containers/TriggerSettings/index.d.ts +3 -0
  110. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -0
  111. package/dist/types/src/containers/index.d.ts +5 -0
  112. package/dist/types/src/containers/index.d.ts.map +1 -0
  113. package/dist/types/src/hooks/index.d.ts +2 -0
  114. package/dist/types/src/hooks/index.d.ts.map +1 -1
  115. package/dist/types/src/hooks/useComputeRuntime.d.ts +7 -0
  116. package/dist/types/src/hooks/useComputeRuntime.d.ts.map +1 -0
  117. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +4 -7
  118. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -1
  119. package/dist/types/src/hooks/useComputeRuntimeService.d.ts +5 -0
  120. package/dist/types/src/hooks/useComputeRuntimeService.d.ts.map +1 -0
  121. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +4 -3
  122. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  123. package/dist/types/src/index.d.ts +2 -6
  124. package/dist/types/src/index.d.ts.map +1 -1
  125. package/dist/types/src/meta.d.ts +2 -2
  126. package/dist/types/src/meta.d.ts.map +1 -1
  127. package/dist/types/src/operations/create-trigger-from-template.d.ts +5 -0
  128. package/dist/types/src/operations/create-trigger-from-template.d.ts.map +1 -0
  129. package/dist/types/src/operations/definitions.d.ts +19 -0
  130. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  131. package/dist/types/src/operations/index.d.ts +4 -0
  132. package/dist/types/src/operations/index.d.ts.map +1 -0
  133. package/dist/types/src/testing/test-functions.d.ts +204 -3
  134. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  135. package/dist/types/src/translations.d.ts +29 -30
  136. package/dist/types/src/translations.d.ts.map +1 -1
  137. package/dist/types/src/types/capabilities.d.ts +25 -0
  138. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  139. package/dist/types/src/types/events.d.ts +5 -0
  140. package/dist/types/src/types/events.d.ts.map +1 -0
  141. package/dist/types/src/types/index.d.ts +2 -0
  142. package/dist/types/src/types/index.d.ts.map +1 -1
  143. package/dist/types/src/types/schema.d.ts +11 -3
  144. package/dist/types/src/types/schema.d.ts.map +1 -1
  145. package/dist/types/tsconfig.tsbuildinfo +1 -1
  146. package/package.json +89 -50
  147. package/src/AutomationPlugin.tsx +18 -35
  148. package/src/capabilities/app-graph-builder.ts +54 -79
  149. package/src/capabilities/compute-runtime.ts +172 -53
  150. package/src/capabilities/index.ts +9 -7
  151. package/src/capabilities/node.ts +7 -0
  152. package/src/capabilities/operation-handler.ts +16 -0
  153. package/src/capabilities/react-surface.tsx +49 -46
  154. package/src/cli/commands/index.ts +5 -0
  155. package/src/cli/commands/trigger/create/index.ts +14 -0
  156. package/src/cli/commands/trigger/create/queue.ts +90 -0
  157. package/src/cli/commands/trigger/create/subscription.ts +129 -0
  158. package/src/cli/commands/trigger/create/timer.ts +94 -0
  159. package/src/cli/commands/trigger/index.ts +16 -0
  160. package/src/cli/commands/trigger/list.ts +68 -0
  161. package/src/cli/commands/trigger/options.ts +59 -0
  162. package/src/cli/commands/trigger/remove.ts +45 -0
  163. package/src/cli/commands/trigger/update/index.ts +14 -0
  164. package/src/cli/commands/trigger/update/queue.ts +195 -0
  165. package/src/cli/commands/trigger/update/subscription.ts +279 -0
  166. package/src/cli/commands/trigger/update/timer.ts +194 -0
  167. package/src/cli/commands/trigger/util.ts +409 -0
  168. package/src/cli/index.ts +5 -0
  169. package/src/cli/plugin.ts +23 -0
  170. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +10 -8
  171. package/src/components/AutomationPanel/AutomationPanel.tsx +174 -75
  172. package/src/components/FunctionsPanel/FunctionsPanel.tsx +42 -41
  173. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +28 -49
  174. package/src/components/FunctionsRegistry/index.ts +4 -1
  175. package/src/components/TriggerEditor/FunctionInputEditor.tsx +34 -33
  176. package/src/components/TriggerEditor/SpecSelector.tsx +20 -9
  177. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +80 -34
  178. package/src/components/TriggerEditor/TriggerEditor.tsx +90 -48
  179. package/src/components/index.ts +1 -2
  180. package/src/containers/AutomationSettings/AutomationSettings.tsx +28 -0
  181. package/src/containers/AutomationSettings/index.ts +5 -0
  182. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +34 -0
  183. package/src/containers/FunctionsContainer/index.ts +5 -0
  184. package/src/containers/TriggerSettings/TriggerSettings.tsx +26 -0
  185. package/src/containers/TriggerSettings/index.ts +6 -0
  186. package/src/containers/index.ts +9 -0
  187. package/src/hooks/index.ts +3 -0
  188. package/src/hooks/useComputeRuntime.ts +16 -0
  189. package/src/hooks/useComputeRuntimeCallback.ts +8 -44
  190. package/src/hooks/useComputeRuntimeService.ts +24 -0
  191. package/src/hooks/useTriggerRuntimeControls.ts +28 -14
  192. package/src/index.ts +2 -7
  193. package/src/meta.ts +3 -3
  194. package/src/operations/create-trigger-from-template.ts +75 -0
  195. package/src/operations/definitions.ts +28 -0
  196. package/src/operations/index.ts +9 -0
  197. package/src/testing/test-functions.ts +9 -6
  198. package/src/translations.ts +35 -34
  199. package/src/types/capabilities.ts +56 -0
  200. package/src/types/events.ts +11 -0
  201. package/src/types/index.ts +2 -0
  202. package/src/types/schema.ts +5 -5
  203. package/dist/lib/browser/AutomationPanel-7OECLR5N.mjs +0 -11
  204. package/dist/lib/browser/AutomationSettings-KCZISXI6.mjs +0 -68
  205. package/dist/lib/browser/AutomationSettings-KCZISXI6.mjs.map +0 -7
  206. package/dist/lib/browser/FunctionsContainer-MIWEISRR.mjs +0 -151
  207. package/dist/lib/browser/FunctionsContainer-MIWEISRR.mjs.map +0 -7
  208. package/dist/lib/browser/FunctionsPanel-CRW6SJUN.mjs +0 -10
  209. package/dist/lib/browser/app-graph-builder-W7LLC6XW.mjs +0 -81
  210. package/dist/lib/browser/app-graph-builder-W7LLC6XW.mjs.map +0 -7
  211. package/dist/lib/browser/chunk-EPEXQP45.mjs +0 -14
  212. package/dist/lib/browser/chunk-EPEXQP45.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-JW7XSPYW.mjs +0 -267
  214. package/dist/lib/browser/chunk-JW7XSPYW.mjs.map +0 -7
  215. package/dist/lib/browser/chunk-LZQFZO3B.mjs +0 -17
  216. package/dist/lib/browser/chunk-LZQFZO3B.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-NAPXRXTY.mjs +0 -100
  218. package/dist/lib/browser/chunk-NAPXRXTY.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-QKFBHAGN.mjs +0 -184
  220. package/dist/lib/browser/chunk-QKFBHAGN.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-TWWFNOIR.mjs +0 -109
  222. package/dist/lib/browser/chunk-TWWFNOIR.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-XAKZ4ANY.mjs +0 -15
  224. package/dist/lib/browser/chunk-XAKZ4ANY.mjs.map +0 -7
  225. package/dist/lib/browser/chunk-YBPJCY3F.mjs +0 -38
  226. package/dist/lib/browser/chunk-YBPJCY3F.mjs.map +0 -7
  227. package/dist/lib/browser/compute-runtime-EIQTHJFZ.mjs +0 -113
  228. package/dist/lib/browser/compute-runtime-EIQTHJFZ.mjs.map +0 -7
  229. package/dist/lib/browser/intent-resolver-5HR7M7T6.mjs +0 -77
  230. package/dist/lib/browser/intent-resolver-5HR7M7T6.mjs.map +0 -7
  231. package/dist/lib/browser/react-surface-YQW7WCFW.mjs +0 -64
  232. package/dist/lib/browser/react-surface-YQW7WCFW.mjs.map +0 -7
  233. package/dist/lib/node-esm/AutomationPanel-HCVFNHGQ.mjs +0 -12
  234. package/dist/lib/node-esm/AutomationPanel-HCVFNHGQ.mjs.map +0 -7
  235. package/dist/lib/node-esm/AutomationSettings-UUUPVNUJ.mjs +0 -69
  236. package/dist/lib/node-esm/AutomationSettings-UUUPVNUJ.mjs.map +0 -7
  237. package/dist/lib/node-esm/FunctionsContainer-6OB3JN5O.mjs +0 -152
  238. package/dist/lib/node-esm/FunctionsContainer-6OB3JN5O.mjs.map +0 -7
  239. package/dist/lib/node-esm/FunctionsPanel-RVVCS6VH.mjs +0 -11
  240. package/dist/lib/node-esm/FunctionsPanel-RVVCS6VH.mjs.map +0 -7
  241. package/dist/lib/node-esm/app-graph-builder-SLQOO7GH.mjs +0 -82
  242. package/dist/lib/node-esm/app-graph-builder-SLQOO7GH.mjs.map +0 -7
  243. package/dist/lib/node-esm/chunk-6YRKST6M.mjs +0 -185
  244. package/dist/lib/node-esm/chunk-6YRKST6M.mjs.map +0 -7
  245. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs +0 -19
  246. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-CPP35BE6.mjs +0 -16
  248. package/dist/lib/node-esm/chunk-CPP35BE6.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-ECJKIUBO.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-KB7NFEYY.mjs +0 -16
  251. package/dist/lib/node-esm/chunk-KB7NFEYY.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-PICJ2REN.mjs +0 -101
  253. package/dist/lib/node-esm/chunk-PICJ2REN.mjs.map +0 -7
  254. package/dist/lib/node-esm/chunk-RVK52XGK.mjs +0 -110
  255. package/dist/lib/node-esm/chunk-RVK52XGK.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-W76WUTZY.mjs +0 -268
  257. package/dist/lib/node-esm/chunk-W76WUTZY.mjs.map +0 -7
  258. package/dist/lib/node-esm/compute-runtime-URROOC34.mjs +0 -114
  259. package/dist/lib/node-esm/compute-runtime-URROOC34.mjs.map +0 -7
  260. package/dist/lib/node-esm/intent-resolver-KDRYB5BC.mjs +0 -78
  261. package/dist/lib/node-esm/intent-resolver-KDRYB5BC.mjs.map +0 -7
  262. package/dist/lib/node-esm/react-surface-NNHYNBO6.mjs +0 -65
  263. package/dist/lib/node-esm/react-surface-NNHYNBO6.mjs.map +0 -7
  264. package/dist/types/src/capabilities/capabilities.d.ts +0 -20
  265. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  266. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  267. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  268. package/dist/types/src/components/AutomationSettings.d.ts +0 -5
  269. package/dist/types/src/components/AutomationSettings.d.ts.map +0 -1
  270. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  271. package/dist/types/src/components/TriggerSettings.d.ts +0 -6
  272. package/dist/types/src/components/TriggerSettings.d.ts.map +0 -1
  273. package/dist/types/src/events.d.ts +0 -4
  274. package/dist/types/src/events.d.ts.map +0 -1
  275. package/src/capabilities/capabilities.ts +0 -41
  276. package/src/capabilities/intent-resolver.ts +0 -72
  277. package/src/components/AutomationSettings.tsx +0 -30
  278. package/src/components/FunctionsContainer.tsx +0 -36
  279. package/src/components/TriggerSettings.tsx +0 -25
  280. package/src/events.ts +0 -11
  281. /package/dist/lib/browser/{AutomationPanel-7OECLR5N.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  282. /package/dist/lib/{browser/FunctionsPanel-CRW6SJUN.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
@@ -0,0 +1,129 @@
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 { Database, Filter, JsonSchema, Query, Ref } from '@dxos/echo';
17
+ import { Trigger } from '@dxos/functions';
18
+ import { Operation } from '@dxos/operation';
19
+
20
+ import { Deep, Delay, Enabled, Input, Typename } from '../options';
21
+ import { printTrigger, promptForSchemaInput, selectFunction } from '../util';
22
+
23
+ export const subscription = Command.make(
24
+ 'subscription',
25
+ {
26
+ spaceId: Common.spaceId.pipe(Options.optional),
27
+ enabled: Enabled,
28
+ functionId: Common.functionId.pipe(Options.optional),
29
+ typename: Typename.pipe(Options.optional),
30
+ deep: Deep.pipe(Options.optional),
31
+ delay: Delay.pipe(Options.optional),
32
+ input: Input.pipe(Options.optional),
33
+ },
34
+ (options) =>
35
+ Effect.gen(function* () {
36
+ const { json } = yield* CommandConfig;
37
+
38
+ const functionId = yield* Option.match(options.functionId, {
39
+ onNone: () => selectFunction(),
40
+ onSome: (id) => Effect.succeed(id),
41
+ });
42
+ const functions = yield* Database.runQuery(Filter.type(Operation.PersistentOperation));
43
+ const fn = functions.find((fn) => fn.id === functionId);
44
+ if (!fn) {
45
+ return yield* Effect.fail(new Error(`Function not found: ${functionId}`));
46
+ }
47
+
48
+ const typename = yield* Option.match(options.typename, {
49
+ onNone: () =>
50
+ Prompt.text({
51
+ message: 'Enter type name:',
52
+ }).pipe(Prompt.run),
53
+ onSome: (value) => Effect.succeed(value),
54
+ });
55
+ const queryAst = Query.select(Filter.type(typename)).ast;
56
+
57
+ const deepOption = yield* Option.match(options.deep, {
58
+ onNone: () =>
59
+ Prompt.confirm({
60
+ message: 'Watch changes to nested properties (deep)?',
61
+ initial: false,
62
+ }).pipe(
63
+ Prompt.run,
64
+ Effect.map((value) => (value ? Option.some(value) : Option.none())),
65
+ ),
66
+ onSome: () => Effect.succeed(Option.some(true)),
67
+ });
68
+
69
+ const delayOption = yield* Option.match(options.delay, {
70
+ onNone: () =>
71
+ Effect.gen(function* () {
72
+ const delayStr = yield* Prompt.text({
73
+ message: 'Debounce delay in milliseconds (optional, press Enter to skip):',
74
+ }).pipe(Prompt.run);
75
+ return delayStr === '' ? Option.none<number>() : Option.some(parseInt(delayStr, 10));
76
+ }),
77
+ onSome: (value) => Effect.succeed(Option.some(value)),
78
+ });
79
+
80
+ const subscriptionOptions: { deep?: boolean; delay?: number } = {};
81
+ if (Option.isSome(deepOption)) {
82
+ subscriptionOptions.deep = deepOption.value;
83
+ }
84
+ if (Option.isSome(delayOption)) {
85
+ subscriptionOptions.delay = delayOption.value;
86
+ }
87
+
88
+ const input = yield* Option.match(options.input, {
89
+ onNone: () => promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined),
90
+ onSome: (value) => Effect.succeed(Object.fromEntries(HashMap.toEntries(value))),
91
+ });
92
+
93
+ // Always prompt for enabled if functionId is not provided.
94
+ const enabled = yield* Option.match(options.functionId, {
95
+ onNone: () =>
96
+ Prompt.confirm({
97
+ message: 'Enable the trigger?',
98
+ initial: true,
99
+ }).pipe(Prompt.run),
100
+ onSome: () => Effect.succeed(options.enabled),
101
+ });
102
+
103
+ const trigger = Trigger.make({
104
+ function: Ref.make(fn),
105
+ enabled,
106
+ spec: {
107
+ kind: 'subscription',
108
+ query: {
109
+ ast: queryAst,
110
+ },
111
+ options: Object.keys(subscriptionOptions).length > 0 ? subscriptionOptions : undefined,
112
+ },
113
+ input,
114
+ });
115
+ yield* Database.add(trigger);
116
+
117
+ if (json) {
118
+ yield* Console.log(JSON.stringify(trigger, null, 2));
119
+ } else {
120
+ yield* Console.log(print(yield* printTrigger(trigger)));
121
+ }
122
+
123
+ yield* flushAndSync({ indexes: true });
124
+ }),
125
+ ).pipe(
126
+ Command.withDescription('Create a subscription trigger.'),
127
+ Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),
128
+ Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),
129
+ );
@@ -0,0 +1,94 @@
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 { Database, Filter, JsonSchema, Ref } from '@dxos/echo';
17
+ import { Trigger } from '@dxos/functions';
18
+ import { Operation } from '@dxos/operation';
19
+
20
+ import { Cron, Enabled, Input } from '../options';
21
+ import { printTrigger, promptForSchemaInput, selectFunction } from '../util';
22
+
23
+ // trigger create timer --cron "0 0 * * *" --functionId <functionId>
24
+ export const timer = Command.make(
25
+ 'timer',
26
+ {
27
+ spaceId: Common.spaceId.pipe(Options.optional),
28
+ enabled: Enabled,
29
+ functionId: Common.functionId.pipe(Options.optional),
30
+ cron: Cron.pipe(Options.optional),
31
+ input: Input.pipe(Options.optional),
32
+ },
33
+ (options) =>
34
+ Effect.gen(function* () {
35
+ const { json } = yield* CommandConfig;
36
+
37
+ const functionId = yield* Option.match(options.functionId, {
38
+ onNone: () => selectFunction(),
39
+ onSome: (id) => Effect.succeed(id),
40
+ });
41
+ const functions = yield* Database.runQuery(Filter.type(Operation.PersistentOperation));
42
+ const fn = functions.find((fn) => fn.id === functionId);
43
+ if (!fn) {
44
+ return yield* Effect.fail(new Error(`Function not found: ${functionId}`));
45
+ }
46
+
47
+ const cron = yield* Option.match(options.cron, {
48
+ onNone: () =>
49
+ Prompt.text({
50
+ message: 'Enter cron expression:',
51
+ }).pipe(Prompt.run),
52
+ onSome: (value) => Effect.succeed(value),
53
+ });
54
+
55
+ const input = yield* Option.match(options.input, {
56
+ onNone: () => promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined),
57
+ onSome: (value) => Effect.succeed(Object.fromEntries(HashMap.toEntries(value))),
58
+ });
59
+
60
+ // Always prompt for enabled if functionId is not provided.
61
+ const enabled = yield* Option.match(options.functionId, {
62
+ onNone: () =>
63
+ Prompt.confirm({
64
+ message: 'Enable the trigger?',
65
+ initial: true,
66
+ }).pipe(Prompt.run),
67
+ onSome: () => Effect.succeed(options.enabled),
68
+ });
69
+
70
+ const trigger = Trigger.make({
71
+ function: Ref.make(fn),
72
+ enabled,
73
+ spec: {
74
+ kind: 'timer',
75
+ cron,
76
+ },
77
+ input,
78
+ });
79
+
80
+ yield* Database.add(trigger);
81
+
82
+ if (json) {
83
+ yield* Console.log(JSON.stringify(trigger, null, 2));
84
+ } else {
85
+ yield* Console.log(print(yield* printTrigger(trigger)));
86
+ }
87
+
88
+ yield* flushAndSync({ indexes: true });
89
+ }),
90
+ ).pipe(
91
+ Command.withDescription('Create a timer trigger.'),
92
+ Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),
93
+ Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),
94
+ );
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Command from '@effect/cli/Command';
6
+
7
+ import { create } from './create';
8
+ import { list } from './list';
9
+ import { remove } from './remove';
10
+ import { update } from './update';
11
+
12
+ // TODO(wittjosiah): Rename to automation to align with Composer?
13
+ export const trigger = Command.make('trigger').pipe(
14
+ Command.withDescription('Manage EDGE triggers.'),
15
+ Command.withSubcommands([create, list, remove, update]),
16
+ );
@@ -0,0 +1,68 @@
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 Console from 'effect/Console';
8
+ import * as Effect from 'effect/Effect';
9
+
10
+ import { CommandConfig, Common, printList, spaceIdWithDefault, spaceLayer } from '@dxos/cli-util';
11
+ import { ClientService } from '@dxos/client';
12
+ import { Context } from '@dxos/context';
13
+ import { Database, Filter } from '@dxos/echo';
14
+ import { Trigger } from '@dxos/functions';
15
+
16
+ import { getTriggerRemoteStatus, printTrigger } from './util';
17
+
18
+ export const list = Command.make(
19
+ 'list',
20
+ {
21
+ spaceId: Common.spaceId.pipe(Options.optional),
22
+ },
23
+ Effect.fn(function* ({ spaceId: spaceIdOption }) {
24
+ const { json } = yield* CommandConfig;
25
+
26
+ // Fetch local triggers
27
+ const triggers = yield* Database.runQuery(Filter.type(Trigger.Trigger));
28
+
29
+ // Fetch remote cron triggers to check availability
30
+ const remoteCronIds = yield* Effect.gen(function* () {
31
+ const client = yield* ClientService;
32
+ const spaceId = yield* spaceIdWithDefault(spaceIdOption);
33
+ const result = yield* Effect.promise(() => client.edge.http.getCronTriggers(Context.default(), spaceId)).pipe(
34
+ Effect.catchAll(() => Effect.succeed({ cronIds: [] })),
35
+ );
36
+ return result.cronIds;
37
+ });
38
+
39
+ // Determine remote status for each trigger
40
+ const triggersWithStatus = triggers.map((trigger) => ({
41
+ trigger,
42
+ remoteStatus: getTriggerRemoteStatus(trigger, remoteCronIds),
43
+ }));
44
+
45
+ // Print triggers
46
+ if (json) {
47
+ yield* Console.log(
48
+ JSON.stringify(
49
+ triggersWithStatus.map(({ trigger, remoteStatus }) => ({ ...trigger, remoteStatus })),
50
+ null,
51
+ 2,
52
+ ),
53
+ );
54
+ } else {
55
+ if (triggersWithStatus.length === 0) {
56
+ yield* Console.log('No triggers found.');
57
+ } else {
58
+ const items = yield* Effect.all(
59
+ triggersWithStatus.map(({ trigger, remoteStatus }) => printTrigger(trigger, remoteStatus)),
60
+ );
61
+ yield* Console.log(printList(items));
62
+ }
63
+ }
64
+ }),
65
+ ).pipe(
66
+ Command.withDescription('List triggers configured on EDGE.'),
67
+ Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),
68
+ );
@@ -0,0 +1,59 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Options from '@effect/cli/Options';
6
+ import * as Schema from 'effect/Schema';
7
+
8
+ import { DXN } from '@dxos/keys';
9
+
10
+ export const TriggerId = Options.text('id').pipe(Options.withDescription('The id of the trigger.'));
11
+
12
+ export const Enabled = Options.boolean('enabled', { ifPresent: true }).pipe(
13
+ Options.withDescription('Whether the trigger is enabled.'),
14
+ );
15
+
16
+ export const Input = Options.keyValueMap('input').pipe(
17
+ Options.withDescription("Input data to pass to the function. Must match the function's input schema."),
18
+ );
19
+
20
+ //
21
+ // Subscription
22
+ //
23
+
24
+ export const Typename = Options.text('typename').pipe(
25
+ Options.withDescription('The type name to query for the subscription trigger.'),
26
+ );
27
+
28
+ export const Deep = Options.boolean('deep', { ifPresent: true }).pipe(
29
+ Options.withDescription('Watch changes to nested properties (not just creation).'),
30
+ );
31
+
32
+ export const Delay = Options.integer('delay').pipe(
33
+ Options.withDescription('Debounce changes with a delay in milliseconds.'),
34
+ );
35
+
36
+ //
37
+ // Timer
38
+ //
39
+
40
+ export const Cron = Options.text('cron').pipe(
41
+ Options.withDescription('The cron expression to use for the timer trigger.'),
42
+ );
43
+
44
+ //
45
+ // Queue
46
+ //
47
+
48
+ // TODO(dmaretskyi): Extract
49
+ const DXNSchema = Schema.String.pipe(
50
+ Schema.transform(Schema.instanceOf(DXN), {
51
+ decode: (value: string) => DXN.parse(value),
52
+ encode: (value: DXN) => value.toString(),
53
+ }),
54
+ );
55
+
56
+ export const Queue = Options.text('queue').pipe(
57
+ Options.withDescription('The DXN of the queue for the queue trigger.'),
58
+ Options.withSchema(DXNSchema),
59
+ );
@@ -0,0 +1,45 @@
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 Console from 'effect/Console';
8
+ import * as Effect from 'effect/Effect';
9
+ import * as Option from 'effect/Option';
10
+
11
+ import { CommandConfig, Common, print, spaceLayer, withTypes } from '@dxos/cli-util';
12
+ import { DXN } from '@dxos/echo';
13
+ import { Database } from '@dxos/echo';
14
+ import { Trigger } from '@dxos/functions';
15
+
16
+ import { TriggerId } from './options';
17
+ import { printTriggerRemoved, selectTrigger } from './util';
18
+
19
+ export const remove = Command.make(
20
+ 'remove',
21
+ {
22
+ spaceId: Common.spaceId.pipe(Options.optional),
23
+ id: TriggerId.pipe(Options.optional),
24
+ },
25
+ (options) =>
26
+ Effect.gen(function* () {
27
+ const { json } = yield* CommandConfig;
28
+ const triggerId = yield* Option.match(options.id, {
29
+ onNone: () => selectTrigger(),
30
+ onSome: (id) => Effect.succeed(id),
31
+ });
32
+ const dxn = DXN.fromLocalObjectId(triggerId);
33
+ const trigger = yield* Database.resolve(dxn, Trigger.Trigger);
34
+ yield* Database.remove(trigger);
35
+ if (json) {
36
+ yield* Console.log(JSON.stringify({ id: trigger.id, removed: true }, null, 2));
37
+ } else {
38
+ yield* Console.log(print(printTriggerRemoved(trigger.id)));
39
+ }
40
+ }),
41
+ ).pipe(
42
+ Command.withDescription('Remove a trigger.'),
43
+ Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),
44
+ Command.provideEffectDiscard(() => withTypes(Trigger.Trigger)),
45
+ );
@@ -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 update = Command.make('update').pipe(
12
+ Command.withDescription('Update a trigger.'),
13
+ Command.withSubcommands([subscription, timer, queue]),
14
+ );
@@ -0,0 +1,195 @@
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 Option from 'effect/Option';
11
+
12
+ import { CommandConfig } from '@dxos/cli-util';
13
+ import { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';
14
+ import { Common } from '@dxos/cli-util';
15
+ import { DXN, Database, Filter, JsonSchema, Obj, Ref } from '@dxos/echo';
16
+ import { Trigger } from '@dxos/functions';
17
+ import { Operation } from '@dxos/operation';
18
+
19
+ import { Enabled, Input, Queue, TriggerId } from '../options';
20
+ import { printTrigger, promptForSchemaInput, selectFunction, selectQueue, selectTrigger } from '../util';
21
+
22
+ export const queue = Command.make(
23
+ 'queue',
24
+ {
25
+ spaceId: Common.spaceId.pipe(Options.optional),
26
+ id: TriggerId.pipe(Options.optional),
27
+ enabled: Enabled,
28
+ functionId: Common.functionId.pipe(Options.optional),
29
+ queue: Queue.pipe(Options.optional),
30
+ input: Input.pipe(Options.optional),
31
+ },
32
+ (options) =>
33
+ Effect.gen(function* () {
34
+ const { json } = yield* CommandConfig;
35
+ const triggerId = yield* Option.match(options.id, {
36
+ onNone: () => selectTrigger('queue'),
37
+ onSome: (id) => Effect.succeed(id),
38
+ });
39
+ const dxn = DXN.fromLocalObjectId(triggerId);
40
+ const trigger = yield* Database.resolve(dxn, Trigger.Trigger);
41
+ if (trigger.spec?.kind !== 'queue') {
42
+ return yield* Effect.fail(new Error(`Invalid trigger type: ${trigger.spec?.kind}`));
43
+ }
44
+
45
+ const currentFn = yield* updateFunction(trigger, options.functionId);
46
+ yield* updateQueue(trigger, options.queue);
47
+ yield* updateInput(trigger, currentFn, options.input);
48
+ yield* updateEnabled(trigger, options.id, options.enabled);
49
+
50
+ if (json) {
51
+ yield* Console.log(JSON.stringify(trigger, null, 2));
52
+ } else {
53
+ yield* Console.log(print(yield* printTrigger(trigger)));
54
+ }
55
+
56
+ yield* flushAndSync({ indexes: true });
57
+ }),
58
+ ).pipe(
59
+ Command.withDescription('Update a queue trigger.'),
60
+ Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),
61
+ Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),
62
+ );
63
+
64
+ /**
65
+ * Handles updating the function for a trigger.
66
+ * Prompts for confirmation if functionId is not provided, then updates the function if confirmed.
67
+ * @returns The current function (either original or newly assigned)
68
+ */
69
+ const updateFunction = Effect.fn(function* (trigger: Trigger.Trigger, functionIdOption: Option.Option<string>) {
70
+ let currentFn: Operation.PersistentOperation | undefined = trigger.function
71
+ ? yield* Database.load(trigger.function) as any
72
+ : undefined;
73
+ if (currentFn && !Obj.instanceOf(Operation.PersistentOperation, currentFn)) {
74
+ currentFn = undefined;
75
+ }
76
+ const currentFunctionName = currentFn ? (currentFn.name ?? currentFn.id) : undefined;
77
+ const shouldChangeFunction = yield* Option.match(functionIdOption, {
78
+ onNone: () =>
79
+ Prompt.confirm({
80
+ message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ''}?`,
81
+ initial: false,
82
+ }).pipe(Prompt.run),
83
+ onSome: () => Effect.succeed(true),
84
+ });
85
+ if (shouldChangeFunction) {
86
+ const functionId = yield* Option.match(functionIdOption, {
87
+ onNone: () => selectFunction(),
88
+ onSome: (id) => Effect.succeed(id),
89
+ });
90
+ const functions = yield* Database.runQuery(Filter.type(Operation.PersistentOperation));
91
+ const foundFn = functions.find((fn) => fn.id === functionId);
92
+ if (!foundFn || !Obj.instanceOf(Operation.PersistentOperation, foundFn)) {
93
+ return yield* Effect.fail(new Error(`Function not found: ${functionId}`));
94
+ }
95
+ Obj.change(trigger, (mutableTrigger) => {
96
+ mutableTrigger.function = Ref.make(foundFn);
97
+ });
98
+ currentFn = foundFn;
99
+ }
100
+
101
+ if (!currentFn) {
102
+ const functionId = trigger.function?.dxn.asEchoDXN()?.echoId ?? 'unknown';
103
+ return yield* Effect.fail(new Error(`Invalid reference for ${functionId}`));
104
+ }
105
+
106
+ return currentFn;
107
+ });
108
+
109
+ /**
110
+ * Handles updating the queue DXN for a queue trigger.
111
+ * Prompts for confirmation if queue is not provided, then updates the queue if confirmed.
112
+ */
113
+ const updateQueue = Effect.fn(function* (trigger: Trigger.Trigger, queueOption: Option.Option<DXN>) {
114
+ const currentQueue = trigger.spec?.kind === 'queue' ? trigger.spec.queue : undefined;
115
+ const currentQueueStr = currentQueue
116
+ ? typeof currentQueue === 'string'
117
+ ? currentQueue
118
+ : String(currentQueue)
119
+ : undefined;
120
+ const shouldChangeQueue = yield* Option.match(queueOption, {
121
+ onNone: () =>
122
+ Prompt.confirm({
123
+ message: `Change the queue${currentQueueStr ? ` (current: ${currentQueueStr})` : ''}?`,
124
+ initial: false,
125
+ }).pipe(Prompt.run),
126
+ onSome: () => Effect.succeed(true),
127
+ });
128
+ if (shouldChangeQueue) {
129
+ const queueDxn = yield* Option.match(queueOption, {
130
+ onNone: () => selectQueue(),
131
+ onSome: (dxn) => Effect.succeed(dxn.toString()),
132
+ });
133
+ Obj.change(trigger, (mutableTrigger) => {
134
+ if (mutableTrigger.spec?.kind === 'queue') {
135
+ mutableTrigger.spec.queue = queueDxn;
136
+ }
137
+ });
138
+ }
139
+ });
140
+
141
+ /**
142
+ * Handles updating the input for a trigger.
143
+ * Prompts for confirmation if input is not provided, then updates the input if confirmed.
144
+ */
145
+ const updateInput = Effect.fn(function* (
146
+ trigger: Trigger.Trigger,
147
+ fn: Operation.PersistentOperation,
148
+ inputOption: Option.Option<Record<string, any>>,
149
+ ) {
150
+ const currentInput = trigger.input as Record<string, any> | undefined;
151
+ const currentInputStr = currentInput ? JSON.stringify(currentInput) : 'none';
152
+ const shouldChangeInput = yield* Option.match(inputOption, {
153
+ onNone: () =>
154
+ Effect.gen(function* () {
155
+ yield* Console.log(`Current input: ${currentInputStr}`);
156
+ return yield* Prompt.confirm({
157
+ message: 'Change input?',
158
+ initial: false,
159
+ }).pipe(Prompt.run);
160
+ }),
161
+ onSome: () => Effect.succeed(true),
162
+ });
163
+ if (shouldChangeInput) {
164
+ const inputObj = yield* Option.match(inputOption, {
165
+ onNone: () =>
166
+ promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined, currentInput),
167
+ onSome: (value) => Effect.succeed(value as Record<string, any>),
168
+ });
169
+ Obj.change(trigger, (mutableTrigger) => {
170
+ mutableTrigger.input = inputObj;
171
+ });
172
+ }
173
+ });
174
+
175
+ /**
176
+ * Handles updating the enabled status for a trigger.
177
+ * Prompts for enabled if id is not provided.
178
+ */
179
+ const updateEnabled = Effect.fn(function* (
180
+ trigger: Trigger.Trigger,
181
+ idOption: Option.Option<string>,
182
+ enabled: boolean,
183
+ ) {
184
+ const enabledValue = yield* Option.match(idOption, {
185
+ onNone: () =>
186
+ Prompt.confirm({
187
+ message: 'Enable the trigger?',
188
+ initial: trigger.enabled,
189
+ }).pipe(Prompt.run),
190
+ onSome: () => Effect.succeed(enabled),
191
+ });
192
+ Obj.change(trigger, (mutableTrigger) => {
193
+ mutableTrigger.enabled = enabledValue;
194
+ });
195
+ });