@dxos/plugin-automation 0.8.4-main.406dc2a → 0.8.4-main.43cb759274

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 (361) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +428 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/AutomationPanel-OKF2MDLO.mjs +12 -0
  5. package/dist/lib/neutral/AutomationPlugin.mjs +10 -0
  6. package/dist/lib/neutral/AutomationPlugin.node.mjs +1113 -0
  7. package/dist/lib/neutral/AutomationPlugin.node.mjs.map +7 -0
  8. package/dist/lib/neutral/AutomationPlugin.workerd.mjs +23 -0
  9. package/dist/lib/neutral/AutomationPlugin.workerd.mjs.map +7 -0
  10. package/dist/lib/neutral/AutomationSettings-GQF5UFM6.mjs +32 -0
  11. package/dist/lib/neutral/AutomationSettings-GQF5UFM6.mjs.map +7 -0
  12. package/dist/lib/neutral/FunctionsContainer-YBTQGCL3.mjs +38 -0
  13. package/dist/lib/neutral/FunctionsContainer-YBTQGCL3.mjs.map +7 -0
  14. package/dist/lib/neutral/FunctionsPanel-L32Z67B7.mjs +97 -0
  15. package/dist/lib/neutral/FunctionsPanel-L32Z67B7.mjs.map +7 -0
  16. package/dist/lib/neutral/FunctionsRegistry-RTCY3LXE.mjs +95 -0
  17. package/dist/lib/neutral/FunctionsRegistry-RTCY3LXE.mjs.map +7 -0
  18. package/dist/lib/neutral/TriggerSettings-XCHIZPOR.mjs +9 -0
  19. package/dist/lib/neutral/app-graph-builder-Q3LJLICE.mjs +75 -0
  20. package/dist/lib/neutral/app-graph-builder-Q3LJLICE.mjs.map +7 -0
  21. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  22. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  23. package/dist/lib/neutral/capabilities/node.mjs +17 -0
  24. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-2JP77CMN.mjs +42 -0
  26. package/dist/lib/neutral/chunk-2JP77CMN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-7YWISQOZ.mjs +54 -0
  28. package/dist/lib/neutral/chunk-7YWISQOZ.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-C7H62AU3.mjs +435 -0
  30. package/dist/lib/neutral/chunk-C7H62AU3.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-CMM3AFHR.mjs +111 -0
  32. package/dist/lib/neutral/chunk-CMM3AFHR.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  34. package/dist/lib/neutral/chunk-LRVJEKMN.mjs +40 -0
  35. package/dist/lib/neutral/chunk-LRVJEKMN.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-MBIODLCB.mjs +12 -0
  37. package/dist/lib/neutral/chunk-MBIODLCB.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-NCCFEPBZ.mjs +76 -0
  39. package/dist/lib/neutral/chunk-NCCFEPBZ.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-RCBE37YU.mjs +368 -0
  41. package/dist/lib/neutral/chunk-RCBE37YU.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-TJOQNSS5.mjs +8 -0
  43. package/dist/lib/neutral/chunk-TJOQNSS5.mjs.map +7 -0
  44. package/dist/lib/neutral/components/index.mjs +16 -0
  45. package/dist/lib/neutral/containers/index.mjs +13 -0
  46. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  47. package/dist/lib/neutral/create-trigger-from-template-5YUHZOFA.mjs +68 -0
  48. package/dist/lib/neutral/create-trigger-from-template-5YUHZOFA.mjs.map +7 -0
  49. package/dist/lib/neutral/hooks/index.mjs +10 -0
  50. package/dist/lib/neutral/index.mjs +16 -0
  51. package/dist/lib/neutral/layer-specs-OXK75RDW.mjs +141 -0
  52. package/dist/lib/neutral/layer-specs-OXK75RDW.mjs.map +7 -0
  53. package/dist/lib/neutral/meta.json +1 -0
  54. package/dist/lib/neutral/meta.mjs +8 -0
  55. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs +13 -0
  56. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs.map +7 -0
  57. package/dist/lib/neutral/operations/index.mjs +8 -0
  58. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  59. package/dist/lib/neutral/plugin.mjs +16 -0
  60. package/dist/lib/neutral/plugin.mjs.map +7 -0
  61. package/dist/lib/neutral/react-surface-FOOBGYNG.mjs +57 -0
  62. package/dist/lib/neutral/react-surface-FOOBGYNG.mjs.map +7 -0
  63. package/dist/lib/neutral/registry-sync-JYDDTBAE.mjs +82 -0
  64. package/dist/lib/neutral/registry-sync-JYDDTBAE.mjs.map +7 -0
  65. package/dist/lib/neutral/testing.mjs +8 -0
  66. package/dist/lib/neutral/testing.mjs.map +7 -0
  67. package/dist/lib/neutral/translations.mjs +60 -0
  68. package/dist/lib/neutral/translations.mjs.map +7 -0
  69. package/dist/lib/neutral/trigger-runtime-controller-BOEJYGWC.mjs +77 -0
  70. package/dist/lib/neutral/trigger-runtime-controller-BOEJYGWC.mjs.map +7 -0
  71. package/dist/lib/neutral/types/index.mjs +12 -0
  72. package/dist/lib/neutral/types/index.mjs.map +7 -0
  73. package/dist/types/src/AutomationPlugin.d.ts +3 -1
  74. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  75. package/dist/types/src/AutomationPlugin.node.d.ts +4 -0
  76. package/dist/types/src/AutomationPlugin.node.d.ts.map +1 -0
  77. package/dist/types/src/AutomationPlugin.test.d.ts +2 -0
  78. package/dist/types/src/AutomationPlugin.test.d.ts.map +1 -0
  79. package/dist/types/src/AutomationPlugin.workerd.d.ts +4 -0
  80. package/dist/types/src/AutomationPlugin.workerd.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  82. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/index.d.ts +8 -5
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/layer-specs.d.ts +6 -0
  86. package/dist/types/src/capabilities/layer-specs.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/node.d.ts +8 -0
  88. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  90. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  92. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/registry-sync.d.ts +21 -0
  94. package/dist/types/src/capabilities/registry-sync.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts +5 -0
  96. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/trigger-runtime-controller.test.d.ts +2 -0
  98. package/dist/types/src/capabilities/trigger-runtime-controller.test.d.ts.map +1 -0
  99. package/dist/types/src/commands/index.d.ts +2 -0
  100. package/dist/types/src/commands/index.d.ts.map +1 -0
  101. package/dist/types/src/commands/trigger/create/index.d.ts +25 -0
  102. package/dist/types/src/commands/trigger/create/index.d.ts.map +1 -0
  103. package/dist/types/src/commands/trigger/create/queue.d.ts +13 -0
  104. package/dist/types/src/commands/trigger/create/queue.d.ts.map +1 -0
  105. package/dist/types/src/commands/trigger/create/subscription.d.ts +15 -0
  106. package/dist/types/src/commands/trigger/create/subscription.d.ts.map +1 -0
  107. package/dist/types/src/commands/trigger/create/timer.d.ts +13 -0
  108. package/dist/types/src/commands/trigger/create/timer.d.ts.map +1 -0
  109. package/dist/types/src/commands/trigger/index.d.ts +57 -0
  110. package/dist/types/src/commands/trigger/index.d.ts.map +1 -0
  111. package/dist/types/src/commands/trigger/list.d.ts +7 -0
  112. package/dist/types/src/commands/trigger/list.d.ts.map +1 -0
  113. package/dist/types/src/commands/trigger/options.d.ts +10 -0
  114. package/dist/types/src/commands/trigger/options.d.ts.map +1 -0
  115. package/dist/types/src/commands/trigger/remove.d.ts +8 -0
  116. package/dist/types/src/commands/trigger/remove.d.ts.map +1 -0
  117. package/dist/types/src/commands/trigger/update/index.d.ts +28 -0
  118. package/dist/types/src/commands/trigger/update/index.d.ts.map +1 -0
  119. package/dist/types/src/commands/trigger/update/queue.d.ts +11 -0
  120. package/dist/types/src/commands/trigger/update/queue.d.ts.map +1 -0
  121. package/dist/types/src/commands/trigger/update/subscription.d.ts +13 -0
  122. package/dist/types/src/commands/trigger/update/subscription.d.ts.map +1 -0
  123. package/dist/types/src/commands/trigger/update/timer.d.ts +11 -0
  124. package/dist/types/src/commands/trigger/update/timer.d.ts.map +1 -0
  125. package/dist/types/src/commands/trigger/util.d.ts +85 -0
  126. package/dist/types/src/commands/trigger/util.d.ts.map +1 -0
  127. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +6 -7
  128. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  129. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +45 -27
  130. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/AutomationPanel/TriggerEdgeMetadata.d.ts +18 -0
  132. package/dist/types/src/components/AutomationPanel/TriggerEdgeMetadata.d.ts.map +1 -0
  133. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -1
  134. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  135. package/dist/types/src/components/FunctionsPanel/index.d.ts.map +1 -1
  136. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts +8 -0
  137. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -0
  138. package/dist/types/src/components/FunctionsRegistry/index.d.ts +4 -0
  139. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -0
  140. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +12 -9
  141. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  142. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  143. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  144. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +9 -8
  145. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  146. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +117 -29
  147. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/TriggerEditor/util.d.ts +14 -0
  149. package/dist/types/src/components/TriggerEditor/util.d.ts.map +1 -0
  150. package/dist/types/src/components/index.d.ts +3 -4
  151. package/dist/types/src/components/index.d.ts.map +1 -1
  152. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +6 -0
  153. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  154. package/dist/types/src/containers/AutomationSettings/index.d.ts +2 -0
  155. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -0
  156. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts +4 -0
  157. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -0
  158. package/dist/types/src/containers/FunctionsContainer/index.d.ts +2 -0
  159. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -0
  160. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -0
  161. package/dist/types/src/containers/TriggerSettings/index.d.ts +3 -0
  162. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -0
  163. package/dist/types/src/containers/index.d.ts +5 -0
  164. package/dist/types/src/containers/index.d.ts.map +1 -0
  165. package/dist/types/src/hooks/index.d.ts +1 -1
  166. package/dist/types/src/hooks/index.d.ts.map +1 -1
  167. package/dist/types/src/hooks/useEdgeTriggersDispatcherStatus.d.ts +13 -0
  168. package/dist/types/src/hooks/useEdgeTriggersDispatcherStatus.d.ts.map +1 -0
  169. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +6 -5
  170. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  171. package/dist/types/src/index.d.ts +1 -4
  172. package/dist/types/src/index.d.ts.map +1 -1
  173. package/dist/types/src/meta.d.ts +2 -2
  174. package/dist/types/src/meta.d.ts.map +1 -1
  175. package/dist/types/src/operations/create-trigger-from-template.d.ts +5 -0
  176. package/dist/types/src/operations/create-trigger-from-template.d.ts.map +1 -0
  177. package/dist/types/src/operations/index.d.ts +3 -0
  178. package/dist/types/src/operations/index.d.ts.map +1 -0
  179. package/dist/types/src/plugin.d.ts +4 -0
  180. package/dist/types/src/plugin.d.ts.map +1 -0
  181. package/dist/types/src/testing/test-functions.d.ts +318 -3
  182. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  183. package/dist/types/src/testing.d.ts +2 -0
  184. package/dist/types/src/testing.d.ts.map +1 -0
  185. package/dist/types/src/translations.d.ts +45 -28
  186. package/dist/types/src/translations.d.ts.map +1 -1
  187. package/dist/types/src/types/AutomationOperation.d.ts +21 -0
  188. package/dist/types/src/types/AutomationOperation.d.ts.map +1 -0
  189. package/dist/types/src/types/index.d.ts +1 -0
  190. package/dist/types/src/types/index.d.ts.map +1 -1
  191. package/dist/types/src/types/schema.d.ts +13 -5
  192. package/dist/types/src/types/schema.d.ts.map +1 -1
  193. package/dist/types/tsconfig.tsbuildinfo +1 -1
  194. package/package.json +136 -69
  195. package/src/AutomationPlugin.node.ts +35 -0
  196. package/src/AutomationPlugin.test.ts +27 -0
  197. package/src/AutomationPlugin.tsx +39 -36
  198. package/src/AutomationPlugin.workerd.ts +18 -0
  199. package/src/capabilities/app-graph-builder.ts +59 -80
  200. package/src/capabilities/index.ts +14 -7
  201. package/src/capabilities/layer-specs.ts +197 -0
  202. package/src/capabilities/node.ts +18 -0
  203. package/src/capabilities/operation-handler.ts +16 -0
  204. package/src/capabilities/react-surface.tsx +49 -45
  205. package/src/capabilities/registry-sync.ts +110 -0
  206. package/src/capabilities/trigger-runtime-controller.test.ts +103 -0
  207. package/src/capabilities/trigger-runtime-controller.ts +126 -0
  208. package/src/commands/index.ts +5 -0
  209. package/src/commands/trigger/create/index.ts +14 -0
  210. package/src/commands/trigger/create/queue.ts +87 -0
  211. package/src/commands/trigger/create/subscription.ts +125 -0
  212. package/src/commands/trigger/create/timer.ts +90 -0
  213. package/src/commands/trigger/index.ts +16 -0
  214. package/src/commands/trigger/list.ts +70 -0
  215. package/src/commands/trigger/options.ts +47 -0
  216. package/src/commands/trigger/remove.ts +45 -0
  217. package/src/commands/trigger/update/index.ts +14 -0
  218. package/src/commands/trigger/update/queue.ts +191 -0
  219. package/src/commands/trigger/update/subscription.ts +279 -0
  220. package/src/commands/trigger/update/timer.ts +195 -0
  221. package/src/commands/trigger/util.ts +410 -0
  222. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +13 -7
  223. package/src/components/AutomationPanel/AutomationPanel.tsx +260 -100
  224. package/src/components/AutomationPanel/TriggerEdgeMetadata.tsx +148 -0
  225. package/src/components/FunctionsPanel/FunctionsPanel.tsx +50 -30
  226. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +119 -0
  227. package/src/components/FunctionsRegistry/index.ts +8 -0
  228. package/src/components/TriggerEditor/FunctionInputEditor.tsx +39 -42
  229. package/src/components/TriggerEditor/SpecSelector.tsx +28 -22
  230. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +105 -41
  231. package/src/components/TriggerEditor/TriggerEditor.tsx +179 -56
  232. package/src/components/TriggerEditor/util.ts +51 -0
  233. package/src/components/index.ts +1 -2
  234. package/src/containers/AutomationSettings/AutomationSettings.tsx +31 -0
  235. package/src/containers/AutomationSettings/index.ts +5 -0
  236. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +33 -0
  237. package/src/containers/FunctionsContainer/index.ts +5 -0
  238. package/src/containers/TriggerSettings/TriggerSettings.tsx +48 -0
  239. package/src/containers/TriggerSettings/index.ts +6 -0
  240. package/src/containers/index.ts +9 -0
  241. package/src/hooks/index.ts +2 -1
  242. package/src/hooks/useEdgeTriggersDispatcherStatus.ts +78 -0
  243. package/src/hooks/useTriggerRuntimeControls.ts +39 -19
  244. package/src/index.ts +1 -5
  245. package/src/meta.ts +30 -7
  246. package/src/operations/create-trigger-from-template.ts +70 -0
  247. package/src/operations/index.ts +7 -0
  248. package/src/plugin.ts +11 -0
  249. package/src/testing/test-functions.ts +43 -9
  250. package/src/testing.ts +7 -0
  251. package/src/translations.ts +53 -33
  252. package/src/types/AutomationOperation.ts +39 -0
  253. package/src/types/index.ts +2 -0
  254. package/src/types/schema.ts +6 -6
  255. package/src/vite-env.d.ts +10 -0
  256. package/dist/lib/browser/AutomationPanel-3PHA5FTJ.mjs +0 -11
  257. package/dist/lib/browser/AutomationSettings-3EYSPFKB.mjs +0 -69
  258. package/dist/lib/browser/AutomationSettings-3EYSPFKB.mjs.map +0 -7
  259. package/dist/lib/browser/FunctionsContainer-HHBMPUOD.mjs +0 -36
  260. package/dist/lib/browser/FunctionsContainer-HHBMPUOD.mjs.map +0 -7
  261. package/dist/lib/browser/FunctionsPanel-NRIKAPQV.mjs +0 -10
  262. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs +0 -81
  263. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-5ARH77PV.mjs +0 -15
  265. package/dist/lib/browser/chunk-5ARH77PV.mjs.map +0 -7
  266. package/dist/lib/browser/chunk-6TUZQIEN.mjs +0 -14
  267. package/dist/lib/browser/chunk-6TUZQIEN.mjs.map +0 -7
  268. package/dist/lib/browser/chunk-DK7BLEKU.mjs +0 -14
  269. package/dist/lib/browser/chunk-DK7BLEKU.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-DLLE4FKP.mjs +0 -94
  271. package/dist/lib/browser/chunk-DLLE4FKP.mjs.map +0 -7
  272. package/dist/lib/browser/chunk-MVPRI3DB.mjs +0 -53
  273. package/dist/lib/browser/chunk-MVPRI3DB.mjs.map +0 -7
  274. package/dist/lib/browser/chunk-SUKAEYF3.mjs +0 -267
  275. package/dist/lib/browser/chunk-SUKAEYF3.mjs.map +0 -7
  276. package/dist/lib/browser/chunk-VGBZKM3O.mjs +0 -38
  277. package/dist/lib/browser/chunk-VGBZKM3O.mjs.map +0 -7
  278. package/dist/lib/browser/chunk-VL3KSDVL.mjs +0 -183
  279. package/dist/lib/browser/chunk-VL3KSDVL.mjs.map +0 -7
  280. package/dist/lib/browser/chunk-WWURMV25.mjs +0 -13
  281. package/dist/lib/browser/chunk-WWURMV25.mjs.map +0 -7
  282. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs +0 -160
  283. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs.map +0 -7
  284. package/dist/lib/browser/hooks/index.mjs +0 -12
  285. package/dist/lib/browser/index.mjs +0 -121
  286. package/dist/lib/browser/index.mjs.map +0 -7
  287. package/dist/lib/browser/intent-resolver-D2OHKQRR.mjs +0 -77
  288. package/dist/lib/browser/intent-resolver-D2OHKQRR.mjs.map +0 -7
  289. package/dist/lib/browser/meta.json +0 -1
  290. package/dist/lib/browser/react-surface-G7CG7BML.mjs +0 -63
  291. package/dist/lib/browser/react-surface-G7CG7BML.mjs.map +0 -7
  292. package/dist/lib/browser/types/index.mjs +0 -8
  293. package/dist/lib/node-esm/AutomationPanel-EETYIR35.mjs +0 -12
  294. package/dist/lib/node-esm/AutomationSettings-WKSMWITV.mjs +0 -70
  295. package/dist/lib/node-esm/AutomationSettings-WKSMWITV.mjs.map +0 -7
  296. package/dist/lib/node-esm/FunctionsContainer-ZKVOBUHV.mjs +0 -37
  297. package/dist/lib/node-esm/FunctionsContainer-ZKVOBUHV.mjs.map +0 -7
  298. package/dist/lib/node-esm/FunctionsPanel-SAMRTELO.mjs +0 -11
  299. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs +0 -82
  300. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-2EWXIFEK.mjs +0 -16
  302. package/dist/lib/node-esm/chunk-2EWXIFEK.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs +0 -15
  304. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs.map +0 -7
  305. package/dist/lib/node-esm/chunk-AKHETVIQ.mjs +0 -184
  306. package/dist/lib/node-esm/chunk-AKHETVIQ.mjs.map +0 -7
  307. package/dist/lib/node-esm/chunk-B7N3H45O.mjs +0 -16
  308. package/dist/lib/node-esm/chunk-B7N3H45O.mjs.map +0 -7
  309. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs +0 -39
  310. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs.map +0 -7
  311. package/dist/lib/node-esm/chunk-J3XEBEIE.mjs +0 -268
  312. package/dist/lib/node-esm/chunk-J3XEBEIE.mjs.map +0 -7
  313. package/dist/lib/node-esm/chunk-QCA543ZR.mjs +0 -54
  314. package/dist/lib/node-esm/chunk-QCA543ZR.mjs.map +0 -7
  315. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs +0 -16
  316. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-YQXW3JXD.mjs +0 -95
  318. package/dist/lib/node-esm/chunk-YQXW3JXD.mjs.map +0 -7
  319. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs +0 -161
  320. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs.map +0 -7
  321. package/dist/lib/node-esm/hooks/index.mjs +0 -13
  322. package/dist/lib/node-esm/index.mjs +0 -122
  323. package/dist/lib/node-esm/index.mjs.map +0 -7
  324. package/dist/lib/node-esm/intent-resolver-2LGBVXT5.mjs +0 -78
  325. package/dist/lib/node-esm/intent-resolver-2LGBVXT5.mjs.map +0 -7
  326. package/dist/lib/node-esm/meta.json +0 -1
  327. package/dist/lib/node-esm/react-surface-OMZSBDHS.mjs +0 -64
  328. package/dist/lib/node-esm/react-surface-OMZSBDHS.mjs.map +0 -7
  329. package/dist/lib/node-esm/types/index.mjs +0 -9
  330. package/dist/types/src/capabilities/capabilities.d.ts +0 -19
  331. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  332. package/dist/types/src/capabilities/compute-runtime.d.ts +0 -5
  333. package/dist/types/src/capabilities/compute-runtime.d.ts.map +0 -1
  334. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  335. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  336. package/dist/types/src/components/AutomationSettings.d.ts +0 -5
  337. package/dist/types/src/components/AutomationSettings.d.ts.map +0 -1
  338. package/dist/types/src/components/FunctionsContainer.d.ts +0 -7
  339. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  340. package/dist/types/src/components/TriggerSettings.d.ts.map +0 -1
  341. package/dist/types/src/events.d.ts +0 -4
  342. package/dist/types/src/events.d.ts.map +0 -1
  343. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +0 -8
  344. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +0 -1
  345. package/src/capabilities/capabilities.ts +0 -48
  346. package/src/capabilities/compute-runtime.ts +0 -138
  347. package/src/capabilities/intent-resolver.ts +0 -72
  348. package/src/components/AutomationSettings.tsx +0 -30
  349. package/src/components/FunctionsContainer.tsx +0 -29
  350. package/src/components/TriggerSettings.tsx +0 -25
  351. package/src/events.ts +0 -11
  352. package/src/hooks/useComputeRuntimeCallback.ts +0 -30
  353. /package/dist/lib/{browser/AutomationPanel-3PHA5FTJ.mjs.map → neutral/AutomationPanel-OKF2MDLO.mjs.map} +0 -0
  354. /package/dist/lib/{browser/FunctionsPanel-NRIKAPQV.mjs.map → neutral/AutomationPlugin.mjs.map} +0 -0
  355. /package/dist/lib/{browser/hooks/index.mjs.map → neutral/TriggerSettings-XCHIZPOR.mjs.map} +0 -0
  356. /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  357. /package/dist/lib/{node-esm/hooks → neutral/components}/index.mjs.map +0 -0
  358. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  359. /package/dist/lib/{node-esm/AutomationPanel-EETYIR35.mjs.map → neutral/index.mjs.map} +0 -0
  360. /package/dist/lib/{node-esm/FunctionsPanel-SAMRTELO.mjs.map → neutral/meta.mjs.map} +0 -0
  361. /package/dist/types/src/{components → containers/TriggerSettings}/TriggerSettings.d.ts +0 -0
@@ -0,0 +1,1113 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/AutomationPlugin.node.ts
4
+ import { ActivationEvent, ActivationEvents, Plugin } from "@dxos/app-framework";
5
+ import { AppPlugin } from "@dxos/app-toolkit";
6
+ import { Operation as Operation8, Trace, Trigger as Trigger10 } from "@dxos/compute";
7
+ import { ClientEvents } from "@dxos/plugin-client";
8
+ import { AppGraphBuilder, LayerSpecs, OperationHandler, RegistrySync, TriggerRuntimeController } from "#capabilities";
9
+ import { meta } from "#meta";
10
+
11
+ // src/commands/trigger/index.ts
12
+ import * as Command11 from "@effect/cli/Command";
13
+
14
+ // src/commands/trigger/create/index.ts
15
+ import * as Command4 from "@effect/cli/Command";
16
+
17
+ // src/commands/trigger/create/queue.ts
18
+ import * as Command from "@effect/cli/Command";
19
+ import * as Options2 from "@effect/cli/Options";
20
+ import * as Prompt2 from "@effect/cli/Prompt";
21
+ import * as Console2 from "effect/Console";
22
+ import * as Effect2 from "effect/Effect";
23
+ import * as HashMap from "effect/HashMap";
24
+ import * as Option2 from "effect/Option";
25
+ import { CommandConfig } from "@dxos/cli-util";
26
+ import { flushAndSync, print, spaceLayer, withTypes } from "@dxos/cli-util";
27
+ import { Common } from "@dxos/cli-util";
28
+ import { Operation as Operation2, Trigger as Trigger2 } from "@dxos/compute";
29
+ import { Database as Database2, Feed as FeedNs, Filter as Filter2, JsonSchema, Ref as Ref2 } from "@dxos/echo";
30
+ import { EID } from "@dxos/keys";
31
+
32
+ // src/commands/trigger/options.ts
33
+ import * as Options from "@effect/cli/Options";
34
+ var TriggerId = Options.text("id").pipe(Options.withDescription("The id of the trigger."));
35
+ var Enabled = Options.boolean("enabled", {
36
+ ifPresent: true
37
+ }).pipe(Options.withDescription("Whether the trigger is enabled."));
38
+ var Input = Options.keyValueMap("input").pipe(Options.withDescription("Input data to pass to the function. Must match the function's input schema."));
39
+ var Typename = Options.text("typename").pipe(Options.withDescription("The type name to query for the subscription trigger."));
40
+ var Deep = Options.boolean("deep", {
41
+ ifPresent: true
42
+ }).pipe(Options.withDescription("Watch changes to nested properties (not just creation)."));
43
+ var Delay = Options.integer("delay").pipe(Options.withDescription("Debounce changes with a delay in milliseconds."));
44
+ var Cron = Options.text("cron").pipe(Options.withDescription("The cron expression to use for the timer trigger."));
45
+ var Feed = Options.text("feed").pipe(Options.withDescription("The EID of the feed for the feed trigger (echo://<spaceId>/<objectId>)."));
46
+
47
+ // src/commands/trigger/util.ts
48
+ import * as Prompt from "@effect/cli/Prompt";
49
+ import * as Ansi from "@effect/printer-ansi/Ansi";
50
+ import * as Console from "effect/Console";
51
+ import * as Effect from "effect/Effect";
52
+ import * as Match from "effect/Match";
53
+ import * as Option from "effect/Option";
54
+ import * as SchemaAST from "effect/SchemaAST";
55
+ import { FormBuilder } from "@dxos/cli-util";
56
+ import { Operation, Trigger } from "@dxos/compute";
57
+ import { Annotation, Database, Entity, Feed as Feed2, Filter, Obj, Query, Ref, Scope, Type } from "@dxos/echo";
58
+ import { getProperties } from "@dxos/effect";
59
+ import { FeedAnnotation } from "@dxos/schema";
60
+ var getTriggerRemoteStatus = (trigger2, remoteCronIds) => {
61
+ if (trigger2.spec?.kind !== "timer") {
62
+ return "n/a";
63
+ }
64
+ return remoteCronIds.includes(trigger2.id) ? "available" : "not available";
65
+ };
66
+ var printTrigger = Effect.fn(function* (trigger2, remoteStatus) {
67
+ const fn6 = trigger2.function && (yield* Database.load(trigger2.function));
68
+ return FormBuilder.make({
69
+ title: trigger2.id
70
+ }).pipe(FormBuilder.set("status", trigger2.enabled ? "enabled" : "disabled", trigger2.enabled ? Ansi.green : Ansi.blackBright), FormBuilder.option("kind", Option.fromNullable(trigger2.spec?.kind)), FormBuilder.option("remote", Option.fromNullable(remoteStatus), Match.type().pipe(Match.withReturnType(), Match.when("available", () => Ansi.green), Match.when("not available", () => Ansi.yellow), Match.when("n/a", () => Ansi.blackBright), Match.exhaustive)), FormBuilder.when(fn6, FormBuilder.nest("function", FormBuilder.make().pipe(FormBuilder.set("key", Obj.getMeta(fn6).key), FormBuilder.set("dxn", Obj.getURI(fn6))))), FormBuilder.nestedOption("spec", Option.fromNullable(trigger2.spec).pipe(Option.map(printSpec))), FormBuilder.build);
71
+ });
72
+ var printSpec = (spec) => {
73
+ switch (spec.kind) {
74
+ case "timer":
75
+ return printTimer(spec);
76
+ case "subscription":
77
+ return printSubscription(spec);
78
+ case "webhook":
79
+ return printWebhook(spec);
80
+ case "feed":
81
+ return printFeed(spec);
82
+ default:
83
+ return FormBuilder.make({}).pipe(FormBuilder.set("unknown", "Unknown spec type"));
84
+ }
85
+ };
86
+ var printTimer = (spec) => FormBuilder.make({}).pipe(FormBuilder.set("cron", spec.cron));
87
+ var printSubscription = (spec) => FormBuilder.make({}).pipe(FormBuilder.set("query", spec.query?.raw ?? "[Query AST]"));
88
+ var printWebhook = (spec) => FormBuilder.make({}).pipe(FormBuilder.set("method", spec.method), FormBuilder.set("port", spec.port));
89
+ var printFeed = (spec) => FormBuilder.make({}).pipe(FormBuilder.set("feed", spec.feed ? spec.feed.uri.toString() : "(none)"));
90
+ var promptForSchemaInput = Effect.fn(function* (schema, defaults) {
91
+ if (!schema) {
92
+ return {};
93
+ }
94
+ const ast = schema.ast;
95
+ if (!SchemaAST.isTypeLiteral(ast)) {
96
+ return {};
97
+ }
98
+ const properties = getProperties(ast);
99
+ if (properties.length === 0) {
100
+ return {};
101
+ }
102
+ const requiredProperties = [];
103
+ const optionalProperties = [];
104
+ for (const prop of properties) {
105
+ if (prop.isOptional) {
106
+ optionalProperties.push(prop);
107
+ } else {
108
+ requiredProperties.push(prop);
109
+ }
110
+ }
111
+ const propertyInfo = properties.map((prop) => {
112
+ const key = prop.name.toString();
113
+ return {
114
+ prop,
115
+ key,
116
+ isRequired: !prop.isOptional
117
+ };
118
+ });
119
+ const selectedKeys = /* @__PURE__ */ new Set();
120
+ for (const info of propertyInfo) {
121
+ if (info.isRequired) {
122
+ selectedKeys.add(info.key);
123
+ }
124
+ }
125
+ if (requiredProperties.length > 0) {
126
+ const requiredNames = requiredProperties.map((p) => {
127
+ const info = propertyInfo.find((i) => i.prop === p);
128
+ return info?.key ?? p.name.toString();
129
+ });
130
+ yield* Console.log(`Required properties (will be included): ${requiredNames.join(", ")}`);
131
+ }
132
+ if (optionalProperties.length > 0) {
133
+ const optionalInfo = propertyInfo.filter((info) => !info.isRequired);
134
+ const choices = optionalInfo.map((info) => {
135
+ const hasDefault = defaults?.[info.key] !== void 0;
136
+ const defaultText = hasDefault ? ` (current: ${JSON.stringify(defaults[info.key])})` : "";
137
+ return {
138
+ title: `${info.key}${defaultText}`,
139
+ value: info.key,
140
+ description: hasDefault ? "Has default value" : void 0
141
+ };
142
+ });
143
+ const selected = yield* Prompt.multiSelect({
144
+ message: "Select optional properties to include:",
145
+ choices
146
+ });
147
+ for (const key of selected) {
148
+ selectedKeys.add(String(key));
149
+ }
150
+ }
151
+ if (selectedKeys.size === 0) {
152
+ return {};
153
+ }
154
+ const inputObj = {};
155
+ for (const info of propertyInfo) {
156
+ if (!selectedKeys.has(info.key)) {
157
+ continue;
158
+ }
159
+ const key = info.key;
160
+ const propType = info.prop.type;
161
+ const schemaDefault = Option.getOrUndefined(SchemaAST.getDefaultAnnotation(propType));
162
+ const defaultValue = defaults?.[key] ?? schemaDefault;
163
+ if (SchemaAST.isBooleanKeyword(propType)) {
164
+ const initialValue = typeof defaultValue === "boolean" ? defaultValue : typeof schemaDefault === "boolean" ? schemaDefault : false;
165
+ const value2 = yield* Prompt.confirm({
166
+ message: `${info.key}${defaults?.[key] !== void 0 ? ` (current: ${defaults[key]})` : ""}:`,
167
+ initial: initialValue
168
+ });
169
+ inputObj[key] = value2;
170
+ } else if (SchemaAST.isNumberKeyword(propType)) {
171
+ const currentValue = typeof defaultValue === "number" ? String(defaultValue) : "";
172
+ const valueStr = yield* Prompt.text({
173
+ message: `${info.key}${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ""}:`
174
+ }).pipe(Prompt.run);
175
+ inputObj[key] = valueStr === "" && defaultValue !== void 0 ? defaultValue : parseFloat(valueStr) || 0;
176
+ } else if (SchemaAST.isStringKeyword(propType)) {
177
+ const currentValue = typeof defaultValue === "string" ? defaultValue : "";
178
+ const valueStr = yield* Prompt.text({
179
+ message: `${info.key}${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ""}:`
180
+ }).pipe(Prompt.run);
181
+ inputObj[key] = valueStr === "" && defaultValue !== void 0 ? defaultValue : valueStr;
182
+ } else if (Ref.isRefType(propType)) {
183
+ const isDefaultTemplate = typeof defaultValue === "string" && defaultValue.startsWith("{{") && defaultValue.endsWith("}}");
184
+ const useTemplate = yield* Prompt.confirm({
185
+ message: `Use a template to specify ${info.key}?${isDefaultTemplate ? " (current: template)" : ""}`,
186
+ initial: isDefaultTemplate
187
+ });
188
+ if (useTemplate) {
189
+ const currentValue = typeof defaultValue === "string" ? defaultValue : "";
190
+ const templateStr = yield* Prompt.text({
191
+ message: `${info.key} template${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ""}:`
192
+ }).pipe(Prompt.run);
193
+ inputObj[key] = templateStr === "" && defaultValue !== void 0 ? defaultValue : templateStr;
194
+ } else {
195
+ const annotation = Annotation.ReferenceAnnotation.getFromAst(propType).pipe(Option.getOrThrow);
196
+ const objects = yield* Database.runQuery(Filter.typename(annotation.typename));
197
+ if (objects.length === 0) {
198
+ inputObj[key] = void 0;
199
+ } else {
200
+ const selected = yield* Prompt.select({
201
+ message: `Select ${info.key}:`,
202
+ choices: objects.map((obj) => ({
203
+ title: Entity.getLabel(obj) ?? obj.id,
204
+ value: Ref.make(obj),
205
+ description: Entity.getDescription(obj)
206
+ }))
207
+ });
208
+ inputObj[key] = selected;
209
+ }
210
+ }
211
+ } else {
212
+ const currentValue = defaultValue !== void 0 ? String(defaultValue) : "";
213
+ const valueStr = yield* Prompt.text({
214
+ message: `${info.key}${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ""}:`
215
+ }).pipe(Prompt.run);
216
+ inputObj[key] = valueStr === "" && defaultValue !== void 0 ? defaultValue : valueStr;
217
+ }
218
+ }
219
+ return inputObj;
220
+ });
221
+ var selectFunction = Effect.fn(function* () {
222
+ const functions = yield* Database.runQuery(Filter.type(Operation.PersistentOperation));
223
+ if (functions.length === 0) {
224
+ return yield* Effect.fail(new Error("No functions available"));
225
+ }
226
+ const selected = yield* Prompt.select({
227
+ message: "Select a function:",
228
+ choices: functions.map((fn6) => ({
229
+ title: fn6.name ?? fn6.id,
230
+ value: fn6.id,
231
+ description: fn6.description
232
+ }))
233
+ });
234
+ return String(selected);
235
+ });
236
+ var selectTrigger = Effect.fn(function* (kind) {
237
+ const triggers = yield* Database.runQuery(Query.select(Filter.type(Trigger.Trigger)).debugLabel("cli.trigger.selectTrigger"));
238
+ const filteredTriggers = kind ? triggers.filter((trigger2) => trigger2.spec?.kind === kind) : triggers;
239
+ if (filteredTriggers.length === 0) {
240
+ return yield* Effect.fail(new Error(kind ? `No ${kind} triggers available` : "No triggers available"));
241
+ }
242
+ const choices = yield* Effect.all(filteredTriggers.map((trigger2) => Effect.gen(function* () {
243
+ const fn6 = trigger2.function ? yield* Database.load(trigger2.function) : void 0;
244
+ const functionName = fn6 && Obj.instanceOf(Operation.PersistentOperation, fn6) ? fn6.name ?? Obj.getMeta(fn6).key ?? fn6.id : void 0;
245
+ const title = functionName ?? trigger2.id;
246
+ const description = `${trigger2.enabled ? "enabled" : "disabled"} - ${trigger2.spec?.kind ?? "unknown"}`;
247
+ return {
248
+ title,
249
+ value: trigger2.id,
250
+ description
251
+ };
252
+ })));
253
+ const selected = yield* Prompt.select({
254
+ message: kind ? `Select a ${kind} trigger:` : "Select a trigger:",
255
+ choices
256
+ });
257
+ return String(selected);
258
+ });
259
+ var selectFeed = Effect.fn(function* () {
260
+ const schemas = yield* Database.runQuery(Query.select(Filter.type(Type.Type)).from(Scope.space(), Scope.registry()));
261
+ const feedSchemas = schemas.filter((type2) => {
262
+ const schema = Type.getSchema(type2);
263
+ const annotation = FeedAnnotation.get(schema);
264
+ return Option.isSome(annotation) && annotation.value === true;
265
+ });
266
+ if (feedSchemas.length === 0) {
267
+ return yield* Effect.fail(new Error("No schemas with Feed annotation found"));
268
+ }
269
+ const feedChoices = [];
270
+ for (const schema of feedSchemas) {
271
+ yield* Effect.gen(function* () {
272
+ const typename = Type.getTypename(schema);
273
+ const objects = yield* Database.runQuery(Filter.type(typename));
274
+ for (const obj of objects) {
275
+ const feedRef = obj.feed;
276
+ if (!feedRef) {
277
+ continue;
278
+ }
279
+ const feedObj = yield* Effect.promise(() => feedRef.tryLoad());
280
+ if (!feedObj || !Obj.instanceOf(Feed2.Feed, feedObj)) {
281
+ continue;
282
+ }
283
+ const label = Obj.getLabel(obj) ?? obj.id;
284
+ const description = Obj.getTypename(obj);
285
+ feedChoices.push({
286
+ title: label,
287
+ value: feedObj,
288
+ description
289
+ });
290
+ }
291
+ }).pipe(Effect.catchAll(() => Effect.void));
292
+ }
293
+ if (feedChoices.length === 0) {
294
+ return yield* Effect.fail(new Error("No objects with feed properties found"));
295
+ }
296
+ const selected = yield* Prompt.select({
297
+ message: "Select a feed:",
298
+ choices: feedChoices
299
+ });
300
+ return selected;
301
+ });
302
+ var printTriggerRemoved = (id) => FormBuilder.make({
303
+ title: "Trigger removed"
304
+ }).pipe(FormBuilder.set("id", id), FormBuilder.build);
305
+
306
+ // src/commands/trigger/create/queue.ts
307
+ var queue = Command.make("feed", {
308
+ spaceId: Common.spaceId.pipe(Options2.optional),
309
+ enabled: Enabled,
310
+ functionId: Common.functionId.pipe(Options2.optional),
311
+ feed: Feed.pipe(Options2.optional),
312
+ input: Input.pipe(Options2.optional)
313
+ }, (options) => Effect2.gen(function* () {
314
+ const { json } = yield* CommandConfig;
315
+ const functionId = yield* Option2.match(options.functionId, {
316
+ onNone: () => selectFunction(),
317
+ onSome: (id) => Effect2.succeed(id)
318
+ });
319
+ const functions = yield* Database2.runQuery(Filter2.type(Operation2.PersistentOperation));
320
+ const fn6 = functions.find((fn7) => fn7.id === functionId);
321
+ if (!fn6) {
322
+ return yield* Effect2.fail(new Error(`Function not found: ${functionId}`));
323
+ }
324
+ const feed = yield* Option2.match(options.feed, {
325
+ onNone: () => selectFeed(),
326
+ onSome: (uri) => Database2.resolve(EID.parse(uri), FeedNs.Feed)
327
+ });
328
+ const input = yield* Option2.match(options.input, {
329
+ onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema.toEffectSchema(fn6.inputSchema) : void 0),
330
+ onSome: (value2) => Effect2.succeed(Object.fromEntries(HashMap.toEntries(value2)))
331
+ });
332
+ const enabled = yield* Option2.match(options.functionId, {
333
+ onNone: () => Prompt2.confirm({
334
+ message: "Enable the trigger?",
335
+ initial: true
336
+ }).pipe(Prompt2.run),
337
+ onSome: () => Effect2.succeed(options.enabled)
338
+ });
339
+ const trigger2 = Trigger2.make({
340
+ function: Ref2.make(fn6),
341
+ enabled,
342
+ spec: Trigger2.specFeed(feed),
343
+ input
344
+ });
345
+ yield* Database2.add(trigger2);
346
+ if (json) {
347
+ yield* Console2.log(JSON.stringify(trigger2, null, 2));
348
+ } else {
349
+ yield* Console2.log(print(yield* printTrigger(trigger2)));
350
+ }
351
+ yield* flushAndSync({
352
+ indexes: true
353
+ });
354
+ })).pipe(Command.withDescription("Create a feed trigger."), Command.provide(({ spaceId }) => spaceLayer(spaceId, true)), Command.provideEffectDiscard(() => withTypes(Operation2.PersistentOperation, Trigger2.Trigger)));
355
+
356
+ // src/commands/trigger/create/subscription.ts
357
+ import * as Command2 from "@effect/cli/Command";
358
+ import * as Options3 from "@effect/cli/Options";
359
+ import * as Prompt3 from "@effect/cli/Prompt";
360
+ import * as Console3 from "effect/Console";
361
+ import * as Effect3 from "effect/Effect";
362
+ import * as HashMap2 from "effect/HashMap";
363
+ import * as Option3 from "effect/Option";
364
+ import { CommandConfig as CommandConfig2 } from "@dxos/cli-util";
365
+ import { flushAndSync as flushAndSync2, print as print2, spaceLayer as spaceLayer2, withTypes as withTypes2 } from "@dxos/cli-util";
366
+ import { Common as Common2 } from "@dxos/cli-util";
367
+ import { Operation as Operation3, Trigger as Trigger3 } from "@dxos/compute";
368
+ import { Database as Database3, Filter as Filter3, JsonSchema as JsonSchema2, Query as Query2, Ref as Ref3 } from "@dxos/echo";
369
+ var subscription = Command2.make("subscription", {
370
+ spaceId: Common2.spaceId.pipe(Options3.optional),
371
+ enabled: Enabled,
372
+ functionId: Common2.functionId.pipe(Options3.optional),
373
+ typename: Typename.pipe(Options3.optional),
374
+ deep: Deep.pipe(Options3.optional),
375
+ delay: Delay.pipe(Options3.optional),
376
+ input: Input.pipe(Options3.optional)
377
+ }, (options) => Effect3.gen(function* () {
378
+ const { json } = yield* CommandConfig2;
379
+ const functionId = yield* Option3.match(options.functionId, {
380
+ onNone: () => selectFunction(),
381
+ onSome: (id) => Effect3.succeed(id)
382
+ });
383
+ const functions = yield* Database3.runQuery(Filter3.type(Operation3.PersistentOperation));
384
+ const fn6 = functions.find((fn7) => fn7.id === functionId);
385
+ if (!fn6) {
386
+ return yield* Effect3.fail(new Error(`Function not found: ${functionId}`));
387
+ }
388
+ const typename = yield* Option3.match(options.typename, {
389
+ onNone: () => Prompt3.text({
390
+ message: "Enter type name:"
391
+ }).pipe(Prompt3.run),
392
+ onSome: (value2) => Effect3.succeed(value2)
393
+ });
394
+ const subscriptionQuery = Query2.select(Filter3.type(typename));
395
+ const deepOption = yield* Option3.match(options.deep, {
396
+ onNone: () => Prompt3.confirm({
397
+ message: "Watch changes to nested properties (deep)?",
398
+ initial: false
399
+ }).pipe(Prompt3.run, Effect3.map((value2) => value2 ? Option3.some(value2) : Option3.none())),
400
+ onSome: () => Effect3.succeed(Option3.some(true))
401
+ });
402
+ const delayOption = yield* Option3.match(options.delay, {
403
+ onNone: () => Effect3.gen(function* () {
404
+ const delayStr = yield* Prompt3.text({
405
+ message: "Debounce delay in milliseconds (optional, press Enter to skip):"
406
+ }).pipe(Prompt3.run);
407
+ return delayStr === "" ? Option3.none() : Option3.some(parseInt(delayStr, 10));
408
+ }),
409
+ onSome: (value2) => Effect3.succeed(Option3.some(value2))
410
+ });
411
+ const subscriptionOptions = {};
412
+ if (Option3.isSome(deepOption)) {
413
+ subscriptionOptions.deep = deepOption.value;
414
+ }
415
+ if (Option3.isSome(delayOption)) {
416
+ subscriptionOptions.delay = delayOption.value;
417
+ }
418
+ const input = yield* Option3.match(options.input, {
419
+ onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema2.toEffectSchema(fn6.inputSchema) : void 0),
420
+ onSome: (value2) => Effect3.succeed(Object.fromEntries(HashMap2.toEntries(value2)))
421
+ });
422
+ const enabled = yield* Option3.match(options.functionId, {
423
+ onNone: () => Prompt3.confirm({
424
+ message: "Enable the trigger?",
425
+ initial: true
426
+ }).pipe(Prompt3.run),
427
+ onSome: () => Effect3.succeed(options.enabled)
428
+ });
429
+ const trigger2 = Trigger3.make({
430
+ function: Ref3.make(fn6),
431
+ enabled,
432
+ spec: Trigger3.specSubscription(subscriptionQuery, Object.keys(subscriptionOptions).length > 0 ? subscriptionOptions : void 0),
433
+ input
434
+ });
435
+ yield* Database3.add(trigger2);
436
+ if (json) {
437
+ yield* Console3.log(JSON.stringify(trigger2, null, 2));
438
+ } else {
439
+ yield* Console3.log(print2(yield* printTrigger(trigger2)));
440
+ }
441
+ yield* flushAndSync2({
442
+ indexes: true
443
+ });
444
+ })).pipe(Command2.withDescription("Create a subscription trigger."), Command2.provide(({ spaceId }) => spaceLayer2(spaceId, true)), Command2.provideEffectDiscard(() => withTypes2(Operation3.PersistentOperation, Trigger3.Trigger)));
445
+
446
+ // src/commands/trigger/create/timer.ts
447
+ import * as Command3 from "@effect/cli/Command";
448
+ import * as Options4 from "@effect/cli/Options";
449
+ import * as Prompt4 from "@effect/cli/Prompt";
450
+ import * as Console4 from "effect/Console";
451
+ import * as Effect4 from "effect/Effect";
452
+ import * as HashMap3 from "effect/HashMap";
453
+ import * as Option4 from "effect/Option";
454
+ import { CommandConfig as CommandConfig3 } from "@dxos/cli-util";
455
+ import { flushAndSync as flushAndSync3, print as print3, spaceLayer as spaceLayer3, withTypes as withTypes3 } from "@dxos/cli-util";
456
+ import { Common as Common3 } from "@dxos/cli-util";
457
+ import { Operation as Operation4, Trigger as Trigger4 } from "@dxos/compute";
458
+ import { Database as Database4, Filter as Filter4, JsonSchema as JsonSchema3, Ref as Ref4 } from "@dxos/echo";
459
+ var timer = Command3.make("timer", {
460
+ spaceId: Common3.spaceId.pipe(Options4.optional),
461
+ enabled: Enabled,
462
+ functionId: Common3.functionId.pipe(Options4.optional),
463
+ cron: Cron.pipe(Options4.optional),
464
+ input: Input.pipe(Options4.optional)
465
+ }, (options) => Effect4.gen(function* () {
466
+ const { json } = yield* CommandConfig3;
467
+ const functionId = yield* Option4.match(options.functionId, {
468
+ onNone: () => selectFunction(),
469
+ onSome: (id) => Effect4.succeed(id)
470
+ });
471
+ const functions = yield* Database4.runQuery(Filter4.type(Operation4.PersistentOperation));
472
+ const fn6 = functions.find((fn7) => fn7.id === functionId);
473
+ if (!fn6) {
474
+ return yield* Effect4.fail(new Error(`Function not found: ${functionId}`));
475
+ }
476
+ const cron = yield* Option4.match(options.cron, {
477
+ onNone: () => Prompt4.text({
478
+ message: "Enter cron expression:"
479
+ }).pipe(Prompt4.run),
480
+ onSome: (value2) => Effect4.succeed(value2)
481
+ });
482
+ const input = yield* Option4.match(options.input, {
483
+ onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema3.toEffectSchema(fn6.inputSchema) : void 0),
484
+ onSome: (value2) => Effect4.succeed(Object.fromEntries(HashMap3.toEntries(value2)))
485
+ });
486
+ const enabled = yield* Option4.match(options.functionId, {
487
+ onNone: () => Prompt4.confirm({
488
+ message: "Enable the trigger?",
489
+ initial: true
490
+ }).pipe(Prompt4.run),
491
+ onSome: () => Effect4.succeed(options.enabled)
492
+ });
493
+ const trigger2 = Trigger4.make({
494
+ function: Ref4.make(fn6),
495
+ enabled,
496
+ spec: Trigger4.specTimer(cron),
497
+ input
498
+ });
499
+ yield* Database4.add(trigger2);
500
+ if (json) {
501
+ yield* Console4.log(JSON.stringify(trigger2, null, 2));
502
+ } else {
503
+ yield* Console4.log(print3(yield* printTrigger(trigger2)));
504
+ }
505
+ yield* flushAndSync3({
506
+ indexes: true
507
+ });
508
+ })).pipe(Command3.withDescription("Create a timer trigger."), Command3.provide(({ spaceId }) => spaceLayer3(spaceId, true)), Command3.provideEffectDiscard(() => withTypes3(Operation4.PersistentOperation, Trigger4.Trigger)));
509
+
510
+ // src/commands/trigger/create/index.ts
511
+ var create = Command4.make("create").pipe(Command4.withDescription("Create a trigger."), Command4.withSubcommands([
512
+ subscription,
513
+ timer,
514
+ queue
515
+ ]));
516
+
517
+ // src/commands/trigger/list.ts
518
+ import * as Command5 from "@effect/cli/Command";
519
+ import * as Options5 from "@effect/cli/Options";
520
+ import * as Console5 from "effect/Console";
521
+ import * as Effect5 from "effect/Effect";
522
+ import { CommandConfig as CommandConfig4, Common as Common4, printList, spaceIdWithDefault, spaceLayer as spaceLayer4 } from "@dxos/cli-util";
523
+ import { ClientService } from "@dxos/client";
524
+ import { Trigger as Trigger5 } from "@dxos/compute";
525
+ import { Context } from "@dxos/context";
526
+ import { Database as Database5, Filter as Filter5, Query as Query3 } from "@dxos/echo";
527
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-automation/src/commands/trigger/list.ts";
528
+ var list = Command5.make("list", {
529
+ spaceId: Common4.spaceId.pipe(Options5.optional)
530
+ }, Effect5.fn(function* ({ spaceId: spaceIdOption }) {
531
+ const { json } = yield* CommandConfig4;
532
+ const triggers = yield* Database5.runQuery(Query3.select(Filter5.type(Trigger5.Trigger)).debugLabel("cli.trigger.list"));
533
+ const remoteCronIds = yield* Effect5.gen(function* () {
534
+ const client = yield* ClientService;
535
+ const spaceId = yield* spaceIdWithDefault(spaceIdOption);
536
+ const result = yield* Effect5.promise(() => client.edge.http.getCronTriggers(Context.default(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 24 }), spaceId)).pipe(Effect5.catchAll(() => Effect5.succeed({
537
+ cronIds: []
538
+ })));
539
+ return result.cronIds;
540
+ });
541
+ const triggersWithStatus = triggers.map((trigger2) => ({
542
+ trigger: trigger2,
543
+ remoteStatus: getTriggerRemoteStatus(trigger2, remoteCronIds)
544
+ }));
545
+ if (json) {
546
+ yield* Console5.log(JSON.stringify(triggersWithStatus.map(({ trigger: trigger2, remoteStatus }) => ({
547
+ ...trigger2,
548
+ remoteStatus
549
+ })), null, 2));
550
+ } else {
551
+ if (triggersWithStatus.length === 0) {
552
+ yield* Console5.log("No triggers found.");
553
+ } else {
554
+ const items = yield* Effect5.all(triggersWithStatus.map(({ trigger: trigger2, remoteStatus }) => printTrigger(trigger2, remoteStatus)));
555
+ yield* Console5.log(printList(items));
556
+ }
557
+ }
558
+ })).pipe(Command5.withDescription("List triggers configured on EDGE."), Command5.provide(({ spaceId }) => spaceLayer4(spaceId, true)));
559
+
560
+ // src/commands/trigger/remove.ts
561
+ import * as Command6 from "@effect/cli/Command";
562
+ import * as Options6 from "@effect/cli/Options";
563
+ import * as Console6 from "effect/Console";
564
+ import * as Effect6 from "effect/Effect";
565
+ import * as Option5 from "effect/Option";
566
+ import { CommandConfig as CommandConfig5, Common as Common5, print as print4, spaceLayer as spaceLayer5, withTypes as withTypes4 } from "@dxos/cli-util";
567
+ import { Trigger as Trigger6 } from "@dxos/compute";
568
+ import { Database as Database6, Ref as Ref5 } from "@dxos/echo";
569
+ import { EID as EID2 } from "@dxos/keys";
570
+ var remove = Command6.make("remove", {
571
+ spaceId: Common5.spaceId.pipe(Options6.optional),
572
+ id: TriggerId.pipe(Options6.optional)
573
+ }, (options) => Effect6.gen(function* () {
574
+ const { json } = yield* CommandConfig5;
575
+ const triggerId = yield* Option5.match(options.id, {
576
+ onNone: () => selectTrigger(),
577
+ onSome: (id) => Effect6.succeed(id)
578
+ });
579
+ const dxn = EID2.make({
580
+ entityId: triggerId
581
+ });
582
+ const trigger2 = yield* Database6.resolve(Ref5.fromURI(dxn), Trigger6.Trigger);
583
+ yield* Database6.remove(trigger2);
584
+ if (json) {
585
+ yield* Console6.log(JSON.stringify({
586
+ id: trigger2.id,
587
+ removed: true
588
+ }, null, 2));
589
+ } else {
590
+ yield* Console6.log(print4(printTriggerRemoved(trigger2.id)));
591
+ }
592
+ })).pipe(Command6.withDescription("Remove a trigger."), Command6.provide(({ spaceId }) => spaceLayer5(spaceId, true)), Command6.provideEffectDiscard(() => withTypes4(Trigger6.Trigger)));
593
+
594
+ // src/commands/trigger/update/index.ts
595
+ import * as Command10 from "@effect/cli/Command";
596
+
597
+ // src/commands/trigger/update/queue.ts
598
+ import * as Command7 from "@effect/cli/Command";
599
+ import * as Options7 from "@effect/cli/Options";
600
+ import * as Prompt5 from "@effect/cli/Prompt";
601
+ import * as Console7 from "effect/Console";
602
+ import * as Effect7 from "effect/Effect";
603
+ import * as Option6 from "effect/Option";
604
+ import { CommandConfig as CommandConfig6 } from "@dxos/cli-util";
605
+ import { flushAndSync as flushAndSync4, print as print5, spaceLayer as spaceLayer6, withTypes as withTypes5 } from "@dxos/cli-util";
606
+ import { Common as Common6 } from "@dxos/cli-util";
607
+ import { Operation as Operation5, Trigger as Trigger7 } from "@dxos/compute";
608
+ import { Database as Database7, Feed as FeedNs2, Filter as Filter6, JsonSchema as JsonSchema4, Obj as Obj2, Ref as Ref6 } from "@dxos/echo";
609
+ import { EID as EID3 } from "@dxos/keys";
610
+ var queue2 = Command7.make("feed", {
611
+ spaceId: Common6.spaceId.pipe(Options7.optional),
612
+ id: TriggerId.pipe(Options7.optional),
613
+ enabled: Enabled,
614
+ functionId: Common6.functionId.pipe(Options7.optional),
615
+ feed: Feed.pipe(Options7.optional),
616
+ input: Input.pipe(Options7.optional)
617
+ }, (options) => Effect7.gen(function* () {
618
+ const { json } = yield* CommandConfig6;
619
+ const triggerId = yield* Option6.match(options.id, {
620
+ onNone: () => selectTrigger("feed"),
621
+ onSome: (id) => Effect7.succeed(id)
622
+ });
623
+ const dxn = EID3.make({
624
+ entityId: triggerId
625
+ });
626
+ const trigger2 = yield* Database7.resolve(dxn, Trigger7.Trigger);
627
+ if (trigger2.spec?.kind !== "feed") {
628
+ return yield* Effect7.fail(new Error(`Invalid trigger type: ${trigger2.spec?.kind}`));
629
+ }
630
+ const currentFn = yield* updateFunction(trigger2, options.functionId);
631
+ yield* updateFeed(trigger2, options.feed);
632
+ yield* updateInput(trigger2, currentFn, options.input);
633
+ yield* updateEnabled(trigger2, options.id, options.enabled);
634
+ if (json) {
635
+ yield* Console7.log(JSON.stringify(trigger2, null, 2));
636
+ } else {
637
+ yield* Console7.log(print5(yield* printTrigger(trigger2)));
638
+ }
639
+ yield* flushAndSync4({
640
+ indexes: true
641
+ });
642
+ })).pipe(Command7.withDescription("Update a feed trigger."), Command7.provide(({ spaceId }) => spaceLayer6(spaceId, true)), Command7.provideEffectDiscard(() => withTypes5(Operation5.PersistentOperation, Trigger7.Trigger)));
643
+ var updateFunction = Effect7.fn(function* (trigger2, functionIdOption) {
644
+ let currentFn = trigger2.function ? yield* Database7.load(trigger2.function) : void 0;
645
+ if (currentFn && !Obj2.instanceOf(Operation5.PersistentOperation, currentFn)) {
646
+ currentFn = void 0;
647
+ }
648
+ const currentFunctionName = currentFn ? currentFn.name ?? currentFn.id : void 0;
649
+ const shouldChangeFunction = yield* Option6.match(functionIdOption, {
650
+ onNone: () => Prompt5.confirm({
651
+ message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ""}?`,
652
+ initial: false
653
+ }).pipe(Prompt5.run),
654
+ onSome: () => Effect7.succeed(true)
655
+ });
656
+ if (shouldChangeFunction) {
657
+ const functionId = yield* Option6.match(functionIdOption, {
658
+ onNone: () => selectFunction(),
659
+ onSome: (id) => Effect7.succeed(id)
660
+ });
661
+ const functions = yield* Database7.runQuery(Filter6.type(Operation5.PersistentOperation));
662
+ const foundFn = functions.find((fn6) => fn6.id === functionId);
663
+ if (!foundFn || !Obj2.instanceOf(Operation5.PersistentOperation, foundFn)) {
664
+ return yield* Effect7.fail(new Error(`Function not found: ${functionId}`));
665
+ }
666
+ Obj2.update(trigger2, (trigger3) => {
667
+ trigger3.function = Ref6.make(foundFn);
668
+ });
669
+ currentFn = foundFn;
670
+ }
671
+ if (!currentFn) {
672
+ const functionId = (trigger2.function ? trigger2.function.uri.toString() : void 0) ?? "unknown";
673
+ return yield* Effect7.fail(new Error(`Invalid reference for ${functionId}`));
674
+ }
675
+ return currentFn;
676
+ });
677
+ var updateFeed = Effect7.fn(function* (trigger2, feedOption) {
678
+ const currentFeed = trigger2.spec?.kind === "feed" ? trigger2.spec.feed : void 0;
679
+ const currentFeedStr = currentFeed ? currentFeed.uri.toString() : void 0;
680
+ const shouldChangeFeed = yield* Option6.match(feedOption, {
681
+ onNone: () => Prompt5.confirm({
682
+ message: `Change the feed${currentFeedStr ? ` (current: ${currentFeedStr})` : ""}?`,
683
+ initial: false
684
+ }).pipe(Prompt5.run),
685
+ onSome: () => Effect7.succeed(true)
686
+ });
687
+ if (shouldChangeFeed) {
688
+ const feed = yield* Option6.match(feedOption, {
689
+ onNone: () => selectFeed(),
690
+ onSome: (uri) => Database7.resolve(EID3.parse(uri), FeedNs2.Feed)
691
+ });
692
+ Obj2.update(trigger2, (trigger3) => {
693
+ if (trigger3.spec?.kind === "feed") {
694
+ trigger3.spec.feed = Ref6.make(feed);
695
+ }
696
+ });
697
+ }
698
+ });
699
+ var updateInput = Effect7.fn(function* (trigger2, fn6, inputOption) {
700
+ const currentInput = trigger2.input;
701
+ const currentInputStr = currentInput ? JSON.stringify(currentInput) : "none";
702
+ const shouldChangeInput = yield* Option6.match(inputOption, {
703
+ onNone: () => Effect7.gen(function* () {
704
+ yield* Console7.log(`Current input: ${currentInputStr}`);
705
+ return yield* Prompt5.confirm({
706
+ message: "Change input?",
707
+ initial: false
708
+ }).pipe(Prompt5.run);
709
+ }),
710
+ onSome: () => Effect7.succeed(true)
711
+ });
712
+ if (shouldChangeInput) {
713
+ const inputObj = yield* Option6.match(inputOption, {
714
+ onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema4.toEffectSchema(fn6.inputSchema) : void 0, currentInput),
715
+ onSome: (value2) => Effect7.succeed(value2)
716
+ });
717
+ Obj2.update(trigger2, (trigger3) => {
718
+ trigger3.input = inputObj;
719
+ });
720
+ }
721
+ });
722
+ var updateEnabled = Effect7.fn(function* (trigger2, idOption, enabled) {
723
+ const enabledValue = yield* Option6.match(idOption, {
724
+ onNone: () => Prompt5.confirm({
725
+ message: "Enable the trigger?",
726
+ initial: trigger2.enabled
727
+ }).pipe(Prompt5.run),
728
+ onSome: () => Effect7.succeed(enabled)
729
+ });
730
+ Obj2.update(trigger2, (trigger3) => {
731
+ trigger3.enabled = enabledValue;
732
+ });
733
+ });
734
+
735
+ // src/commands/trigger/update/subscription.ts
736
+ import * as Command8 from "@effect/cli/Command";
737
+ import * as Options8 from "@effect/cli/Options";
738
+ import * as Prompt6 from "@effect/cli/Prompt";
739
+ import * as Console8 from "effect/Console";
740
+ import * as Effect8 from "effect/Effect";
741
+ import * as Match2 from "effect/Match";
742
+ import * as Option7 from "effect/Option";
743
+ import { CommandConfig as CommandConfig7 } from "@dxos/cli-util";
744
+ import { flushAndSync as flushAndSync5, print as print6, spaceLayer as spaceLayer7, withTypes as withTypes6 } from "@dxos/cli-util";
745
+ import { Common as Common7 } from "@dxos/cli-util";
746
+ import { Operation as Operation6, Trigger as Trigger8 } from "@dxos/compute";
747
+ import { Database as Database8, Filter as Filter7, JsonSchema as JsonSchema5, Obj as Obj3, Query as Query4, Ref as Ref7 } from "@dxos/echo";
748
+ import { DXN, EID as EID4 } from "@dxos/keys";
749
+ var subscription2 = Command8.make("subscription", {
750
+ spaceId: Common7.spaceId.pipe(Options8.optional),
751
+ id: TriggerId.pipe(Options8.optional),
752
+ enabled: Enabled,
753
+ functionId: Common7.functionId.pipe(Options8.optional),
754
+ typename: Typename.pipe(Options8.optional),
755
+ deep: Deep.pipe(Options8.optional),
756
+ delay: Delay.pipe(Options8.optional),
757
+ input: Input.pipe(Options8.optional)
758
+ }, (options) => Effect8.gen(function* () {
759
+ const { json } = yield* CommandConfig7;
760
+ const triggerId = yield* Option7.match(options.id, {
761
+ onNone: () => selectTrigger("subscription"),
762
+ onSome: (id) => Effect8.succeed(id)
763
+ });
764
+ const dxn = EID4.make({
765
+ entityId: triggerId
766
+ });
767
+ const trigger2 = yield* Database8.resolve(Ref7.fromURI(dxn), Trigger8.Trigger);
768
+ if (trigger2.spec?.kind !== "subscription") {
769
+ return yield* Effect8.fail(new Error(`Invalid trigger type: ${trigger2.spec?.kind}`));
770
+ }
771
+ const currentFn = yield* updateFunction2(trigger2, options.functionId);
772
+ yield* updateSpec(trigger2, options.typename, options.deep, options.delay);
773
+ yield* updateInput2(trigger2, currentFn, options.input);
774
+ yield* updateEnabled2(trigger2, options.id, options.enabled);
775
+ if (json) {
776
+ yield* Console8.log(JSON.stringify(trigger2, null, 2));
777
+ } else {
778
+ yield* Console8.log(print6(yield* printTrigger(trigger2)));
779
+ }
780
+ yield* flushAndSync5({
781
+ indexes: true
782
+ });
783
+ })).pipe(Command8.withDescription("Update a subscription trigger."), Command8.provide(({ spaceId }) => spaceLayer7(spaceId, true)), Command8.provideEffectDiscard(() => withTypes6(Operation6.PersistentOperation, Trigger8.Trigger)));
784
+ var extractCurrentTypename = (spec) => {
785
+ if (!spec?.query?.ast) {
786
+ return Option7.none();
787
+ }
788
+ return Match2.value(spec.query.ast).pipe(Match2.withReturnType(), Match2.when({
789
+ type: "select"
790
+ }, (q) => Match2.value(q.filter).pipe(Match2.withReturnType(), Match2.when({
791
+ type: "object"
792
+ }, (f) => Option7.fromNullable(f.typename).pipe(Option7.flatMap((dxn) => Option7.fromNullable(DXN.isDXN(dxn) ? DXN.getName(dxn) : void 0)))), Match2.orElse(() => Option7.none()))), Match2.orElse(() => Option7.none()));
793
+ };
794
+ var updateFunction2 = Effect8.fn(function* (trigger2, functionIdOption) {
795
+ let currentFn = trigger2.function ? yield* Database8.load(trigger2.function) : void 0;
796
+ if (currentFn && !Obj3.instanceOf(Operation6.PersistentOperation, currentFn)) {
797
+ currentFn = void 0;
798
+ }
799
+ const currentFunctionName = currentFn ? currentFn.name ?? currentFn.id : void 0;
800
+ const shouldChangeFunction = yield* Option7.match(functionIdOption, {
801
+ onNone: () => Prompt6.confirm({
802
+ message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ""}?`,
803
+ initial: false
804
+ }).pipe(Prompt6.run),
805
+ onSome: () => Effect8.succeed(true)
806
+ });
807
+ if (shouldChangeFunction) {
808
+ const functionId = yield* Option7.match(functionIdOption, {
809
+ onNone: () => selectFunction(),
810
+ onSome: (id) => Effect8.succeed(id)
811
+ });
812
+ const functions = yield* Database8.runQuery(Filter7.type(Operation6.PersistentOperation));
813
+ const foundFn = functions.find((fn6) => fn6.id === functionId);
814
+ if (!foundFn || !Obj3.instanceOf(Operation6.PersistentOperation, foundFn)) {
815
+ return yield* Effect8.fail(new Error(`Function not found: ${functionId}`));
816
+ }
817
+ Obj3.update(trigger2, (trigger3) => {
818
+ trigger3.function = Ref7.make(foundFn);
819
+ });
820
+ currentFn = foundFn;
821
+ }
822
+ if (!currentFn) {
823
+ const functionId = (trigger2.function ? EID4.getEntityId(EID4.tryParse(trigger2.function.uri)) : void 0) ?? "unknown";
824
+ return yield* Effect8.fail(new Error(`Invalid reference for ${functionId}`));
825
+ }
826
+ return currentFn;
827
+ });
828
+ var updateSpec = Effect8.fn(function* (trigger2, typenameOption, deepOption, delayOption) {
829
+ const currentSpec = trigger2.spec?.kind === "subscription" ? trigger2.spec : void 0;
830
+ const currentTypename = extractCurrentTypename(currentSpec);
831
+ const currentTypenameStr = Option7.getOrUndefined(currentTypename);
832
+ const currentDeep = currentSpec?.options?.deep;
833
+ const currentDelay = currentSpec?.options?.delay;
834
+ const specParts = [];
835
+ if (currentTypenameStr) {
836
+ specParts.push(`typename: ${currentTypenameStr}`);
837
+ }
838
+ if (currentDeep !== void 0) {
839
+ specParts.push(`deep: ${currentDeep}`);
840
+ }
841
+ if (currentDelay !== void 0) {
842
+ specParts.push(`delay: ${currentDelay}`);
843
+ }
844
+ const currentSpecStr = specParts.length > 0 ? specParts.join(", ") : "none";
845
+ const hasSpecOption = Option7.isSome(typenameOption) || Option7.isSome(deepOption) || Option7.isSome(delayOption);
846
+ const shouldChangeSpec = yield* hasSpecOption ? Effect8.succeed(true) : Prompt6.confirm({
847
+ message: `Change the trigger spec (current: ${currentSpecStr})?`,
848
+ initial: false
849
+ }).pipe(Prompt6.run);
850
+ if (shouldChangeSpec) {
851
+ const typename = yield* Option7.match(typenameOption, {
852
+ onNone: () => Prompt6.text({
853
+ message: `Enter type name${currentTypenameStr ? ` (current: ${currentTypenameStr})` : ""}:`
854
+ }).pipe(Prompt6.run),
855
+ onSome: (value2) => Effect8.succeed(value2)
856
+ });
857
+ const queryAst = Query4.select(Filter7.type(typename)).ast;
858
+ const deepOptionValue = yield* Option7.match(deepOption, {
859
+ onNone: () => Prompt6.confirm({
860
+ message: "Watch changes to nested properties (deep)?",
861
+ initial: currentSpec?.options?.deep ?? false
862
+ }).pipe(Prompt6.run, Effect8.map((value2) => value2 ? Option7.some(value2) : Option7.none())),
863
+ onSome: () => Effect8.succeed(Option7.some(true))
864
+ });
865
+ const delayOptionValue = yield* Option7.match(delayOption, {
866
+ onNone: () => Effect8.gen(function* () {
867
+ const currentDelay2 = currentSpec?.options?.delay;
868
+ const delayStr = yield* Prompt6.text({
869
+ message: `Debounce delay in milliseconds (optional, press Enter to skip)${currentDelay2 ? ` (current: ${currentDelay2})` : ""}:`
870
+ }).pipe(Prompt6.run);
871
+ return delayStr === "" ? Option7.none() : Option7.some(parseInt(delayStr, 10));
872
+ }),
873
+ onSome: (value2) => Effect8.succeed(Option7.some(value2))
874
+ });
875
+ const subscriptionOptions = {};
876
+ if (Option7.isSome(deepOptionValue)) {
877
+ subscriptionOptions.deep = deepOptionValue.value;
878
+ }
879
+ if (Option7.isSome(delayOptionValue)) {
880
+ subscriptionOptions.delay = delayOptionValue.value;
881
+ }
882
+ Obj3.update(trigger2, (trigger3) => {
883
+ const spec = trigger3.spec;
884
+ if (spec?.kind === "subscription") {
885
+ spec.query = {
886
+ ast: queryAst
887
+ };
888
+ spec.options = Object.keys(subscriptionOptions).length > 0 ? subscriptionOptions : void 0;
889
+ }
890
+ });
891
+ }
892
+ });
893
+ var updateInput2 = Effect8.fn(function* (trigger2, fn6, inputOption) {
894
+ const currentInput = trigger2.input;
895
+ const currentInputStr = currentInput ? JSON.stringify(currentInput) : "none";
896
+ const shouldChangeInput = yield* Option7.match(inputOption, {
897
+ onNone: () => Effect8.gen(function* () {
898
+ yield* Console8.log(`Current input: ${currentInputStr}`);
899
+ return yield* Prompt6.confirm({
900
+ message: "Change input?",
901
+ initial: false
902
+ }).pipe(Prompt6.run);
903
+ }),
904
+ onSome: () => Effect8.succeed(true)
905
+ });
906
+ if (shouldChangeInput) {
907
+ const inputObj = yield* Option7.match(inputOption, {
908
+ onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema5.toEffectSchema(fn6.inputSchema) : void 0, currentInput),
909
+ onSome: (value2) => Effect8.succeed(value2)
910
+ });
911
+ Obj3.update(trigger2, (trigger3) => {
912
+ trigger3.input = inputObj;
913
+ });
914
+ }
915
+ });
916
+ var updateEnabled2 = Effect8.fn(function* (trigger2, idOption, enabled) {
917
+ const enabledValue = yield* Option7.match(idOption, {
918
+ onNone: () => Prompt6.confirm({
919
+ message: "Enable the trigger?",
920
+ initial: trigger2.enabled
921
+ }).pipe(Prompt6.run),
922
+ onSome: () => Effect8.succeed(enabled)
923
+ });
924
+ Obj3.update(trigger2, (trigger3) => {
925
+ trigger3.enabled = enabledValue;
926
+ });
927
+ });
928
+
929
+ // src/commands/trigger/update/timer.ts
930
+ import * as Command9 from "@effect/cli/Command";
931
+ import * as Options9 from "@effect/cli/Options";
932
+ import * as Prompt7 from "@effect/cli/Prompt";
933
+ import * as Console9 from "effect/Console";
934
+ import * as Effect9 from "effect/Effect";
935
+ import * as Option8 from "effect/Option";
936
+ import { CommandConfig as CommandConfig8 } from "@dxos/cli-util";
937
+ import { flushAndSync as flushAndSync6, print as print7, spaceLayer as spaceLayer8, withTypes as withTypes7 } from "@dxos/cli-util";
938
+ import { Common as Common8 } from "@dxos/cli-util";
939
+ import { Operation as Operation7, Trigger as Trigger9 } from "@dxos/compute";
940
+ import { Database as Database9, Filter as Filter8, JsonSchema as JsonSchema6, Obj as Obj4, Ref as Ref8 } from "@dxos/echo";
941
+ import { EID as EID5 } from "@dxos/keys";
942
+ var timer2 = Command9.make("timer", {
943
+ spaceId: Common8.spaceId.pipe(Options9.optional),
944
+ id: TriggerId.pipe(Options9.optional),
945
+ enabled: Enabled,
946
+ functionId: Common8.functionId.pipe(Options9.optional),
947
+ cron: Cron.pipe(Options9.optional),
948
+ input: Input.pipe(Options9.optional)
949
+ }, (options) => Effect9.gen(function* () {
950
+ const { json } = yield* CommandConfig8;
951
+ const triggerId = yield* Option8.match(options.id, {
952
+ onNone: () => selectTrigger("timer"),
953
+ onSome: (id) => Effect9.succeed(id)
954
+ });
955
+ const dxn = EID5.make({
956
+ entityId: triggerId
957
+ });
958
+ const trigger2 = yield* Database9.resolve(Ref8.fromURI(dxn), Trigger9.Trigger);
959
+ if (!trigger2.spec || trigger2.spec?.kind !== "timer") {
960
+ return yield* Effect9.fail(new Error(`Invalid trigger type: ${trigger2.spec?.kind}`));
961
+ }
962
+ const currentFn = yield* updateFunction3(trigger2, options.functionId);
963
+ yield* updateCron(trigger2, options.cron);
964
+ yield* updateInput3(trigger2, currentFn, options.input);
965
+ yield* updateEnabled3(trigger2, options.id, options.enabled);
966
+ if (json) {
967
+ yield* Console9.log(JSON.stringify(trigger2, null, 2));
968
+ } else {
969
+ yield* Console9.log(print7(yield* printTrigger(trigger2)));
970
+ }
971
+ yield* flushAndSync6({
972
+ indexes: true
973
+ });
974
+ })).pipe(Command9.withDescription("Update a timer trigger."), Command9.provide(({ spaceId }) => spaceLayer8(spaceId, true)), Command9.provideEffectDiscard(() => withTypes7(Operation7.PersistentOperation, Trigger9.Trigger)));
975
+ var updateFunction3 = Effect9.fn(function* (trigger2, functionIdOption) {
976
+ let currentFn = trigger2.function ? yield* Database9.load(trigger2.function) : void 0;
977
+ if (currentFn && !Obj4.instanceOf(Operation7.PersistentOperation, currentFn)) {
978
+ currentFn = void 0;
979
+ }
980
+ const currentFunctionName = currentFn ? currentFn.name ?? currentFn.id : void 0;
981
+ const shouldChangeFunction = yield* Option8.match(functionIdOption, {
982
+ onNone: () => Prompt7.confirm({
983
+ message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ""}?`,
984
+ initial: false
985
+ }).pipe(Prompt7.run),
986
+ onSome: () => Effect9.succeed(true)
987
+ });
988
+ if (shouldChangeFunction) {
989
+ const functionId = yield* Option8.match(functionIdOption, {
990
+ onNone: () => selectFunction(),
991
+ onSome: (id) => Effect9.succeed(id)
992
+ });
993
+ const functions = yield* Database9.runQuery(Filter8.type(Operation7.PersistentOperation));
994
+ const foundFn = functions.find((fn6) => fn6.id === functionId);
995
+ if (!foundFn || !Obj4.instanceOf(Operation7.PersistentOperation, foundFn)) {
996
+ return yield* Effect9.fail(new Error(`Function not found: ${functionId}`));
997
+ }
998
+ Obj4.update(trigger2, (trigger3) => {
999
+ trigger3.function = Ref8.make(foundFn);
1000
+ });
1001
+ currentFn = foundFn;
1002
+ }
1003
+ if (!currentFn) {
1004
+ const functionId = (trigger2.function ? EID5.getEntityId(EID5.tryParse(trigger2.function.uri)) : void 0) ?? "unknown";
1005
+ return yield* Effect9.fail(new Error(`Invalid reference for ${functionId}`));
1006
+ }
1007
+ return currentFn;
1008
+ });
1009
+ var updateCron = Effect9.fn(function* (trigger2, cronOption) {
1010
+ const currentCron = trigger2.spec?.kind === "timer" ? trigger2.spec.cron : void 0;
1011
+ const shouldChangeCron = yield* Option8.match(cronOption, {
1012
+ onNone: () => Prompt7.confirm({
1013
+ message: `Change the cron expression${currentCron ? ` (current: ${currentCron})` : ""}?`,
1014
+ initial: false
1015
+ }).pipe(Prompt7.run),
1016
+ onSome: () => Effect9.succeed(true)
1017
+ });
1018
+ if (shouldChangeCron) {
1019
+ const cron = yield* Option8.match(cronOption, {
1020
+ onNone: () => Prompt7.text({
1021
+ message: `Enter cron expression${currentCron ? ` (current: ${currentCron})` : ""}:`
1022
+ }).pipe(Prompt7.run),
1023
+ onSome: (value2) => Effect9.succeed(value2)
1024
+ });
1025
+ Obj4.update(trigger2, (trigger3) => {
1026
+ if (trigger3.spec?.kind === "timer") {
1027
+ trigger3.spec.cron = cron;
1028
+ }
1029
+ });
1030
+ }
1031
+ });
1032
+ var updateInput3 = Effect9.fn(function* (trigger2, fn6, inputOption) {
1033
+ const currentInput = trigger2.input;
1034
+ const currentInputStr = currentInput ? JSON.stringify(currentInput) : "none";
1035
+ const shouldChangeInput = yield* Option8.match(inputOption, {
1036
+ onNone: () => Effect9.gen(function* () {
1037
+ yield* Console9.log(`Current input: ${currentInputStr}`);
1038
+ return yield* Prompt7.confirm({
1039
+ message: "Change input?",
1040
+ initial: false
1041
+ }).pipe(Prompt7.run);
1042
+ }),
1043
+ onSome: () => Effect9.succeed(true)
1044
+ });
1045
+ if (shouldChangeInput) {
1046
+ const inputObj = yield* Option8.match(inputOption, {
1047
+ onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema6.toEffectSchema(fn6.inputSchema) : void 0, currentInput),
1048
+ onSome: (value2) => Effect9.succeed(value2)
1049
+ });
1050
+ Obj4.update(trigger2, (trigger3) => {
1051
+ trigger3.input = inputObj;
1052
+ });
1053
+ }
1054
+ });
1055
+ var updateEnabled3 = Effect9.fn(function* (trigger2, idOption, enabled) {
1056
+ const enabledValue = yield* Option8.match(idOption, {
1057
+ onNone: () => Prompt7.confirm({
1058
+ message: "Enable the trigger?",
1059
+ initial: trigger2.enabled
1060
+ }).pipe(Prompt7.run),
1061
+ onSome: () => Effect9.succeed(enabled)
1062
+ });
1063
+ Obj4.update(trigger2, (trigger3) => {
1064
+ trigger3.enabled = enabledValue;
1065
+ });
1066
+ });
1067
+
1068
+ // src/commands/trigger/update/index.ts
1069
+ var update = Command10.make("update").pipe(Command10.withDescription("Update a trigger."), Command10.withSubcommands([
1070
+ subscription2,
1071
+ timer2,
1072
+ queue2
1073
+ ]));
1074
+
1075
+ // src/commands/trigger/index.ts
1076
+ var trigger = Command11.make("trigger").pipe(Command11.withDescription("Manage EDGE triggers."), Command11.withSubcommands([
1077
+ create,
1078
+ list,
1079
+ remove,
1080
+ update
1081
+ ]));
1082
+
1083
+ // src/AutomationPlugin.node.ts
1084
+ var AutomationPlugin = Plugin.define(meta).pipe(AppPlugin.addAppGraphModule({
1085
+ activate: AppGraphBuilder
1086
+ }), AppPlugin.addCommandModule({
1087
+ commands: [
1088
+ trigger
1089
+ ]
1090
+ }), AppPlugin.addOperationHandlerModule({
1091
+ activate: OperationHandler
1092
+ }), AppPlugin.addSchemaModule({
1093
+ schema: [
1094
+ Operation8.PersistentOperation,
1095
+ Trigger10.Trigger,
1096
+ Trace.Message
1097
+ ]
1098
+ }), Plugin.addModule({
1099
+ activatesOn: ActivationEvents.SetupProcessManager,
1100
+ activate: LayerSpecs
1101
+ }), Plugin.addModule({
1102
+ activatesOn: ClientEvents.ClientReady,
1103
+ activate: RegistrySync
1104
+ }), Plugin.addModule({
1105
+ activatesOn: ActivationEvent.allOf(ActivationEvents.ProcessManagerReady, ClientEvents.SpacesReady),
1106
+ activate: TriggerRuntimeController
1107
+ }), Plugin.make);
1108
+ var AutomationPlugin_node_default = AutomationPlugin;
1109
+ export {
1110
+ AutomationPlugin,
1111
+ AutomationPlugin_node_default as default
1112
+ };
1113
+ //# sourceMappingURL=AutomationPlugin.node.mjs.map