@dxos/plugin-automation 0.8.4-main.c4373fc → 0.8.4-main.d05673bc65

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 (335) hide show
  1. package/dist/lib/browser/AutomationPanel-IGLIQY2N.mjs +11 -0
  2. package/dist/lib/browser/AutomationSettings-EDO3N5WI.mjs +37 -0
  3. package/dist/lib/browser/AutomationSettings-EDO3N5WI.mjs.map +7 -0
  4. package/dist/lib/browser/FunctionsContainer-R4ZMYSFJ.mjs +43 -0
  5. package/dist/lib/browser/FunctionsContainer-R4ZMYSFJ.mjs.map +7 -0
  6. package/dist/lib/browser/{FunctionsPanel-NRIKAPQV.mjs → FunctionsPanel-NMA4RYJL.mjs} +3 -3
  7. package/dist/lib/browser/FunctionsRegistry-TMKAEG5E.mjs +10 -0
  8. package/dist/lib/browser/TriggerSettings-56AIMOEC.mjs +11 -0
  9. package/dist/lib/browser/app-graph-builder-74ILZP25.mjs +83 -0
  10. package/dist/lib/browser/app-graph-builder-74ILZP25.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-75XLBFAG.mjs +97 -0
  12. package/dist/lib/browser/chunk-75XLBFAG.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BWEKRPFJ.mjs +294 -0
  14. package/dist/lib/browser/chunk-BWEKRPFJ.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-EL64ZPPN.mjs +17 -0
  16. package/dist/lib/browser/chunk-EL64ZPPN.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FUVAC5EC.mjs +96 -0
  18. package/dist/lib/browser/chunk-FUVAC5EC.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-GVHAETEQ.mjs +83 -0
  20. package/dist/lib/browser/chunk-GVHAETEQ.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-H2MV4XE6.mjs +31 -0
  22. package/dist/lib/browser/chunk-H2MV4XE6.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-O23LHDEX.mjs +269 -0
  24. package/dist/lib/browser/chunk-O23LHDEX.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-OAZ2JYXV.mjs +93 -0
  26. package/dist/lib/browser/chunk-OAZ2JYXV.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-Z7F7X2C5.mjs +8 -0
  28. package/dist/lib/browser/chunk-Z7F7X2C5.mjs.map +7 -0
  29. package/dist/lib/browser/cli/index.mjs +1115 -0
  30. package/dist/lib/browser/cli/index.mjs.map +7 -0
  31. package/dist/lib/browser/compute-runtime-F3UMRKCL.mjs +124 -0
  32. package/dist/lib/browser/compute-runtime-F3UMRKCL.mjs.map +7 -0
  33. package/dist/lib/browser/hooks/index.mjs +5 -4
  34. package/dist/lib/browser/index.mjs +66 -64
  35. package/dist/lib/browser/index.mjs.map +4 -4
  36. package/dist/lib/browser/meta.json +1 -1
  37. package/dist/lib/browser/operation-resolver-IRC2DZU7.mjs +84 -0
  38. package/dist/lib/browser/operation-resolver-IRC2DZU7.mjs.map +7 -0
  39. package/dist/lib/browser/react-surface-5MFPVWIN.mjs +65 -0
  40. package/dist/lib/browser/react-surface-5MFPVWIN.mjs.map +7 -0
  41. package/dist/lib/browser/types/index.mjs +10 -4
  42. package/dist/lib/node-esm/{AutomationPanel-GHK5UG4K.mjs → AutomationPanel-O2BCQA7P.mjs} +4 -4
  43. package/dist/lib/node-esm/AutomationPanel-O2BCQA7P.mjs.map +7 -0
  44. package/dist/lib/node-esm/AutomationSettings-LJNRQUX7.mjs +38 -0
  45. package/dist/lib/node-esm/AutomationSettings-LJNRQUX7.mjs.map +7 -0
  46. package/dist/lib/node-esm/FunctionsContainer-GYRPQZM7.mjs +44 -0
  47. package/dist/lib/node-esm/FunctionsContainer-GYRPQZM7.mjs.map +7 -0
  48. package/dist/lib/node-esm/{FunctionsPanel-SAMRTELO.mjs → FunctionsPanel-DCXXLSVP.mjs} +3 -3
  49. package/dist/lib/node-esm/FunctionsPanel-DCXXLSVP.mjs.map +7 -0
  50. package/dist/lib/node-esm/FunctionsRegistry-7WCHC64E.mjs +11 -0
  51. package/dist/lib/node-esm/FunctionsRegistry-7WCHC64E.mjs.map +7 -0
  52. package/dist/lib/node-esm/TriggerSettings-ONY5ZUKW.mjs +12 -0
  53. package/dist/lib/node-esm/TriggerSettings-ONY5ZUKW.mjs.map +7 -0
  54. package/dist/lib/node-esm/app-graph-builder-VDXPOWCH.mjs +84 -0
  55. package/dist/lib/node-esm/app-graph-builder-VDXPOWCH.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-2UF55HSG.mjs +94 -0
  57. package/dist/lib/node-esm/chunk-2UF55HSG.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-6B4WZRVH.mjs +84 -0
  59. package/dist/lib/node-esm/chunk-6B4WZRVH.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-6JVB3IHW.mjs +97 -0
  61. package/dist/lib/node-esm/chunk-6JVB3IHW.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-FPXVLTEY.mjs +270 -0
  63. package/dist/lib/node-esm/chunk-FPXVLTEY.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-JVUE5PMI.mjs +32 -0
  65. package/dist/lib/node-esm/chunk-JVUE5PMI.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-K7T2MVB7.mjs +98 -0
  67. package/dist/lib/node-esm/chunk-K7T2MVB7.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-Q5JSKD6Z.mjs +295 -0
  69. package/dist/lib/node-esm/chunk-Q5JSKD6Z.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-R5YEWJCG.mjs +10 -0
  71. package/dist/lib/node-esm/chunk-R5YEWJCG.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-WC5AT7B3.mjs +19 -0
  73. package/dist/lib/node-esm/chunk-WC5AT7B3.mjs.map +7 -0
  74. package/dist/lib/node-esm/cli/index.mjs +1116 -0
  75. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  76. package/dist/lib/node-esm/compute-runtime-AMFVJMF2.mjs +125 -0
  77. package/dist/lib/node-esm/compute-runtime-AMFVJMF2.mjs.map +7 -0
  78. package/dist/lib/node-esm/hooks/index.mjs +5 -4
  79. package/dist/lib/node-esm/index.mjs +66 -64
  80. package/dist/lib/node-esm/index.mjs.map +4 -4
  81. package/dist/lib/node-esm/meta.json +1 -1
  82. package/dist/lib/node-esm/operation-resolver-CBLQHL4N.mjs +85 -0
  83. package/dist/lib/node-esm/operation-resolver-CBLQHL4N.mjs.map +7 -0
  84. package/dist/lib/node-esm/react-surface-Z74AHU4T.mjs +66 -0
  85. package/dist/lib/node-esm/react-surface-Z74AHU4T.mjs.map +7 -0
  86. package/dist/lib/node-esm/types/index.mjs +10 -4
  87. package/dist/types/src/AutomationPlugin.d.ts +2 -1
  88. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  90. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  92. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/compute-runtime/compute-runtime.d.ts +6 -0
  94. package/dist/types/src/capabilities/compute-runtime/compute-runtime.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/compute-runtime/index.d.ts +3 -0
  96. package/dist/types/src/capabilities/compute-runtime/index.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/index.d.ts +4 -5
  98. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  100. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  102. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  104. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  106. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  107. package/dist/types/src/cli/commands/index.d.ts +2 -0
  108. package/dist/types/src/cli/commands/index.d.ts.map +1 -0
  109. package/dist/types/src/cli/commands/trigger/create/index.d.ts +25 -0
  110. package/dist/types/src/cli/commands/trigger/create/index.d.ts.map +1 -0
  111. package/dist/types/src/cli/commands/trigger/create/queue.d.ts +13 -0
  112. package/dist/types/src/cli/commands/trigger/create/queue.d.ts.map +1 -0
  113. package/dist/types/src/cli/commands/trigger/create/subscription.d.ts +15 -0
  114. package/dist/types/src/cli/commands/trigger/create/subscription.d.ts.map +1 -0
  115. package/dist/types/src/cli/commands/trigger/create/timer.d.ts +13 -0
  116. package/dist/types/src/cli/commands/trigger/create/timer.d.ts.map +1 -0
  117. package/dist/types/src/cli/commands/trigger/index.d.ts +57 -0
  118. package/dist/types/src/cli/commands/trigger/index.d.ts.map +1 -0
  119. package/dist/types/src/cli/commands/trigger/list.d.ts +7 -0
  120. package/dist/types/src/cli/commands/trigger/list.d.ts.map +1 -0
  121. package/dist/types/src/cli/commands/trigger/options.d.ts +11 -0
  122. package/dist/types/src/cli/commands/trigger/options.d.ts.map +1 -0
  123. package/dist/types/src/cli/commands/trigger/remove.d.ts +8 -0
  124. package/dist/types/src/cli/commands/trigger/remove.d.ts.map +1 -0
  125. package/dist/types/src/cli/commands/trigger/update/index.d.ts +28 -0
  126. package/dist/types/src/cli/commands/trigger/update/index.d.ts.map +1 -0
  127. package/dist/types/src/cli/commands/trigger/update/queue.d.ts +12 -0
  128. package/dist/types/src/cli/commands/trigger/update/queue.d.ts.map +1 -0
  129. package/dist/types/src/cli/commands/trigger/update/subscription.d.ts +13 -0
  130. package/dist/types/src/cli/commands/trigger/update/subscription.d.ts.map +1 -0
  131. package/dist/types/src/cli/commands/trigger/update/timer.d.ts +11 -0
  132. package/dist/types/src/cli/commands/trigger/update/timer.d.ts.map +1 -0
  133. package/dist/types/src/cli/commands/trigger/util.d.ts +46 -0
  134. package/dist/types/src/cli/commands/trigger/util.d.ts.map +1 -0
  135. package/dist/types/src/cli/index.d.ts +2 -0
  136. package/dist/types/src/cli/index.d.ts.map +1 -0
  137. package/dist/types/src/cli/plugin.d.ts +3 -0
  138. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  139. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +6 -7
  140. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  141. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +5 -0
  142. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  144. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts +8 -0
  145. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -0
  146. package/dist/types/src/components/FunctionsRegistry/index.d.ts +4 -0
  147. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -0
  148. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +12 -9
  149. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  150. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  151. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  152. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +10 -8
  153. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  154. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +74 -2
  155. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/index.d.ts +3 -4
  157. package/dist/types/src/components/index.d.ts.map +1 -1
  158. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts +4 -0
  159. package/dist/types/src/containers/AutomationSettings/AutomationSettings.d.ts.map +1 -0
  160. package/dist/types/src/containers/AutomationSettings/index.d.ts +3 -0
  161. package/dist/types/src/containers/AutomationSettings/index.d.ts.map +1 -0
  162. package/dist/types/src/{components → containers/FunctionsContainer}/FunctionsContainer.d.ts +0 -1
  163. package/dist/types/src/containers/FunctionsContainer/FunctionsContainer.d.ts.map +1 -0
  164. package/dist/types/src/containers/FunctionsContainer/index.d.ts +3 -0
  165. package/dist/types/src/containers/FunctionsContainer/index.d.ts.map +1 -0
  166. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts +6 -0
  167. package/dist/types/src/containers/TriggerSettings/TriggerSettings.d.ts.map +1 -0
  168. package/dist/types/src/containers/TriggerSettings/index.d.ts +3 -0
  169. package/dist/types/src/containers/TriggerSettings/index.d.ts.map +1 -0
  170. package/dist/types/src/containers/index.d.ts +5 -0
  171. package/dist/types/src/containers/index.d.ts.map +1 -0
  172. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +8 -4
  173. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -1
  174. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +6 -5
  175. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  176. package/dist/types/src/index.d.ts +2 -2
  177. package/dist/types/src/index.d.ts.map +1 -1
  178. package/dist/types/src/meta.d.ts +2 -2
  179. package/dist/types/src/meta.d.ts.map +1 -1
  180. package/dist/types/src/testing/test-functions.d.ts +202 -3
  181. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  182. package/dist/types/src/translations.d.ts +5 -0
  183. package/dist/types/src/translations.d.ts.map +1 -1
  184. package/dist/types/src/types/capabilities.d.ts +22 -0
  185. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  186. package/dist/types/src/types/events.d.ts +5 -0
  187. package/dist/types/src/types/events.d.ts.map +1 -0
  188. package/dist/types/src/types/index.d.ts +2 -0
  189. package/dist/types/src/types/index.d.ts.map +1 -1
  190. package/dist/types/src/types/schema.d.ts +32 -3
  191. package/dist/types/src/types/schema.d.ts.map +1 -1
  192. package/dist/types/tsconfig.tsbuildinfo +1 -1
  193. package/package.json +66 -47
  194. package/src/AutomationPlugin.tsx +15 -34
  195. package/src/capabilities/app-graph-builder/app-graph-builder.ts +73 -0
  196. package/src/capabilities/app-graph-builder/index.ts +7 -0
  197. package/src/capabilities/compute-runtime/compute-runtime.ts +146 -0
  198. package/src/capabilities/compute-runtime/index.ts +7 -0
  199. package/src/capabilities/index.ts +4 -8
  200. package/src/capabilities/operation-resolver/index.ts +7 -0
  201. package/src/capabilities/operation-resolver/operation-resolver.ts +80 -0
  202. package/src/capabilities/react-surface/index.ts +7 -0
  203. package/src/capabilities/react-surface/react-surface.tsx +57 -0
  204. package/src/cli/commands/index.ts +5 -0
  205. package/src/cli/commands/trigger/create/index.ts +14 -0
  206. package/src/cli/commands/trigger/create/queue.ts +89 -0
  207. package/src/cli/commands/trigger/create/subscription.ts +128 -0
  208. package/src/cli/commands/trigger/create/timer.ts +93 -0
  209. package/src/cli/commands/trigger/index.ts +16 -0
  210. package/src/cli/commands/trigger/list.ts +67 -0
  211. package/src/cli/commands/trigger/options.ts +59 -0
  212. package/src/cli/commands/trigger/remove.ts +45 -0
  213. package/src/cli/commands/trigger/update/index.ts +14 -0
  214. package/src/cli/commands/trigger/update/queue.ts +195 -0
  215. package/src/cli/commands/trigger/update/subscription.ts +278 -0
  216. package/src/cli/commands/trigger/update/timer.ts +193 -0
  217. package/src/cli/commands/trigger/util.ts +404 -0
  218. package/src/cli/index.ts +5 -0
  219. package/src/cli/plugin.ts +24 -0
  220. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +5 -6
  221. package/src/components/AutomationPanel/AutomationPanel.tsx +188 -86
  222. package/src/components/FunctionsPanel/FunctionsPanel.tsx +34 -22
  223. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +110 -0
  224. package/src/components/FunctionsRegistry/index.ts +8 -0
  225. package/src/components/TriggerEditor/FunctionInputEditor.tsx +34 -33
  226. package/src/components/TriggerEditor/SpecSelector.tsx +12 -11
  227. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +89 -23
  228. package/src/components/TriggerEditor/TriggerEditor.tsx +101 -86
  229. package/src/components/index.ts +1 -2
  230. package/src/{components → containers/AutomationSettings}/AutomationSettings.tsx +9 -12
  231. package/src/containers/AutomationSettings/index.ts +7 -0
  232. package/src/containers/FunctionsContainer/FunctionsContainer.tsx +33 -0
  233. package/src/containers/FunctionsContainer/index.ts +7 -0
  234. package/src/containers/TriggerSettings/TriggerSettings.tsx +26 -0
  235. package/src/containers/TriggerSettings/index.ts +6 -0
  236. package/src/containers/index.ts +9 -0
  237. package/src/hooks/useComputeRuntimeCallback.ts +45 -8
  238. package/src/hooks/useTriggerRuntimeControls.ts +30 -15
  239. package/src/index.ts +2 -2
  240. package/src/meta.ts +8 -5
  241. package/src/testing/test-functions.ts +6 -6
  242. package/src/translations.ts +7 -0
  243. package/src/{capabilities → types}/capabilities.ts +9 -14
  244. package/src/types/events.ts +11 -0
  245. package/src/types/index.ts +2 -0
  246. package/src/types/schema.ts +24 -3
  247. package/dist/lib/browser/AutomationPanel-PNBH5L5C.mjs +0 -11
  248. package/dist/lib/browser/AutomationSettings-3LABN6ER.mjs +0 -69
  249. package/dist/lib/browser/AutomationSettings-3LABN6ER.mjs.map +0 -7
  250. package/dist/lib/browser/FunctionsContainer-HHBMPUOD.mjs +0 -36
  251. package/dist/lib/browser/FunctionsContainer-HHBMPUOD.mjs.map +0 -7
  252. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs +0 -81
  253. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-5ARH77PV.mjs +0 -15
  255. package/dist/lib/browser/chunk-5ARH77PV.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-AY67OUDA.mjs +0 -14
  257. package/dist/lib/browser/chunk-AY67OUDA.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-DLLE4FKP.mjs +0 -94
  259. package/dist/lib/browser/chunk-DLLE4FKP.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-LC3QQU47.mjs +0 -171
  261. package/dist/lib/browser/chunk-LC3QQU47.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-MVPRI3DB.mjs +0 -53
  263. package/dist/lib/browser/chunk-MVPRI3DB.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-NIJWEQRD.mjs +0 -283
  265. package/dist/lib/browser/chunk-NIJWEQRD.mjs.map +0 -7
  266. package/dist/lib/browser/chunk-QT3YWUOT.mjs +0 -14
  267. package/dist/lib/browser/chunk-QT3YWUOT.mjs.map +0 -7
  268. package/dist/lib/browser/chunk-VGBZKM3O.mjs +0 -38
  269. package/dist/lib/browser/chunk-VGBZKM3O.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-WWURMV25.mjs +0 -13
  271. package/dist/lib/browser/chunk-WWURMV25.mjs.map +0 -7
  272. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs +0 -160
  273. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs.map +0 -7
  274. package/dist/lib/browser/intent-resolver-D2OHKQRR.mjs +0 -77
  275. package/dist/lib/browser/intent-resolver-D2OHKQRR.mjs.map +0 -7
  276. package/dist/lib/browser/react-surface-JXFO46V4.mjs +0 -63
  277. package/dist/lib/browser/react-surface-JXFO46V4.mjs.map +0 -7
  278. package/dist/lib/node-esm/AutomationSettings-XENNIIZM.mjs +0 -70
  279. package/dist/lib/node-esm/AutomationSettings-XENNIIZM.mjs.map +0 -7
  280. package/dist/lib/node-esm/FunctionsContainer-ZKVOBUHV.mjs +0 -37
  281. package/dist/lib/node-esm/FunctionsContainer-ZKVOBUHV.mjs.map +0 -7
  282. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs +0 -82
  283. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-3EWMZAU6.mjs +0 -172
  285. package/dist/lib/node-esm/chunk-3EWMZAU6.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs +0 -15
  287. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs +0 -39
  289. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-EX74SIDO.mjs +0 -284
  291. package/dist/lib/node-esm/chunk-EX74SIDO.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-LWASMQIF.mjs +0 -16
  293. package/dist/lib/node-esm/chunk-LWASMQIF.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-QCA543ZR.mjs +0 -54
  295. package/dist/lib/node-esm/chunk-QCA543ZR.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-U7LJXQS4.mjs +0 -16
  297. package/dist/lib/node-esm/chunk-U7LJXQS4.mjs.map +0 -7
  298. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs +0 -16
  299. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs.map +0 -7
  300. package/dist/lib/node-esm/chunk-YQXW3JXD.mjs +0 -95
  301. package/dist/lib/node-esm/chunk-YQXW3JXD.mjs.map +0 -7
  302. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs +0 -161
  303. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs.map +0 -7
  304. package/dist/lib/node-esm/intent-resolver-2LGBVXT5.mjs +0 -78
  305. package/dist/lib/node-esm/intent-resolver-2LGBVXT5.mjs.map +0 -7
  306. package/dist/lib/node-esm/react-surface-YDJ43B3N.mjs +0 -64
  307. package/dist/lib/node-esm/react-surface-YDJ43B3N.mjs.map +0 -7
  308. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  309. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  310. package/dist/types/src/capabilities/capabilities.d.ts +0 -19
  311. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  312. package/dist/types/src/capabilities/compute-runtime.d.ts +0 -5
  313. package/dist/types/src/capabilities/compute-runtime.d.ts.map +0 -1
  314. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  315. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  316. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  317. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  318. package/dist/types/src/components/AutomationSettings.d.ts +0 -5
  319. package/dist/types/src/components/AutomationSettings.d.ts.map +0 -1
  320. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  321. package/dist/types/src/components/TriggerSettings.d.ts +0 -6
  322. package/dist/types/src/components/TriggerSettings.d.ts.map +0 -1
  323. package/dist/types/src/events.d.ts +0 -4
  324. package/dist/types/src/events.d.ts.map +0 -1
  325. package/src/capabilities/app-graph-builder.ts +0 -87
  326. package/src/capabilities/compute-runtime.ts +0 -138
  327. package/src/capabilities/intent-resolver.ts +0 -72
  328. package/src/capabilities/react-surface.tsx +0 -55
  329. package/src/components/FunctionsContainer.tsx +0 -29
  330. package/src/components/TriggerSettings.tsx +0 -25
  331. package/src/events.ts +0 -11
  332. /package/dist/lib/browser/{AutomationPanel-PNBH5L5C.mjs.map → AutomationPanel-IGLIQY2N.mjs.map} +0 -0
  333. /package/dist/lib/browser/{FunctionsPanel-NRIKAPQV.mjs.map → FunctionsPanel-NMA4RYJL.mjs.map} +0 -0
  334. /package/dist/lib/{node-esm/AutomationPanel-GHK5UG4K.mjs.map → browser/FunctionsRegistry-TMKAEG5E.mjs.map} +0 -0
  335. /package/dist/lib/{node-esm/FunctionsPanel-SAMRTELO.mjs.map → browser/TriggerSettings-56AIMOEC.mjs.map} +0 -0
@@ -3,57 +3,70 @@
3
3
  //
4
4
 
5
5
  import * as Array from 'effect/Array';
6
- import * as Function from 'effect/Function';
6
+ import * as EFn from 'effect/Function';
7
7
  import * as Match from 'effect/Match';
8
8
  import * as Schema from 'effect/Schema';
9
- import React, { useMemo, useState } from 'react';
9
+ import React, { useCallback, useMemo, useState } from 'react';
10
10
 
11
- import { Filter, Obj } from '@dxos/echo';
12
- import { FunctionTrigger, FunctionType, ScriptType } from '@dxos/functions';
11
+ import { Filter, Obj, Tag } from '@dxos/echo';
12
+ import { Function, Script, Trigger } from '@dxos/functions';
13
+ import { KEY_QUEUE_CURSOR } from '@dxos/functions-runtime';
14
+ import { FunctionsServiceClient } from '@dxos/functions-runtime/edge';
15
+ import { useTypeOptions } from '@dxos/plugin-space';
13
16
  import { type Client, useClient } from '@dxos/react-client';
14
- import { type Space, getSpace, useQuery } from '@dxos/react-client/echo';
15
- import { Clipboard, IconButton, Input, Separator, type ThemedClassName, useTranslation } from '@dxos/react-ui';
16
- import { ControlItem, controlItemClasses } from '@dxos/react-ui-form';
17
+ import { type Space, useObject, useQuery } from '@dxos/react-client/echo';
18
+ import { Clipboard, IconButton, type IconButtonProps, Input, Separator, useTranslation } from '@dxos/react-ui';
19
+ import { Settings } from '@dxos/react-ui-form';
17
20
  import { List } from '@dxos/react-ui-list';
18
- import { ghostHover, mx } from '@dxos/react-ui-theme';
19
- import { DataType } from '@dxos/schema';
21
+ import { Pipeline } from '@dxos/types';
22
+ import { ghostHover, mx } from '@dxos/ui-theme';
23
+ import { isNonNullable } from '@dxos/util';
20
24
 
21
25
  import { meta } from '../../meta';
22
26
  import { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';
23
27
 
24
- const grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';
28
+ const grid = 'grid grid-cols-[40px_1fr_32px_32px] min-h-[2.5rem]';
25
29
 
26
- export type AutomationPanelProps = ThemedClassName<{
30
+ export type AutomationPanelProps = {
27
31
  space: Space;
28
- object?: Obj.Any;
29
- initialTrigger?: FunctionTrigger;
32
+ object?: Obj.Unknown;
33
+ initialTrigger?: Trigger.Trigger;
30
34
  onDone?: () => void;
31
- }>;
35
+ };
32
36
 
33
37
  // TODO(burdon): Factor out common layout with ViewEditor.
34
- export const AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }: AutomationPanelProps) => {
38
+ export const AutomationPanel = ({ space, object, initialTrigger, onDone }: AutomationPanelProps) => {
35
39
  const { t } = useTranslation(meta.id);
36
40
  const client = useClient();
37
- const functions = useQuery(space, Filter.type(FunctionType));
38
- const triggers = useQuery(space, Filter.type(FunctionTrigger));
41
+ const functionsServiceClient = useMemo(() => FunctionsServiceClient.fromClient(client), [client]);
42
+ const functions = useQuery(space.db, Filter.type(Function.Function));
43
+ const triggers = useQuery(space.db, Filter.type(Trigger.Trigger));
39
44
  const filteredTriggers = useMemo(() => {
40
45
  return object ? triggers.filter(triggerMatch(object)) : triggers;
41
46
  }, [object, triggers]);
47
+ const tags = useQuery(space.db, Filter.type(Tag.Tag));
48
+ const types = useTypeOptions({
49
+ space,
50
+ annotation: {
51
+ location: ['database', 'runtime'],
52
+ kind: ['user'],
53
+ },
54
+ });
42
55
 
43
- const [trigger, setTrigger] = useState<FunctionTrigger | undefined>(initialTrigger);
44
- const [selected, setSelected] = useState<FunctionTrigger>();
56
+ const [trigger, setTrigger] = useState<Trigger.Trigger | undefined>(initialTrigger);
57
+ const [selected, setSelected] = useState<Trigger.Trigger>();
45
58
 
46
- const handleSelect = (trigger: FunctionTrigger) => {
59
+ const handleSelect = (trigger: Trigger.Trigger) => {
47
60
  setTrigger(trigger);
48
61
  setSelected(trigger);
49
62
  };
50
63
 
51
64
  const handleAdd = () => {
52
- setTrigger(Obj.make(FunctionTrigger, {}));
65
+ setTrigger(Trigger.make({}));
53
66
  setSelected(undefined);
54
67
  };
55
68
 
56
- const handleDelete = (trigger: FunctionTrigger) => {
69
+ const handleDelete = (trigger: Trigger.Trigger) => {
57
70
  space.db.remove(trigger);
58
71
  setTrigger(undefined);
59
72
  setSelected(undefined);
@@ -61,9 +74,11 @@ export const AutomationPanel = ({ classNames, space, object, initialTrigger, onD
61
74
 
62
75
  const handleSave: TriggerEditorProps['onSave'] = (trigger) => {
63
76
  if (selected) {
64
- Object.assign(selected, trigger);
77
+ Obj.change(selected, (mutable) => {
78
+ Object.assign(mutable, trigger);
79
+ });
65
80
  } else {
66
- space.db.add(Obj.make(FunctionTrigger, trigger));
81
+ space.db.add(Trigger.make(trigger));
67
82
  }
68
83
 
69
84
  setTrigger(undefined);
@@ -76,97 +91,184 @@ export const AutomationPanel = ({ classNames, space, object, initialTrigger, onD
76
91
  onDone?.();
77
92
  };
78
93
 
94
+ const handleForceRunTrigger = async (trigger: Trigger.Trigger) => {
95
+ await functionsServiceClient.forceRunCronTrigger(space.id, trigger.id);
96
+ };
97
+
98
+ const handleResetCursor = async (trigger: Trigger.Trigger) => {
99
+ Obj.change(trigger, (t) => {
100
+ Obj.deleteKeys(t, KEY_QUEUE_CURSOR);
101
+ });
102
+ await space.db.flush({ indexes: true });
103
+ };
104
+
79
105
  if (trigger) {
80
106
  return (
81
- <ControlItem title={t('trigger editor title')}>
107
+ <Settings.Item title={t('trigger editor title')} description={t('trigger editor description')}>
82
108
  <TriggerEditor
83
- space={space}
109
+ db={space.db}
84
110
  trigger={trigger}
85
111
  readonlySpec={Boolean(object)}
112
+ tags={tags}
113
+ types={types}
86
114
  onSave={handleSave}
87
115
  onCancel={handleCancel}
88
116
  />
89
- </ControlItem>
117
+ </Settings.Item>
90
118
  );
91
119
  }
92
120
 
93
121
  return (
94
- <div className={mx(controlItemClasses, classNames)}>
122
+ <Settings.Container>
95
123
  {filteredTriggers.length > 0 && (
96
- <List.Root<FunctionTrigger>
124
+ <List.Root<Trigger.Trigger>
97
125
  items={filteredTriggers}
98
- isItem={Schema.is(FunctionTrigger)}
126
+ isItem={Schema.is(Trigger.Trigger)}
99
127
  getId={(field) => field.id}
100
128
  >
101
129
  {({ items: filteredTriggers }) => (
102
130
  <div role='list' className='flex flex-col w-full'>
103
- {filteredTriggers?.map((trigger) => {
104
- const copyAction = getCopyAction(client, trigger);
105
- return (
106
- <List.Item<FunctionTrigger>
107
- key={trigger.id}
108
- item={trigger}
109
- classNames={mx(grid, ghostHover, 'items-center', 'px-2')}
110
- >
111
- <Input.Root>
112
- <Input.Switch
113
- checked={trigger.enabled}
114
- onCheckedChange={(checked) => (trigger.enabled = checked)}
115
- />
116
- </Input.Root>
117
-
118
- <div className={'flex'}>
119
- <List.ItemTitle
120
- classNames='px-1 cursor-pointer w-0 shrink truncate'
121
- onClick={() => handleSelect(trigger)}
122
- >
123
- {getFunctionName(functions, trigger) ?? '∅'}
124
- </List.ItemTitle>
125
-
126
- {/* TODO: a better way to expose copy action */}
127
- {copyAction && (
128
- <Clipboard.IconButton
129
- label={t(copyAction.translationKey)}
130
- value={copyAction.contentProvider()}
131
- />
132
- )}
133
- </div>
134
-
135
- <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />
136
- </List.Item>
137
- );
138
- })}
131
+ {filteredTriggers?.map((trigger) => (
132
+ <TriggerListItem
133
+ key={trigger.id}
134
+ trigger={trigger}
135
+ functions={functions}
136
+ onSelect={handleSelect}
137
+ onDelete={handleDelete}
138
+ onResetCursor={handleResetCursor}
139
+ onForceRun={handleForceRunTrigger}
140
+ />
141
+ ))}
139
142
  </div>
140
143
  )}
141
144
  </List.Root>
142
145
  )}
143
- {filteredTriggers.length > 0 && <Separator classNames='mlb-4' />}
146
+
147
+ {filteredTriggers.length > 0 && <Separator classNames='my-4' />}
144
148
  <IconButton icon='ph--plus--regular' label={t('new trigger label')} onClick={handleAdd} />
145
- </div>
149
+ </Settings.Container>
150
+ );
151
+ };
152
+
153
+ const TriggerListItem = ({
154
+ trigger,
155
+ functions,
156
+ onSelect,
157
+ onDelete,
158
+ onResetCursor,
159
+ onForceRun,
160
+ }: {
161
+ trigger: Trigger.Trigger;
162
+ functions: Function.Function[];
163
+ onSelect?: (trigger: Trigger.Trigger) => void;
164
+ onDelete?: (trigger: Trigger.Trigger) => void;
165
+ onResetCursor?: (trigger: Trigger.Trigger) => void;
166
+ onForceRun?: (trigger: Trigger.Trigger) => void;
167
+ }) => {
168
+ const client = useClient();
169
+ const copyAction = getCopyAction(client, trigger);
170
+ const { t } = useTranslation(meta.id);
171
+ const cursor = Obj.getKeys(trigger, KEY_QUEUE_CURSOR).at(0)?.id;
172
+ const [snapshot, updateTrigger] = useObject(trigger);
173
+
174
+ const enabled = snapshot.enabled ?? false;
175
+ const onEnabledChange = (checked: boolean) => {
176
+ updateTrigger((trigger) => {
177
+ trigger.enabled = checked;
178
+ });
179
+ };
180
+
181
+ const handleSelect = useCallback(() => {
182
+ onSelect?.(trigger);
183
+ }, [onSelect, trigger]);
184
+
185
+ const handleDelete = useCallback(() => {
186
+ onDelete?.(trigger);
187
+ }, [onDelete, trigger]);
188
+
189
+ const handleResetCursor = useCallback(() => {
190
+ onResetCursor?.(trigger);
191
+ }, [onResetCursor, trigger]);
192
+
193
+ const handleForceRun = useCallback(() => {
194
+ onForceRun?.(trigger);
195
+ }, [onForceRun, trigger]);
196
+
197
+ const actionProps = useMemo<IconButtonProps | undefined>(() => {
198
+ if (trigger.spec?.kind === 'timer' && onForceRun) {
199
+ return {
200
+ disabled: !enabled || trigger.spec?.kind !== 'timer',
201
+ icon: 'ph--play--regular',
202
+ label: 'Force run',
203
+ onClick: handleForceRun,
204
+ };
205
+ }
206
+
207
+ if (trigger.spec?.kind === 'queue' && onResetCursor) {
208
+ return {
209
+ disabled: !cursor,
210
+ icon: 'ph--arrow-clockwise--regular',
211
+ label: 'Reset cursor',
212
+ onClick: handleResetCursor,
213
+ };
214
+ }
215
+ }, [enabled, trigger.spec?.kind, handleForceRun]);
216
+
217
+ return (
218
+ <List.Item<Obj.Snapshot<Trigger.Trigger>>
219
+ key={trigger.id}
220
+ item={snapshot}
221
+ classNames={mx(grid, ghostHover, 'items-center', 'px-2')}
222
+ >
223
+ <Input.Root>
224
+ <Input.Switch checked={enabled} onCheckedChange={onEnabledChange} />
225
+ </Input.Root>
226
+
227
+ <div className={'flex'}>
228
+ <List.ItemTitle classNames='px-1 cursor-pointer w-0 shrink truncate' onClick={handleSelect}>
229
+ {getFunctionName(functions, trigger) ?? '∅'}
230
+ {cursor && <div className='text-xs text-description truncate ml-4'>Position: {cursor}</div>}
231
+ </List.ItemTitle>
232
+
233
+ {copyAction && (
234
+ <Clipboard.IconButton label={t(copyAction.translationKey)} value={copyAction.contentProvider()} />
235
+ )}
236
+ </div>
237
+
238
+ {actionProps ? <List.ItemIconButton {...actionProps} autoHide={false} /> : <div />}
239
+
240
+ {onDelete && <List.ItemDeleteButton onClick={handleDelete} />}
241
+ </List.Item>
146
242
  );
147
243
  };
148
244
 
149
- const getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {
245
+ const getCopyAction = (client: Client, trigger: Trigger.Trigger | undefined) => {
150
246
  if (trigger?.spec?.kind === 'email') {
151
- return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };
247
+ return {
248
+ translationKey: 'trigger copy email' as const,
249
+ contentProvider: () => `${Obj.getDatabase(trigger)!.spaceId}@dxos.network`,
250
+ };
152
251
  }
153
252
 
154
253
  if (trigger?.spec?.kind === 'webhook') {
155
- return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };
254
+ return {
255
+ translationKey: 'trigger copy url' as const,
256
+ contentProvider: () => getWebhookUrl(client, trigger!),
257
+ };
156
258
  }
157
259
 
158
260
  return undefined;
159
261
  };
160
262
 
161
- const getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {
162
- const spaceId = getSpace(trigger)!.id;
263
+ const getWebhookUrl = (client: Client, trigger: Trigger.Trigger) => {
264
+ const spaceId = Obj.getDatabase(trigger)!.spaceId;
163
265
  const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);
164
266
  const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');
165
267
  edgeUrl.protocol = isSecure ? 'https' : 'http';
166
268
  return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
167
269
  };
168
270
 
169
- const getFunctionName = (functions: FunctionType[], trigger: FunctionTrigger) => {
271
+ const getFunctionName = (functions: Function.Function[], trigger: Trigger.Trigger) => {
170
272
  // TODO(wittjosiah): Truncation should be done in the UI.
171
273
  // Warning that the List component is currently a can of worms.
172
274
  const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}…`;
@@ -174,25 +276,25 @@ const getFunctionName = (functions: FunctionType[], trigger: FunctionTrigger) =>
174
276
  return functionObject?.name ?? shortId;
175
277
  };
176
278
 
177
- const scriptMatch = (script: ScriptType) => (trigger: FunctionTrigger) => {
279
+ const scriptMatch = (script: Script.Script) => (trigger: Trigger.Trigger) => {
178
280
  const fn = trigger.function?.target;
179
- if (!Obj.instanceOf(FunctionType, fn)) {
281
+ if (!Obj.instanceOf(Function.Function, fn)) {
180
282
  return false;
181
283
  }
182
284
 
183
285
  return fn.source?.target === script;
184
286
  };
185
287
 
186
- const projectMatch = (project: DataType.Project) => {
187
- const viewQueries = Function.pipe(
188
- project.collections,
189
- Array.map((collection) => collection.target),
190
- Array.filter(Schema.is(DataType.View)),
288
+ const projectMatch = (project: Pipeline.Pipeline) => {
289
+ const viewQueries = EFn.pipe(
290
+ project.columns,
291
+ Array.map((column) => column.view.target),
292
+ Array.filter(isNonNullable),
191
293
  Array.map((view) => Obj.getSnapshot(view).query.ast),
192
294
  Array.map((ast) => JSON.stringify(ast)),
193
295
  );
194
296
 
195
- return (trigger: FunctionTrigger) => {
297
+ return (trigger: Trigger.Trigger) => {
196
298
  const spec = Obj.getSnapshot(trigger).spec;
197
299
  if (spec?.kind !== 'subscription') {
198
300
  return false;
@@ -203,14 +305,14 @@ const projectMatch = (project: DataType.Project) => {
203
305
  };
204
306
  };
205
307
 
206
- const triggerMatch = Match.type<Obj.Any>().pipe(
207
- Match.withReturnType<(trigger: FunctionTrigger) => boolean>(),
308
+ const triggerMatch = Match.type<Obj.Unknown>().pipe(
309
+ Match.withReturnType<(trigger: Trigger.Trigger) => boolean>(),
208
310
  Match.when(
209
- (obj) => Obj.instanceOf(ScriptType, obj),
311
+ (obj) => Obj.instanceOf(Script.Script, obj),
210
312
  (obj) => scriptMatch(obj),
211
313
  ),
212
314
  Match.when(
213
- (obj) => Obj.instanceOf(DataType.Project, obj),
315
+ (obj) => Obj.instanceOf(Pipeline.Pipeline, obj),
214
316
  (obj) => projectMatch(obj),
215
317
  ),
216
318
  Match.orElse((_obj) => () => true),
@@ -5,27 +5,28 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import React, { useCallback, useMemo } from 'react';
7
7
 
8
- import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
- import { FunctionType, ScriptType } from '@dxos/functions';
10
- import { Filter, type Space, fullyQualifiedId, useQuery } from '@dxos/react-client/echo';
11
- import { Button, useTranslation } from '@dxos/react-ui';
12
- import { controlItemClasses } from '@dxos/react-ui-form';
8
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
9
+ import { LayoutOperation, getObjectPathFromObject } from '@dxos/app-toolkit';
10
+ import { Obj } from '@dxos/echo';
11
+ import { Function, Script } from '@dxos/functions';
12
+ import { SpaceOperation } from '@dxos/plugin-space/types';
13
+ import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
14
+ import { Button, IconButton, useTranslation } from '@dxos/react-ui';
15
+ import { Settings } from '@dxos/react-ui-form';
13
16
  import { List } from '@dxos/react-ui-list';
14
- import { ghostHover, mx } from '@dxos/react-ui-theme';
17
+ import { ghostHover, mx } from '@dxos/ui-theme';
15
18
 
16
19
  import { meta } from '../../meta';
17
20
 
18
- const grid = 'grid grid-cols-[1fr_auto] min-bs-[2.5rem]';
19
-
20
21
  export type FunctionsPanelProps = {
21
22
  space: Space;
22
23
  };
23
24
 
24
25
  export const FunctionsPanel = ({ space }: FunctionsPanelProps) => {
25
26
  const { t } = useTranslation(meta.id);
26
- const functions = useQuery(space, Filter.type(FunctionType));
27
- const scripts = useQuery(space, Filter.type(ScriptType));
28
- const { dispatchPromise: dispatch } = useIntentDispatcher();
27
+ const functions = useQuery(space.db, Filter.type(Function.Function));
28
+ const scripts = useQuery(space.db, Filter.type(Script.Script));
29
+ const { invokePromise } = useOperationInvoker();
29
30
 
30
31
  const functionToScriptMap = useMemo(
31
32
  () =>
@@ -40,13 +41,13 @@ export const FunctionsPanel = ({ space }: FunctionsPanelProps) => {
40
41
  }
41
42
  return map;
42
43
  },
43
- {} as Record<string, ScriptType>,
44
+ {} as Record<string, Script.Script>,
44
45
  ),
45
46
  [functions, scripts],
46
47
  );
47
48
 
48
49
  const getScriptName = useCallback(
49
- (func: FunctionType) => {
50
+ (func: Function.Function) => {
50
51
  const script = functionToScriptMap[func.id];
51
52
  return script?.name;
52
53
  },
@@ -54,26 +55,31 @@ export const FunctionsPanel = ({ space }: FunctionsPanelProps) => {
54
55
  );
55
56
 
56
57
  const handleGoToScript = useCallback(
57
- (func: FunctionType) => {
58
+ (func: Function.Function) => {
58
59
  const script = functionToScriptMap[func.id];
59
60
  if (script) {
60
- void dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [fullyQualifiedId(script)] }));
61
+ void invokePromise(LayoutOperation.Open, { subject: [getObjectPathFromObject(script)] });
61
62
  }
62
63
  },
63
- [functionToScriptMap, dispatch],
64
+ [functionToScriptMap, invokePromise],
65
+ );
66
+
67
+ const handleDelete = useCallback(
68
+ (func: Function.Function) => invokePromise(SpaceOperation.RemoveObjects, { objects: [func] }),
69
+ [invokePromise],
64
70
  );
65
71
 
66
72
  return (
67
- <div role='none' className={mx(controlItemClasses)}>
73
+ <Settings.Container>
68
74
  {functions.length > 0 && (
69
- <List.Root<FunctionType> items={functions} isItem={Schema.is(FunctionType)} getId={(func) => func.id}>
75
+ <List.Root<Function.Function> items={functions} isItem={Schema.is(Function.Function)} getId={(func) => func.id}>
70
76
  {({ items }) => (
71
77
  <div role='list' className='flex flex-col w-full'>
72
78
  {items?.map((func) => (
73
- <List.Item<FunctionType>
79
+ <List.Item<Function.Function>
74
80
  key={func.id}
75
81
  item={func}
76
- classNames={mx(grid, ghostHover, 'items-center', 'pli-2', 'min-bs-[3rem]')}
82
+ classNames={mx('grid grid-cols-[1fr_auto] min-h-[2.5rem] min-h-[3rem] px-2 items-center', ghostHover)}
77
83
  >
78
84
  <div className='flex flex-col truncate'>
79
85
  <List.ItemTitle classNames='truncate'>{func.name}</List.ItemTitle>
@@ -84,6 +90,12 @@ export const FunctionsPanel = ({ space }: FunctionsPanelProps) => {
84
90
  {functionToScriptMap[func.id] && (
85
91
  <Button onClick={() => handleGoToScript(func)}>{t('go to function source button label')}</Button>
86
92
  )}
93
+ <IconButton
94
+ iconOnly
95
+ icon='ph--trash--regular'
96
+ label={t('delete function button label')}
97
+ onClick={() => handleDelete(func)}
98
+ />
87
99
  </List.Item>
88
100
  ))}
89
101
  </div>
@@ -91,7 +103,7 @@ export const FunctionsPanel = ({ space }: FunctionsPanelProps) => {
91
103
  </List.Root>
92
104
  )}
93
105
 
94
- {functions.length === 0 && <div className='text-center plb-4 text-gray-500'>{t('no functions found')}</div>}
95
- </div>
106
+ {functions.length === 0 && <div className='text-center py-4 text-description'>{t('no functions found')}</div>}
107
+ </Settings.Container>
96
108
  );
97
109
  };
@@ -0,0 +1,110 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { useState } from 'react';
7
+ import React, { useCallback } from 'react';
8
+
9
+ import { Function } from '@dxos/functions';
10
+ import { getDeployedFunctions } from '@dxos/functions-runtime/edge';
11
+ import { useClient } from '@dxos/react-client';
12
+ import { Filter, Query, type Space, useQuery } from '@dxos/react-client/echo';
13
+ import { IconButton, useAsyncEffect, useTranslation } from '@dxos/react-ui';
14
+ import { Settings } from '@dxos/react-ui-form';
15
+ import { List } from '@dxos/react-ui-list';
16
+ import { ghostHover, mx } from '@dxos/ui-theme';
17
+
18
+ import { meta } from '../../meta';
19
+
20
+ const grid = 'grid grid-cols-[1fr_1fr_auto] min-h-[2.5rem]';
21
+
22
+ type FunctionsRegistryProps = {
23
+ space: Space;
24
+ };
25
+
26
+ export const FunctionsRegistry = ({ space }: FunctionsRegistryProps) => {
27
+ const client = useClient();
28
+ const [loading, setLoading] = useState(true);
29
+ const [functions, setFunctions] = useState<Function.Function[]>([]);
30
+ const { t } = useTranslation(meta.id);
31
+
32
+ const dbFunctions = useQuery(space.db, Filter.type(Function.Function));
33
+
34
+ const state = (func: Function.Function) => {
35
+ const dbFunction = dbFunctions.find((f) => f.key === func.key);
36
+ if (!dbFunction) {
37
+ return 'import';
38
+ }
39
+ if (dbFunction.version === func.version && dbFunction.updated === func.updated) {
40
+ return 'none';
41
+ }
42
+ return 'update';
43
+ };
44
+
45
+ useAsyncEffect(async () => {
46
+ setLoading(true);
47
+ const functions = await getDeployedFunctions(client, true);
48
+ setFunctions(functions);
49
+ setLoading(false);
50
+ }, []);
51
+
52
+ const hanleImportOrUpdate = useCallback(
53
+ async (func: Function.Function) => {
54
+ const functions = await space.db.query(Query.type(Function.Function, { key: func.key })).run();
55
+ const [existingFunc] = functions;
56
+ if (!existingFunc) {
57
+ space.db.add(func);
58
+ return;
59
+ }
60
+ Function.setFrom(existingFunc, func);
61
+ },
62
+ [space],
63
+ );
64
+
65
+ return (
66
+ <Settings.Container>
67
+ {functions.length > 0 && (
68
+ <List.Root<Function.Function> items={functions} isItem={Schema.is(Function.Function)} getId={(func) => func.id}>
69
+ {({ items }) => (
70
+ <div role='list' className='flex flex-col w-full'>
71
+ {items?.map((func) => (
72
+ <List.Item<Function.Function>
73
+ key={func.id}
74
+ item={func}
75
+ classNames={mx(grid, ghostHover, 'items-center', 'px-2', 'min-h-[3rem]')}
76
+ >
77
+ <div className='flex flex-col truncate'>
78
+ <List.ItemTitle classNames='truncate'>{func.name}</List.ItemTitle>
79
+ <div className='text-xs text-description truncate'>{func.key}</div>
80
+ </div>
81
+ <div className='flex flex-col truncate'>
82
+ <div className='text-xs text-description truncate'>{func.version}</div>
83
+ <div className='text-xs text-description truncate'>
84
+ {func.updated ? `Uploaded ${new Date(func.updated).toLocaleString()}` : ''}
85
+ </div>
86
+ </div>
87
+
88
+ <IconButton
89
+ iconOnly
90
+ icon={state(func) === 'update' ? 'ph--arrows-clockwise--regular' : 'ph--download--regular'}
91
+ label={
92
+ state(func) === 'update' ? t('update function button label') : t('import function button label')
93
+ }
94
+ disabled={state(func) === 'none'}
95
+ onClick={() => hanleImportOrUpdate(func)}
96
+ />
97
+ </List.Item>
98
+ ))}
99
+ </div>
100
+ )}
101
+ </List.Root>
102
+ )}
103
+
104
+ {functions.length === 0 && !loading && (
105
+ <div className='text-center py-4 text-gray-500'>{t('no functions found')}</div>
106
+ )}
107
+ {loading && <div className='text-center py-4 text-gray-500'>{t('loading functions')}</div>}
108
+ </Settings.Container>
109
+ );
110
+ };
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { FunctionsRegistry } from './FunctionsRegistry';
6
+
7
+ export { FunctionsRegistry };
8
+ export default FunctionsRegistry;