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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +428 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/AutomationPanel-OKF2MDLO.mjs +12 -0
  5. package/dist/lib/neutral/AutomationPlugin.mjs +10 -0
  6. package/dist/lib/neutral/AutomationPlugin.node.mjs +1113 -0
  7. package/dist/lib/neutral/AutomationPlugin.node.mjs.map +7 -0
  8. package/dist/lib/neutral/AutomationPlugin.workerd.mjs +23 -0
  9. package/dist/lib/neutral/AutomationPlugin.workerd.mjs.map +7 -0
  10. package/dist/lib/neutral/AutomationSettings-GQF5UFM6.mjs +32 -0
  11. package/dist/lib/neutral/AutomationSettings-GQF5UFM6.mjs.map +7 -0
  12. package/dist/lib/neutral/FunctionsContainer-YBTQGCL3.mjs +38 -0
  13. package/dist/lib/neutral/FunctionsContainer-YBTQGCL3.mjs.map +7 -0
  14. package/dist/lib/neutral/FunctionsPanel-L32Z67B7.mjs +97 -0
  15. package/dist/lib/neutral/FunctionsPanel-L32Z67B7.mjs.map +7 -0
  16. package/dist/lib/neutral/FunctionsRegistry-RTCY3LXE.mjs +95 -0
  17. package/dist/lib/neutral/FunctionsRegistry-RTCY3LXE.mjs.map +7 -0
  18. package/dist/lib/neutral/TriggerSettings-XCHIZPOR.mjs +9 -0
  19. package/dist/lib/neutral/app-graph-builder-Q3LJLICE.mjs +75 -0
  20. package/dist/lib/neutral/app-graph-builder-Q3LJLICE.mjs.map +7 -0
  21. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  22. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  23. package/dist/lib/neutral/capabilities/node.mjs +17 -0
  24. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-2JP77CMN.mjs +42 -0
  26. package/dist/lib/neutral/chunk-2JP77CMN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-7YWISQOZ.mjs +54 -0
  28. package/dist/lib/neutral/chunk-7YWISQOZ.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-C7H62AU3.mjs +435 -0
  30. package/dist/lib/neutral/chunk-C7H62AU3.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-CMM3AFHR.mjs +111 -0
  32. package/dist/lib/neutral/chunk-CMM3AFHR.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  34. package/dist/lib/neutral/chunk-LRVJEKMN.mjs +40 -0
  35. package/dist/lib/neutral/chunk-LRVJEKMN.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-MBIODLCB.mjs +12 -0
  37. package/dist/lib/neutral/chunk-MBIODLCB.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-NCCFEPBZ.mjs +76 -0
  39. package/dist/lib/neutral/chunk-NCCFEPBZ.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-RCBE37YU.mjs +368 -0
  41. package/dist/lib/neutral/chunk-RCBE37YU.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-TJOQNSS5.mjs +8 -0
  43. package/dist/lib/neutral/chunk-TJOQNSS5.mjs.map +7 -0
  44. package/dist/lib/neutral/components/index.mjs +16 -0
  45. package/dist/lib/neutral/containers/index.mjs +13 -0
  46. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  47. package/dist/lib/neutral/create-trigger-from-template-5YUHZOFA.mjs +68 -0
  48. package/dist/lib/neutral/create-trigger-from-template-5YUHZOFA.mjs.map +7 -0
  49. package/dist/lib/neutral/hooks/index.mjs +10 -0
  50. package/dist/lib/neutral/index.mjs +16 -0
  51. package/dist/lib/neutral/layer-specs-OXK75RDW.mjs +141 -0
  52. package/dist/lib/neutral/layer-specs-OXK75RDW.mjs.map +7 -0
  53. package/dist/lib/neutral/meta.json +1 -0
  54. package/dist/lib/neutral/meta.mjs +8 -0
  55. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs +13 -0
  56. package/dist/lib/neutral/operation-handler-YXGYH5W5.mjs.map +7 -0
  57. package/dist/lib/neutral/operations/index.mjs +8 -0
  58. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  59. package/dist/lib/neutral/plugin.mjs +16 -0
  60. package/dist/lib/neutral/plugin.mjs.map +7 -0
  61. package/dist/lib/neutral/react-surface-FOOBGYNG.mjs +57 -0
  62. package/dist/lib/neutral/react-surface-FOOBGYNG.mjs.map +7 -0
  63. package/dist/lib/neutral/registry-sync-JYDDTBAE.mjs +82 -0
  64. package/dist/lib/neutral/registry-sync-JYDDTBAE.mjs.map +7 -0
  65. package/dist/lib/neutral/testing.mjs +8 -0
  66. package/dist/lib/neutral/testing.mjs.map +7 -0
  67. package/dist/lib/neutral/translations.mjs +60 -0
  68. package/dist/lib/neutral/translations.mjs.map +7 -0
  69. package/dist/lib/neutral/trigger-runtime-controller-BOEJYGWC.mjs +77 -0
  70. package/dist/lib/neutral/trigger-runtime-controller-BOEJYGWC.mjs.map +7 -0
  71. package/dist/lib/neutral/types/index.mjs +12 -0
  72. package/dist/lib/neutral/types/index.mjs.map +7 -0
  73. package/dist/types/src/AutomationPlugin.d.ts +3 -1
  74. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  75. package/dist/types/src/AutomationPlugin.node.d.ts +4 -0
  76. package/dist/types/src/AutomationPlugin.node.d.ts.map +1 -0
  77. package/dist/types/src/AutomationPlugin.test.d.ts +2 -0
  78. package/dist/types/src/AutomationPlugin.test.d.ts.map +1 -0
  79. package/dist/types/src/AutomationPlugin.workerd.d.ts +4 -0
  80. package/dist/types/src/AutomationPlugin.workerd.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  82. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/index.d.ts +8 -5
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/layer-specs.d.ts +6 -0
  86. package/dist/types/src/capabilities/layer-specs.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/node.d.ts +8 -0
  88. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  90. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  92. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/registry-sync.d.ts +21 -0
  94. package/dist/types/src/capabilities/registry-sync.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts +5 -0
  96. package/dist/types/src/capabilities/trigger-runtime-controller.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/trigger-runtime-controller.test.d.ts +2 -0
  98. package/dist/types/src/capabilities/trigger-runtime-controller.test.d.ts.map +1 -0
  99. package/dist/types/src/commands/index.d.ts +2 -0
  100. package/dist/types/src/commands/index.d.ts.map +1 -0
  101. package/dist/types/src/commands/trigger/create/index.d.ts +25 -0
  102. package/dist/types/src/commands/trigger/create/index.d.ts.map +1 -0
  103. package/dist/types/src/commands/trigger/create/queue.d.ts +13 -0
  104. package/dist/types/src/commands/trigger/create/queue.d.ts.map +1 -0
  105. package/dist/types/src/commands/trigger/create/subscription.d.ts +15 -0
  106. package/dist/types/src/commands/trigger/create/subscription.d.ts.map +1 -0
  107. package/dist/types/src/commands/trigger/create/timer.d.ts +13 -0
  108. package/dist/types/src/commands/trigger/create/timer.d.ts.map +1 -0
  109. package/dist/types/src/commands/trigger/index.d.ts +57 -0
  110. package/dist/types/src/commands/trigger/index.d.ts.map +1 -0
  111. package/dist/types/src/commands/trigger/list.d.ts +7 -0
  112. package/dist/types/src/commands/trigger/list.d.ts.map +1 -0
  113. package/dist/types/src/commands/trigger/options.d.ts +10 -0
  114. package/dist/types/src/commands/trigger/options.d.ts.map +1 -0
  115. package/dist/types/src/commands/trigger/remove.d.ts +8 -0
  116. package/dist/types/src/commands/trigger/remove.d.ts.map +1 -0
  117. package/dist/types/src/commands/trigger/update/index.d.ts +28 -0
  118. package/dist/types/src/commands/trigger/update/index.d.ts.map +1 -0
  119. package/dist/types/src/commands/trigger/update/queue.d.ts +11 -0
  120. package/dist/types/src/commands/trigger/update/queue.d.ts.map +1 -0
  121. package/dist/types/src/commands/trigger/update/subscription.d.ts +13 -0
  122. package/dist/types/src/commands/trigger/update/subscription.d.ts.map +1 -0
  123. package/dist/types/src/commands/trigger/update/timer.d.ts +11 -0
  124. package/dist/types/src/commands/trigger/update/timer.d.ts.map +1 -0
  125. package/dist/types/src/commands/trigger/util.d.ts +85 -0
  126. package/dist/types/src/commands/trigger/util.d.ts.map +1 -0
  127. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +6 -7
  128. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  129. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +45 -27
  130. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/AutomationPanel/TriggerEdgeMetadata.d.ts +18 -0
  132. package/dist/types/src/components/AutomationPanel/TriggerEdgeMetadata.d.ts.map +1 -0
  133. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -1
  134. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  135. package/dist/types/src/components/FunctionsPanel/index.d.ts.map +1 -1
  136. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts +8 -0
  137. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -0
  138. package/dist/types/src/components/FunctionsRegistry/index.d.ts +4 -0
  139. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -0
  140. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +12 -9
  141. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  142. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  143. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  144. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +9 -8
  145. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  146. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +117 -29
  147. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/TriggerEditor/util.d.ts +14 -0
  149. package/dist/types/src/components/TriggerEditor/util.d.ts.map +1 -0
  150. package/dist/types/src/components/index.d.ts +3 -4
  151. package/dist/types/src/components/index.d.ts.map +1 -1
  152. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +6 -0
  153. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  154. package/dist/types/src/containers/AutomationSettings/index.d.ts +2 -0
  155. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -0
  156. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts +4 -0
  157. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -0
  158. package/dist/types/src/containers/FunctionsContainer/index.d.ts +2 -0
  159. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -0
  160. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -0
  161. package/dist/types/src/containers/TriggerSettings/index.d.ts +3 -0
  162. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -0
  163. package/dist/types/src/containers/index.d.ts +5 -0
  164. package/dist/types/src/containers/index.d.ts.map +1 -0
  165. package/dist/types/src/hooks/index.d.ts +1 -1
  166. package/dist/types/src/hooks/index.d.ts.map +1 -1
  167. package/dist/types/src/hooks/useEdgeTriggersDispatcherStatus.d.ts +13 -0
  168. package/dist/types/src/hooks/useEdgeTriggersDispatcherStatus.d.ts.map +1 -0
  169. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +6 -5
  170. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  171. package/dist/types/src/index.d.ts +1 -4
  172. package/dist/types/src/index.d.ts.map +1 -1
  173. package/dist/types/src/meta.d.ts +2 -2
  174. package/dist/types/src/meta.d.ts.map +1 -1
  175. package/dist/types/src/operations/create-trigger-from-template.d.ts +5 -0
  176. package/dist/types/src/operations/create-trigger-from-template.d.ts.map +1 -0
  177. package/dist/types/src/operations/index.d.ts +3 -0
  178. package/dist/types/src/operations/index.d.ts.map +1 -0
  179. package/dist/types/src/plugin.d.ts +4 -0
  180. package/dist/types/src/plugin.d.ts.map +1 -0
  181. package/dist/types/src/testing/test-functions.d.ts +318 -3
  182. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  183. package/dist/types/src/testing.d.ts +2 -0
  184. package/dist/types/src/testing.d.ts.map +1 -0
  185. package/dist/types/src/translations.d.ts +45 -28
  186. package/dist/types/src/translations.d.ts.map +1 -1
  187. package/dist/types/src/types/AutomationOperation.d.ts +21 -0
  188. package/dist/types/src/types/AutomationOperation.d.ts.map +1 -0
  189. package/dist/types/src/types/index.d.ts +1 -0
  190. package/dist/types/src/types/index.d.ts.map +1 -1
  191. package/dist/types/src/types/schema.d.ts +13 -5
  192. package/dist/types/src/types/schema.d.ts.map +1 -1
  193. package/dist/types/tsconfig.tsbuildinfo +1 -1
  194. package/package.json +136 -69
  195. package/src/AutomationPlugin.node.ts +35 -0
  196. package/src/AutomationPlugin.test.ts +27 -0
  197. package/src/AutomationPlugin.tsx +39 -36
  198. package/src/AutomationPlugin.workerd.ts +18 -0
  199. package/src/capabilities/app-graph-builder.ts +59 -80
  200. package/src/capabilities/index.ts +14 -7
  201. package/src/capabilities/layer-specs.ts +197 -0
  202. package/src/capabilities/node.ts +18 -0
  203. package/src/capabilities/operation-handler.ts +16 -0
  204. package/src/capabilities/react-surface.tsx +49 -45
  205. package/src/capabilities/registry-sync.ts +110 -0
  206. package/src/capabilities/trigger-runtime-controller.test.ts +103 -0
  207. package/src/capabilities/trigger-runtime-controller.ts +126 -0
  208. package/src/commands/index.ts +5 -0
  209. package/src/commands/trigger/create/index.ts +14 -0
  210. package/src/commands/trigger/create/queue.ts +87 -0
  211. package/src/commands/trigger/create/subscription.ts +125 -0
  212. package/src/commands/trigger/create/timer.ts +90 -0
  213. package/src/commands/trigger/index.ts +16 -0
  214. package/src/commands/trigger/list.ts +70 -0
  215. package/src/commands/trigger/options.ts +47 -0
  216. package/src/commands/trigger/remove.ts +45 -0
  217. package/src/commands/trigger/update/index.ts +14 -0
  218. package/src/commands/trigger/update/queue.ts +191 -0
  219. package/src/commands/trigger/update/subscription.ts +279 -0
  220. package/src/commands/trigger/update/timer.ts +195 -0
  221. package/src/commands/trigger/util.ts +410 -0
  222. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +13 -7
  223. package/src/components/AutomationPanel/AutomationPanel.tsx +260 -100
  224. package/src/components/AutomationPanel/TriggerEdgeMetadata.tsx +148 -0
  225. package/src/components/FunctionsPanel/FunctionsPanel.tsx +50 -30
  226. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +119 -0
  227. package/src/components/FunctionsRegistry/index.ts +8 -0
  228. package/src/components/TriggerEditor/FunctionInputEditor.tsx +39 -42
  229. package/src/components/TriggerEditor/SpecSelector.tsx +28 -22
  230. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +105 -41
  231. package/src/components/TriggerEditor/TriggerEditor.tsx +179 -56
  232. package/src/components/TriggerEditor/util.ts +51 -0
  233. package/src/components/index.ts +1 -2
  234. package/src/containers/AutomationSettings/AutomationSettings.tsx +31 -0
  235. package/src/containers/AutomationSettings/index.ts +5 -0
  236. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +33 -0
  237. package/src/containers/FunctionsContainer/index.ts +5 -0
  238. package/src/containers/TriggerSettings/TriggerSettings.tsx +48 -0
  239. package/src/containers/TriggerSettings/index.ts +6 -0
  240. package/src/containers/index.ts +9 -0
  241. package/src/hooks/index.ts +2 -1
  242. package/src/hooks/useEdgeTriggersDispatcherStatus.ts +78 -0
  243. package/src/hooks/useTriggerRuntimeControls.ts +39 -19
  244. package/src/index.ts +1 -5
  245. package/src/meta.ts +30 -7
  246. package/src/operations/create-trigger-from-template.ts +70 -0
  247. package/src/operations/index.ts +7 -0
  248. package/src/plugin.ts +11 -0
  249. package/src/testing/test-functions.ts +43 -9
  250. package/src/testing.ts +7 -0
  251. package/src/translations.ts +53 -33
  252. package/src/types/AutomationOperation.ts +39 -0
  253. package/src/types/index.ts +2 -0
  254. package/src/types/schema.ts +6 -6
  255. package/src/vite-env.d.ts +10 -0
  256. package/dist/lib/browser/AutomationPanel-3PHA5FTJ.mjs +0 -11
  257. package/dist/lib/browser/AutomationSettings-3EYSPFKB.mjs +0 -69
  258. package/dist/lib/browser/AutomationSettings-3EYSPFKB.mjs.map +0 -7
  259. package/dist/lib/browser/FunctionsContainer-HHBMPUOD.mjs +0 -36
  260. package/dist/lib/browser/FunctionsContainer-HHBMPUOD.mjs.map +0 -7
  261. package/dist/lib/browser/FunctionsPanel-NRIKAPQV.mjs +0 -10
  262. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs +0 -81
  263. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-5ARH77PV.mjs +0 -15
  265. package/dist/lib/browser/chunk-5ARH77PV.mjs.map +0 -7
  266. package/dist/lib/browser/chunk-6TUZQIEN.mjs +0 -14
  267. package/dist/lib/browser/chunk-6TUZQIEN.mjs.map +0 -7
  268. package/dist/lib/browser/chunk-DK7BLEKU.mjs +0 -14
  269. package/dist/lib/browser/chunk-DK7BLEKU.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-DLLE4FKP.mjs +0 -94
  271. package/dist/lib/browser/chunk-DLLE4FKP.mjs.map +0 -7
  272. package/dist/lib/browser/chunk-MVPRI3DB.mjs +0 -53
  273. package/dist/lib/browser/chunk-MVPRI3DB.mjs.map +0 -7
  274. package/dist/lib/browser/chunk-SUKAEYF3.mjs +0 -267
  275. package/dist/lib/browser/chunk-SUKAEYF3.mjs.map +0 -7
  276. package/dist/lib/browser/chunk-VGBZKM3O.mjs +0 -38
  277. package/dist/lib/browser/chunk-VGBZKM3O.mjs.map +0 -7
  278. package/dist/lib/browser/chunk-VL3KSDVL.mjs +0 -183
  279. package/dist/lib/browser/chunk-VL3KSDVL.mjs.map +0 -7
  280. package/dist/lib/browser/chunk-WWURMV25.mjs +0 -13
  281. package/dist/lib/browser/chunk-WWURMV25.mjs.map +0 -7
  282. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs +0 -160
  283. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs.map +0 -7
  284. package/dist/lib/browser/hooks/index.mjs +0 -12
  285. package/dist/lib/browser/index.mjs +0 -121
  286. package/dist/lib/browser/index.mjs.map +0 -7
  287. package/dist/lib/browser/intent-resolver-D2OHKQRR.mjs +0 -77
  288. package/dist/lib/browser/intent-resolver-D2OHKQRR.mjs.map +0 -7
  289. package/dist/lib/browser/meta.json +0 -1
  290. package/dist/lib/browser/react-surface-G7CG7BML.mjs +0 -63
  291. package/dist/lib/browser/react-surface-G7CG7BML.mjs.map +0 -7
  292. package/dist/lib/browser/types/index.mjs +0 -8
  293. package/dist/lib/node-esm/AutomationPanel-EETYIR35.mjs +0 -12
  294. package/dist/lib/node-esm/AutomationSettings-WKSMWITV.mjs +0 -70
  295. package/dist/lib/node-esm/AutomationSettings-WKSMWITV.mjs.map +0 -7
  296. package/dist/lib/node-esm/FunctionsContainer-ZKVOBUHV.mjs +0 -37
  297. package/dist/lib/node-esm/FunctionsContainer-ZKVOBUHV.mjs.map +0 -7
  298. package/dist/lib/node-esm/FunctionsPanel-SAMRTELO.mjs +0 -11
  299. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs +0 -82
  300. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-2EWXIFEK.mjs +0 -16
  302. package/dist/lib/node-esm/chunk-2EWXIFEK.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs +0 -15
  304. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs.map +0 -7
  305. package/dist/lib/node-esm/chunk-AKHETVIQ.mjs +0 -184
  306. package/dist/lib/node-esm/chunk-AKHETVIQ.mjs.map +0 -7
  307. package/dist/lib/node-esm/chunk-B7N3H45O.mjs +0 -16
  308. package/dist/lib/node-esm/chunk-B7N3H45O.mjs.map +0 -7
  309. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs +0 -39
  310. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs.map +0 -7
  311. package/dist/lib/node-esm/chunk-J3XEBEIE.mjs +0 -268
  312. package/dist/lib/node-esm/chunk-J3XEBEIE.mjs.map +0 -7
  313. package/dist/lib/node-esm/chunk-QCA543ZR.mjs +0 -54
  314. package/dist/lib/node-esm/chunk-QCA543ZR.mjs.map +0 -7
  315. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs +0 -16
  316. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-YQXW3JXD.mjs +0 -95
  318. package/dist/lib/node-esm/chunk-YQXW3JXD.mjs.map +0 -7
  319. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs +0 -161
  320. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs.map +0 -7
  321. package/dist/lib/node-esm/hooks/index.mjs +0 -13
  322. package/dist/lib/node-esm/index.mjs +0 -122
  323. package/dist/lib/node-esm/index.mjs.map +0 -7
  324. package/dist/lib/node-esm/intent-resolver-2LGBVXT5.mjs +0 -78
  325. package/dist/lib/node-esm/intent-resolver-2LGBVXT5.mjs.map +0 -7
  326. package/dist/lib/node-esm/meta.json +0 -1
  327. package/dist/lib/node-esm/react-surface-OMZSBDHS.mjs +0 -64
  328. package/dist/lib/node-esm/react-surface-OMZSBDHS.mjs.map +0 -7
  329. package/dist/lib/node-esm/types/index.mjs +0 -9
  330. package/dist/types/src/capabilities/capabilities.d.ts +0 -19
  331. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  332. package/dist/types/src/capabilities/compute-runtime.d.ts +0 -5
  333. package/dist/types/src/capabilities/compute-runtime.d.ts.map +0 -1
  334. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  335. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  336. package/dist/types/src/components/AutomationSettings.d.ts +0 -5
  337. package/dist/types/src/components/AutomationSettings.d.ts.map +0 -1
  338. package/dist/types/src/components/FunctionsContainer.d.ts +0 -7
  339. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  340. package/dist/types/src/components/TriggerSettings.d.ts.map +0 -1
  341. package/dist/types/src/events.d.ts +0 -4
  342. package/dist/types/src/events.d.ts.map +0 -1
  343. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +0 -8
  344. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +0 -1
  345. package/src/capabilities/capabilities.ts +0 -48
  346. package/src/capabilities/compute-runtime.ts +0 -138
  347. package/src/capabilities/intent-resolver.ts +0 -72
  348. package/src/components/AutomationSettings.tsx +0 -30
  349. package/src/components/FunctionsContainer.tsx +0 -29
  350. package/src/components/TriggerSettings.tsx +0 -25
  351. package/src/events.ts +0 -11
  352. package/src/hooks/useComputeRuntimeCallback.ts +0 -30
  353. /package/dist/lib/{browser/AutomationPanel-3PHA5FTJ.mjs.map → neutral/AutomationPanel-OKF2MDLO.mjs.map} +0 -0
  354. /package/dist/lib/{browser/FunctionsPanel-NRIKAPQV.mjs.map → neutral/AutomationPlugin.mjs.map} +0 -0
  355. /package/dist/lib/{browser/hooks/index.mjs.map → neutral/TriggerSettings-XCHIZPOR.mjs.map} +0 -0
  356. /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  357. /package/dist/lib/{node-esm/hooks → neutral/components}/index.mjs.map +0 -0
  358. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  359. /package/dist/lib/{node-esm/AutomationPanel-EETYIR35.mjs.map → neutral/index.mjs.map} +0 -0
  360. /package/dist/lib/{node-esm/FunctionsPanel-SAMRTELO.mjs.map → neutral/meta.mjs.map} +0 -0
  361. /package/dist/types/src/{components → containers/TriggerSettings}/TriggerSettings.d.ts +0 -0
@@ -4,47 +4,49 @@
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useState } from 'react';
7
+ import { expect, userEvent, within } from 'storybook/test';
7
8
 
9
+ import { Operation, Trigger } from '@dxos/compute';
8
10
  import { Filter, Obj, Ref, Tag, Type } from '@dxos/echo';
9
- import { FunctionTrigger, FunctionType } from '@dxos/functions';
10
11
  import { invariant } from '@dxos/invariant';
11
- import { faker } from '@dxos/random';
12
+ import { random } from '@dxos/random';
12
13
  import { useQuery } from '@dxos/react-client/echo';
13
- import { ContactType, useClientProvider, withClientProvider } from '@dxos/react-client/testing';
14
+ import { TestSchema, useClientStory, withClientProvider } from '@dxos/react-client/testing';
14
15
  import { useAsyncEffect } from '@dxos/react-ui';
15
- import { withTheme } from '@dxos/react-ui/testing';
16
- import { DataType } from '@dxos/schema';
16
+ import { translations as formTranslations } from '@dxos/react-ui-form/translations';
17
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
18
+ import { Employer, Organization, Person, Pipeline } from '@dxos/types';
17
19
 
18
- import { functions } from '../../testing';
19
- import { translations } from '../../translations';
20
+ import { functions, registryFunctions } from '#testing';
21
+ import { translations } from '#translations';
20
22
 
21
23
  import { TriggerEditor, type TriggerEditorProps } from './TriggerEditor';
22
24
 
23
25
  const types = [
24
26
  // TODO(burdon): Get label from annotation.
25
- { value: Type.getTypename(DataType.Organization), label: 'Organization' },
26
- { value: Type.getTypename(DataType.Person), label: 'Person' },
27
- { value: Type.getTypename(DataType.Project), label: 'Project' },
28
- { value: Type.getTypename(DataType.Employer), label: 'Employer' },
27
+ { value: Type.getTypename(Organization.Organization), label: 'Organization' },
28
+ { value: Type.getTypename(Person.Person), label: 'Person' },
29
+ { value: Type.getTypename(Pipeline.Pipeline), label: 'Project' },
30
+ { value: Type.getTypename(Employer.Employer), label: 'Employer' },
29
31
  ];
30
32
 
31
33
  const DefaultStory = (props: Partial<TriggerEditorProps>) => {
32
- const { space } = useClientProvider();
33
- const [trigger, setTrigger] = useState<FunctionTrigger>();
34
- const tags = useQuery(space, Filter.type(Tag.Tag));
34
+ const { space } = useClientStory();
35
+ const [trigger, setTrigger] = useState<Trigger.Trigger>();
36
+ const tags = useQuery(space?.db, Filter.type(Tag.Tag));
35
37
 
36
38
  useAsyncEffect(async () => {
37
39
  if (!space) {
38
40
  return;
39
41
  }
40
42
 
41
- const result = await space.db.query(Filter.type(FunctionType)).run();
42
- const fn = result.objects.find((fn) => fn.name === 'example.com/function/forex');
43
+ const functions = await space.db.query(Filter.type(Operation.PersistentOperation)).run();
44
+ const fn = functions.find((fn) => fn.name === 'com.example.function.forex');
43
45
  invariant(fn);
44
46
  const trigger = space.db.add(
45
- Obj.make(FunctionTrigger, {
47
+ Trigger.make({
46
48
  function: Ref.make(fn),
47
- spec: { kind: 'webhook' },
49
+ spec: Trigger.specWebhook(),
48
50
  input: {
49
51
  from: 'USD',
50
52
  to: 'JPY',
@@ -59,41 +61,60 @@ const DefaultStory = (props: Partial<TriggerEditorProps>) => {
59
61
  }
60
62
 
61
63
  return (
62
- <div role='none' className='w-[32rem] bs-fit border border-separator rounded-sm'>
63
- <TriggerEditor
64
- space={space}
65
- trigger={trigger}
66
- types={types}
67
- tags={tags}
68
- onSave={(values) => console.log('on save', values)}
69
- {...props}
70
- />
71
- </div>
64
+ <TriggerEditor
65
+ db={space.db}
66
+ trigger={trigger}
67
+ types={types}
68
+ tags={tags}
69
+ onSave={(values) => console.log('on save', values)}
70
+ {...props}
71
+ />
72
72
  );
73
73
  };
74
74
 
75
75
  const meta = {
76
- title: 'plugins/plugin-automation/TriggerEditor',
76
+ title: 'plugins/plugin-automation/components/TriggerEditor',
77
77
  component: TriggerEditor as any,
78
78
  render: DefaultStory,
79
79
  decorators: [
80
- withTheme,
80
+ withTheme(),
81
+ withLayout({ layout: 'column' }),
81
82
  withClientProvider({
82
83
  createIdentity: true,
83
84
  createSpace: true,
84
- types: [Tag.Tag, FunctionType, FunctionTrigger, ContactType],
85
+ types: [Tag.Tag, Operation.PersistentOperation, Trigger.Trigger, TestSchema.ContactType],
85
86
  onCreateSpace: ({ space }) => {
86
- space.db.add(Tag.make({ label: 'Important' }));
87
- space.db.add(Tag.make({ label: 'Investor' }));
88
- space.db.add(Tag.make({ label: 'New' }));
87
+ // Tags.
88
+ ['Important', 'Investor', 'New'].forEach((label) => {
89
+ space.db.add(Tag.make({ label }));
90
+ });
91
+
92
+ // Functions in the local space.
93
+ functions.forEach((fn) => {
94
+ const { key, version, ...data } = fn;
95
+ space.db.add(
96
+ Obj.make(Operation.PersistentOperation, {
97
+ [Obj.Meta]: { key, version: version ?? '0.1.0' },
98
+ ...data,
99
+ }),
100
+ );
101
+ });
89
102
 
90
- for (const fn of functions) {
91
- space.db.add(Obj.make(FunctionType, fn));
92
- }
103
+ // Functions in the registry (simulate built-in / plugin-provided operations).
104
+ space.db.registry.add(
105
+ registryFunctions.map(({ key, version, ...data }) =>
106
+ Obj.make(Operation.PersistentOperation, {
107
+ [Obj.Meta]: { key, version: version ?? '0.1.0' },
108
+ ...data,
109
+ }),
110
+ ),
111
+ );
112
+
113
+ // Objects.
93
114
  Array.from({ length: 10 }).map(() => {
94
115
  return space.db.add(
95
- Obj.make(ContactType, {
96
- name: faker.person.fullName(),
116
+ Obj.make(TestSchema.ContactType, {
117
+ name: random.person.fullName(),
97
118
  identifiers: [],
98
119
  }),
99
120
  );
@@ -102,8 +123,8 @@ const meta = {
102
123
  }),
103
124
  ],
104
125
  parameters: {
105
- layout: 'column',
106
- translations,
126
+ layout: 'fullscreen',
127
+ translations: [...formTranslations, ...translations],
107
128
  },
108
129
  } satisfies Meta<typeof DefaultStory>;
109
130
 
@@ -118,3 +139,46 @@ export const ReadonlySpec: Story = {
118
139
  readonlySpec: true,
119
140
  },
120
141
  };
142
+
143
+ export const Spec: Story = {
144
+ play: async ({ canvasElement }) => {
145
+ const canvas = within(canvasElement);
146
+ const webhookText = await canvas.findByText('Webhook', {}, { timeout: 10_000 });
147
+ const combobox = webhookText.closest('[role="combobox"]') as HTMLElement;
148
+ await expect(combobox).not.toBeDisabled();
149
+
150
+ // Helper to switch to a kind via keyboard.
151
+ // TODO(wittjosiah): Radix Select in popper mode doesn't close on click.
152
+ // Use keyboard navigation: open, type first letter to jump, Enter to select.
153
+ const selectKind = async (combobox: HTMLElement, firstLetter: string) => {
154
+ combobox.focus();
155
+ await userEvent.keyboard('{Enter}');
156
+ await userEvent.keyboard(firstLetter);
157
+ await userEvent.keyboard('{Enter}');
158
+ };
159
+
160
+ // Timer — should show "Cron" field.
161
+ await selectKind(combobox, 't');
162
+ await expect(canvas.findByLabelText('Cron')).resolves.toBeInTheDocument();
163
+
164
+ // Email — no extra fields; Cron should be gone.
165
+ await selectKind(combobox, 'e');
166
+ await expect(combobox).not.toBeDisabled();
167
+ await expect(canvas.queryByLabelText('Cron')).not.toBeInTheDocument();
168
+
169
+ // Webhook — should show "Method" field.
170
+ await selectKind(combobox, 'w');
171
+ await expect(canvas.findByLabelText('Method')).resolves.toBeInTheDocument();
172
+
173
+ // Subscription — should show query editor.
174
+ await selectKind(combobox, 's');
175
+ await expect(combobox).not.toBeDisabled();
176
+ await expect(canvas.queryByLabelText('Method')).not.toBeInTheDocument();
177
+
178
+ // Feed — should show the Feed selector field (a Ref(Feed) combobox). The combobox
179
+ // isn't associated with its label, so match the field's <label> element directly.
180
+ await selectKind(combobox, 'f');
181
+ await expect(combobox).not.toBeDisabled();
182
+ await expect(await canvas.findByText('Feed', { selector: 'label' })).toBeInTheDocument();
183
+ },
184
+ };
@@ -2,85 +2,120 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import * as Option from 'effect/Option';
6
+ import * as Record from 'effect/Record';
5
7
  import React, { useCallback, useMemo } from 'react';
6
8
 
9
+ import { Operation, Script, Trigger } from '@dxos/compute';
7
10
  import { ComputeGraph } from '@dxos/conductor';
8
- import { type Query, Type } from '@dxos/echo';
9
- import { FunctionTrigger, FunctionType, ScriptType } from '@dxos/functions';
10
- import { Filter, Ref, type Space, useQuery } from '@dxos/react-client/echo';
11
+ import { Annotation, type Database, Entity, Feed, Filter, Obj, Query, Ref, Scope, Type } from '@dxos/echo';
12
+ import { DXN, EID } from '@dxos/keys';
13
+ import { useQuery } from '@dxos/react-client/echo';
11
14
  import { Input } from '@dxos/react-ui';
12
15
  import { QueryForm, type QueryFormProps } from '@dxos/react-ui-components';
13
- import { type CustomInputMap, Form, InputHeader, SelectInput, useRefQueryLookupHandler } from '@dxos/react-ui-form';
14
-
15
- import { FunctionInputEditor, type FunctionInputEditorProps } from './FunctionInputEditor';
16
+ import {
17
+ type ExcludeId,
18
+ Form,
19
+ FormFieldLabel,
20
+ type FormFieldMap,
21
+ type FormRootProps,
22
+ SelectField,
23
+ omitId,
24
+ } from '@dxos/react-ui-form';
25
+
26
+ import { FunctionInputEditor } from './FunctionInputEditor';
16
27
  import { SpecSelector } from './SpecSelector';
28
+ import { getOperationUri } from './util';
29
+
30
+ type TriggerFormSchema = ExcludeId<typeof Trigger.Trigger>;
17
31
 
18
32
  export type TriggerEditorProps = {
19
- space: Space;
20
- trigger: FunctionTrigger;
33
+ db: Database.Database;
34
+ trigger: Trigger.Trigger;
21
35
  // TODO(wittjosiah): This needs to apply to whole spec but currently only applies to spec.kind & spec.query.
22
36
  readonlySpec?: boolean;
23
- onSave?: (trigger: Omit<FunctionTrigger, 'id'>) => void;
24
- onCancel?: () => void;
25
- } & Pick<QueryFormProps, 'types' | 'tags'>;
26
-
27
- export const TriggerEditor = ({ space, trigger, readonlySpec, types, tags, onSave, onCancel }: TriggerEditorProps) => {
28
- const handleSave = ({ id: _, ...values }: FunctionTrigger) => {
29
- onSave?.(values);
30
- };
37
+ } &
38
+ // prettier-ignore
39
+ Pick<QueryFormProps, 'types' | 'tags'> &
40
+ Pick<FormRootProps<TriggerFormSchema>, 'onSave' | 'onCancel'>;
41
+
42
+ export const TriggerEditor = ({ db, types, tags, readonlySpec, trigger, ...formProps }: TriggerEditorProps) => {
43
+ const fieldMap = useCustomInputs({ db, types, tags, readonlySpec });
44
+
45
+ const handleValuesChanged = useCallback(
46
+ (newValues: Partial<TriggerFormSchema>) => {
47
+ Obj.update(trigger, (trigger) => {
48
+ Object.assign(trigger, newValues);
49
+ });
50
+ },
51
+ [trigger],
52
+ );
31
53
 
32
- const handleRefQueryLookup = useRefQueryLookupHandler({ space });
33
- const Custom = useCustomInputs({ space, readonlySpec, types, tags, onQueryRefOptions: handleRefQueryLookup });
54
+ const triggerSchema = useMemo(() => omitId(Trigger.Trigger), []);
55
+ const defaultValues = useMemo(() => {
56
+ const { id: _, ...values } = trigger;
57
+ return values;
58
+ }, [trigger]);
34
59
 
35
60
  return (
36
- <Form
37
- outerSpacing={false}
38
- Custom={Custom}
39
- schema={FunctionTrigger}
40
- values={trigger}
41
- onSave={handleSave}
42
- onCancel={onCancel}
43
- onQueryRefOptions={handleRefQueryLookup}
44
- />
61
+ <Form.Root<TriggerFormSchema>
62
+ {...formProps}
63
+ db={db}
64
+ schema={triggerSchema}
65
+ defaultValues={defaultValues}
66
+ fieldMap={fieldMap}
67
+ onValuesChanged={handleValuesChanged}
68
+ >
69
+ <Form.Viewport>
70
+ <Form.Content>
71
+ <Form.FieldSet />
72
+ <Form.Actions />
73
+ </Form.Content>
74
+ </Form.Viewport>
75
+ </Form.Root>
45
76
  );
46
77
  };
47
78
 
48
79
  type UseCustomInputsProps = {
49
- space: Space;
80
+ db: Database.Database;
50
81
  readonlySpec?: boolean;
51
- onQueryRefOptions: FunctionInputEditorProps['onQueryRefOptions'];
52
82
  } & Pick<QueryFormProps, 'types' | 'tags'>;
53
83
 
54
- const useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }: UseCustomInputsProps) => {
55
- const functions = useQuery(space, Filter.type(FunctionType));
56
- const workflows = useQuery(space, Filter.type(ComputeGraph));
57
- const scripts = useQuery(space, Filter.type(ScriptType));
84
+ const useCustomInputs = ({ db, readonlySpec, types, tags }: UseCustomInputsProps): FormFieldMap => {
85
+ const functions = useQuery(
86
+ db,
87
+ Query.select(Filter.type(Operation.PersistentOperation)).from(Scope.space(), Scope.registry()),
88
+ );
89
+
90
+ const workflows = useQuery(db, Filter.type(ComputeGraph));
91
+ const scripts = useQuery(db, Filter.type(Script.Script));
92
+ const feeds = useQuery(db, Filter.type(Feed.Feed));
58
93
 
59
94
  return useMemo(
60
- (): CustomInputMap => ({
95
+ (): FormFieldMap => ({
61
96
  // Function selector.
62
- ['function' satisfies keyof FunctionTrigger]: (props) => {
97
+ ['function' satisfies keyof Trigger.Trigger]: (props) => {
63
98
  const getValue = useCallback(() => {
64
99
  const formValue = props.getValue();
65
100
  if (Ref.isRef(formValue)) {
66
- return formValue.dxn.toString() as string;
101
+ return formValue.uri;
67
102
  }
68
103
  return undefined;
69
104
  }, [props]);
70
105
 
71
106
  const handleOnValueChange = useCallback(
72
- (_type: any, dxnString: string) => {
73
- const dxn = Type.DXN.parse(dxnString);
74
- if (dxn) {
75
- const ref = Ref.fromDXN(dxn);
76
- props.onValueChange('object', ref);
107
+ (_type: any, uriString: string) => {
108
+ // Function references are either an EID (space-resident) or a key DXN (registry).
109
+ const uri = EID.tryParse(uriString) ?? (DXN.isDXN(uriString) ? uriString : undefined);
110
+ if (uri) {
111
+ props.onValueChange(props.type, Ref.fromURI(uri));
77
112
  }
78
113
  },
79
- [props.onValueChange],
114
+ [props.type, props.onValueChange],
80
115
  );
81
116
 
82
117
  return (
83
- <SelectInput
118
+ <SelectField
84
119
  {...props}
85
120
  getValue={getValue as any}
86
121
  onValueChange={handleOnValueChange}
@@ -90,38 +125,126 @@ const useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }
90
125
  },
91
126
 
92
127
  // Spec selector.
93
- ['spec.kind' as const]: (props) => <SpecSelector {...props} readonly={readonlySpec ? 'disabled-input' : false} />,
128
+ 'spec.kind': (props) => <SpecSelector {...props} readonly={readonlySpec} />,
129
+
130
+ // Feed selector with parent labels.
131
+ 'spec.feed': (props) => {
132
+ const getValue = useCallback(() => {
133
+ const formValue = props.getValue();
134
+ if (Ref.isRef(formValue)) {
135
+ return formValue.uri.toString() as string;
136
+ }
137
+ return undefined;
138
+ }, [props]);
139
+
140
+ const handleOnValueChange = useCallback(
141
+ (_type: any, dxnString: string) => {
142
+ const uri = EID.tryParse(dxnString);
143
+ if (uri) {
144
+ props.onValueChange(props.type, Ref.fromURI(uri));
145
+ }
146
+ },
147
+ [props.type, props.onValueChange],
148
+ );
149
+
150
+ return (
151
+ <SelectField
152
+ {...props}
153
+ getValue={getValue as any}
154
+ onValueChange={handleOnValueChange}
155
+ options={getFeedOptions(feeds)}
156
+ />
157
+ );
158
+ },
94
159
 
95
160
  // TODO(wittjosiah): Copied from ViewEditor.
96
161
  // Query input editor.
97
- ['spec.query' as const]: (props) => {
162
+ 'spec.query': (props) => {
98
163
  const handleChange = useCallback(
99
- (query: Query.Any) => props.onValueChange('object', { ast: query.ast }),
100
- [props.onValueChange],
164
+ (query: Query.Any) => props.onValueChange(props.type, { ast: query.ast }),
165
+ [props.type, props.onValueChange],
101
166
  );
102
167
 
103
168
  return (
104
169
  <Input.Root>
105
- <InputHeader label={props.label} />
170
+ <FormFieldLabel label={props.label} asChild />
106
171
  <QueryForm initialQuery={(props.getValue() as any).ast} types={types} tags={tags} onChange={handleChange} />
107
172
  </Input.Root>
108
173
  );
109
174
  },
110
175
 
111
176
  // Function input editor.
112
- ['input' as const]: (props) => (
113
- <FunctionInputEditor {...props} functions={functions} onQueryRefOptions={onQueryRefOptions} />
114
- ),
177
+ input: (props) => <FunctionInputEditor {...props} functions={functions} db={db} />,
115
178
  }),
116
- [workflows, scripts, functions, readonlySpec],
179
+ [workflows, scripts, functions, feeds, readonlySpec],
117
180
  );
118
181
  };
119
182
 
183
+ const getObjectIconProps = (object: Entity.Unknown): { icon?: string; iconHue?: string } => {
184
+ const type = Entity.getType(object);
185
+ const schema = type ? Type.getSchema(type) : undefined;
186
+ const annotation = schema ? Option.getOrUndefined(Annotation.IconAnnotation.get(schema)) : undefined;
187
+ return annotation ? { icon: annotation.icon, iconHue: annotation.hue } : {};
188
+ };
189
+
120
190
  const getWorkflowOptions = (graphs: ComputeGraph[]) => {
121
- return graphs.map((graph) => ({ label: `compute-${graph.id}`, value: `dxn:echo:@:${graph.id}` }));
191
+ return graphs.map((graph) => ({
192
+ label: `compute-${graph.id}`,
193
+ value: Obj.getURI(graph),
194
+ ...getObjectIconProps(graph),
195
+ }));
196
+ };
197
+
198
+ const getFunctionOptions = (scripts: Script.Script[], functions: Operation.PersistentOperation[]) => {
199
+ const getLabel = (fn: Operation.PersistentOperation) =>
200
+ scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
201
+ return functions.map((fn) => {
202
+ const { icon: schemaIcon, iconHue } = getObjectIconProps(fn);
203
+ return {
204
+ label: getLabel(fn),
205
+ value: getOperationUri(fn),
206
+ icon: fn.icon ?? schemaIcon,
207
+ iconHue,
208
+ };
209
+ });
210
+ };
211
+
212
+ const getFeedDisplayName = (feed: Feed.Feed): string =>
213
+ Entity.getLabel(feed) ?? feed.name ?? Entity.getTypename(feed) ?? 'Feed';
214
+
215
+ const computeRefRole = (entity: Feed.Feed): string | undefined => {
216
+ const parent = Obj.getParent(entity);
217
+ if (!parent) {
218
+ return undefined;
219
+ }
220
+ for (const key of Record.keys(parent)) {
221
+ if (Ref.isRef(parent[key]) && parent[key].target?.id === entity.id) {
222
+ return `$.${key}`;
223
+ }
224
+ }
225
+ return undefined;
122
226
  };
123
227
 
124
- const getFunctionOptions = (scripts: ScriptType[], functions: FunctionType[]) => {
125
- const getLabel = (fn: FunctionType) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
126
- return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:echo:@:${fn.id}` }));
228
+ const getFeedOptions = (feeds: Feed.Feed[]) => {
229
+ return feeds.map((feed) => {
230
+ const parent = Obj.getParent(feed);
231
+ const displayObject = parent ?? feed;
232
+ const role = computeRefRole(feed);
233
+
234
+ if (parent) {
235
+ return {
236
+ label: Entity.getLabel(parent) ?? Entity.getTypename(parent) ?? 'Parent',
237
+ secondaryLabel: role ?? getFeedDisplayName(feed),
238
+ value: Obj.getURI(feed),
239
+ ...getObjectIconProps(displayObject),
240
+ };
241
+ }
242
+
243
+ return {
244
+ label: getFeedDisplayName(feed),
245
+ secondaryLabel: role,
246
+ value: Obj.getURI(feed),
247
+ ...getObjectIconProps(displayObject),
248
+ };
249
+ });
127
250
  };
@@ -0,0 +1,51 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Operation } from '@dxos/compute';
6
+ import { Obj } from '@dxos/echo';
7
+ import { DXN, EID, type URI } from '@dxos/keys';
8
+
9
+ /**
10
+ * Reference URI for an operation. Registry operations (no owning database) are referenced by
11
+ * their versioned key DXN so they resolve via the operation registry; space-resident operations
12
+ * are referenced by their EID.
13
+ */
14
+ // TODO(wittjosiah): There should be a generic & consistent way to get the dxn uri for entities if its available.
15
+ export const getOperationUri = (fn: Operation.PersistentOperation): URI.URI => {
16
+ if (Obj.getDatabase(fn) === undefined) {
17
+ const key = Operation.getKey(fn);
18
+ const version = Operation.getVersion(fn);
19
+ const dxn = key ? DXN.tryMake(version ? `dxn:${key}:${version}` : `dxn:${key}`) : undefined;
20
+ if (dxn) {
21
+ return dxn;
22
+ }
23
+ }
24
+
25
+ return Obj.getURI(fn);
26
+ };
27
+
28
+ /**
29
+ * Resolve an operation from a list by its reference URI (an EID for space-resident operations,
30
+ * or a versioned key DXN for registry operations).
31
+ */
32
+ export const findOperationByUri = (
33
+ functions: readonly Operation.PersistentOperation[],
34
+ uri: URI.URI,
35
+ ): Operation.PersistentOperation | undefined => {
36
+ const eid = EID.tryParse(uri);
37
+ if (eid) {
38
+ const entityId = EID.getEntityId(eid);
39
+ return entityId ? functions.find((fn) => fn.id === entityId) : undefined;
40
+ }
41
+
42
+ if (DXN.isDXN(uri)) {
43
+ const key = DXN.getName(uri);
44
+ const version = DXN.getVersion(uri);
45
+ return functions.find(
46
+ (fn) => Operation.getKey(fn) === key && (version === undefined || Operation.getVersion(fn) === version),
47
+ );
48
+ }
49
+
50
+ return undefined;
51
+ };
@@ -7,6 +7,5 @@ import { lazy } from 'react';
7
7
  export * from './TriggerEditor';
8
8
 
9
9
  export const AutomationPanel = lazy(() => import('./AutomationPanel'));
10
- export const AutomationSettings = lazy(() => import('./AutomationSettings'));
11
- export const FunctionsContainer = lazy(() => import('./FunctionsContainer'));
12
10
  export const FunctionsPanel = lazy(() => import('./FunctionsPanel'));
11
+ export const FunctionsRegistry = lazy(() => import('./FunctionsRegistry'));
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { useTranslation } from '@dxos/react-ui';
9
+ import { Settings } from '@dxos/react-ui-form';
10
+
11
+ import { meta } from '#meta';
12
+
13
+ import { AutomationPanel, type AutomationPanelProps } from '../../components/AutomationPanel';
14
+ import { TriggersSettings } from '../TriggerSettings';
15
+
16
+ export type AutomationSettingsProps = AppSurface.SpaceArticleProps<Omit<AutomationPanelProps, 'space'>>;
17
+
18
+ export const AutomationSettings = (props: AutomationSettingsProps) => {
19
+ const { t } = useTranslation(meta.id);
20
+ return (
21
+ <Settings.Viewport>
22
+ <Settings.Section
23
+ title={t('automation-verbose.label', { ns: meta.id })}
24
+ description={t('automation.description', { ns: meta.id })}
25
+ >
26
+ <AutomationPanel {...props} />
27
+ <TriggersSettings space={props.space} />
28
+ </Settings.Section>
29
+ </Settings.Viewport>
30
+ );
31
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { AutomationSettings as default } from './AutomationSettings';
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { useTranslation } from '@dxos/react-ui';
9
+ import { Settings } from '@dxos/react-ui-form';
10
+
11
+ import { meta } from '#meta';
12
+
13
+ import { FunctionsPanel, FunctionsRegistry } from '../../components';
14
+
15
+ export const FunctionsContainer = ({ space }: AppSurface.SpaceArticleProps) => {
16
+ const { t } = useTranslation(meta.id);
17
+ return (
18
+ <Settings.Viewport>
19
+ <Settings.Section
20
+ title={t('functions-verbose.label', { ns: meta.id })}
21
+ description={t('functions.description', { ns: meta.id })}
22
+ >
23
+ <FunctionsPanel space={space} />
24
+ </Settings.Section>
25
+ <Settings.Section
26
+ title={t('functions-registry-verbose.label', { ns: meta.id })}
27
+ description={t('functions-registry.description', { ns: meta.id })}
28
+ >
29
+ <FunctionsRegistry space={space} />
30
+ </Settings.Section>
31
+ </Settings.Viewport>
32
+ );
33
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { FunctionsContainer as default } from './FunctionsContainer';