@dxos/plugin-routine 0.9.1-staging.ee54ba693a → 0.11.0

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 (320) hide show
  1. package/PLUGIN.mdl +18 -13
  2. package/dist/lib/RoutinePlugin.mjs +2 -0
  3. package/dist/lib/RoutinePlugin.node.mjs +894 -0
  4. package/dist/lib/RoutinePlugin.node.mjs.map +1 -0
  5. package/dist/lib/RoutinePlugin.workerd.mjs +20 -0
  6. package/dist/lib/RoutinePlugin.workerd.mjs.map +1 -0
  7. package/dist/lib/capabilities/node.mjs +12 -0
  8. package/dist/lib/capabilities/node.mjs.map +1 -0
  9. package/dist/lib/capabilities.mjs +14 -0
  10. package/dist/lib/capabilities.mjs.map +1 -0
  11. package/dist/lib/chunk-RoutineArticle.mjs +79 -0
  12. package/dist/lib/chunk-RoutineArticle.mjs.map +1 -0
  13. package/dist/lib/chunk-RoutineCompanion.mjs +192 -0
  14. package/dist/lib/chunk-RoutineCompanion.mjs.map +1 -0
  15. package/dist/lib/chunk-RoutinePlugin.mjs +38 -0
  16. package/dist/lib/chunk-RoutinePlugin.mjs.map +1 -0
  17. package/dist/lib/chunk-RoutineSettings.mjs +50 -0
  18. package/dist/lib/chunk-RoutineSettings.mjs.map +1 -0
  19. package/dist/lib/chunk-RoutineTraceCompanion.mjs +208 -0
  20. package/dist/lib/chunk-RoutineTraceCompanion.mjs.map +1 -0
  21. package/dist/lib/chunk-SkillArticle.mjs +28 -0
  22. package/dist/lib/chunk-SkillArticle.mjs.map +1 -0
  23. package/dist/lib/chunk-app-graph-builder.mjs +71 -0
  24. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  25. package/dist/lib/chunk-create-object.mjs +23 -0
  26. package/dist/lib/chunk-create-object.mjs.map +1 -0
  27. package/dist/lib/chunk-create-routine.mjs +34 -0
  28. package/dist/lib/chunk-create-routine.mjs.map +1 -0
  29. package/dist/lib/chunk-create-trigger-from-template.mjs +48 -0
  30. package/dist/lib/chunk-create-trigger-from-template.mjs.map +1 -0
  31. package/dist/lib/chunk-layer-specs.mjs +179 -0
  32. package/dist/lib/chunk-layer-specs.mjs.map +1 -0
  33. package/dist/lib/{neutral/chunk-HLO4LYXT.mjs → chunk-meta.mjs} +19 -27
  34. package/dist/lib/chunk-meta.mjs.map +1 -0
  35. package/dist/lib/chunk-operation-handler.mjs +11 -0
  36. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  37. package/dist/lib/chunk-paths.mjs +11 -0
  38. package/dist/lib/chunk-paths.mjs.map +1 -0
  39. package/dist/lib/chunk-react-surface.mjs +64 -0
  40. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  41. package/dist/lib/chunk-registry-sync.mjs +104 -0
  42. package/dist/lib/chunk-registry-sync.mjs.map +1 -0
  43. package/dist/lib/chunk-run-routine.mjs +57 -0
  44. package/dist/lib/chunk-run-routine.mjs.map +1 -0
  45. package/dist/lib/chunk-templates.mjs +37 -0
  46. package/dist/lib/chunk-templates.mjs.map +1 -0
  47. package/dist/lib/chunk-trigger-runtime-controller.mjs +73 -0
  48. package/dist/lib/chunk-trigger-runtime-controller.mjs.map +1 -0
  49. package/dist/lib/chunk-types.mjs +149 -0
  50. package/dist/lib/chunk-types.mjs.map +1 -0
  51. package/dist/lib/chunk-util.mjs +142 -0
  52. package/dist/lib/chunk-util.mjs.map +1 -0
  53. package/dist/lib/components.mjs +1645 -0
  54. package/dist/lib/components.mjs.map +1 -0
  55. package/dist/lib/containers.mjs +11 -0
  56. package/dist/lib/containers.mjs.map +1 -0
  57. package/dist/lib/hooks.mjs +37 -0
  58. package/dist/lib/hooks.mjs.map +1 -0
  59. package/dist/lib/index.mjs +5 -0
  60. package/dist/lib/meta.mjs +2 -0
  61. package/dist/lib/operations.mjs +7 -0
  62. package/dist/lib/operations.mjs.map +1 -0
  63. package/dist/lib/plugin.mjs +9 -0
  64. package/dist/lib/plugin.mjs.map +1 -0
  65. package/dist/lib/testing.mjs +2 -0
  66. package/dist/lib/translations.mjs +110 -0
  67. package/dist/lib/translations.mjs.map +1 -0
  68. package/dist/lib/types.mjs +2 -0
  69. package/dist/types/src/RoutinePlugin.d.ts.map +1 -1
  70. package/dist/types/src/RoutinePlugin.node.d.ts.map +1 -1
  71. package/dist/types/src/RoutinePlugin.workerd.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  73. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  74. package/dist/types/src/capabilities/index.d.ts +0 -1
  75. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/layer-specs.d.ts +1 -1
  77. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  78. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  79. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/registry-sync.d.ts +1 -1
  81. package/dist/types/src/capabilities/templates.d.ts +1 -1
  82. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts +1 -1
  83. package/dist/types/src/commands/trigger/create/{queue.d.ts → feed.d.ts} +2 -2
  84. package/dist/types/src/commands/trigger/create/feed.d.ts.map +1 -0
  85. package/dist/types/src/commands/trigger/update/{queue.d.ts → feed.d.ts} +2 -2
  86. package/dist/types/src/commands/trigger/update/feed.d.ts.map +1 -0
  87. package/dist/types/src/commands/trigger/util.d.ts +1 -1
  88. package/dist/types/src/commands/trigger/util.d.ts.map +1 -1
  89. package/dist/types/src/components/InstructionsEditor/InstructionsEditor.d.ts +7 -5
  90. package/dist/types/src/components/InstructionsEditor/InstructionsEditor.d.ts.map +1 -1
  91. package/dist/types/src/components/InstructionsEditor/InstructionsEditor.stories.d.ts +3 -3
  92. package/dist/types/src/components/InstructionsEditor/InstructionsEditor.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/RoutineCard/RoutineCard.d.ts +9 -0
  94. package/dist/types/src/components/RoutineCard/RoutineCard.d.ts.map +1 -0
  95. package/dist/types/src/components/RoutineCard/RoutineCard.stories.d.ts +21 -0
  96. package/dist/types/src/components/RoutineCard/RoutineCard.stories.d.ts.map +1 -0
  97. package/dist/types/src/components/RoutineCard/index.d.ts +2 -0
  98. package/dist/types/src/components/RoutineCard/index.d.ts.map +1 -0
  99. package/dist/types/src/components/RoutineForm/RoutineForm.d.ts +7 -2
  100. package/dist/types/src/components/RoutineForm/RoutineForm.d.ts.map +1 -1
  101. package/dist/types/src/components/Schedule/Schedule.d.ts +2 -26
  102. package/dist/types/src/components/Schedule/Schedule.d.ts.map +1 -1
  103. package/dist/types/src/components/Schedule/days.d.ts +24 -0
  104. package/dist/types/src/components/Schedule/days.d.ts.map +1 -0
  105. package/dist/types/src/components/Schedule/describe-schedule.d.ts +3 -0
  106. package/dist/types/src/components/Schedule/describe-schedule.d.ts.map +1 -0
  107. package/dist/types/src/components/Schedule/index.d.ts +2 -0
  108. package/dist/types/src/components/Schedule/index.d.ts.map +1 -1
  109. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +1 -1
  110. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  111. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
  112. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  113. package/dist/types/src/components/TriggerEditor/TriggerKindSelector.d.ts +5 -2
  114. package/dist/types/src/components/TriggerEditor/TriggerKindSelector.d.ts.map +1 -1
  115. package/dist/types/src/components/TriggerEditor/trigger-kind-icon.d.ts +5 -0
  116. package/dist/types/src/components/TriggerEditor/trigger-kind-icon.d.ts.map +1 -0
  117. package/dist/types/src/components/index.d.ts +1 -1
  118. package/dist/types/src/components/index.d.ts.map +1 -1
  119. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts +5 -10
  120. package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +1 -1
  121. package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts +6 -2
  122. package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts.map +1 -1
  123. package/dist/types/src/containers/RoutineCompanion/RoutineCompanion.d.ts +4 -12
  124. package/dist/types/src/containers/RoutineCompanion/RoutineCompanion.d.ts.map +1 -1
  125. package/dist/types/src/containers/RoutineCompanion/RoutineCompanion.stories.d.ts.map +1 -1
  126. package/dist/types/src/containers/RoutineSettings/RoutineSettings.d.ts +4 -8
  127. package/dist/types/src/containers/RoutineSettings/RoutineSettings.d.ts.map +1 -1
  128. package/dist/types/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.d.ts +5 -3
  129. package/dist/types/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.d.ts.map +1 -1
  130. package/dist/types/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.stories.d.ts.map +1 -1
  131. package/dist/types/src/containers/RoutineTraceCompanion/useRoutineRuns.d.ts +1 -1
  132. package/dist/types/src/containers/RoutineTraceCompanion/useRoutineRuns.d.ts.map +1 -1
  133. package/dist/types/src/containers/SkillArticle/SkillArticle.d.ts +4 -1
  134. package/dist/types/src/containers/SkillArticle/SkillArticle.d.ts.map +1 -1
  135. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +1 -1
  136. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  137. package/dist/types/src/index.d.ts +1 -0
  138. package/dist/types/src/index.d.ts.map +1 -1
  139. package/dist/types/src/operations/run-routine.d.ts.map +1 -1
  140. package/dist/types/src/operations/run-routine.test.d.ts +2 -0
  141. package/dist/types/src/operations/run-routine.test.d.ts.map +1 -0
  142. package/dist/types/src/paths.d.ts.map +1 -1
  143. package/dist/types/src/templates/index.d.ts +1 -1
  144. package/dist/types/src/templates/index.d.ts.map +1 -1
  145. package/dist/types/src/testing/test-functions.d.ts +30 -6
  146. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  147. package/dist/types/src/translations.d.ts.map +1 -1
  148. package/dist/types/src/types/RoutineCapabilities.d.ts +9 -3
  149. package/dist/types/src/types/RoutineCapabilities.d.ts.map +1 -1
  150. package/dist/types/src/types/RoutineOperation.d.ts +2 -3
  151. package/dist/types/src/types/RoutineOperation.d.ts.map +1 -1
  152. package/dist/types/src/types/index.d.ts +0 -1
  153. package/dist/types/src/types/index.d.ts.map +1 -1
  154. package/dist/types/src/util/index.d.ts +1 -0
  155. package/dist/types/src/util/index.d.ts.map +1 -1
  156. package/dist/types/src/util/routines-for-object.d.ts +6 -3
  157. package/dist/types/src/util/routines-for-object.d.ts.map +1 -1
  158. package/dist/types/src/util/wire.d.ts +21 -0
  159. package/dist/types/src/util/wire.d.ts.map +1 -0
  160. package/dist/types/src/util/wire.test.d.ts +2 -0
  161. package/dist/types/src/util/wire.test.d.ts.map +1 -0
  162. package/dist/types/tsconfig.tsbuildinfo +1 -1
  163. package/dx.config.ts +3 -2
  164. package/package.json +73 -71
  165. package/src/RoutinePlugin.node.ts +1 -2
  166. package/src/RoutinePlugin.tsx +2 -4
  167. package/src/RoutinePlugin.workerd.ts +1 -2
  168. package/src/capabilities/app-graph-builder.ts +9 -7
  169. package/src/capabilities/create-object.ts +2 -2
  170. package/src/capabilities/index.ts +0 -1
  171. package/src/capabilities/layer-specs.ts +78 -12
  172. package/src/capabilities/{react-surface.tsx → react-surface.ts} +18 -22
  173. package/src/capabilities/trigger-runtime-controller.test.ts +12 -18
  174. package/src/capabilities/trigger-runtime-controller.ts +22 -25
  175. package/src/commands/trigger/create/{queue.ts → feed.ts} +1 -1
  176. package/src/commands/trigger/create/index.ts +2 -2
  177. package/src/commands/trigger/update/{queue.ts → feed.ts} +1 -1
  178. package/src/commands/trigger/update/index.ts +2 -2
  179. package/src/commands/trigger/util.ts +1 -2
  180. package/src/components/InstructionsEditor/InstructionsEditor.stories.tsx +7 -6
  181. package/src/components/InstructionsEditor/InstructionsEditor.tsx +31 -19
  182. package/src/components/RoutineCard/RoutineCard.stories.tsx +95 -0
  183. package/src/components/RoutineCard/RoutineCard.tsx +60 -0
  184. package/src/components/{MasterDetail → RoutineCard}/index.ts +1 -1
  185. package/src/components/RoutineForm/RoutineForm.tsx +60 -52
  186. package/src/components/Schedule/Schedule.stories.tsx +1 -1
  187. package/src/components/Schedule/Schedule.tsx +4 -73
  188. package/src/components/Schedule/days.ts +18 -0
  189. package/src/components/Schedule/describe-schedule.ts +64 -0
  190. package/src/components/Schedule/index.ts +2 -0
  191. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +1 -1
  192. package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
  193. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +3 -3
  194. package/src/components/TriggerEditor/TriggerEditor.tsx +79 -66
  195. package/src/components/TriggerEditor/TriggerKindSelector.tsx +4 -30
  196. package/src/components/TriggerEditor/trigger-kind-icon.ts +38 -0
  197. package/src/components/index.ts +1 -1
  198. package/src/containers/RoutineArticle/RoutineArticle.stories.tsx +78 -19
  199. package/src/containers/RoutineArticle/RoutineArticle.tsx +8 -4
  200. package/src/containers/RoutineCompanion/RoutineCompanion.stories.tsx +5 -4
  201. package/src/containers/RoutineCompanion/RoutineCompanion.tsx +11 -7
  202. package/src/containers/RoutineSettings/RoutineSettings.tsx +22 -33
  203. package/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.stories.tsx +6 -5
  204. package/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.tsx +3 -1
  205. package/src/containers/RoutineTraceCompanion/useRoutineRuns.ts +3 -5
  206. package/src/containers/SkillArticle/SkillArticle.tsx +2 -0
  207. package/src/hooks/useTriggerRuntimeControls.ts +2 -2
  208. package/src/index.ts +1 -0
  209. package/src/operations/create-routine.ts +1 -1
  210. package/src/operations/create-trigger-from-template.ts +2 -2
  211. package/src/operations/run-routine.test.ts +150 -0
  212. package/src/operations/run-routine.ts +18 -2
  213. package/src/paths.ts +5 -5
  214. package/src/templates/index.ts +5 -3
  215. package/src/translations.ts +5 -6
  216. package/src/types/RoutineCapabilities.ts +10 -4
  217. package/src/types/RoutineOperation.ts +7 -6
  218. package/src/types/index.ts +0 -1
  219. package/src/util/index.ts +1 -0
  220. package/src/util/routines-for-object.test.ts +37 -5
  221. package/src/util/routines-for-object.ts +33 -8
  222. package/src/util/wire.test.ts +77 -0
  223. package/src/util/wire.ts +76 -0
  224. package/dist/lib/neutral/RoutineArticle-UNTMV4CC.mjs +0 -95
  225. package/dist/lib/neutral/RoutineArticle-UNTMV4CC.mjs.map +0 -7
  226. package/dist/lib/neutral/RoutineCompanion-ZZ6WMY7I.mjs +0 -249
  227. package/dist/lib/neutral/RoutineCompanion-ZZ6WMY7I.mjs.map +0 -7
  228. package/dist/lib/neutral/RoutinePlugin.mjs +0 -10
  229. package/dist/lib/neutral/RoutinePlugin.mjs.map +0 -7
  230. package/dist/lib/neutral/RoutinePlugin.node.mjs +0 -1133
  231. package/dist/lib/neutral/RoutinePlugin.node.mjs.map +0 -7
  232. package/dist/lib/neutral/RoutinePlugin.workerd.mjs +0 -36
  233. package/dist/lib/neutral/RoutinePlugin.workerd.mjs.map +0 -7
  234. package/dist/lib/neutral/RoutineSettings-ZJOM4F3S.mjs +0 -48
  235. package/dist/lib/neutral/RoutineSettings-ZJOM4F3S.mjs.map +0 -7
  236. package/dist/lib/neutral/RoutineTraceCompanion-5U6R7LJE.mjs +0 -236
  237. package/dist/lib/neutral/RoutineTraceCompanion-5U6R7LJE.mjs.map +0 -7
  238. package/dist/lib/neutral/SkillArticle-WWDNKW2Z.mjs +0 -27
  239. package/dist/lib/neutral/SkillArticle-WWDNKW2Z.mjs.map +0 -7
  240. package/dist/lib/neutral/app-graph-builder-FALWLZTI.mjs +0 -90
  241. package/dist/lib/neutral/app-graph-builder-FALWLZTI.mjs.map +0 -7
  242. package/dist/lib/neutral/capabilities/index.mjs +0 -25
  243. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  244. package/dist/lib/neutral/capabilities/node.mjs +0 -19
  245. package/dist/lib/neutral/capabilities/node.mjs.map +0 -7
  246. package/dist/lib/neutral/chunk-674LDIUJ.mjs +0 -9
  247. package/dist/lib/neutral/chunk-674LDIUJ.mjs.map +0 -7
  248. package/dist/lib/neutral/chunk-HLO4LYXT.mjs.map +0 -7
  249. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  250. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  251. package/dist/lib/neutral/chunk-P3TDQKOO.mjs +0 -8
  252. package/dist/lib/neutral/chunk-P3TDQKOO.mjs.map +0 -7
  253. package/dist/lib/neutral/chunk-R7J2MU2M.mjs +0 -263
  254. package/dist/lib/neutral/chunk-R7J2MU2M.mjs.map +0 -7
  255. package/dist/lib/neutral/chunk-WLNL77C7.mjs +0 -14
  256. package/dist/lib/neutral/chunk-WLNL77C7.mjs.map +0 -7
  257. package/dist/lib/neutral/chunk-YGWSAKLD.mjs +0 -65
  258. package/dist/lib/neutral/chunk-YGWSAKLD.mjs.map +0 -7
  259. package/dist/lib/neutral/components/index.mjs +0 -1921
  260. package/dist/lib/neutral/components/index.mjs.map +0 -7
  261. package/dist/lib/neutral/containers/index.mjs +0 -17
  262. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  263. package/dist/lib/neutral/create-object-V23KVDMJ.mjs +0 -25
  264. package/dist/lib/neutral/create-object-V23KVDMJ.mjs.map +0 -7
  265. package/dist/lib/neutral/create-routine-6QBY6TWF.mjs +0 -38
  266. package/dist/lib/neutral/create-routine-6QBY6TWF.mjs.map +0 -7
  267. package/dist/lib/neutral/create-trigger-from-template-U3KNS77V.mjs +0 -70
  268. package/dist/lib/neutral/create-trigger-from-template-U3KNS77V.mjs.map +0 -7
  269. package/dist/lib/neutral/hooks/index.mjs +0 -47
  270. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  271. package/dist/lib/neutral/index.mjs +0 -27
  272. package/dist/lib/neutral/index.mjs.map +0 -7
  273. package/dist/lib/neutral/layer-specs-2TWJU5HI.mjs +0 -135
  274. package/dist/lib/neutral/layer-specs-2TWJU5HI.mjs.map +0 -7
  275. package/dist/lib/neutral/meta.json +0 -1
  276. package/dist/lib/neutral/meta.mjs +0 -8
  277. package/dist/lib/neutral/meta.mjs.map +0 -7
  278. package/dist/lib/neutral/navigation-resolver-KQIWUH6F.mjs +0 -18
  279. package/dist/lib/neutral/navigation-resolver-KQIWUH6F.mjs.map +0 -7
  280. package/dist/lib/neutral/operation-handler-QKLJSDCQ.mjs +0 -13
  281. package/dist/lib/neutral/operation-handler-QKLJSDCQ.mjs.map +0 -7
  282. package/dist/lib/neutral/operations/index.mjs +0 -8
  283. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  284. package/dist/lib/neutral/plugin.mjs +0 -16
  285. package/dist/lib/neutral/plugin.mjs.map +0 -7
  286. package/dist/lib/neutral/react-surface-GMO7I7YE.mjs +0 -67
  287. package/dist/lib/neutral/react-surface-GMO7I7YE.mjs.map +0 -7
  288. package/dist/lib/neutral/registry-sync-DYPOC7ZG.mjs +0 -86
  289. package/dist/lib/neutral/registry-sync-DYPOC7ZG.mjs.map +0 -7
  290. package/dist/lib/neutral/run-routine-AEWO6SYD.mjs +0 -37
  291. package/dist/lib/neutral/run-routine-AEWO6SYD.mjs.map +0 -7
  292. package/dist/lib/neutral/templates-IIUCEBAX.mjs +0 -49
  293. package/dist/lib/neutral/templates-IIUCEBAX.mjs.map +0 -7
  294. package/dist/lib/neutral/testing.mjs +0 -8
  295. package/dist/lib/neutral/testing.mjs.map +0 -7
  296. package/dist/lib/neutral/translations.mjs +0 -115
  297. package/dist/lib/neutral/translations.mjs.map +0 -7
  298. package/dist/lib/neutral/trigger-runtime-controller-WIDDFGQT.mjs +0 -77
  299. package/dist/lib/neutral/trigger-runtime-controller-WIDDFGQT.mjs.map +0 -7
  300. package/dist/lib/neutral/types/index.mjs +0 -17
  301. package/dist/lib/neutral/types/index.mjs.map +0 -7
  302. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
  303. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  304. package/dist/types/src/commands/trigger/create/queue.d.ts.map +0 -1
  305. package/dist/types/src/commands/trigger/update/queue.d.ts.map +0 -1
  306. package/dist/types/src/components/MasterDetail/MasterDetail.d.ts +0 -51
  307. package/dist/types/src/components/MasterDetail/MasterDetail.d.ts.map +0 -1
  308. package/dist/types/src/components/MasterDetail/MasterDetail.stories.d.ts +0 -16
  309. package/dist/types/src/components/MasterDetail/MasterDetail.stories.d.ts.map +0 -1
  310. package/dist/types/src/components/MasterDetail/index.d.ts +0 -2
  311. package/dist/types/src/components/MasterDetail/index.d.ts.map +0 -1
  312. package/dist/types/src/types/Routine.d.ts +0 -55
  313. package/dist/types/src/types/Routine.d.ts.map +0 -1
  314. package/dist/types/src/types/Routine.test.d.ts +0 -2
  315. package/dist/types/src/types/Routine.test.d.ts.map +0 -1
  316. package/src/capabilities/navigation-resolver.ts +0 -21
  317. package/src/components/MasterDetail/MasterDetail.stories.tsx +0 -100
  318. package/src/components/MasterDetail/MasterDetail.tsx +0 -175
  319. package/src/types/Routine.test.ts +0 -51
  320. package/src/types/Routine.ts +0 -144
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoutinePlugin.node.mjs","names":[],"sources":["../../src/commands/trigger/options.ts","../../src/commands/trigger/util.ts","../../src/commands/trigger/create/feed.ts","../../src/commands/trigger/create/subscription.ts","../../src/commands/trigger/create/timer.ts","../../src/commands/trigger/create/index.ts","../../src/commands/trigger/list.ts","../../src/commands/trigger/remove.ts","../../src/commands/trigger/update/feed.ts","../../src/commands/trigger/update/subscription.ts","../../src/commands/trigger/update/timer.ts","../../src/commands/trigger/update/index.ts","../../src/commands/trigger/index.ts","../../src/RoutinePlugin.node.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Options from '@effect/cli/Options';\n\nexport const TriggerId = Options.text('id').pipe(Options.withDescription('The id of the trigger.'));\n\nexport const Enabled = Options.boolean('enabled', { ifPresent: true }).pipe(\n Options.withDescription('Whether the trigger is enabled.'),\n);\n\nexport const Input = Options.keyValueMap('input').pipe(\n Options.withDescription(\"Input data to pass to the function. Must match the function's input schema.\"),\n);\n\n//\n// Subscription\n//\n\nexport const Typename = Options.text('typename').pipe(\n Options.withDescription('The type name to query for the subscription trigger.'),\n);\n\nexport const Deep = Options.boolean('deep', { ifPresent: true }).pipe(\n Options.withDescription('Watch changes to nested properties (not just creation).'),\n);\n\nexport const Delay = Options.integer('delay').pipe(\n Options.withDescription('Debounce changes with a delay in milliseconds.'),\n);\n\n//\n// Timer\n//\n\nexport const Cron = Options.text('cron').pipe(\n Options.withDescription('The cron expression to use for the timer trigger.'),\n);\n\n//\n// Feed\n//\n\nexport const Feed = Options.text('feed').pipe(\n Options.withDescription('The EID of the feed for the feed trigger (echo://<spaceId>/<objectId>).'),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Ansi from '@effect/printer-ansi/Ansi';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport type * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { FormBuilder } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Annotation, Database, Entity, Feed, Filter, Obj, Query, Ref, Scope, Type } from '@dxos/echo';\nimport { SchemaEx } from '@dxos/effect';\nimport { DXN } from '@dxos/keys';\nimport { FeedAnnotation } from '@dxos/schema';\n\nexport type TriggerRemoteStatus = 'available' | 'not available' | 'n/a';\n\n/**\n * Determines the remote status of a trigger.\n * Only timer/cron triggers can be checked for remote availability.\n */\nexport const getTriggerRemoteStatus = (trigger: Trigger.Trigger, remoteCronIds: string[]): TriggerRemoteStatus => {\n if (trigger.spec?.kind !== 'timer') {\n return 'n/a';\n }\n return remoteCronIds.includes(trigger.id) ? 'available' : 'not available';\n};\n\n/**\n * Pretty prints a trigger with ANSI colors.\n */\nexport const printTrigger = Effect.fn(function* (trigger: Trigger.Trigger, remoteStatus?: TriggerRemoteStatus) {\n const fn = trigger.runnable && (yield* Database.load(trigger.runnable));\n\n return FormBuilder.make({\n title: trigger.id,\n }).pipe(\n FormBuilder.set(\n 'status',\n trigger.enabled ? 'enabled' : 'disabled',\n trigger.enabled ? Ansi.green : Ansi.blackBright,\n ),\n FormBuilder.option('kind', Option.fromNullable(trigger.spec?.kind)),\n FormBuilder.option(\n 'remote',\n Option.fromNullable(remoteStatus),\n Match.type<TriggerRemoteStatus>().pipe(\n Match.withReturnType<Ansi.Ansi>(),\n Match.when('available', () => Ansi.green),\n Match.when('not available', () => Ansi.yellow),\n Match.when('n/a', () => Ansi.blackBright),\n Match.exhaustive,\n ),\n ),\n FormBuilder.when(\n fn,\n FormBuilder.nest(\n 'function',\n FormBuilder.make().pipe(\n FormBuilder.set('key', Obj.getMeta(fn as Operation.PersistentOperation).key),\n FormBuilder.set('dxn', Obj.getURI(fn as Obj.Unknown)),\n ),\n ),\n ),\n FormBuilder.nestedOption('spec', Option.fromNullable(trigger.spec).pipe(Option.map(printSpec))),\n FormBuilder.build,\n );\n});\n\nconst printSpec = <T extends Trigger.Spec>(spec: T): FormBuilder.FormBuilder => {\n switch (spec.kind) {\n case 'timer':\n return printTimer(spec);\n case 'subscription':\n return printSubscription(spec);\n case 'webhook':\n return printWebhook(spec);\n case 'feed':\n return printFeed(spec);\n default:\n return FormBuilder.make({}).pipe(FormBuilder.set('unknown', 'Unknown spec type'));\n }\n};\n\nconst printTimer = (spec: Trigger.TimerSpec) => FormBuilder.make({}).pipe(FormBuilder.set('cron', spec.cron));\n\nconst printSubscription = (spec: Trigger.SubscriptionSpec) =>\n FormBuilder.make({}).pipe(FormBuilder.set('query', spec.query?.raw ?? '[Query AST]'));\n\nconst printWebhook = (spec: Trigger.WebhookSpec) =>\n FormBuilder.make({}).pipe(FormBuilder.set('method', spec.method), FormBuilder.set('port', spec.port));\n\nconst printFeed = (spec: Trigger.FeedSpec) =>\n FormBuilder.make({}).pipe(FormBuilder.set('feed', spec.feed ? spec.feed.uri.toString() : '(none)'));\n\n/**\n * Prompts for input values based on an Effect schema.\n * First shows a multi-select to choose which properties to specify,\n * then prompts for values of the selected properties.\n * Required properties are automatically included and cannot be unselected.\n * @param schema - The Effect schema to prompt for\n * @param defaults - Optional default values to use as initial values and pre-select optional properties\n */\nexport const promptForSchemaInput = Effect.fn(function* (\n schema: Schema.Schema.AnyNoContext | undefined,\n defaults?: Record<string, any> | undefined,\n) {\n if (!schema) {\n return {};\n }\n\n const ast = schema.ast;\n\n // Check if it's a struct/object type\n if (!SchemaAST.isTypeLiteral(ast)) {\n return {};\n }\n\n const properties = SchemaEx.getProperties(ast);\n if (properties.length === 0) {\n return {};\n }\n\n // Separate required and optional properties\n const requiredProperties: typeof properties = [];\n const optionalProperties: typeof properties = [];\n\n for (const prop of properties) {\n if (prop.isOptional) {\n optionalProperties.push(prop);\n } else {\n requiredProperties.push(prop);\n }\n }\n\n // Build property info\n const propertyInfo = properties.map((prop) => {\n const key = prop.name.toString();\n return {\n prop,\n key,\n isRequired: !prop.isOptional,\n };\n });\n\n // Multi-select: show all properties and let user select which optional ones to include\n const selectedKeys = new Set<string>();\n\n // Required properties are automatically selected\n for (const info of propertyInfo) {\n if (info.isRequired) {\n selectedKeys.add(info.key);\n }\n }\n\n // Show required properties that will be automatically included\n if (requiredProperties.length > 0) {\n const requiredNames = requiredProperties.map((p) => {\n const info = propertyInfo.find((i) => i.prop === p);\n return info?.key ?? p.name.toString();\n });\n yield* Console.log(`Required properties (will be included): ${requiredNames.join(', ')}`);\n }\n\n // For optional properties, use multi-select to choose which ones to include\n if (optionalProperties.length > 0) {\n const optionalInfo = propertyInfo.filter((info) => !info.isRequired);\n const choices = optionalInfo.map((info) => {\n const hasDefault = defaults?.[info.key] !== undefined;\n const defaultText = hasDefault ? ` (current: ${JSON.stringify(defaults[info.key])})` : '';\n return {\n title: `${info.key}${defaultText}`,\n value: info.key,\n description: hasDefault ? 'Has default value' : undefined,\n };\n });\n\n const selected = yield* Prompt.multiSelect({\n message: 'Select optional properties to include:',\n choices,\n });\n\n // Add selected optional properties to selectedKeys\n for (const key of selected) {\n selectedKeys.add(String(key));\n }\n }\n\n // If no properties selected (shouldn't happen if there are required ones), return empty\n if (selectedKeys.size === 0) {\n return {};\n }\n\n // Prompt for values of selected properties\n const inputObj: Record<string, any> = {};\n\n for (const info of propertyInfo) {\n if (!selectedKeys.has(info.key)) {\n continue;\n }\n\n const key = info.key;\n const propType = info.prop.type;\n const schemaDefault = Option.getOrUndefined(SchemaAST.getDefaultAnnotation(propType));\n const defaultValue = defaults?.[key] ?? schemaDefault;\n\n if (SchemaAST.isBooleanKeyword(propType)) {\n const initialValue =\n typeof defaultValue === 'boolean' ? defaultValue : typeof schemaDefault === 'boolean' ? schemaDefault : false;\n const value = yield* Prompt.confirm({\n message: `${info.key}${defaults?.[key] !== undefined ? ` (current: ${defaults[key]})` : ''}:`,\n initial: initialValue,\n });\n inputObj[key] = value;\n } else if (SchemaAST.isNumberKeyword(propType)) {\n const currentValue = typeof defaultValue === 'number' ? String(defaultValue) : '';\n const valueStr = yield* Prompt.text({\n message: `${info.key}${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ''}:`,\n }).pipe(Prompt.run);\n inputObj[key] = valueStr === '' && defaultValue !== undefined ? defaultValue : parseFloat(valueStr) || 0;\n } else if (SchemaAST.isStringKeyword(propType)) {\n const currentValue = typeof defaultValue === 'string' ? defaultValue : '';\n const valueStr = yield* Prompt.text({\n message: `${info.key}${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ''}:`,\n }).pipe(Prompt.run);\n inputObj[key] = valueStr === '' && defaultValue !== undefined ? defaultValue : valueStr;\n } else if (Ref.isRefType(propType)) {\n const isDefaultTemplate =\n typeof defaultValue === 'string' && defaultValue.startsWith('{{') && defaultValue.endsWith('}}');\n const useTemplate = yield* Prompt.confirm({\n message: `Use a template to specify ${info.key}?${isDefaultTemplate ? ' (current: template)' : ''}`,\n initial: isDefaultTemplate,\n });\n if (useTemplate) {\n const currentValue = typeof defaultValue === 'string' ? defaultValue : '';\n const templateStr = yield* Prompt.text({\n message: `${info.key} template${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ''}:`,\n }).pipe(Prompt.run);\n inputObj[key] = templateStr === '' && defaultValue !== undefined ? defaultValue : templateStr;\n } else {\n const annotation = Annotation.ReferenceAnnotation.getFromAst(propType).pipe(Option.getOrThrow);\n const objects = yield* Database.query(Filter.type(DXN.make(annotation.typename))).run;\n if (objects.length === 0) {\n inputObj[key] = undefined;\n } else {\n const selected = yield* Prompt.select({\n message: `Select ${info.key}:`,\n choices: objects.map((obj: Entity.Any) => ({\n title: Entity.getLabel(obj) ?? obj.id,\n value: Ref.make(obj),\n description: Entity.getDescription(obj),\n })),\n });\n inputObj[key] = selected;\n }\n }\n } else {\n // For other types, prompt as string and let validation handle it\n const currentValue = defaultValue !== undefined ? String(defaultValue) : '';\n const valueStr = yield* Prompt.text({\n message: `${info.key}${currentValue ? ` (current: ${currentValue}, press Enter to keep)` : ''}:`,\n }).pipe(Prompt.run);\n inputObj[key] = valueStr === '' && defaultValue !== undefined ? defaultValue : valueStr;\n }\n }\n\n return inputObj;\n});\n\n/**\n * Selects a function interactively from available functions in the database.\n * Queries the database for functions and prompts the user to select one.\n */\nexport const selectFunction = Effect.fn(function* () {\n const allFunctions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n // Hide internal operations: only operations annotated visible are user-bindable as trigger actions.\n const functions = allFunctions.filter((fn) => Operation.isVisible(fn));\n\n if (functions.length === 0) {\n return yield* Effect.fail(new Error('No functions available'));\n }\n\n const selected = yield* Prompt.select({\n message: 'Select a function:',\n choices: functions.map((fn: Operation.PersistentOperation) => ({\n title: fn.name ?? fn.id,\n value: fn.id,\n description: fn.description,\n })),\n });\n\n return String(selected);\n});\n\n/**\n * Selects a trigger interactively from available triggers.\n * If kind is provided, filters triggers by that kind.\n * Queries the database for triggers and prompts the user to select one.\n */\nexport const selectTrigger = Effect.fn(function* (kind?: Trigger.Kind) {\n const triggers = yield* Database.query(\n Query.select(Filter.type(Trigger.Trigger)).debugLabel('cli.trigger.selectTrigger'),\n ).run;\n const filteredTriggers = kind ? triggers.filter((trigger) => trigger.spec?.kind === kind) : triggers;\n\n if (filteredTriggers.length === 0) {\n return yield* Effect.fail(new Error(kind ? `No ${kind} triggers available` : 'No triggers available'));\n }\n\n const choices = yield* Effect.all(\n filteredTriggers.map((trigger) =>\n Effect.gen(function* () {\n const fn = trigger.runnable ? yield* Database.load(trigger.runnable) : undefined;\n const functionName =\n fn && Obj.instanceOf(Operation.PersistentOperation, fn)\n ? (fn.name ?? Obj.getMeta(fn).key ?? fn.id)\n : undefined;\n const title = functionName ?? trigger.id;\n const description = `${trigger.enabled ? 'enabled' : 'disabled'} - ${trigger.spec?.kind ?? 'unknown'}`;\n\n return {\n title,\n value: trigger.id,\n description,\n };\n }),\n ),\n );\n\n const selected = yield* Prompt.select({\n message: kind ? `Select a ${kind} trigger:` : 'Select a trigger:',\n choices,\n });\n\n return String(selected);\n});\n\n/**\n * Selects a feed interactively from available feeds in the database.\n * Queries schemas with FeedAnnotation, then queries objects of those types,\n * and returns the chosen Feed object.\n */\nexport const selectFeed = Effect.fn(function* () {\n // Query schema registry for schemas with FeedAnnotation.\n const schemas = yield* Database.query(Query.select(Filter.type(Type.Type)).from(Scope.space(), Scope.registry())).run;\n\n // Filter schemas that have FeedAnnotation.\n const feedSchemas = schemas.filter((type) => {\n const schema = Type.getSchema(type);\n const annotation = FeedAnnotation.get(schema);\n return Option.isSome(annotation) && annotation.value === true;\n });\n\n if (feedSchemas.length === 0) {\n return yield* Effect.fail(new Error('No schemas with Feed annotation found'));\n }\n\n // Collect all Feed objects referenced by host objects.\n const feedChoices: Array<{ title: string; value: Feed.Feed; description?: string }> = [];\n\n // Process each feed schema, resolving the Feed object reference.\n for (const schema of feedSchemas) {\n yield* Effect.gen(function* () {\n const objects = yield* Database.query(Filter.type(Type.getURI(schema))).run;\n\n for (const obj of objects) {\n // Access the feed property (which is a Ref<Feed>).\n const feedRef = (obj as any).feed as Ref.Ref<any> | undefined;\n if (!feedRef) {\n continue;\n }\n\n const feedObj = yield* Effect.promise(() => feedRef.tryLoad());\n if (!feedObj || !Obj.instanceOf(Feed.Feed, feedObj)) {\n continue;\n }\n\n const label = Obj.getLabel(obj) ?? obj.id;\n const description = Obj.getTypename(obj);\n\n feedChoices.push({\n title: label,\n value: feedObj,\n description,\n });\n }\n }).pipe(Effect.catchAll(() => Effect.void));\n }\n\n if (feedChoices.length === 0) {\n return yield* Effect.fail(new Error('No objects with feed properties found'));\n }\n\n const selected = yield* Prompt.select({\n message: 'Select a feed:',\n choices: feedChoices,\n });\n\n return selected as Feed.Feed;\n});\n\n/**\n * Pretty prints trigger removal result with ANSI colors.\n */\nexport const printTriggerRemoved = (id: string) =>\n FormBuilder.make({ title: 'Trigger removed' }).pipe(FormBuilder.set('id', id), FormBuilder.build);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as HashMap from 'effect/HashMap';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig } from '@dxos/cli-util';\nimport { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Common } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Database, Filter, JsonSchema, Ref, Feed as Feed$ } from '@dxos/echo';\nimport { EID } from '@dxos/keys';\n\nimport { Enabled, Feed, Input } from '../options';\nimport { printTrigger, promptForSchemaInput, selectFeed, selectFunction } from '../util';\n\nexport const feed = Command.make(\n 'feed',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n enabled: Enabled,\n functionId: Common.functionId.pipe(Options.optional),\n feed: Feed.pipe(Options.optional),\n input: Input.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n\n const functionId = yield* Option.match(options.functionId, {\n onNone: () => selectFunction(),\n onSome: (id) => Effect.succeed(id),\n });\n const functions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n const fn = functions.find((fn) => fn.id === functionId);\n if (!fn) {\n return yield* Effect.fail(new Error(`Function not found: ${functionId}`));\n }\n\n const feed = yield* Option.match(options.feed, {\n onNone: () => selectFeed(),\n onSome: (uri) => Database.resolve(EID.parse(uri), Feed$.Feed),\n });\n\n const input = yield* Option.match(options.input, {\n onNone: () => promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined),\n onSome: (value) => Effect.succeed(Object.fromEntries(HashMap.toEntries(value))),\n });\n\n // Always prompt for enabled if functionId is not provided.\n const enabled = yield* Option.match(options.functionId, {\n onNone: () =>\n Prompt.confirm({\n message: 'Enable the trigger?',\n initial: true,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(options.enabled),\n });\n\n const trigger = Trigger.make({\n runnable: Ref.make(fn),\n enabled,\n spec: Trigger.specFeed(feed),\n input,\n });\n\n yield* Database.add(trigger);\n\n if (json) {\n yield* Console.log(JSON.stringify(trigger, null, 2));\n } else {\n yield* Console.log(print(yield* printTrigger(trigger)));\n }\n\n yield* flushAndSync({ indexes: true });\n }),\n).pipe(\n Command.withDescription('Create a feed trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as HashMap from 'effect/HashMap';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig } from '@dxos/cli-util';\nimport { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Common } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Database, Filter, JsonSchema, Query, Ref } from '@dxos/echo';\nimport { DXN } from '@dxos/keys';\n\nimport { Deep, Delay, Enabled, Input, Typename } from '../options';\nimport { printTrigger, promptForSchemaInput, selectFunction } from '../util';\n\nexport const subscription = Command.make(\n 'subscription',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n enabled: Enabled,\n functionId: Common.functionId.pipe(Options.optional),\n typename: Typename.pipe(Options.optional),\n deep: Deep.pipe(Options.optional),\n delay: Delay.pipe(Options.optional),\n input: Input.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n\n const functionId = yield* Option.match(options.functionId, {\n onNone: () => selectFunction(),\n onSome: (id) => Effect.succeed(id),\n });\n const functions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n const fn = functions.find((fn) => fn.id === functionId);\n if (!fn) {\n return yield* Effect.fail(new Error(`Function not found: ${functionId}`));\n }\n\n const typename = yield* Option.match(options.typename, {\n onNone: () =>\n Prompt.text({\n message: 'Enter type name:',\n }).pipe(Prompt.run),\n onSome: (value) => Effect.succeed(value),\n });\n const subscriptionQuery = Query.select(Filter.type(DXN.make(typename)));\n\n const deepOption = yield* Option.match(options.deep, {\n onNone: () =>\n Prompt.confirm({\n message: 'Watch changes to nested properties (deep)?',\n initial: false,\n }).pipe(\n Prompt.run,\n Effect.map((value) => (value ? Option.some(value) : Option.none())),\n ),\n onSome: () => Effect.succeed(Option.some(true)),\n });\n\n const delayOption = yield* Option.match(options.delay, {\n onNone: () =>\n Effect.gen(function* () {\n const delayStr = yield* Prompt.text({\n message: 'Debounce delay in milliseconds (optional, press Enter to skip):',\n }).pipe(Prompt.run);\n return delayStr === '' ? Option.none<number>() : Option.some(parseInt(delayStr, 10));\n }),\n onSome: (value) => Effect.succeed(Option.some(value)),\n });\n\n const subscriptionOptions: { deep?: boolean; delay?: number } = {};\n if (Option.isSome(deepOption)) {\n subscriptionOptions.deep = deepOption.value;\n }\n if (Option.isSome(delayOption)) {\n subscriptionOptions.delay = delayOption.value;\n }\n\n const input = yield* Option.match(options.input, {\n onNone: () => promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined),\n onSome: (value) => Effect.succeed(Object.fromEntries(HashMap.toEntries(value))),\n });\n\n // Always prompt for enabled if functionId is not provided.\n const enabled = yield* Option.match(options.functionId, {\n onNone: () =>\n Prompt.confirm({\n message: 'Enable the trigger?',\n initial: true,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(options.enabled),\n });\n\n const trigger = Trigger.make({\n runnable: Ref.make(fn),\n enabled,\n spec: Trigger.specSubscription(\n subscriptionQuery,\n Object.keys(subscriptionOptions).length > 0 ? subscriptionOptions : undefined,\n ),\n input,\n });\n yield* Database.add(trigger);\n\n if (json) {\n yield* Console.log(JSON.stringify(trigger, null, 2));\n } else {\n yield* Console.log(print(yield* printTrigger(trigger)));\n }\n\n yield* flushAndSync({ indexes: true });\n }),\n).pipe(\n Command.withDescription('Create a subscription trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as HashMap from 'effect/HashMap';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig } from '@dxos/cli-util';\nimport { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Common } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Database, Filter, JsonSchema, Ref } from '@dxos/echo';\n\nimport { Cron, Enabled, Input } from '../options';\nimport { printTrigger, promptForSchemaInput, selectFunction } from '../util';\n\n// trigger create timer --cron \"0 0 * * *\" --functionId <functionId>\nexport const timer = Command.make(\n 'timer',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n enabled: Enabled,\n functionId: Common.functionId.pipe(Options.optional),\n cron: Cron.pipe(Options.optional),\n input: Input.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n\n const functionId = yield* Option.match(options.functionId, {\n onNone: () => selectFunction(),\n onSome: (id) => Effect.succeed(id),\n });\n const functions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n const fn = functions.find((fn) => fn.id === functionId);\n if (!fn) {\n return yield* Effect.fail(new Error(`Function not found: ${functionId}`));\n }\n\n const cron = yield* Option.match(options.cron, {\n onNone: () =>\n Prompt.text({\n message: 'Enter cron expression:',\n }).pipe(Prompt.run),\n onSome: (value) => Effect.succeed(value),\n });\n\n const input = yield* Option.match(options.input, {\n onNone: () => promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined),\n onSome: (value) => Effect.succeed(Object.fromEntries(HashMap.toEntries(value))),\n });\n\n // Always prompt for enabled if functionId is not provided.\n const enabled = yield* Option.match(options.functionId, {\n onNone: () =>\n Prompt.confirm({\n message: 'Enable the trigger?',\n initial: true,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(options.enabled),\n });\n\n const trigger = Trigger.make({\n runnable: Ref.make(fn),\n enabled,\n spec: Trigger.specTimer(cron),\n input,\n });\n\n yield* Database.add(trigger);\n\n if (json) {\n yield* Console.log(JSON.stringify(trigger, null, 2));\n } else {\n yield* Console.log(print(yield* printTrigger(trigger)));\n }\n\n yield* flushAndSync({ indexes: true });\n }),\n).pipe(\n Command.withDescription('Create a timer trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\n\nimport { feed } from './feed';\nimport { subscription } from './subscription';\nimport { timer } from './timer';\n\nexport const create = Command.make('create').pipe(\n Command.withDescription('Create a trigger.'),\n Command.withSubcommands([subscription, timer, feed]),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\n\nimport { CommandConfig, Common, printList, spaceIdWithDefault, spaceLayer } from '@dxos/cli-util';\nimport { ClientService } from '@dxos/client';\nimport { Trigger } from '@dxos/compute';\nimport { Context } from '@dxos/context';\nimport { Database, Filter, Query } from '@dxos/echo';\n\nimport { getTriggerRemoteStatus, printTrigger } from './util';\n\nexport const list = Command.make(\n 'list',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n },\n Effect.fn(function* ({ spaceId: spaceIdOption }) {\n const { json } = yield* CommandConfig;\n\n // Fetch local triggers\n const triggers = yield* Database.query(Query.select(Filter.type(Trigger.Trigger)).debugLabel('cli.trigger.list'))\n .run;\n\n // Fetch remote cron triggers to check availability\n const remoteCronIds = yield* Effect.gen(function* () {\n const client = yield* ClientService;\n const spaceId = yield* spaceIdWithDefault(spaceIdOption);\n const result = yield* Effect.promise(() => client.edge.http.getCronTriggers(Context.default(), spaceId)).pipe(\n Effect.catchAll(() => Effect.succeed({ cronIds: [] })),\n );\n return result.cronIds;\n });\n\n // Determine remote status for each trigger\n const triggersWithStatus = triggers.map((trigger) => ({\n trigger,\n remoteStatus: getTriggerRemoteStatus(trigger, remoteCronIds),\n }));\n\n // Print triggers\n if (json) {\n yield* Console.log(\n JSON.stringify(\n triggersWithStatus.map(({ trigger, remoteStatus }) => ({ ...trigger, remoteStatus })),\n null,\n 2,\n ),\n );\n } else {\n if (triggersWithStatus.length === 0) {\n yield* Console.log('No triggers found.');\n } else {\n const items = yield* Effect.all(\n triggersWithStatus.map(({ trigger, remoteStatus }) => printTrigger(trigger, remoteStatus)),\n );\n yield* Console.log(printList(items));\n }\n }\n }),\n).pipe(\n Command.withDescription('List triggers configured on EDGE.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig, Common, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Trigger } from '@dxos/compute';\nimport { Database, Ref } from '@dxos/echo';\nimport { EID } from '@dxos/keys';\n\nimport { TriggerId } from './options';\nimport { printTriggerRemoved, selectTrigger } from './util';\n\nexport const remove = Command.make(\n 'remove',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n id: TriggerId.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n const triggerId = yield* Option.match(options.id, {\n onNone: () => selectTrigger(),\n onSome: (id) => Effect.succeed(id),\n });\n const dxn = EID.make({ entityId: triggerId });\n const trigger = yield* Database.resolve(Ref.fromURI(dxn), Trigger.Trigger);\n yield* Database.remove(trigger);\n if (json) {\n yield* Console.log(JSON.stringify({ id: trigger.id, removed: true }, null, 2));\n } else {\n yield* Console.log(print(printTriggerRemoved(trigger.id)));\n }\n }),\n).pipe(\n Command.withDescription('Remove a trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Trigger.Trigger)),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig } from '@dxos/cli-util';\nimport { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Common } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Database, Filter, JsonSchema, Obj, Ref, Feed as Feed$ } from '@dxos/echo';\nimport { EID, type EntityId } from '@dxos/keys';\n\nimport { Enabled, Feed, Input, TriggerId } from '../options';\nimport { printTrigger, promptForSchemaInput, selectFeed, selectFunction, selectTrigger } from '../util';\n\nexport const feed = Command.make(\n 'feed',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n id: TriggerId.pipe(Options.optional),\n enabled: Enabled,\n functionId: Common.functionId.pipe(Options.optional),\n feed: Feed.pipe(Options.optional),\n input: Input.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n const triggerId = yield* Option.match(options.id, {\n onNone: () => selectTrigger('feed'),\n onSome: (id) => Effect.succeed(id),\n });\n const dxn = EID.make({ entityId: triggerId as EntityId });\n const trigger = yield* Database.resolve(dxn, Trigger.Trigger);\n if (trigger.spec?.kind !== 'feed') {\n return yield* Effect.fail(new Error(`Invalid trigger type: ${trigger.spec?.kind}`));\n }\n\n const currentFn = yield* updateFunction(trigger, options.functionId);\n yield* updateFeed(trigger, options.feed);\n yield* updateInput(trigger, currentFn, options.input);\n yield* updateEnabled(trigger, options.id, options.enabled);\n\n if (json) {\n yield* Console.log(JSON.stringify(trigger, null, 2));\n } else {\n yield* Console.log(print(yield* printTrigger(trigger)));\n }\n\n yield* flushAndSync({ indexes: true });\n }),\n).pipe(\n Command.withDescription('Update a feed trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),\n);\n\n/**\n * Handles updating the function for a trigger.\n * Prompts for confirmation if functionId is not provided, then updates the function if confirmed.\n * @returns The current function (either original or newly assigned)\n */\nconst updateFunction = Effect.fn(function* (trigger: Trigger.Trigger, functionIdOption: Option.Option<string>) {\n let currentFn: Operation.PersistentOperation | undefined = trigger.runnable\n ? yield* Database.load(trigger.runnable)\n : undefined;\n if (currentFn && !Obj.instanceOf(Operation.PersistentOperation, currentFn)) {\n currentFn = undefined;\n }\n const currentFunctionName = currentFn ? (currentFn.name ?? currentFn.id) : undefined;\n const shouldChangeFunction = yield* Option.match(functionIdOption, {\n onNone: () =>\n Prompt.confirm({\n message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ''}?`,\n initial: false,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeFunction) {\n const functionId = yield* Option.match(functionIdOption, {\n onNone: () => selectFunction(),\n onSome: (id) => Effect.succeed(id),\n });\n const functions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n const foundFn = functions.find((fn) => fn.id === functionId);\n if (!foundFn || !Obj.instanceOf(Operation.PersistentOperation, foundFn)) {\n return yield* Effect.fail(new Error(`Function not found: ${functionId}`));\n }\n Obj.update(trigger, (trigger) => {\n trigger.runnable = Ref.make(foundFn);\n });\n currentFn = foundFn;\n }\n\n if (!currentFn) {\n const runnableId = (trigger.runnable ? trigger.runnable.uri.toString() : undefined) ?? 'unknown';\n return yield* Effect.fail(new Error(`Invalid reference for ${runnableId}`));\n }\n\n return currentFn;\n});\n\n/**\n * Handles updating the feed reference for a feed trigger.\n * Prompts for confirmation if feed is not provided, then updates the feed if confirmed.\n */\nconst updateFeed = Effect.fn(function* (trigger: Trigger.Trigger, feedOption: Option.Option<string>) {\n const currentFeed = trigger.spec?.kind === 'feed' ? trigger.spec.feed : undefined;\n const currentFeedStr = currentFeed ? currentFeed.uri.toString() : undefined;\n const shouldChangeFeed = yield* Option.match(feedOption, {\n onNone: () =>\n Prompt.confirm({\n message: `Change the feed${currentFeedStr ? ` (current: ${currentFeedStr})` : ''}?`,\n initial: false,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeFeed) {\n const feed = yield* Option.match(feedOption, {\n onNone: () => selectFeed(),\n onSome: (uri) => Database.resolve(EID.parse(uri), Feed$.Feed),\n });\n Obj.update(trigger, (trigger) => {\n if (trigger.spec?.kind === 'feed') {\n trigger.spec.feed = Ref.make(feed);\n }\n });\n }\n});\n\n/**\n * Handles updating the input for a trigger.\n * Prompts for confirmation if input is not provided, then updates the input if confirmed.\n */\nconst updateInput = Effect.fn(function* (\n trigger: Trigger.Trigger,\n fn: Operation.PersistentOperation,\n inputOption: Option.Option<Record<string, any>>,\n) {\n const currentInput = trigger.input as Record<string, any> | undefined;\n const currentInputStr = currentInput ? JSON.stringify(currentInput) : 'none';\n const shouldChangeInput = yield* Option.match(inputOption, {\n onNone: () =>\n Effect.gen(function* () {\n yield* Console.log(`Current input: ${currentInputStr}`);\n return yield* Prompt.confirm({\n message: 'Change input?',\n initial: false,\n }).pipe(Prompt.run);\n }),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeInput) {\n const inputObj = yield* Option.match(inputOption, {\n onNone: () =>\n promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined, currentInput),\n onSome: (value) => Effect.succeed(value as Record<string, any>),\n });\n Obj.update(trigger, (trigger) => {\n trigger.input = inputObj;\n });\n }\n});\n\n/**\n * Handles updating the enabled status for a trigger.\n * Prompts for enabled if id is not provided.\n */\nconst updateEnabled = Effect.fn(function* (\n trigger: Trigger.Trigger,\n idOption: Option.Option<string>,\n enabled: boolean,\n) {\n const enabledValue = yield* Option.match(idOption, {\n onNone: () =>\n Prompt.confirm({\n message: 'Enable the trigger?',\n initial: trigger.enabled,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(enabled),\n });\n Obj.update(trigger, (trigger) => {\n trigger.enabled = enabledValue;\n });\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig } from '@dxos/cli-util';\nimport { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Common } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Database, Filter, JsonSchema, Obj, Query, Ref } from '@dxos/echo';\nimport { DXN, EID } from '@dxos/keys';\n\nimport { Deep, Delay, Enabled, Input, TriggerId, Typename } from '../options';\nimport { printTrigger, promptForSchemaInput, selectFunction, selectTrigger } from '../util';\n\nexport const subscription = Command.make(\n 'subscription',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n id: TriggerId.pipe(Options.optional),\n enabled: Enabled,\n functionId: Common.functionId.pipe(Options.optional),\n typename: Typename.pipe(Options.optional),\n deep: Deep.pipe(Options.optional),\n delay: Delay.pipe(Options.optional),\n input: Input.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n\n const triggerId = yield* Option.match(options.id, {\n onNone: () => selectTrigger('subscription'),\n onSome: (id) => Effect.succeed(id),\n });\n const dxn = EID.make({ entityId: triggerId });\n const trigger = yield* Database.resolve(Ref.fromURI(dxn), Trigger.Trigger);\n if (trigger.spec?.kind !== 'subscription') {\n return yield* Effect.fail(new Error(`Invalid trigger type: ${trigger.spec?.kind}`));\n }\n\n const currentFn = yield* updateFunction(trigger, options.functionId);\n yield* updateSpec(trigger, options.typename, options.deep, options.delay);\n yield* updateInput(trigger, currentFn, options.input);\n yield* updateEnabled(trigger, options.id, options.enabled);\n\n if (json) {\n yield* Console.log(JSON.stringify(trigger, null, 2));\n } else {\n yield* Console.log(print(yield* printTrigger(trigger)));\n }\n\n yield* flushAndSync({ indexes: true });\n }),\n).pipe(\n Command.withDescription('Update a subscription trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),\n);\n\n/**\n * Extracts the current typename from a subscription trigger's query AST.\n */\nconst extractCurrentTypename = (spec: Trigger.SubscriptionSpec | undefined): Option.Option<string> => {\n if (!spec?.query?.ast) {\n return Option.none();\n }\n return Match.value(spec.query.ast).pipe(\n Match.withReturnType<Option.Option<string>>(),\n Match.when({ type: 'select' }, (q) =>\n Match.value(q.filter).pipe(\n Match.withReturnType<Option.Option<string>>(),\n Match.when({ type: 'object' }, (f) =>\n Option.fromNullable(f.typename).pipe(\n Option.flatMap((dxn) => Option.fromNullable(DXN.isDXN(dxn) ? DXN.getName(dxn) : undefined)),\n ),\n ),\n Match.orElse(() => Option.none()),\n ),\n ),\n Match.orElse(() => Option.none()),\n );\n};\n\n/**\n * Handles updating the function for a trigger.\n * Prompts for confirmation if functionId is not provided, then updates the function if confirmed.\n * @returns The current function (either original or newly assigned)\n */\nconst updateFunction = Effect.fn(function* (trigger: Trigger.Trigger, functionIdOption: Option.Option<string>) {\n let currentFn: Operation.PersistentOperation | undefined = trigger.runnable\n ? yield* Database.load(trigger.runnable)\n : undefined;\n if (currentFn && !Obj.instanceOf(Operation.PersistentOperation, currentFn)) {\n currentFn = undefined;\n }\n const currentFunctionName = currentFn ? (currentFn.name ?? currentFn.id) : undefined;\n const shouldChangeFunction = yield* Option.match(functionIdOption, {\n onNone: () =>\n Prompt.confirm({\n message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ''}?`,\n initial: false,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeFunction) {\n const functionId = yield* Option.match(functionIdOption, {\n onNone: () => selectFunction(),\n onSome: (id) => Effect.succeed(id),\n });\n const functions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n const foundFn = functions.find((fn) => fn.id === functionId);\n if (!foundFn || !Obj.instanceOf(Operation.PersistentOperation, foundFn)) {\n return yield* Effect.fail(new Error(`Function not found: ${functionId}`));\n }\n Obj.update(trigger, (trigger) => {\n trigger.runnable = Ref.make(foundFn);\n });\n currentFn = foundFn;\n }\n\n if (!currentFn) {\n const runnableId = trigger.runnable?.uri.toString() ?? 'unknown';\n return yield* Effect.fail(new Error(`Invalid reference for ${runnableId}`));\n }\n\n return currentFn;\n});\n\n/**\n * Handles updating the subscription trigger spec (typename, deep, delay).\n * Prompts for confirmation if no spec options are provided, then updates the spec if confirmed.\n */\nconst updateSpec = Effect.fn(function* (\n trigger: Trigger.Trigger,\n typenameOption: Option.Option<string>,\n deepOption: Option.Option<boolean>,\n delayOption: Option.Option<number>,\n) {\n const currentSpec = trigger.spec?.kind === 'subscription' ? trigger.spec : undefined;\n const currentTypename = extractCurrentTypename(currentSpec);\n const currentTypenameStr = Option.getOrUndefined(currentTypename);\n const currentDeep = currentSpec?.options?.deep;\n const currentDelay = currentSpec?.options?.delay;\n const specParts: string[] = [];\n if (currentTypenameStr) {\n specParts.push(`typename: ${currentTypenameStr}`);\n }\n if (currentDeep !== undefined) {\n specParts.push(`deep: ${currentDeep}`);\n }\n if (currentDelay !== undefined) {\n specParts.push(`delay: ${currentDelay}`);\n }\n const currentSpecStr = specParts.length > 0 ? specParts.join(', ') : 'none';\n\n const hasSpecOption = Option.isSome(typenameOption) || Option.isSome(deepOption) || Option.isSome(delayOption);\n const shouldChangeSpec = yield* hasSpecOption\n ? Effect.succeed(true)\n : Prompt.confirm({\n message: `Change the trigger spec (current: ${currentSpecStr})?`,\n initial: false,\n }).pipe(Prompt.run);\n if (shouldChangeSpec) {\n const typename = yield* Option.match(typenameOption, {\n onNone: () =>\n Prompt.text({\n message: `Enter type name${currentTypenameStr ? ` (current: ${currentTypenameStr})` : ''}:`,\n }).pipe(Prompt.run),\n onSome: (value) => Effect.succeed(value),\n });\n const queryAst = Query.select(Filter.type(DXN.make(typename))).ast;\n\n const deepOptionValue = yield* Option.match(deepOption, {\n onNone: () =>\n Prompt.confirm({\n message: 'Watch changes to nested properties (deep)?',\n initial: currentSpec?.options?.deep ?? false,\n }).pipe(\n Prompt.run,\n Effect.map((value) => (value ? Option.some(value) : Option.none())),\n ),\n onSome: () => Effect.succeed(Option.some(true)),\n });\n\n const delayOptionValue = yield* Option.match(delayOption, {\n onNone: () =>\n Effect.gen(function* () {\n const currentDelay = currentSpec?.options?.delay;\n const delayStr = yield* Prompt.text({\n message: `Debounce delay in milliseconds (optional, press Enter to skip)${currentDelay ? ` (current: ${currentDelay})` : ''}:`,\n }).pipe(Prompt.run);\n return delayStr === '' ? Option.none<number>() : Option.some(parseInt(delayStr, 10));\n }),\n onSome: (value) => Effect.succeed(Option.some(value)),\n });\n\n const subscriptionOptions: { deep?: boolean; delay?: number } = {};\n if (Option.isSome(deepOptionValue)) {\n subscriptionOptions.deep = deepOptionValue.value;\n }\n if (Option.isSome(delayOptionValue)) {\n subscriptionOptions.delay = delayOptionValue.value;\n }\n\n Obj.update(trigger, (trigger) => {\n const spec = trigger.spec;\n if (spec?.kind === 'subscription') {\n // Cast needed because QueryAST types are deeply readonly but spec.query expects mutable.\n spec.query = { ast: queryAst } as NonNullable<typeof spec.query>;\n spec.options = Object.keys(subscriptionOptions).length > 0 ? subscriptionOptions : undefined;\n }\n });\n }\n});\n\n/**\n * Handles updating the input for a trigger.\n * Prompts for confirmation if input is not provided, then updates the input if confirmed.\n */\nconst updateInput = Effect.fn(function* (\n trigger: Trigger.Trigger,\n fn: Operation.PersistentOperation,\n inputOption: Option.Option<Record<string, any>>,\n) {\n const currentInput = trigger.input as Record<string, any> | undefined;\n const currentInputStr = currentInput ? JSON.stringify(currentInput) : 'none';\n const shouldChangeInput = yield* Option.match(inputOption, {\n onNone: () =>\n Effect.gen(function* () {\n yield* Console.log(`Current input: ${currentInputStr}`);\n return yield* Prompt.confirm({\n message: 'Change input?',\n initial: false,\n }).pipe(Prompt.run);\n }),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeInput) {\n const inputObj = yield* Option.match(inputOption, {\n onNone: () =>\n promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined, currentInput),\n onSome: (value) => Effect.succeed(value as Record<string, any>),\n });\n Obj.update(trigger, (trigger) => {\n trigger.input = inputObj;\n });\n }\n});\n\n/**\n * Handles updating the enabled status for a trigger.\n * Prompts for enabled if id is not provided.\n */\nconst updateEnabled = Effect.fn(function* (\n trigger: Trigger.Trigger,\n idOption: Option.Option<string>,\n enabled: boolean,\n) {\n const enabledValue = yield* Option.match(idOption, {\n onNone: () =>\n Prompt.confirm({\n message: 'Enable the trigger?',\n initial: trigger.enabled,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(enabled),\n });\n Obj.update(trigger, (trigger) => {\n trigger.enabled = enabledValue;\n });\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\nimport * as Options from '@effect/cli/Options';\nimport * as Prompt from '@effect/cli/Prompt';\nimport * as Console from 'effect/Console';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { CommandConfig } from '@dxos/cli-util';\nimport { flushAndSync, print, spaceLayer, withTypes } from '@dxos/cli-util';\nimport { Common } from '@dxos/cli-util';\nimport { Operation, Trigger } from '@dxos/compute';\nimport { Database, Filter, JsonSchema, Obj, Ref } from '@dxos/echo';\nimport { EID } from '@dxos/keys';\n\nimport { Cron, Enabled, Input, TriggerId } from '../options';\nimport { printTrigger, promptForSchemaInput, selectFunction, selectTrigger } from '../util';\n\nexport const timer = Command.make(\n 'timer',\n {\n spaceId: Common.spaceId.pipe(Options.optional),\n id: TriggerId.pipe(Options.optional),\n enabled: Enabled,\n functionId: Common.functionId.pipe(Options.optional),\n cron: Cron.pipe(Options.optional),\n input: Input.pipe(Options.optional),\n },\n (options) =>\n Effect.gen(function* () {\n const { json } = yield* CommandConfig;\n\n const triggerId = yield* Option.match(options.id, {\n onNone: () => selectTrigger('timer'),\n onSome: (id) => Effect.succeed(id),\n });\n const dxn = EID.make({ entityId: triggerId });\n const trigger = yield* Database.resolve(Ref.fromURI(dxn), Trigger.Trigger);\n if (!trigger.spec || trigger.spec?.kind !== 'timer') {\n return yield* Effect.fail(new Error(`Invalid trigger type: ${trigger.spec?.kind}`));\n }\n\n const currentFn = yield* updateFunction(trigger, options.functionId);\n yield* updateCron(trigger, options.cron);\n yield* updateInput(trigger, currentFn, options.input);\n yield* updateEnabled(trigger, options.id, options.enabled);\n\n if (json) {\n yield* Console.log(JSON.stringify(trigger, null, 2));\n } else {\n yield* Console.log(print(yield* printTrigger(trigger)));\n }\n\n yield* flushAndSync({ indexes: true });\n }),\n).pipe(\n Command.withDescription('Update a timer trigger.'),\n Command.provide(({ spaceId }) => spaceLayer(spaceId, true)),\n Command.provideEffectDiscard(() => withTypes(Operation.PersistentOperation, Trigger.Trigger)),\n);\n\n/**\n * Handles updating the function for a trigger.\n * Prompts for confirmation if functionId is not provided, then updates the function if confirmed.\n * @returns The current function (either original or newly assigned)\n */\nconst updateFunction = Effect.fn(function* (trigger: Trigger.Trigger, functionIdOption: Option.Option<string>) {\n let currentFn: Operation.PersistentOperation | undefined = trigger.runnable\n ? yield* Database.load(trigger.runnable)\n : undefined;\n if (currentFn && !Obj.instanceOf(Operation.PersistentOperation, currentFn)) {\n currentFn = undefined;\n }\n const currentFunctionName = currentFn ? (currentFn.name ?? currentFn.id) : undefined;\n const shouldChangeFunction = yield* Option.match(functionIdOption, {\n onNone: () =>\n Prompt.confirm({\n message: `Change the function${currentFunctionName ? ` (current: ${currentFunctionName})` : ''}?`,\n initial: false,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeFunction) {\n const functionId = yield* Option.match(functionIdOption, {\n onNone: () => selectFunction(),\n onSome: (id) => Effect.succeed(id),\n });\n const functions = yield* Database.query(Filter.type(Operation.PersistentOperation)).run;\n const foundFn = functions.find((fn) => fn.id === functionId);\n if (!foundFn || !Obj.instanceOf(Operation.PersistentOperation, foundFn)) {\n return yield* Effect.fail(new Error(`Function not found: ${functionId}`));\n }\n Obj.update(trigger, (trigger) => {\n trigger.runnable = Ref.make(foundFn);\n });\n currentFn = foundFn;\n }\n\n if (!currentFn) {\n const runnableId = trigger.runnable?.uri.toString() ?? 'unknown';\n return yield* Effect.fail(new Error(`Invalid reference for ${runnableId}`));\n }\n\n return currentFn;\n});\n\n/**\n * Handles updating the cron expression for a timer trigger.\n * Prompts for confirmation if cron is not provided, then updates the cron if confirmed.\n */\nconst updateCron = Effect.fn(function* (trigger: Trigger.Trigger, cronOption: Option.Option<string>) {\n const currentCron = trigger.spec?.kind === 'timer' ? trigger.spec.cron : undefined;\n const shouldChangeCron = yield* Option.match(cronOption, {\n onNone: () =>\n Prompt.confirm({\n message: `Change the cron expression${currentCron ? ` (current: ${currentCron})` : ''}?`,\n initial: false,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeCron) {\n const cron = yield* Option.match(cronOption, {\n onNone: () =>\n Prompt.text({\n message: `Enter cron expression${currentCron ? ` (current: ${currentCron})` : ''}:`,\n }).pipe(Prompt.run),\n onSome: (value) => Effect.succeed(value),\n });\n Obj.update(trigger, (trigger) => {\n if (trigger.spec?.kind === 'timer') {\n trigger.spec.cron = cron;\n }\n });\n }\n});\n\n/**\n * Handles updating the input for a trigger.\n * Prompts for confirmation if input is not provided, then updates the input if confirmed.\n */\nconst updateInput = Effect.fn(function* (\n trigger: Trigger.Trigger,\n fn: Operation.PersistentOperation,\n inputOption: Option.Option<Record<string, any>>,\n) {\n const currentInput = trigger.input as Record<string, any> | undefined;\n const currentInputStr = currentInput ? JSON.stringify(currentInput) : 'none';\n const shouldChangeInput = yield* Option.match(inputOption, {\n onNone: () =>\n Effect.gen(function* () {\n yield* Console.log(`Current input: ${currentInputStr}`);\n return yield* Prompt.confirm({\n message: 'Change input?',\n initial: false,\n }).pipe(Prompt.run);\n }),\n onSome: () => Effect.succeed(true),\n });\n if (shouldChangeInput) {\n const inputObj = yield* Option.match(inputOption, {\n onNone: () =>\n promptForSchemaInput(fn.inputSchema ? JsonSchema.toEffectSchema(fn.inputSchema) : undefined, currentInput),\n onSome: (value) => Effect.succeed(value as Record<string, any>),\n });\n Obj.update(trigger, (trigger) => {\n trigger.input = inputObj;\n });\n }\n});\n\n/**\n * Handles updating the enabled status for a trigger.\n * Prompts for enabled if id is not provided.\n */\nconst updateEnabled = Effect.fn(function* (\n trigger: Trigger.Trigger,\n idOption: Option.Option<string>,\n enabled: boolean,\n) {\n const enabledValue = yield* Option.match(idOption, {\n onNone: () =>\n Prompt.confirm({\n message: 'Enable the trigger?',\n initial: trigger.enabled,\n }).pipe(Prompt.run),\n onSome: () => Effect.succeed(enabled),\n });\n Obj.update(trigger, (trigger) => {\n trigger.enabled = enabledValue;\n });\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\n\nimport { feed } from './feed';\nimport { subscription } from './subscription';\nimport { timer } from './timer';\n\nexport const update = Command.make('update').pipe(\n Command.withDescription('Update a trigger.'),\n Command.withSubcommands([subscription, timer, feed]),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Command from '@effect/cli/Command';\n\nimport { create } from './create';\nimport { list } from './list';\nimport { remove } from './remove';\nimport { update } from './update';\n\n// TODO(wittjosiah): Rename to automation to align with Composer?\nexport const trigger = Command.make('trigger').pipe(\n Command.withDescription('Manage EDGE triggers.'),\n Command.withSubcommands([create, list, remove, update]),\n);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { ActivationEvent, ActivationEvents, Plugin } from '@dxos/app-framework';\nimport { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';\nimport { Operation, Routine, Trace, Trigger } from '@dxos/compute';\nimport { ClientEvents } from '@dxos/plugin-client';\n\nimport {\n AppGraphBuilder,\n LayerSpecs,\n OperationHandler,\n RegistrySync,\n Templates,\n TriggerRuntimeController,\n} from '#capabilities';\nimport { meta } from '#meta';\n\nimport { trigger } from './commands';\n\nexport const RoutinePlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addCommandModule({ commands: [trigger] }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addSchemaModule({\n schema: [Routine.Routine, Operation.PersistentOperation, Trigger.Trigger, Trace.Message],\n }),\n // CreateRoutine (in OperationHandler) resolves RoutineCapabilities.Template, so the template\n // provider must be present wherever the handler is exported.\n Plugin.addModule({ id: 'automation-templates', activatesOn: AppActivationEvents.SetupSchema, activate: Templates }),\n Plugin.addModule({\n activatesOn: ActivationEvents.SetupProcessManager,\n activate: LayerSpecs,\n }),\n Plugin.addModule({\n activatesOn: ClientEvents.ClientReady,\n activate: RegistrySync,\n }),\n Plugin.addModule({\n activatesOn: ActivationEvent.allOf(ActivationEvents.ProcessManagerReady, ClientEvents.SpacesReady),\n activate: TriggerRuntimeController,\n }),\n Plugin.make,\n);\n\nexport default RoutinePlugin;\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Plugin } from "@dxos/app-framework";
2
+ import { AppActivationEvents, AppPlugin } from "@dxos/app-toolkit";
3
+ import { Operation, Routine, Trace, Trigger } from "@dxos/compute";
4
+ import { meta } from "#meta";
5
+ import { OperationHandler, Templates } from "#capabilities";
6
+ //#region src/RoutinePlugin.workerd.ts
7
+ var RoutinePlugin = Plugin.define(meta).pipe(AppPlugin.addOperationHandlerModule({ activate: OperationHandler }), AppPlugin.addSchemaModule({ schema: [
8
+ Routine.Routine,
9
+ Operation.PersistentOperation,
10
+ Trigger.Trigger,
11
+ Trace.Message
12
+ ] }), Plugin.addModule({
13
+ id: "automation-templates",
14
+ activatesOn: AppActivationEvents.SetupSchema,
15
+ activate: Templates
16
+ }), Plugin.make);
17
+ //#endregion
18
+ export { RoutinePlugin, RoutinePlugin as default };
19
+
20
+ //# sourceMappingURL=RoutinePlugin.workerd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoutinePlugin.workerd.mjs","names":[],"sources":["../../src/RoutinePlugin.workerd.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';\nimport { Operation, Routine, Trace, Trigger } from '@dxos/compute';\n\nimport { OperationHandler, Templates } from '#capabilities';\nimport { meta } from '#meta';\n\nexport const RoutinePlugin = Plugin.define(meta).pipe(\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addSchemaModule({\n schema: [Routine.Routine, Operation.PersistentOperation, Trigger.Trigger, Trace.Message],\n }),\n // CreateRoutine (in OperationHandler) resolves RoutineCapabilities.Template, so the template\n // provider must be present wherever the handler is exported.\n Plugin.addModule({ id: 'automation-templates', activatesOn: AppActivationEvents.SetupSchema, activate: Templates }),\n Plugin.make,\n);\n\nexport default RoutinePlugin;\n"],"mappings":";;;;;;AAWA,IAAa,gBAAgB,OAAO,OAAO,IAAI,CAAC,CAAC,KAC/C,UAAU,0BAA0B,EAAE,UAAU,iBAAiB,CAAC,GAClE,UAAU,gBAAgB,EACxB,QAAQ;CAAC,QAAQ;CAAS,UAAU;CAAqB,QAAQ;CAAS,MAAM;AAAO,EACzF,CAAC,GAGD,OAAO,UAAU;CAAE,IAAI;CAAwB,aAAa,oBAAoB;CAAa,UAAU;AAAU,CAAC,GAClH,OAAO,IACT"}
@@ -0,0 +1,12 @@
1
+ import { Capability } from "@dxos/app-framework";
2
+ //#region src/capabilities/node.ts
3
+ var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../chunk-app-graph-builder.mjs"));
4
+ var LayerSpecs = Capability.lazy("LayerSpecs", () => import("../chunk-layer-specs.mjs"));
5
+ var OperationHandler = Capability.lazy("OperationHandler", () => import("../chunk-operation-handler.mjs"));
6
+ var RegistrySync = Capability.lazy("RegistrySync", () => import("../chunk-registry-sync.mjs"));
7
+ var Templates = Capability.lazy("Templates", () => import("../chunk-templates.mjs"));
8
+ var TriggerRuntimeController = Capability.lazy("TriggerRuntimeController", () => import("../chunk-trigger-runtime-controller.mjs"));
9
+ //#endregion
10
+ export { AppGraphBuilder, LayerSpecs, OperationHandler, RegistrySync, Templates, TriggerRuntimeController };
11
+
12
+ //# sourceMappingURL=node.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.mjs","names":[],"sources":["../../../src/capabilities/node.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\nimport { OperationHandlerSet } from '@dxos/compute';\n\nexport const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));\nexport const LayerSpecs = Capability.lazy<void, Capability.Any[]>('LayerSpecs', () => import('./layer-specs'));\nexport const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(\n 'OperationHandler',\n () => import('./operation-handler'),\n);\nexport const RegistrySync = Capability.lazy('RegistrySync', () => import('./registry-sync'));\nexport const Templates = Capability.lazy('Templates', () => import('./templates'));\nexport const TriggerRuntimeController = Capability.lazy(\n 'TriggerRuntimeController',\n () => import('./trigger-runtime-controller'),\n);\n"],"mappings":";;AAOA,IAAa,kBAAkB,WAAW,KAAK,yBAAyB,OAAO,iCAAsB;AACrG,IAAa,aAAa,WAAW,KAA6B,oBAAoB,OAAO,2BAAgB;AAC7G,IAAa,mBAAmB,WAAW,KACzC,0BACM,OAAO,iCACf;AACA,IAAa,eAAe,WAAW,KAAK,sBAAsB,OAAO,6BAAkB;AAC3F,IAAa,YAAY,WAAW,KAAK,mBAAmB,OAAO,yBAAc;AACjF,IAAa,2BAA2B,WAAW,KACjD,kCACM,OAAO,0CACf"}
@@ -0,0 +1,14 @@
1
+ import { Capability } from "@dxos/app-framework";
2
+ //#region src/capabilities/index.ts
3
+ var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("./chunk-app-graph-builder.mjs"));
4
+ var CreateObject = Capability.lazy("CreateObject", () => import("./chunk-create-object.mjs"));
5
+ var LayerSpecs = Capability.lazy("LayerSpecs", () => import("./chunk-layer-specs.mjs"));
6
+ var OperationHandler = Capability.lazy("OperationHandler", () => import("./chunk-operation-handler.mjs"));
7
+ var ReactSurface = Capability.lazy("ReactSurface", () => import("./chunk-react-surface.mjs"));
8
+ var RegistrySync = Capability.lazy("RegistrySync", () => import("./chunk-registry-sync.mjs"));
9
+ var Templates = Capability.lazy("Templates", () => import("./chunk-templates.mjs"));
10
+ var TriggerRuntimeController = Capability.lazy("TriggerRuntimeController", () => import("./chunk-trigger-runtime-controller.mjs"));
11
+ //#endregion
12
+ export { AppGraphBuilder, CreateObject, LayerSpecs, OperationHandler, ReactSurface, RegistrySync, Templates, TriggerRuntimeController };
13
+
14
+ //# sourceMappingURL=capabilities.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.mjs","names":[],"sources":["../../src/capabilities/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\nimport { OperationHandlerSet } from '@dxos/compute';\n\nexport const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));\nexport const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));\nexport const LayerSpecs = Capability.lazy<void, Capability.Any[]>('LayerSpecs', () => import('./layer-specs'));\nexport const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(\n 'OperationHandler',\n () => import('./operation-handler'),\n);\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\nexport const RegistrySync = Capability.lazy('RegistrySync', () => import('./registry-sync'));\nexport const Templates = Capability.lazy('Templates', () => import('./templates'));\nexport const TriggerRuntimeController = Capability.lazy(\n 'TriggerRuntimeController',\n () => import('./trigger-runtime-controller'),\n);\n"],"mappings":";;AAOA,IAAa,kBAAkB,WAAW,KAAK,yBAAyB,OAAO,gCAAsB;AACrG,IAAa,eAAe,WAAW,KAAK,sBAAsB,OAAO,4BAAkB;AAC3F,IAAa,aAAa,WAAW,KAA6B,oBAAoB,OAAO,0BAAgB;AAC7G,IAAa,mBAAmB,WAAW,KACzC,0BACM,OAAO,gCACf;AACA,IAAa,eAAe,WAAW,KAAK,sBAAsB,OAAO,4BAAkB;AAC3F,IAAa,eAAe,WAAW,KAAK,sBAAsB,OAAO,4BAAkB;AAC3F,IAAa,YAAY,WAAW,KAAK,mBAAmB,OAAO,wBAAc;AACjF,IAAa,2BAA2B,WAAW,KACjD,kCACM,OAAO,yCACf"}
@@ -0,0 +1,79 @@
1
+ import { meta } from "#meta";
2
+ import { Obj, Ref } from "@dxos/echo";
3
+ import { useCallback, useContext, useMemo } from "react";
4
+ import { useObject } from "@dxos/echo-react";
5
+ import { Panel } from "@dxos/react-ui";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
8
+ import { RoutineOperation } from "#types";
9
+ import { Atom, RegistryContext } from "@effect-atom/atom-react";
10
+ import { RoutineForm } from "#components";
11
+ import { Menu, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
12
+ //#region src/containers/RoutineArticle/RoutineArticle.tsx
13
+ /**
14
+ * Article surface for a {@link Routine}. The form edits the live routine in place; each trigger's on/off state
15
+ * is toggled inline in the trigger editor. The toolbar exposes Run.
16
+ *
17
+ * TODO(wittjosiah): Disable editing while the routine is running (you shouldn't mutate running code). This was
18
+ * previously wired as "read-only when enabled" via a routine-level toggle, but that is not how we want to
19
+ * achieve it — reintroduce a run-state-based lock instead.
20
+ */
21
+ var RoutineArticle = ({ role, attendableId, subject }) => {
22
+ const { invokePromise } = useOperationInvoker();
23
+ const registry = useContext(RegistryContext);
24
+ const [routine] = useObject(subject);
25
+ const db = Obj.getDatabase(subject);
26
+ const runningAtom = useMemo(() => Atom.make(false), []);
27
+ const menuActions = useArticleMenuActions({
28
+ canRun: useMemo(() => Boolean(routine.spec) && routine.triggers.length > 0, [routine.spec, routine.triggers]),
29
+ runningAtom,
30
+ handleRun: useCallback(() => {
31
+ if (!invokePromise || !db) return;
32
+ const triggerRef = routine.triggers[0];
33
+ registry.set(runningAtom, true);
34
+ invokePromise(RoutineOperation.RunRoutine, { routine: Ref.make(subject) }, {
35
+ spaceId: db.spaceId,
36
+ notify: { error: ["run-error.message", { ns: meta.profile.key }] },
37
+ ...triggerRef ? { tracing: { trigger: triggerRef } } : {}
38
+ }).finally(() => registry.set(runningAtom, false));
39
+ }, [
40
+ invokePromise,
41
+ db,
42
+ subject,
43
+ routine,
44
+ registry,
45
+ runningAtom
46
+ ])
47
+ });
48
+ if (!db) return null;
49
+ return /* @__PURE__ */ jsx(Menu.Root, {
50
+ ...menuActions,
51
+ attendableId,
52
+ children: /* @__PURE__ */ jsxs(Panel.Root, {
53
+ role,
54
+ children: [/* @__PURE__ */ jsx(Panel.Toolbar, { children: /* @__PURE__ */ jsx(Menu.Toolbar, { classNames: "dx-document" }) }), /* @__PURE__ */ jsx(Panel.Content, {
55
+ asChild: true,
56
+ children: /* @__PURE__ */ jsx(RoutineForm, {
57
+ db,
58
+ routine: subject
59
+ })
60
+ })]
61
+ })
62
+ });
63
+ };
64
+ var useArticleMenuActions = ({ canRun, runningAtom, handleRun }) => useMenuBuilder((get) => MenuBuilder.make().action("run", {
65
+ label: ["run.label", { ns: meta.profile.key }],
66
+ icon: "ph--play--regular",
67
+ disabled: get(runningAtom) || !canRun,
68
+ disposition: "toolbar",
69
+ testId: "routine.toolbar.run"
70
+ }, () => handleRun()).build(), [
71
+ canRun,
72
+ handleRun,
73
+ runningAtom
74
+ ]);
75
+ RoutineArticle.displayName = "RoutineArticle";
76
+ //#endregion
77
+ export { RoutineArticle as default };
78
+
79
+ //# sourceMappingURL=chunk-RoutineArticle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-RoutineArticle.mjs","names":[],"sources":["../../src/containers/RoutineArticle/RoutineArticle.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Routine } from '@dxos/compute';\nimport { Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { Panel } from '@dxos/react-ui';\nimport { Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';\n\nimport { RoutineForm } from '#components';\nimport { meta } from '#meta';\nimport { RoutineOperation } from '#types';\n\nexport type RoutineArticleProps = AppSurface.ObjectArticleProps<Routine.Routine>;\n\n/**\n * Article surface for a {@link Routine}. The form edits the live routine in place; each trigger's on/off state\n * is toggled inline in the trigger editor. The toolbar exposes Run.\n *\n * TODO(wittjosiah): Disable editing while the routine is running (you shouldn't mutate running code). This was\n * previously wired as \"read-only when enabled\" via a routine-level toggle, but that is not how we want to\n * achieve it — reintroduce a run-state-based lock instead.\n */\nexport const RoutineArticle = ({ role, attendableId, subject }: RoutineArticleProps) => {\n const { invokePromise } = useOperationInvoker();\n const registry = useContext(RegistryContext);\n // Subscribe so the run affordance tracks the routine's action (`spec`).\n const [routine] = useObject(subject);\n const db = Obj.getDatabase(subject);\n\n const runningAtom = useMemo(() => Atom.make(false), []);\n\n // Require both a spec and at least one trigger: manual runs are attributed to the first trigger\n // so they appear in history, and without a trigger the run would be invisible there.\n const canRun = useMemo(() => Boolean(routine.spec) && routine.triggers.length > 0, [routine.spec, routine.triggers]);\n\n const handleRun = useCallback(() => {\n if (!invokePromise || !db) {\n return;\n }\n\n // Thread the routine's first trigger as trace attribution so the run appears in history.\n // Manual runs bypass the trigger dispatcher (which normally stamps meta.trigger), so we\n // do it here — history filters on trigger entity id, and without this the run is invisible.\n const triggerRef = routine.triggers[0];\n registry.set(runningAtom, true);\n void invokePromise(\n RoutineOperation.RunRoutine,\n { routine: Ref.make(subject) },\n {\n spaceId: db.spaceId,\n notify: { error: ['run-error.message', { ns: meta.profile.key }] },\n ...(triggerRef ? { tracing: { trigger: triggerRef } } : {}),\n },\n ).finally(() => registry.set(runningAtom, false));\n }, [invokePromise, db, subject, routine, registry, runningAtom]);\n\n const menuActions = useArticleMenuActions({ canRun, runningAtom, handleRun });\n\n if (!db) {\n return null;\n }\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Panel.Root role={role}>\n <Panel.Toolbar>\n <Menu.Toolbar classNames='dx-document' />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <RoutineForm db={db} routine={subject} />\n </Panel.Content>\n </Panel.Root>\n </Menu.Root>\n );\n};\n\n//\n// Hooks\n//\n\ntype ArticleMenuActionsOptions = {\n canRun: boolean;\n runningAtom: Atom.Writable<boolean>;\n handleRun: () => void;\n};\n\nconst useArticleMenuActions = ({ canRun, runningAtom, handleRun }: ArticleMenuActionsOptions) =>\n useMenuBuilder(\n (get) =>\n MenuBuilder.make()\n .action(\n 'run',\n {\n label: ['run.label', { ns: meta.profile.key }],\n icon: 'ph--play--regular',\n disabled: get(runningAtom) || !canRun,\n disposition: 'toolbar',\n testId: 'routine.toolbar.run',\n },\n () => handleRun(),\n )\n .build(),\n [canRun, handleRun, runningAtom],\n );\n\nRoutineArticle.displayName = 'RoutineArticle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA6BA,IAAa,kBAAkB,EAAE,MAAM,cAAc,cAAmC;CACtF,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,WAAW,WAAW,eAAe;CAE3C,MAAM,CAAC,WAAW,UAAU,OAAO;CACnC,MAAM,KAAK,IAAI,YAAY,OAAO;CAElC,MAAM,cAAc,cAAc,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC;CA2BtD,MAAM,cAAc,sBAAsB;EAAE,QAvB7B,cAAc,QAAQ,QAAQ,IAAI,KAAK,QAAQ,SAAS,SAAS,GAAG,CAAC,QAAQ,MAAM,QAAQ,QAAQ,CAuBtE;EAAQ;EAAa,WArB/C,kBAAkB;GAClC,IAAI,CAAC,iBAAiB,CAAC,IACrB;GAMF,MAAM,aAAa,QAAQ,SAAS;GACpC,SAAS,IAAI,aAAa,IAAI;GAC9B,cACE,iBAAiB,YACjB,EAAE,SAAS,IAAI,KAAK,OAAO,EAAE,GAC7B;IACE,SAAS,GAAG;IACZ,QAAQ,EAAE,OAAO,CAAC,qBAAqB,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,EAAE;IACjE,GAAI,aAAa,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,IAAI,CAAC;GAC3D,CACF,CAAC,CAAC,cAAc,SAAS,IAAI,aAAa,KAAK,CAAC;EAClD,GAAG;GAAC;GAAe;GAAI;GAAS;GAAS;GAAU;EAAW,CAEG;CAAU,CAAC;CAE5E,IAAI,CAAC,IACH,OAAO;CAGT,OACE,oBAAC,KAAK,MAAN;EAAW,GAAI;EAA2B;YACxC,qBAAC,MAAM,MAAP;GAAkB;aAAlB,CACE,oBAAC,MAAM,SAAP,EAAA,UACE,oBAAC,KAAK,SAAN,EAAc,YAAW,cAAe,CAAA,EAC3B,CAAA,GACf,oBAAC,MAAM,SAAP;IAAe,SAAA;cACb,oBAAC,aAAD;KAAiB;KAAI,SAAS;IAAU,CAAA;GAC3B,CAAA,CACL;;CACH,CAAA;AAEf;AAYA,IAAM,yBAAyB,EAAE,QAAQ,aAAa,gBACpD,gBACG,QACC,YAAY,KAAK,CAAA,CACd,OACC,OACA;CACE,OAAO,CAAC,aAAa,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC;CAC7C,MAAM;CACN,UAAU,IAAI,WAAW,KAAK,CAAC;CAC/B,aAAa;CACb,QAAQ;AACV,SACM,UAAU,CAClB,CAAA,CACC,MAAM,GACX;CAAC;CAAQ;CAAW;AAAW,CACjC;AAEF,eAAe,cAAc"}
@@ -0,0 +1,192 @@
1
+ import { a as connectedRoutinesQuery } from "./chunk-util.mjs";
2
+ import { Routine } from "@dxos/compute";
3
+ import { meta } from "#meta";
4
+ import { Database, Filter, Obj, Type } from "@dxos/echo";
5
+ import * as Effect from "effect/Effect";
6
+ import { EffectEx } from "@dxos/effect";
7
+ import { useCallback, useMemo, useRef, useState } from "react";
8
+ import { useQuery } from "@dxos/echo-react";
9
+ import { Panel, ScrollArea, useTranslation } from "@dxos/react-ui";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { MasterDetail } from "@dxos/react-ui-list";
12
+ import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
13
+ import { RoutineCapabilities } from "#types";
14
+ import { SpaceOperation } from "@dxos/plugin-space";
15
+ import { RoutineForm } from "#components";
16
+ import { Atom } from "@effect-atom/atom";
17
+ import { Menu, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
18
+ //#region src/containers/RoutineCompanion/RoutineCompanion.tsx
19
+ /**
20
+ * Per-object companion: a master-detail list of automations connected to the object, via
21
+ * {@link connectedRoutinesQuery} (covers both trigger-input and instructions-context paths).
22
+ *
23
+ * The list is session-stable: a routine seen connected stays listed even after it loses its association
24
+ * (flagged with a 'detached' adornment) so it doesn't vanish mid-edit. The toolbar create menu offers a
25
+ * template picker (contributed via {@link RoutineCapabilities.Template}, filtered by `appliesTo`); each
26
+ * template's `scaffold` returns a fully-wired in-memory routine graph, shown editable in {@link RoutineForm}
27
+ * and committed on Save with a single `Database.add` (which cascades the owned children). Existing routines
28
+ * are edited in place.
29
+ */
30
+ var RoutineCompanion = ({ subject: object, attendableId }) => {
31
+ const db = Obj.getDatabase(object);
32
+ const { t } = useTranslation(meta.profile.key);
33
+ const { invokePromise } = useOperationInvoker();
34
+ const { items, statusFor } = useConnectedRoutines(db, object);
35
+ const [selectedId, setSelectedId] = useState();
36
+ const [draft, setDraft] = useState();
37
+ const [savedRoutine, setSavedRoutine] = useState();
38
+ const selected = useMemo(() => items.find((routine) => routine.id === selectedId) ?? savedRoutine, [
39
+ items,
40
+ selectedId,
41
+ savedRoutine
42
+ ]);
43
+ const handleSelect = useCallback((id) => {
44
+ if (draft) return;
45
+ setSavedRoutine(void 0);
46
+ setSelectedId(id);
47
+ }, [draft]);
48
+ const handleCreateFromTemplate = useCallback(async (template) => {
49
+ if (!db) return;
50
+ const scaffolded = await EffectEx.runPromise(template.scaffold({ subject: object }).pipe(Effect.provideService(Database.Service, Database.makeService(db))));
51
+ setSavedRoutine(void 0);
52
+ setSelectedId(void 0);
53
+ setDraft(scaffolded);
54
+ }, [db, object]);
55
+ const allTemplates = useCapabilities(RoutineCapabilities.Template);
56
+ const menuActions = useCompanionMenuActions({
57
+ t,
58
+ templates: useMemo(() => allTemplates.filter((template) => template.appliesTo?.(object) ?? true), [allTemplates, object]),
59
+ draft,
60
+ handleCreateFromTemplate
61
+ });
62
+ const handleCancel = useCallback(() => {
63
+ setDraft(void 0);
64
+ }, []);
65
+ const handleSave = useCallback(async () => {
66
+ if (!draft || !db) return;
67
+ const persistedRoutine = db.add(draft);
68
+ await db.flush();
69
+ setSelectedId(persistedRoutine.id);
70
+ setSavedRoutine(persistedRoutine);
71
+ setDraft(void 0);
72
+ }, [draft, db]);
73
+ const getMenu = useGetMenu({
74
+ t,
75
+ handleDelete: useCallback((routine) => {
76
+ if (!db) return;
77
+ setSavedRoutine((current) => current?.id === routine.id ? void 0 : current);
78
+ setSelectedId((current) => current === routine.id ? void 0 : current);
79
+ invokePromise?.(SpaceOperation.RemoveObjects, { objects: [routine] }, { spaceId: db.spaceId });
80
+ }, [invokePromise, db])
81
+ });
82
+ const getIcon = useCallback((get, routine) => {
83
+ const { icon, hue } = Obj.getIcon(routine) ?? {
84
+ icon: "ph--lightning--regular",
85
+ hue: void 0
86
+ };
87
+ const { enabled } = get(routineEnabled(routine));
88
+ return {
89
+ icon,
90
+ hue: enabled ? hue : void 0
91
+ };
92
+ }, []);
93
+ const getLabel = useCallback((get, routine) => get(Obj.labelAtom(routine)) || t("object-name.placeholder", { ns: Type.getTypename(Routine.Routine) }) || "", [t]);
94
+ const getAdornment = useCallback((_get, routine) => statusFor(routine.id) === "detached" ? {
95
+ icon: "ph--warning--regular",
96
+ label: t("routine-detached.message")
97
+ } : void 0, [statusFor, t]);
98
+ if (!db) return null;
99
+ const shown = draft ?? selected;
100
+ const detail = shown ? /* @__PURE__ */ jsx(RoutineForm, {
101
+ db,
102
+ routine: shown,
103
+ onSave: draft ? () => void handleSave() : void 0,
104
+ onCancel: draft ? handleCancel : void 0
105
+ }, shown.id) : null;
106
+ return /* @__PURE__ */ jsx(Menu.Root, {
107
+ ...menuActions,
108
+ attendableId,
109
+ children: /* @__PURE__ */ jsxs(Panel.Root, { children: [/* @__PURE__ */ jsx(Panel.Toolbar, { children: /* @__PURE__ */ jsx(Menu.Toolbar, { classNames: "dx-document" }) }), /* @__PURE__ */ jsx(Panel.Content, {
110
+ asChild: true,
111
+ classNames: "pt-trim-md",
112
+ children: /* @__PURE__ */ jsx(ScrollArea.Root, { children: /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(MasterDetail, {
113
+ classNames: "dx-document",
114
+ items,
115
+ selectedId,
116
+ detail,
117
+ onSelect: handleSelect,
118
+ getMenu,
119
+ getIcon,
120
+ getLabel,
121
+ getAdornment,
122
+ emptyLabel: t("no-routines.message")
123
+ }) }) })
124
+ })] })
125
+ });
126
+ };
127
+ /**
128
+ * The companion's automation list, session-stable and frozen against disconnection: routines connected to the
129
+ * object via {@link connectedRoutinesQuery} (trigger-input and instructions-context paths unified) are
130
+ * accumulated append-only so rows never reorder, and a routine that leaves the connected set stays in the list
131
+ * (flagged `detached` via {@link statusFor}) rather than vanishing mid-edit — only a hard-deleted routine drops
132
+ * out. Detached rows are resolved from the space's full routine set since the connected query no longer returns
133
+ * them. A freshly-saved routine appears once the query reflects it.
134
+ */
135
+ var useConnectedRoutines = (db, object) => {
136
+ const connected = useQuery(db, connectedRoutinesQuery(object));
137
+ const connectedIds = useMemo(() => new Set(connected.map((routine) => routine.id)), [connected]);
138
+ const all = useQuery(db, Filter.type(Routine.Routine));
139
+ const byId = useMemo(() => new Map(all.map((routine) => [routine.id, routine])), [all]);
140
+ const seenOrder = useRef([]);
141
+ const seenForObject = useRef(object.id);
142
+ if (seenForObject.current !== object.id) {
143
+ seenForObject.current = object.id;
144
+ seenOrder.current = [];
145
+ }
146
+ for (const id of connectedIds) if (!seenOrder.current.includes(id)) seenOrder.current.push(id);
147
+ return {
148
+ items: useMemo(() => seenOrder.current.flatMap((id) => byId.has(id) ? [byId.get(id)] : []), [byId, connectedIds]),
149
+ statusFor: useCallback((id) => connectedIds.has(id) ? "associated" : "detached", [connectedIds])
150
+ };
151
+ };
152
+ /**
153
+ * Reactive family for a routine's on/off state — subscribes (via `get`) to its triggers' `enabled` flags so the
154
+ * row icon re-derives when a flag flips. Keyed by the routine instance.
155
+ */
156
+ var routineEnabled = Atom.family((routine) => Atom.make((get) => {
157
+ const triggers = get(Obj.atomProperty(routine, "triggers"));
158
+ const hasTriggers = triggers.length > 0;
159
+ return {
160
+ hasTriggers,
161
+ enabled: hasTriggers && triggers.every((ref) => get(Obj.atomProperty(ref, "enabled")) === true)
162
+ };
163
+ }));
164
+ var useGetMenu = ({ t, handleDelete }) => useCallback((_get, routine) => MenuBuilder.make().action("delete", {
165
+ label: t("delete.label"),
166
+ icon: "ph--trash--regular",
167
+ testId: "routine.companion.delete"
168
+ }, () => handleDelete(routine)).build(), [t, handleDelete]);
169
+ var useCompanionMenuActions = ({ t, templates, draft, handleCreateFromTemplate }) => useMenuBuilder(() => MenuBuilder.make().separator("gap").group("create", {
170
+ variant: "dropdownMenu",
171
+ label: t("add-routine.label"),
172
+ icon: "ph--plus--regular",
173
+ iconOnly: true,
174
+ caretDown: false,
175
+ disabled: draft != null || templates.length === 0,
176
+ testId: "routine.companion.create"
177
+ }, (group) => {
178
+ for (const template of templates) group.action(template.id, {
179
+ label: template.label,
180
+ icon: template.icon ?? "ph--lightning--regular"
181
+ }, () => void handleCreateFromTemplate(template));
182
+ }).build(), [
183
+ t,
184
+ templates,
185
+ draft,
186
+ handleCreateFromTemplate
187
+ ]);
188
+ RoutineCompanion.displayName = "RoutineCompanion";
189
+ //#endregion
190
+ export { RoutineCompanion, RoutineCompanion as default };
191
+
192
+ //# sourceMappingURL=chunk-RoutineCompanion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-RoutineCompanion.mjs","names":[],"sources":["../../src/containers/RoutineCompanion/RoutineCompanion.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom';\nimport * as Effect from 'effect/Effect';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Routine } from '@dxos/compute';\nimport { Database, Filter, Obj, Type } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { EffectEx } from '@dxos/effect';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { Panel, ScrollArea, useTranslation } from '@dxos/react-ui';\nimport { MasterDetail, type MasterDetailAdornment, type MasterDetailIcon } from '@dxos/react-ui-list';\nimport { type ActionGraphProps, Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';\n\nimport { RoutineForm } from '#components';\nimport { meta } from '#meta';\nimport { RoutineCapabilities } from '#types';\n\nimport { connectedRoutinesQuery } from '../../util';\n\n/** Association state of a row relative to the companion's object. */\ntype Status = 'associated' | 'detached';\n\nexport type RoutineCompanionProps = AppSurface.ObjectArticleProps<Obj.Unknown>;\n\n/**\n * Per-object companion: a master-detail list of automations connected to the object, via\n * {@link connectedRoutinesQuery} (covers both trigger-input and instructions-context paths).\n *\n * The list is session-stable: a routine seen connected stays listed even after it loses its association\n * (flagged with a 'detached' adornment) so it doesn't vanish mid-edit. The toolbar create menu offers a\n * template picker (contributed via {@link RoutineCapabilities.Template}, filtered by `appliesTo`); each\n * template's `scaffold` returns a fully-wired in-memory routine graph, shown editable in {@link RoutineForm}\n * and committed on Save with a single `Database.add` (which cascades the owned children). Existing routines\n * are edited in place.\n */\nexport const RoutineCompanion = ({ subject: object, attendableId }: RoutineCompanionProps) => {\n // A non-persisted subject has no database; `db` may be undefined. Every hook below tolerates that, and the\n // render is guarded after the last hook (see below) so hook order is identical across renders either way.\n const db = Obj.getDatabase(object);\n\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const { items, statusFor } = useConnectedRoutines(db, object);\n\n const [selectedId, setSelectedId] = useState<string | undefined>();\n const [draft, setDraft] = useState<Routine.Routine | undefined>();\n // After saving a draft, hold the persisted routine directly so the detail panel renders immediately\n // before the reactive queries catch up to include the newly-connected routine.\n const [savedRoutine, setSavedRoutine] = useState<Routine.Routine | undefined>();\n const selected = useMemo(\n () => items.find((routine) => routine.id === selectedId) ?? savedRoutine,\n [items, selectedId, savedRoutine],\n );\n\n const handleSelect = useCallback(\n (id: string | undefined) => {\n // Ignore selection changes while a draft is active — the edit (or create) must be saved or cancelled first.\n if (draft) {\n return;\n }\n setSavedRoutine(undefined);\n setSelectedId(id);\n },\n [draft],\n );\n\n const handleCreateFromTemplate = useCallback(\n async (template: RoutineCapabilities.Template) => {\n if (!db) {\n return;\n }\n\n // The scaffold returns a fully-wired in-memory routine draft graph (its owned trigger/instructions\n // bound and parented); nothing is persisted until Save.\n const scaffolded = await EffectEx.runPromise(\n template.scaffold({ subject: object }).pipe(Effect.provideService(Database.Service, Database.makeService(db))),\n );\n\n setSavedRoutine(undefined);\n setSelectedId(undefined);\n setDraft(scaffolded);\n },\n [db, object],\n );\n\n // Templates filtered to those applicable to this companion's subject.\n const allTemplates = useCapabilities(RoutineCapabilities.Template);\n const templates = useMemo(\n () => allTemplates.filter((template) => template.appliesTo?.(object) ?? true),\n [allTemplates, object],\n );\n\n // Toolbar create menu: a `+` dropdown of applicable templates, pushed to the trailing edge by a growing gap\n // separator (disabled while a draft is in progress so it can't be silently replaced).\n const menuActions = useCompanionMenuActions({ t, templates, draft, handleCreateFromTemplate });\n\n const handleCancel = useCallback(() => {\n // Draft was never persisted, nothing to clean up.\n setDraft(undefined);\n }, []);\n\n const handleSave = useCallback(async () => {\n if (!draft || !db) {\n return;\n }\n\n // The draft is a fully-wired graph (see `makeRoutine`); a single add cascades the owned trigger and\n // instructions, and the subject carried in the instructions' `objects` is the structural connection the\n // query finds.\n const persistedRoutine = db.add(draft);\n await db.flush();\n setSelectedId(persistedRoutine.id);\n // Provide the persisted routine directly so the detail panel renders before the reactive queries\n // catch up to include the newly-connected routine.\n setSavedRoutine(persistedRoutine);\n setDraft(undefined);\n }, [draft, db]);\n\n const handleDelete = useCallback(\n (routine: Routine.Routine) => {\n if (!db) {\n return;\n }\n\n setSavedRoutine((current) => (current?.id === routine.id ? undefined : current));\n setSelectedId((current) => (current === routine.id ? undefined : current));\n // Route through the space operation so the deletion is undoable (toast + RestoreObjects), rather than\n // mutating the database directly.\n void invokePromise?.(SpaceOperation.RemoveObjects, { objects: [routine] }, { spaceId: db.spaceId });\n },\n [invokePromise, db],\n );\n\n // Per-row overflow menu: delete. (A routine's on/off state is toggled per-trigger inline in the form,\n // not from the list.)\n const getMenu = useGetMenu({ t, handleDelete });\n\n // Row icon, reactive per row: an enabled routine takes its type's hue (amber); disabled uses the default\n // icon colour. Subscribes (via `get`) only to this routine's triggers' `enabled` flags.\n const getIcon = useCallback((get: Atom.Context, routine: Routine.Routine): MasterDetailIcon => {\n const { icon, hue } = Obj.getIcon(routine) ?? { icon: 'ph--lightning--regular', hue: undefined };\n const { enabled } = get(routineEnabled(routine));\n return { icon, hue: enabled ? hue : undefined };\n }, []);\n\n // Row label, reactive per row via the object's label atom, so a rename updates the row live.\n const getLabel = useCallback(\n (get: Atom.Context, routine: Routine.Routine): string =>\n get(Obj.labelAtom(routine)) || t('object-name.placeholder', { ns: Type.getTypename(Routine.Routine) }) || '',\n [t],\n );\n\n // Trailing adornment: a warning badge on a row whose routine has left the connected set (it stays in the\n // session-stable list — see {@link useConnectedRoutines} — rather than disappearing while still selected/edited).\n const getAdornment = useCallback(\n (_get: Atom.Context, routine: Routine.Routine): MasterDetailAdornment | undefined =>\n statusFor(routine.id) === 'detached'\n ? { icon: 'ph--warning--regular', label: t('routine-detached.message') }\n : undefined,\n [statusFor, t],\n );\n\n // Render guard placed after every hook so hook order stays stable: a non-persisted subject (no database)\n // has nothing to list.\n if (!db) {\n return null;\n }\n\n // One form for both flows. A selected (persisted) routine is edited in place. The create-from-template draft\n // is the only Save/Cancel flow: an in-memory routine shown editable, discarded on Cancel and persisted by a\n // single `Database.add` on Save. The `key` (the routine id) remounts the uncontrolled form when the shown\n // routine changes; the draft carries a fresh id, so no edits leak between rows.\n const shown = draft ?? selected;\n const detail = shown ? (\n <RoutineForm\n key={shown.id}\n db={db}\n routine={shown}\n onSave={draft ? () => void handleSave() : undefined}\n onCancel={draft ? handleCancel : undefined}\n />\n ) : null;\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Panel.Root>\n <Panel.Toolbar>\n <Menu.Toolbar classNames='dx-document' />\n </Panel.Toolbar>\n <Panel.Content asChild classNames='pt-trim-md'>\n <ScrollArea.Root>\n <ScrollArea.Viewport>\n <MasterDetail<Routine.Routine>\n classNames='dx-document'\n items={items}\n selectedId={selectedId}\n detail={detail}\n onSelect={handleSelect}\n getMenu={getMenu}\n getIcon={getIcon}\n getLabel={getLabel}\n getAdornment={getAdornment}\n emptyLabel={t('no-routines.message')}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Panel.Content>\n </Panel.Root>\n </Menu.Root>\n );\n};\n\n//\n// Hooks\n//\n\n/**\n * The companion's automation list, session-stable and frozen against disconnection: routines connected to the\n * object via {@link connectedRoutinesQuery} (trigger-input and instructions-context paths unified) are\n * accumulated append-only so rows never reorder, and a routine that leaves the connected set stays in the list\n * (flagged `detached` via {@link statusFor}) rather than vanishing mid-edit — only a hard-deleted routine drops\n * out. Detached rows are resolved from the space's full routine set since the connected query no longer returns\n * them. A freshly-saved routine appears once the query reflects it.\n */\nconst useConnectedRoutines = (\n db: Database.Database | undefined,\n object: Obj.Unknown,\n): { items: Routine.Routine[]; statusFor: (id: string) => Status } => {\n const connected = useQuery(db, connectedRoutinesQuery(object));\n const connectedIds = useMemo(() => new Set(connected.map((routine) => routine.id)), [connected]);\n\n // All routines in the space — used to resolve rows that have left the connected set (still exist, just detached).\n const all = useQuery(db, Filter.type(Routine.Routine));\n const byId = useMemo(() => new Map(all.map((routine) => [routine.id, routine])), [all]);\n\n // Session-stable, append-only: a routine seen connected this session is remembered so its row never reorders\n // or disappears on disconnect. Scoped to the current subject — reset if this instance is reused for another\n // object so the previous subject's rows don't leak in.\n const seenOrder = useRef<string[]>([]);\n const seenForObject = useRef(object.id);\n if (seenForObject.current !== object.id) {\n seenForObject.current = object.id;\n seenOrder.current = [];\n }\n for (const id of connectedIds) {\n if (!seenOrder.current.includes(id)) {\n seenOrder.current.push(id);\n }\n }\n\n // Resolve to live objects in stable order, dropping only ids whose routine was hard-deleted.\n const items = useMemo(\n () => seenOrder.current.flatMap((id) => (byId.has(id) ? [byId.get(id)!] : [])),\n [byId, connectedIds],\n );\n\n const statusFor = useCallback(\n (id: string): Status => (connectedIds.has(id) ? 'associated' : 'detached'),\n [connectedIds],\n );\n\n return { items, statusFor };\n};\n\n/**\n * Reactive family for a routine's on/off state — subscribes (via `get`) to its triggers' `enabled` flags so the\n * row icon re-derives when a flag flips. Keyed by the routine instance.\n */\nconst routineEnabled = Atom.family(\n (routine: Routine.Routine): Atom.Atom<{ hasTriggers: boolean; enabled: boolean }> =>\n Atom.make((get) => {\n const triggers = get(Obj.atomProperty(routine, 'triggers'));\n const hasTriggers = triggers.length > 0;\n return {\n hasTriggers,\n enabled: hasTriggers && triggers.every((ref) => get(Obj.atomProperty(ref, 'enabled')) === true),\n };\n }),\n);\n\ntype GetMenuOptions = {\n t: ReturnType<typeof useTranslation>['t'];\n handleDelete: (routine: Routine.Routine) => void;\n};\n\nconst useGetMenu = ({ t, handleDelete }: GetMenuOptions) =>\n useCallback(\n (_get: Atom.Context, routine: Routine.Routine): ActionGraphProps =>\n MenuBuilder.make()\n .action(\n 'delete',\n {\n label: t('delete.label'),\n icon: 'ph--trash--regular',\n testId: 'routine.companion.delete',\n },\n () => handleDelete(routine),\n )\n .build(),\n [t, handleDelete],\n );\n\ntype CompanionMenuActionsOptions = {\n t: ReturnType<typeof useTranslation>['t'];\n templates: RoutineCapabilities.Template[];\n draft: Routine.Routine | undefined;\n handleCreateFromTemplate: (template: RoutineCapabilities.Template) => Promise<void>;\n};\n\nconst useCompanionMenuActions = ({ t, templates, draft, handleCreateFromTemplate }: CompanionMenuActionsOptions) =>\n useMenuBuilder(\n () =>\n MenuBuilder.make()\n .separator('gap')\n .group(\n 'create',\n {\n variant: 'dropdownMenu',\n label: t('add-routine.label'),\n icon: 'ph--plus--regular',\n iconOnly: true,\n caretDown: false,\n disabled: draft != null || templates.length === 0,\n testId: 'routine.companion.create',\n },\n (group) => {\n for (const template of templates) {\n group.action(\n template.id,\n { label: template.label, icon: template.icon ?? 'ph--lightning--regular' },\n () => void handleCreateFromTemplate(template),\n );\n }\n },\n )\n .build(),\n [t, templates, draft, handleCreateFromTemplate],\n );\n\nRoutineCompanion.displayName = 'RoutineCompanion';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,IAAa,oBAAoB,EAAE,SAAS,QAAQ,mBAA0C;CAG5F,MAAM,KAAK,IAAI,YAAY,MAAM;CAEjC,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,EAAE,OAAO,cAAc,qBAAqB,IAAI,MAAM;CAE5D,MAAM,CAAC,YAAY,iBAAiB,SAA6B;CACjE,MAAM,CAAC,OAAO,YAAY,SAAsC;CAGhE,MAAM,CAAC,cAAc,mBAAmB,SAAsC;CAC9E,MAAM,WAAW,cACT,MAAM,MAAM,YAAY,QAAQ,OAAO,UAAU,KAAK,cAC5D;EAAC;EAAO;EAAY;CAAY,CAClC;CAEA,MAAM,eAAe,aAClB,OAA2B;EAE1B,IAAI,OACF;EAEF,gBAAgB,KAAA,CAAS;EACzB,cAAc,EAAE;CAClB,GACA,CAAC,KAAK,CACR;CAEA,MAAM,2BAA2B,YAC/B,OAAO,aAA2C;EAChD,IAAI,CAAC,IACH;EAKF,MAAM,aAAa,MAAM,SAAS,WAChC,SAAS,SAAS,EAAE,SAAS,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,SAAS,SAAS,SAAS,YAAY,EAAE,CAAC,CAAC,CAC/G;EAEA,gBAAgB,KAAA,CAAS;EACzB,cAAc,KAAA,CAAS;EACvB,SAAS,UAAU;CACrB,GACA,CAAC,IAAI,MAAM,CACb;CAGA,MAAM,eAAe,gBAAgB,oBAAoB,QAAQ;CAQjE,MAAM,cAAc,wBAAwB;EAAE;EAAG,WAP/B,cACV,aAAa,QAAQ,aAAa,SAAS,YAAY,MAAM,KAAK,IAAI,GAC5E,CAAC,cAAc,MAAM,CAK0B;EAAW;EAAO;CAAyB,CAAC;CAE7F,MAAM,eAAe,kBAAkB;EAErC,SAAS,KAAA,CAAS;CACpB,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,YAAY,YAAY;EACzC,IAAI,CAAC,SAAS,CAAC,IACb;EAMF,MAAM,mBAAmB,GAAG,IAAI,KAAK;EACrC,MAAM,GAAG,MAAM;EACf,cAAc,iBAAiB,EAAE;EAGjC,gBAAgB,gBAAgB;EAChC,SAAS,KAAA,CAAS;CACpB,GAAG,CAAC,OAAO,EAAE,CAAC;CAmBd,MAAM,UAAU,WAAW;EAAE;EAAG,cAjBX,aAClB,YAA6B;GAC5B,IAAI,CAAC,IACH;GAGF,iBAAiB,YAAa,SAAS,OAAO,QAAQ,KAAK,KAAA,IAAY,OAAQ;GAC/E,eAAe,YAAa,YAAY,QAAQ,KAAK,KAAA,IAAY,OAAQ;GAGzE,gBAAqB,eAAe,eAAe,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC;EACpG,GACA,CAAC,eAAe,EAAE,CAKY;CAAa,CAAC;CAI9C,MAAM,UAAU,aAAa,KAAmB,YAA+C;EAC7F,MAAM,EAAE,MAAM,QAAQ,IAAI,QAAQ,OAAO,KAAK;GAAE,MAAM;GAA0B,KAAK,KAAA;EAAU;EAC/F,MAAM,EAAE,YAAY,IAAI,eAAe,OAAO,CAAC;EAC/C,OAAO;GAAE;GAAM,KAAK,UAAU,MAAM,KAAA;EAAU;CAChD,GAAG,CAAC,CAAC;CAGL,MAAM,WAAW,aACd,KAAmB,YAClB,IAAI,IAAI,UAAU,OAAO,CAAC,KAAK,EAAE,2BAA2B,EAAE,IAAI,KAAK,YAAY,QAAQ,OAAO,EAAE,CAAC,KAAK,IAC5G,CAAC,CAAC,CACJ;CAIA,MAAM,eAAe,aAClB,MAAoB,YACnB,UAAU,QAAQ,EAAE,MAAM,aACtB;EAAE,MAAM;EAAwB,OAAO,EAAE,0BAA0B;CAAE,IACrE,KAAA,GACN,CAAC,WAAW,CAAC,CACf;CAIA,IAAI,CAAC,IACH,OAAO;CAOT,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,QACb,oBAAC,aAAD;EAEM;EACJ,SAAS;EACT,QAAQ,cAAc,KAAK,WAAW,IAAI,KAAA;EAC1C,UAAU,QAAQ,eAAe,KAAA;CAClC,GALM,MAAM,EAKZ,IACC;CAEJ,OACE,oBAAC,KAAK,MAAN;EAAW,GAAI;EAA2B;YACxC,qBAAC,MAAM,MAAP,EAAA,UAAA,CACE,oBAAC,MAAM,SAAP,EAAA,UACE,oBAAC,KAAK,SAAN,EAAc,YAAW,cAAe,CAAA,EAC3B,CAAA,GACf,oBAAC,MAAM,SAAP;GAAe,SAAA;GAAQ,YAAW;aAChC,oBAAC,WAAW,MAAZ,EAAA,UACE,oBAAC,WAAW,UAAZ,EAAA,UACE,oBAAC,cAAD;IACE,YAAW;IACJ;IACK;IACJ;IACR,UAAU;IACD;IACA;IACC;IACI;IACd,YAAY,EAAE,qBAAqB;GACpC,CAAA,EACkB,CAAA,EACN,CAAA;EACJ,CAAA,CACL,EAAA,CAAA;CACH,CAAA;AAEf;;;;;;;;;AAcA,IAAM,wBACJ,IACA,WACoE;CACpE,MAAM,YAAY,SAAS,IAAI,uBAAuB,MAAM,CAAC;CAC7D,MAAM,eAAe,cAAc,IAAI,IAAI,UAAU,KAAK,YAAY,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;CAG/F,MAAM,MAAM,SAAS,IAAI,OAAO,KAAK,QAAQ,OAAO,CAAC;CACrD,MAAM,OAAO,cAAc,IAAI,IAAI,IAAI,KAAK,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CAKtF,MAAM,YAAY,OAAiB,CAAC,CAAC;CACrC,MAAM,gBAAgB,OAAO,OAAO,EAAE;CACtC,IAAI,cAAc,YAAY,OAAO,IAAI;EACvC,cAAc,UAAU,OAAO;EAC/B,UAAU,UAAU,CAAC;CACvB;CACA,KAAK,MAAM,MAAM,cACf,IAAI,CAAC,UAAU,QAAQ,SAAS,EAAE,GAChC,UAAU,QAAQ,KAAK,EAAE;CAe7B,OAAO;EAAE,OAVK,cACN,UAAU,QAAQ,SAAS,OAAQ,KAAK,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAE,IAAI,CAAC,CAAE,GAC7E,CAAC,MAAM,YAAY,CAQZ;EAAO,WALE,aACf,OAAwB,aAAa,IAAI,EAAE,IAAI,eAAe,YAC/D,CAAC,YAAY,CAGC;CAAU;AAC5B;;;;;AAMA,IAAM,iBAAiB,KAAK,QACzB,YACC,KAAK,MAAM,QAAQ;CACjB,MAAM,WAAW,IAAI,IAAI,aAAa,SAAS,UAAU,CAAC;CAC1D,MAAM,cAAc,SAAS,SAAS;CACtC,OAAO;EACL;EACA,SAAS,eAAe,SAAS,OAAO,QAAQ,IAAI,IAAI,aAAa,KAAK,SAAS,CAAC,MAAM,IAAI;CAChG;AACF,CAAC,CACL;AAOA,IAAM,cAAc,EAAE,GAAG,mBACvB,aACG,MAAoB,YACnB,YAAY,KAAK,CAAA,CACd,OACC,UACA;CACE,OAAO,EAAE,cAAc;CACvB,MAAM;CACN,QAAQ;AACV,SACM,aAAa,OAAO,CAC5B,CAAA,CACC,MAAM,GACX,CAAC,GAAG,YAAY,CAClB;AASF,IAAM,2BAA2B,EAAE,GAAG,WAAW,OAAO,+BACtD,qBAEI,YAAY,KAAK,CAAA,CACd,UAAU,KAAK,CAAA,CACf,MACC,UACA;CACE,SAAS;CACT,OAAO,EAAE,mBAAmB;CAC5B,MAAM;CACN,UAAU;CACV,WAAW;CACX,UAAU,SAAS,QAAQ,UAAU,WAAW;CAChD,QAAQ;AACV,IACC,UAAU;CACT,KAAK,MAAM,YAAY,WACrB,MAAM,OACJ,SAAS,IACT;EAAE,OAAO,SAAS;EAAO,MAAM,SAAS,QAAQ;CAAyB,SACnE,KAAK,yBAAyB,QAAQ,CAC9C;AAEJ,CACF,CAAA,CACC,MAAM,GACX;CAAC;CAAG;CAAW;CAAO;AAAwB,CAChD;AAEF,iBAAiB,cAAc"}