@dxos/plugin-automation 0.8.4-main.3a94e84 → 0.8.4-main.3c1ae3b

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 (200) hide show
  1. package/dist/lib/browser/AutomationPanel-WVLTR65T.mjs +11 -0
  2. package/dist/lib/browser/AutomationSettings-LOCSJ4XL.mjs +68 -0
  3. package/dist/lib/browser/AutomationSettings-LOCSJ4XL.mjs.map +7 -0
  4. package/dist/lib/browser/FunctionsContainer-CQRS5IQN.mjs +145 -0
  5. package/dist/lib/browser/FunctionsContainer-CQRS5IQN.mjs.map +7 -0
  6. package/dist/lib/browser/{FunctionsPanel-56ZKRVM5.mjs → FunctionsPanel-CRW6SJUN.mjs} +3 -3
  7. package/dist/lib/browser/{app-graph-builder-ZTAUTFI4.mjs → app-graph-builder-W7LLC6XW.mjs} +13 -12
  8. package/dist/lib/browser/app-graph-builder-W7LLC6XW.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-5Q2XVI36.mjs +100 -0
  10. package/dist/lib/browser/chunk-5Q2XVI36.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-6FCNJOBO.mjs +15 -0
  12. package/dist/lib/browser/chunk-6FCNJOBO.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-ABZVRMU7.mjs +14 -0
  14. package/dist/lib/browser/chunk-ABZVRMU7.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-BPRH3NBB.mjs +204 -0
  16. package/dist/lib/browser/chunk-BPRH3NBB.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-LZQFZO3B.mjs +17 -0
  18. package/dist/lib/browser/chunk-LZQFZO3B.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-LYJVTIVD.mjs → chunk-TWWFNOIR.mjs} +30 -15
  20. package/dist/lib/browser/chunk-TWWFNOIR.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-WAZEZHJI.mjs +270 -0
  22. package/dist/lib/browser/chunk-WAZEZHJI.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-HN7OHFCB.mjs → chunk-YBPJCY3F.mjs} +3 -3
  24. package/dist/lib/browser/chunk-YBPJCY3F.mjs.map +7 -0
  25. package/dist/lib/browser/compute-runtime-GPT45IDG.mjs +115 -0
  26. package/dist/lib/browser/compute-runtime-GPT45IDG.mjs.map +7 -0
  27. package/dist/lib/browser/hooks/index.mjs +13 -0
  28. package/dist/lib/browser/index.mjs +49 -19
  29. package/dist/lib/browser/index.mjs.map +4 -4
  30. package/dist/lib/browser/{intent-resolver-U3ZAQEFW.mjs → intent-resolver-MJ7IDWCD.mjs} +17 -14
  31. package/dist/lib/browser/intent-resolver-MJ7IDWCD.mjs.map +7 -0
  32. package/dist/lib/browser/meta.json +1 -1
  33. package/dist/lib/browser/{react-surface-4DFSM7OX.mjs → react-surface-FF5YP324.mjs} +20 -20
  34. package/dist/lib/browser/react-surface-FF5YP324.mjs.map +7 -0
  35. package/dist/lib/browser/types/index.mjs +2 -2
  36. package/dist/lib/node-esm/{AutomationPanel-YYUMSK2W.mjs → AutomationPanel-PKWGKR7X.mjs} +4 -4
  37. package/dist/lib/node-esm/AutomationSettings-V5GZEOOQ.mjs +69 -0
  38. package/dist/lib/node-esm/AutomationSettings-V5GZEOOQ.mjs.map +7 -0
  39. package/dist/lib/node-esm/FunctionsContainer-5BBSN6IG.mjs +146 -0
  40. package/dist/lib/node-esm/FunctionsContainer-5BBSN6IG.mjs.map +7 -0
  41. package/dist/lib/node-esm/{FunctionsPanel-KGIOZSPZ.mjs → FunctionsPanel-RVVCS6VH.mjs} +3 -3
  42. package/dist/lib/node-esm/FunctionsPanel-RVVCS6VH.mjs.map +7 -0
  43. package/dist/lib/node-esm/{app-graph-builder-3FP63ZSG.mjs → app-graph-builder-SLQOO7GH.mjs} +13 -12
  44. package/dist/lib/node-esm/app-graph-builder-SLQOO7GH.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-267XBACB.mjs +101 -0
  46. package/dist/lib/node-esm/chunk-267XBACB.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-6RH5OXPG.mjs +16 -0
  48. package/dist/lib/node-esm/chunk-6RH5OXPG.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs +19 -0
  50. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-OEZNHUL2.mjs → chunk-ECJKIUBO.mjs} +3 -3
  52. package/dist/lib/node-esm/chunk-ECJKIUBO.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-FOK5AUNF.mjs +16 -0
  54. package/dist/lib/node-esm/chunk-FOK5AUNF.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-JVPWGVIV.mjs +205 -0
  56. package/dist/lib/node-esm/chunk-JVPWGVIV.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-AZH66CED.mjs → chunk-Q7KY3LVQ.mjs} +104 -64
  58. package/dist/lib/node-esm/chunk-Q7KY3LVQ.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-ZGPUV5VS.mjs → chunk-RVK52XGK.mjs} +30 -15
  60. package/dist/lib/node-esm/chunk-RVK52XGK.mjs.map +7 -0
  61. package/dist/lib/node-esm/compute-runtime-SODV3TDU.mjs +116 -0
  62. package/dist/lib/node-esm/compute-runtime-SODV3TDU.mjs.map +7 -0
  63. package/dist/lib/node-esm/hooks/index.mjs +14 -0
  64. package/dist/lib/node-esm/hooks/index.mjs.map +7 -0
  65. package/dist/lib/node-esm/index.mjs +49 -19
  66. package/dist/lib/node-esm/index.mjs.map +4 -4
  67. package/dist/lib/node-esm/{intent-resolver-3QWXEBPX.mjs → intent-resolver-NOBCKCF6.mjs} +17 -14
  68. package/dist/lib/node-esm/intent-resolver-NOBCKCF6.mjs.map +7 -0
  69. package/dist/lib/node-esm/meta.json +1 -1
  70. package/dist/lib/node-esm/{react-surface-3PNW7NDW.mjs → react-surface-OQIMKKTP.mjs} +20 -20
  71. package/dist/lib/node-esm/react-surface-OQIMKKTP.mjs.map +7 -0
  72. package/dist/lib/node-esm/types/index.mjs +2 -2
  73. package/dist/types/src/AutomationPlugin.d.ts +1 -1
  74. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  76. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/capabilities.d.ts +21 -0
  78. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/compute-runtime.d.ts +5 -0
  80. package/dist/types/src/capabilities/compute-runtime.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/index.d.ts +5 -3
  82. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  84. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  86. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  87. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +6 -5
  88. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  89. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +49 -4
  90. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/AutomationSettings.d.ts +5 -0
  92. package/dist/types/src/components/AutomationSettings.d.ts.map +1 -0
  93. package/dist/types/src/components/FunctionsContainer.d.ts.map +1 -1
  94. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  95. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts +8 -0
  96. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -0
  97. package/dist/types/src/components/FunctionsRegistry/index.d.ts +2 -0
  98. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -0
  99. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +10 -8
  100. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  101. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +6 -3
  102. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  103. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +9 -6
  104. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  105. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +117 -4
  106. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/TriggerSettings.d.ts +6 -0
  108. package/dist/types/src/components/TriggerSettings.d.ts.map +1 -0
  109. package/dist/types/src/components/index.d.ts +2 -2
  110. package/dist/types/src/components/index.d.ts.map +1 -1
  111. package/dist/types/src/events.d.ts +4 -0
  112. package/dist/types/src/events.d.ts.map +1 -0
  113. package/dist/types/src/hooks/index.d.ts +3 -0
  114. package/dist/types/src/hooks/index.d.ts.map +1 -0
  115. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +13 -0
  116. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -0
  117. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +11 -0
  118. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -0
  119. package/dist/types/src/index.d.ts +3 -0
  120. package/dist/types/src/index.d.ts.map +1 -1
  121. package/dist/types/src/meta.d.ts +0 -1
  122. package/dist/types/src/meta.d.ts.map +1 -1
  123. package/dist/types/src/testing/test-functions.d.ts +2 -3
  124. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  125. package/dist/types/src/translations.d.ts +6 -0
  126. package/dist/types/src/translations.d.ts.map +1 -1
  127. package/dist/types/src/types/schema.d.ts +1 -1
  128. package/dist/types/src/types/schema.d.ts.map +1 -1
  129. package/dist/types/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +63 -38
  131. package/src/AutomationPlugin.tsx +37 -31
  132. package/src/capabilities/app-graph-builder.ts +16 -15
  133. package/src/capabilities/capabilities.ts +42 -0
  134. package/src/capabilities/compute-runtime.ts +129 -0
  135. package/src/capabilities/index.ts +3 -0
  136. package/src/capabilities/intent-resolver.ts +20 -15
  137. package/src/capabilities/react-surface.tsx +15 -15
  138. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +16 -17
  139. package/src/components/AutomationPanel/AutomationPanel.tsx +127 -54
  140. package/src/components/AutomationSettings.tsx +30 -0
  141. package/src/components/FunctionsContainer.tsx +18 -13
  142. package/src/components/FunctionsPanel/FunctionsPanel.tsx +35 -16
  143. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +126 -0
  144. package/src/components/FunctionsRegistry/index.ts +5 -0
  145. package/src/components/TriggerEditor/FunctionInputEditor.tsx +40 -24
  146. package/src/components/TriggerEditor/SpecSelector.tsx +29 -21
  147. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +78 -32
  148. package/src/components/TriggerEditor/TriggerEditor.tsx +86 -41
  149. package/src/components/TriggerSettings.tsx +25 -0
  150. package/src/components/index.ts +1 -1
  151. package/src/events.ts +11 -0
  152. package/src/hooks/index.ts +6 -0
  153. package/src/hooks/useComputeRuntimeCallback.ts +68 -0
  154. package/src/hooks/useTriggerRuntimeControls.ts +53 -0
  155. package/src/index.ts +3 -0
  156. package/src/meta.ts +6 -5
  157. package/src/testing/test-functions.ts +3 -3
  158. package/src/translations.ts +9 -0
  159. package/src/types/schema.ts +1 -1
  160. package/dist/lib/browser/AutomationContainer-VZNV2ZQF.mjs +0 -38
  161. package/dist/lib/browser/AutomationContainer-VZNV2ZQF.mjs.map +0 -7
  162. package/dist/lib/browser/AutomationPanel-ZWA6GOFY.mjs +0 -11
  163. package/dist/lib/browser/FunctionsContainer-IOB333TX.mjs +0 -39
  164. package/dist/lib/browser/FunctionsContainer-IOB333TX.mjs.map +0 -7
  165. package/dist/lib/browser/app-graph-builder-ZTAUTFI4.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-ECSTS2UI.mjs +0 -14
  167. package/dist/lib/browser/chunk-ECSTS2UI.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-ERTIGJYE.mjs +0 -147
  169. package/dist/lib/browser/chunk-ERTIGJYE.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-FSJZXTS2.mjs +0 -230
  171. package/dist/lib/browser/chunk-FSJZXTS2.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-GW5U2DGT.mjs +0 -15
  173. package/dist/lib/browser/chunk-GW5U2DGT.mjs.map +0 -7
  174. package/dist/lib/browser/chunk-HN7OHFCB.mjs.map +0 -7
  175. package/dist/lib/browser/chunk-LYJVTIVD.mjs.map +0 -7
  176. package/dist/lib/browser/intent-resolver-U3ZAQEFW.mjs.map +0 -7
  177. package/dist/lib/browser/react-surface-4DFSM7OX.mjs.map +0 -7
  178. package/dist/lib/node-esm/AutomationContainer-WMIH3F4V.mjs +0 -39
  179. package/dist/lib/node-esm/AutomationContainer-WMIH3F4V.mjs.map +0 -7
  180. package/dist/lib/node-esm/FunctionsContainer-DJWB6WFH.mjs +0 -40
  181. package/dist/lib/node-esm/FunctionsContainer-DJWB6WFH.mjs.map +0 -7
  182. package/dist/lib/node-esm/app-graph-builder-3FP63ZSG.mjs.map +0 -7
  183. package/dist/lib/node-esm/chunk-AZH66CED.mjs.map +0 -7
  184. package/dist/lib/node-esm/chunk-HIMYPGHF.mjs +0 -148
  185. package/dist/lib/node-esm/chunk-HIMYPGHF.mjs.map +0 -7
  186. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs +0 -17
  187. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-OEZNHUL2.mjs.map +0 -7
  189. package/dist/lib/node-esm/chunk-SGZPTJ47.mjs +0 -16
  190. package/dist/lib/node-esm/chunk-SGZPTJ47.mjs.map +0 -7
  191. package/dist/lib/node-esm/chunk-ZGPUV5VS.mjs.map +0 -7
  192. package/dist/lib/node-esm/intent-resolver-3QWXEBPX.mjs.map +0 -7
  193. package/dist/lib/node-esm/react-surface-3PNW7NDW.mjs.map +0 -7
  194. package/dist/types/src/components/AutomationContainer.d.ts +0 -5
  195. package/dist/types/src/components/AutomationContainer.d.ts.map +0 -1
  196. package/src/components/AutomationContainer.tsx +0 -30
  197. /package/dist/lib/browser/{AutomationPanel-ZWA6GOFY.mjs.map → AutomationPanel-WVLTR65T.mjs.map} +0 -0
  198. /package/dist/lib/browser/{FunctionsPanel-56ZKRVM5.mjs.map → FunctionsPanel-CRW6SJUN.mjs.map} +0 -0
  199. /package/dist/lib/{node-esm/AutomationPanel-YYUMSK2W.mjs.map → browser/hooks/index.mjs.map} +0 -0
  200. /package/dist/lib/node-esm/{FunctionsPanel-KGIOZSPZ.mjs.map → AutomationPanel-PKWGKR7X.mjs.map} +0 -0
@@ -0,0 +1,204 @@
1
+ import {
2
+ TriggerEditor
3
+ } from "./chunk-WAZEZHJI.mjs";
4
+ import {
5
+ meta
6
+ } from "./chunk-LZQFZO3B.mjs";
7
+
8
+ // src/components/AutomationPanel/AutomationPanel.tsx
9
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
10
+ import * as Array from "effect/Array";
11
+ import * as EFn from "effect/Function";
12
+ import * as Match from "effect/Match";
13
+ import * as Schema from "effect/Schema";
14
+ import React, { useMemo, useState } from "react";
15
+ import { Filter, Obj, Tag } from "@dxos/echo";
16
+ import { Function, Script, Trigger } from "@dxos/functions";
17
+ import { FunctionsServiceClient } from "@dxos/functions-runtime/edge";
18
+ import { useTypeOptions } from "@dxos/plugin-space";
19
+ import { useClient } from "@dxos/react-client";
20
+ import { getSpace, useQuery } from "@dxos/react-client/echo";
21
+ import { Clipboard, IconButton, Input, Separator, useTranslation } from "@dxos/react-ui";
22
+ import { ControlItem, controlItemClasses } from "@dxos/react-ui-form";
23
+ import { List } from "@dxos/react-ui-list";
24
+ import { ghostHover, mx } from "@dxos/react-ui-theme";
25
+ import { Project } from "@dxos/types";
26
+ import { isNonNullable } from "@dxos/util";
27
+ var grid = "grid grid-cols-[40px_1fr_32px_32px] min-bs-[2.5rem]";
28
+ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) => {
29
+ var _effect = _useSignals();
30
+ try {
31
+ const { t } = useTranslation(meta.id);
32
+ const client = useClient();
33
+ const functionsServiceClient = useMemo(() => FunctionsServiceClient.fromClient(client), [
34
+ client
35
+ ]);
36
+ const functions = useQuery(space, Filter.type(Function.Function));
37
+ const triggers = useQuery(space, Filter.type(Trigger.Trigger));
38
+ const filteredTriggers = useMemo(() => {
39
+ return object ? triggers.filter(triggerMatch(object)) : triggers;
40
+ }, [
41
+ object,
42
+ triggers
43
+ ]);
44
+ const tags = useQuery(space, Filter.type(Tag.Tag));
45
+ const types = useTypeOptions({
46
+ space,
47
+ annotation: {
48
+ location: [
49
+ "database",
50
+ "runtime"
51
+ ],
52
+ kind: [
53
+ "user"
54
+ ],
55
+ registered: [
56
+ "registered"
57
+ ]
58
+ }
59
+ });
60
+ const [trigger, setTrigger] = useState(initialTrigger);
61
+ const [selected, setSelected] = useState();
62
+ const handleSelect = (trigger2) => {
63
+ setTrigger(trigger2);
64
+ setSelected(trigger2);
65
+ };
66
+ const handleAdd = () => {
67
+ setTrigger(Trigger.make({}));
68
+ setSelected(void 0);
69
+ };
70
+ const handleDelete = (trigger2) => {
71
+ space.db.remove(trigger2);
72
+ setTrigger(void 0);
73
+ setSelected(void 0);
74
+ };
75
+ const handleSave = (trigger2) => {
76
+ if (selected) {
77
+ Object.assign(selected, trigger2);
78
+ } else {
79
+ space.db.add(Trigger.make(trigger2));
80
+ }
81
+ setTrigger(void 0);
82
+ setSelected(void 0);
83
+ onDone?.();
84
+ };
85
+ const handleCancel = () => {
86
+ setTrigger(void 0);
87
+ onDone?.();
88
+ };
89
+ const handleForceRunTrigger = async (trigger2) => {
90
+ await functionsServiceClient.forceRunCronTrigger(space.id, trigger2.id);
91
+ };
92
+ if (trigger) {
93
+ return /* @__PURE__ */ React.createElement(ControlItem, {
94
+ title: t("trigger editor title")
95
+ }, /* @__PURE__ */ React.createElement(TriggerEditor, {
96
+ space,
97
+ trigger,
98
+ readonlySpec: Boolean(object),
99
+ tags,
100
+ types,
101
+ onSave: handleSave,
102
+ onCancel: handleCancel
103
+ }));
104
+ }
105
+ return /* @__PURE__ */ React.createElement("div", {
106
+ className: mx(controlItemClasses, classNames)
107
+ }, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
108
+ items: filteredTriggers,
109
+ isItem: Schema.is(Trigger.Trigger),
110
+ getId: (field) => field.id
111
+ }, ({ items: filteredTriggers2 }) => /* @__PURE__ */ React.createElement("div", {
112
+ role: "list",
113
+ className: "flex flex-col is-full"
114
+ }, filteredTriggers2?.map((trigger2) => {
115
+ const copyAction = getCopyAction(client, trigger2);
116
+ return /* @__PURE__ */ React.createElement(List.Item, {
117
+ key: trigger2.id,
118
+ item: trigger2,
119
+ classNames: mx(grid, ghostHover, "items-center", "pli-2")
120
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
121
+ checked: trigger2.enabled,
122
+ onCheckedChange: (checked) => trigger2.enabled = checked
123
+ })), /* @__PURE__ */ React.createElement("div", {
124
+ className: "flex"
125
+ }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
126
+ classNames: "pli-1 cursor-pointer is-0 shrink truncate",
127
+ onClick: () => handleSelect(trigger2)
128
+ }, getFunctionName(functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
129
+ label: t(copyAction.translationKey),
130
+ value: copyAction.contentProvider()
131
+ })), /* @__PURE__ */ React.createElement(List.ItemButton, {
132
+ autoHide: false,
133
+ disabled: !trigger2.enabled || trigger2.spec?.kind !== "timer",
134
+ icon: "ph--play--regular",
135
+ label: "Force run",
136
+ onClick: () => handleForceRunTrigger(trigger2)
137
+ }), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
138
+ onClick: () => handleDelete(trigger2)
139
+ }));
140
+ }))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
141
+ classNames: "mlb-4"
142
+ }), /* @__PURE__ */ React.createElement(IconButton, {
143
+ icon: "ph--plus--regular",
144
+ label: t("new trigger label"),
145
+ onClick: handleAdd
146
+ }));
147
+ } finally {
148
+ _effect.f();
149
+ }
150
+ };
151
+ var getCopyAction = (client, trigger) => {
152
+ if (trigger?.spec?.kind === "email") {
153
+ return {
154
+ translationKey: "trigger copy email",
155
+ contentProvider: () => `${getSpace(trigger).id}@dxos.network`
156
+ };
157
+ }
158
+ if (trigger?.spec?.kind === "webhook") {
159
+ return {
160
+ translationKey: "trigger copy url",
161
+ contentProvider: () => getWebhookUrl(client, trigger)
162
+ };
163
+ }
164
+ return void 0;
165
+ };
166
+ var getWebhookUrl = (client, trigger) => {
167
+ const spaceId = getSpace(trigger).id;
168
+ const edgeUrl = new URL(client.config.values.runtime.services.edge.url);
169
+ const isSecure = edgeUrl.protocol.startsWith("https") || edgeUrl.protocol.startsWith("wss");
170
+ edgeUrl.protocol = isSecure ? "https" : "http";
171
+ return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
172
+ };
173
+ var getFunctionName = (functions, trigger) => {
174
+ const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}\u2026`;
175
+ const functionObject = functions.find((fn) => fn === trigger.function?.target);
176
+ return functionObject?.name ?? shortId;
177
+ };
178
+ var scriptMatch = (script) => (trigger) => {
179
+ const fn = trigger.function?.target;
180
+ if (!Obj.instanceOf(Function.Function, fn)) {
181
+ return false;
182
+ }
183
+ return fn.source?.target === script;
184
+ };
185
+ var projectMatch = (project) => {
186
+ const viewQueries = EFn.pipe(project.columns, Array.map((column) => column.view.target), Array.filter(isNonNullable), Array.map((view) => Obj.getSnapshot(view).query.ast), Array.map((ast) => JSON.stringify(ast)));
187
+ return (trigger) => {
188
+ const spec = Obj.getSnapshot(trigger).spec;
189
+ if (spec?.kind !== "subscription") {
190
+ return false;
191
+ }
192
+ return viewQueries.some((query) => JSON.stringify(spec.query) === query);
193
+ };
194
+ };
195
+ var triggerMatch = Match.type().pipe(Match.withReturnType(), Match.when((obj) => Obj.instanceOf(Script.Script, obj), (obj) => scriptMatch(obj)), Match.when((obj) => Obj.instanceOf(Project.Project, obj), (obj) => projectMatch(obj)), Match.orElse((_obj) => () => true));
196
+
197
+ // src/components/AutomationPanel/index.ts
198
+ var AutomationPanel_default = AutomationPanel;
199
+
200
+ export {
201
+ AutomationPanel,
202
+ AutomationPanel_default
203
+ };
204
+ //# sourceMappingURL=chunk-BPRH3NBB.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as EFn from 'effect/Function';\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\nimport React, { useMemo, useState } from 'react';\n\nimport { Filter, Obj, Tag } from '@dxos/echo';\nimport { Function, Script, Trigger } from '@dxos/functions';\nimport { FunctionsServiceClient } from '@dxos/functions-runtime/edge';\nimport { useTypeOptions } from '@dxos/plugin-space';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { type Space, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Clipboard, IconButton, Input, Separator, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { ControlItem, controlItemClasses } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\nimport { Project } from '@dxos/types';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = ThemedClassName<{\n space: Space;\n object?: Obj.Any;\n initialTrigger?: Trigger.Trigger;\n onDone?: () => void;\n}>;\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }: AutomationPanelProps) => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const functionsServiceClient = useMemo(() => FunctionsServiceClient.fromClient(client), [client]);\n const functions = useQuery(space, Filter.type(Function.Function));\n const triggers = useQuery(space, Filter.type(Trigger.Trigger));\n const filteredTriggers = useMemo(() => {\n return object ? triggers.filter(triggerMatch(object)) : triggers;\n }, [object, triggers]);\n const tags = useQuery(space, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n space,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n registered: ['registered'],\n },\n });\n\n const [trigger, setTrigger] = useState<Trigger.Trigger | undefined>(initialTrigger);\n const [selected, setSelected] = useState<Trigger.Trigger>();\n\n const handleSelect = (trigger: Trigger.Trigger) => {\n setTrigger(trigger);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(Trigger.make({}));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: Trigger.Trigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(Trigger.make(trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n onDone?.();\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n onDone?.();\n };\n\n const handleForceRunTrigger = async (trigger: Trigger.Trigger) => {\n await functionsServiceClient.forceRunCronTrigger(space.id, trigger.id);\n };\n\n if (trigger) {\n return (\n <ControlItem title={t('trigger editor title')}>\n <TriggerEditor\n space={space}\n trigger={trigger}\n readonlySpec={Boolean(object)}\n tags={tags}\n types={types}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </ControlItem>\n );\n }\n\n return (\n <div className={mx(controlItemClasses, classNames)}>\n {filteredTriggers.length > 0 && (\n <List.Root<Trigger.Trigger>\n items={filteredTriggers}\n isItem={Schema.is(Trigger.Trigger)}\n getId={(field) => field.id}\n >\n {({ items: filteredTriggers }) => (\n <div role='list' className='flex flex-col is-full'>\n {filteredTriggers?.map((trigger) => {\n const copyAction = getCopyAction(client, trigger);\n return (\n <List.Item<Trigger.Trigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center', 'pli-2')}\n >\n <Input.Root>\n <Input.Switch\n checked={trigger.enabled}\n onCheckedChange={(checked) => (trigger.enabled = checked)}\n />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle\n classNames='pli-1 cursor-pointer is-0 shrink truncate'\n onClick={() => handleSelect(trigger)}\n >\n {getFunctionName(functions, trigger) ?? '∅'}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose copy action */}\n {copyAction && (\n <Clipboard.IconButton\n label={t(copyAction.translationKey)}\n value={copyAction.contentProvider()}\n />\n )}\n </div>\n\n <List.ItemButton\n autoHide={false}\n disabled={!trigger.enabled || trigger.spec?.kind !== 'timer'}\n icon='ph--play--regular'\n label='Force run'\n onClick={() => handleForceRunTrigger(trigger)}\n />\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n );\n })}\n </div>\n )}\n </List.Root>\n )}\n {filteredTriggers.length > 0 && <Separator classNames='mlb-4' />}\n <IconButton icon='ph--plus--regular' label={t('new trigger label')} onClick={handleAdd} />\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: Trigger.Trigger | undefined) => {\n if (trigger?.spec?.kind === 'email') {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.kind === 'webhook') {\n return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };\n }\n\n return undefined;\n};\n\nconst getWebhookUrl = (client: Client, trigger: Trigger.Trigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (functions: Function.Function[], trigger: Trigger.Trigger) => {\n // TODO(wittjosiah): Truncation should be done in the UI.\n // Warning that the List component is currently a can of worms.\n const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}…`;\n const functionObject = functions.find((fn) => fn === trigger.function?.target);\n return functionObject?.name ?? shortId;\n};\n\nconst scriptMatch = (script: Script.Script) => (trigger: Trigger.Trigger) => {\n const fn = trigger.function?.target;\n if (!Obj.instanceOf(Function.Function, fn)) {\n return false;\n }\n\n return fn.source?.target === script;\n};\n\nconst projectMatch = (project: Project.Project) => {\n const viewQueries = EFn.pipe(\n project.columns,\n Array.map((column) => column.view.target),\n Array.filter(isNonNullable),\n Array.map((view) => Obj.getSnapshot(view).query.ast),\n Array.map((ast) => JSON.stringify(ast)),\n );\n\n return (trigger: Trigger.Trigger) => {\n const spec = Obj.getSnapshot(trigger).spec;\n if (spec?.kind !== 'subscription') {\n return false;\n }\n\n // TODO(wittjosiah): Implement better way of comparing query ASTs.\n return viewQueries.some((query) => JSON.stringify(spec.query) === query);\n };\n};\n\nconst triggerMatch = Match.type<Obj.Any>().pipe(\n Match.withReturnType<(trigger: Trigger.Trigger) => boolean>(),\n Match.when(\n (obj) => Obj.instanceOf(Script.Script, obj),\n (obj) => scriptMatch(obj),\n ),\n Match.when(\n (obj) => Obj.instanceOf(Project.Project, obj),\n (obj) => projectMatch(obj),\n ),\n Match.orElse((_obj) => () => true),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport * from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
+ "mappings": "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",
6
+ "names": ["Array", "EFn", "Match", "Schema", "React", "useMemo", "useState", "Filter", "Obj", "Tag", "Function", "Script", "Trigger", "FunctionsServiceClient", "useTypeOptions", "useClient", "getSpace", "useQuery", "Clipboard", "IconButton", "Input", "Separator", "useTranslation", "ControlItem", "controlItemClasses", "List", "ghostHover", "mx", "Project", "isNonNullable", "grid", "AutomationPanel", "classNames", "space", "object", "initialTrigger", "onDone", "t", "useTranslation", "meta", "id", "client", "useClient", "functionsServiceClient", "useMemo", "FunctionsServiceClient", "fromClient", "functions", "useQuery", "Filter", "type", "Function", "triggers", "Trigger", "filteredTriggers", "filter", "triggerMatch", "tags", "Tag", "types", "useTypeOptions", "annotation", "location", "kind", "registered", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "handleAdd", "make", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "handleForceRunTrigger", "forceRunCronTrigger", "ControlItem", "title", "TriggerEditor", "readonlySpec", "Boolean", "onSave", "onCancel", "div", "className", "mx", "controlItemClasses", "length", "List", "Root", "items", "isItem", "is", "getId", "field", "role", "map", "copyAction", "getCopyAction", "Item", "key", "item", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Clipboard", "IconButton", "label", "translationKey", "value", "contentProvider", "ItemButton", "autoHide", "disabled", "spec", "icon", "ItemDeleteButton", "Separator", "getSpace", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "values", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "dxn", "slice", "functionObject", "find", "fn", "target", "name", "scriptMatch", "script", "Obj", "instanceOf", "source", "projectMatch", "project", "viewQueries", "pipe", "columns", "column", "view", "isNonNullable", "getSnapshot", "query", "ast", "JSON", "stringify", "some", "withReturnType", "when", "obj", "Script", "Project", "orElse", "_obj", "AutomationPanel"]
7
+ }
@@ -0,0 +1,17 @@
1
+ // src/meta.ts
2
+ import { trim } from "@dxos/util";
3
+ var meta = {
4
+ id: "dxos.org/plugin/automation",
5
+ name: "Automation",
6
+ description: trim`
7
+ Workflow automation engine that triggers custom actions based on object events and conditions.
8
+ Create automated pipelines that respond to changes and streamline repetitive tasks.
9
+ `,
10
+ icon: "ph--robot--regular",
11
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-automation"
12
+ };
13
+
14
+ export {
15
+ meta
16
+ };
17
+ //# sourceMappingURL=chunk-LZQFZO3B.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: PluginMeta = {\n id: 'dxos.org/plugin/automation',\n name: 'Automation',\n description: trim`\n Workflow automation engine that triggers custom actions based on object events and conditions.\n Create automated pipelines that respond to changes and streamline repetitive tasks.\n `,\n icon: 'ph--robot--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-automation',\n};\n"],
5
+ "mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAmB;EAC9BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,QAAQ;AACV;",
6
+ "names": ["trim", "meta", "id", "name", "description", "trim", "icon", "source"]
7
+ }
@@ -1,15 +1,18 @@
1
1
  import {
2
- AUTOMATION_PLUGIN
3
- } from "./chunk-GW5U2DGT.mjs";
2
+ meta
3
+ } from "./chunk-LZQFZO3B.mjs";
4
4
 
5
5
  // src/components/FunctionsPanel/FunctionsPanel.tsx
6
6
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
7
- import { Schema } from "effect";
7
+ import * as Schema from "effect/Schema";
8
8
  import React, { useCallback, useMemo } from "react";
9
- import { createIntent, LayoutAction, useIntentDispatcher } from "@dxos/app-framework";
10
- import { FunctionType, ScriptType } from "@dxos/functions";
11
- import { Filter, fullyQualifiedId, useQuery } from "@dxos/react-client/echo";
12
- import { Button, useTranslation } from "@dxos/react-ui";
9
+ import { LayoutAction, createIntent } from "@dxos/app-framework";
10
+ import { useIntentDispatcher } from "@dxos/app-framework/react";
11
+ import { Obj } from "@dxos/echo";
12
+ import { Function, Script } from "@dxos/functions";
13
+ import { SpaceAction } from "@dxos/plugin-space/types";
14
+ import { Filter, useQuery } from "@dxos/react-client/echo";
15
+ import { Button, IconButton, useTranslation } from "@dxos/react-ui";
13
16
  import { controlItemClasses } from "@dxos/react-ui-form";
14
17
  import { List } from "@dxos/react-ui-list";
15
18
  import { ghostHover, mx } from "@dxos/react-ui-theme";
@@ -17,9 +20,9 @@ var grid = "grid grid-cols-[1fr_auto] min-bs-[2.5rem]";
17
20
  var FunctionsPanel = ({ space }) => {
18
21
  var _effect = _useSignals();
19
22
  try {
20
- const { t } = useTranslation(AUTOMATION_PLUGIN);
21
- const functions = useQuery(space, Filter.type(FunctionType));
22
- const scripts = useQuery(space, Filter.type(ScriptType));
23
+ const { t } = useTranslation(meta.id);
24
+ const functions = useQuery(space, Filter.type(Function.Function));
25
+ const scripts = useQuery(space, Filter.type(Script.Script));
23
26
  const { dispatchPromise: dispatch } = useIntentDispatcher();
24
27
  const functionToScriptMap = useMemo(() => functions.reduce((map, func) => {
25
28
  const scriptId = func.source?.target?.id;
@@ -46,7 +49,7 @@ var FunctionsPanel = ({ space }) => {
46
49
  void dispatch(createIntent(LayoutAction.Open, {
47
50
  part: "main",
48
51
  subject: [
49
- fullyQualifiedId(script)
52
+ Obj.getDXN(script).toString()
50
53
  ]
51
54
  }));
52
55
  }
@@ -54,16 +57,23 @@ var FunctionsPanel = ({ space }) => {
54
57
  functionToScriptMap,
55
58
  dispatch
56
59
  ]);
60
+ const handleDelete = useCallback((func) => dispatch(createIntent(SpaceAction.RemoveObjects, {
61
+ objects: [
62
+ func
63
+ ]
64
+ })), [
65
+ dispatch
66
+ ]);
57
67
  return /* @__PURE__ */ React.createElement("div", {
58
68
  role: "none",
59
69
  className: mx(controlItemClasses)
60
70
  }, functions.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
61
71
  items: functions,
62
- isItem: Schema.is(FunctionType),
72
+ isItem: Schema.is(Function.Function),
63
73
  getId: (func) => func.id
64
74
  }, ({ items }) => /* @__PURE__ */ React.createElement("div", {
65
75
  role: "list",
66
- className: "flex flex-col w-full"
76
+ className: "flex flex-col is-full"
67
77
  }, items?.map((func) => /* @__PURE__ */ React.createElement(List.Item, {
68
78
  key: func.id,
69
79
  item: func,
@@ -76,7 +86,12 @@ var FunctionsPanel = ({ space }) => {
76
86
  className: "text-xs text-description truncate"
77
87
  }, getScriptName(func))), functionToScriptMap[func.id] && /* @__PURE__ */ React.createElement(Button, {
78
88
  onClick: () => handleGoToScript(func)
79
- }, t("go to function source button label")))))), functions.length === 0 && /* @__PURE__ */ React.createElement("div", {
89
+ }, t("go to function source button label")), /* @__PURE__ */ React.createElement(IconButton, {
90
+ iconOnly: true,
91
+ icon: "ph--trash--regular",
92
+ label: t("delete function button label"),
93
+ onClick: () => handleDelete(func)
94
+ }))))), functions.length === 0 && /* @__PURE__ */ React.createElement("div", {
80
95
  className: "text-center plb-4 text-gray-500"
81
96
  }, t("no functions found")));
82
97
  } finally {
@@ -91,4 +106,4 @@ export {
91
106
  FunctionsPanel,
92
107
  FunctionsPanel_default
93
108
  };
94
- //# sourceMappingURL=chunk-LYJVTIVD.mjs.map
109
+ //# sourceMappingURL=chunk-TWWFNOIR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/FunctionsPanel/FunctionsPanel.tsx", "../../../src/components/FunctionsPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { LayoutAction, createIntent } from '@dxos/app-framework';\nimport { useIntentDispatcher } from '@dxos/app-framework/react';\nimport { Obj } from '@dxos/echo';\nimport { Function, Script } from '@dxos/functions';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\nimport { Button, IconButton, useTranslation } from '@dxos/react-ui';\nimport { controlItemClasses } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../../meta';\n\nconst grid = 'grid grid-cols-[1fr_auto] min-bs-[2.5rem]';\n\nexport type FunctionsPanelProps = {\n space: Space;\n};\n\nexport const FunctionsPanel = ({ space }: FunctionsPanelProps) => {\n const { t } = useTranslation(meta.id);\n const functions = useQuery(space, Filter.type(Function.Function));\n const scripts = useQuery(space, Filter.type(Script.Script));\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const functionToScriptMap = useMemo(\n () =>\n functions.reduce(\n (map, func) => {\n const scriptId = func.source?.target?.id;\n if (scriptId) {\n const script = scripts.find((s) => s.id === scriptId);\n if (script) {\n map[func.id] = script;\n }\n }\n return map;\n },\n {} as Record<string, Script.Script>,\n ),\n [functions, scripts],\n );\n\n const getScriptName = useCallback(\n (func: Function.Function) => {\n const script = functionToScriptMap[func.id];\n return script?.name;\n },\n [functionToScriptMap],\n );\n\n const handleGoToScript = useCallback(\n (func: Function.Function) => {\n const script = functionToScriptMap[func.id];\n if (script) {\n void dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n subject: [Obj.getDXN(script).toString()],\n }),\n );\n }\n },\n [functionToScriptMap, dispatch],\n );\n\n const handleDelete = useCallback(\n (func: Function.Function) => dispatch(createIntent(SpaceAction.RemoveObjects, { objects: [func] })),\n [dispatch],\n );\n\n return (\n <div role='none' className={mx(controlItemClasses)}>\n {functions.length > 0 && (\n <List.Root<Function.Function> items={functions} isItem={Schema.is(Function.Function)} getId={(func) => func.id}>\n {({ items }) => (\n <div role='list' className='flex flex-col is-full'>\n {items?.map((func) => (\n <List.Item<Function.Function>\n key={func.id}\n item={func}\n classNames={mx(grid, ghostHover, 'items-center', 'pli-2', 'min-bs-[3rem]')}\n >\n <div className='flex flex-col truncate'>\n <List.ItemTitle classNames='truncate'>{func.name}</List.ItemTitle>\n {getScriptName(func) && (\n <div className='text-xs text-description truncate'>{getScriptName(func)}</div>\n )}\n </div>\n {functionToScriptMap[func.id] && (\n <Button onClick={() => handleGoToScript(func)}>{t('go to function source button label')}</Button>\n )}\n <IconButton\n iconOnly\n icon='ph--trash--regular'\n label={t('delete function button label')}\n onClick={() => handleDelete(func)}\n />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n )}\n\n {functions.length === 0 && <div className='text-center plb-4 text-gray-500'>{t('no functions found')}</div>}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { FunctionsPanel } from './FunctionsPanel';\n\nexport * from './FunctionsPanel';\nexport default FunctionsPanel;\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "React", "useCallback", "useMemo", "LayoutAction", "createIntent", "useIntentDispatcher", "Obj", "Function", "Script", "SpaceAction", "Filter", "useQuery", "Button", "IconButton", "useTranslation", "controlItemClasses", "List", "ghostHover", "mx", "grid", "FunctionsPanel", "space", "t", "useTranslation", "meta", "id", "functions", "useQuery", "Filter", "type", "Function", "scripts", "Script", "dispatchPromise", "dispatch", "useIntentDispatcher", "functionToScriptMap", "useMemo", "reduce", "map", "func", "scriptId", "source", "target", "script", "find", "s", "getScriptName", "useCallback", "name", "handleGoToScript", "createIntent", "LayoutAction", "Open", "part", "subject", "Obj", "getDXN", "toString", "handleDelete", "SpaceAction", "RemoveObjects", "objects", "div", "role", "className", "mx", "controlItemClasses", "length", "List", "Root", "items", "isItem", "is", "getId", "Item", "key", "item", "classNames", "ghostHover", "ItemTitle", "Button", "onClick", "IconButton", "iconOnly", "icon", "label", "FunctionsPanel"]
7
+ }
@@ -0,0 +1,270 @@
1
+ import {
2
+ meta
3
+ } from "./chunk-LZQFZO3B.mjs";
4
+
5
+ // src/components/TriggerEditor/TriggerEditor.tsx
6
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
7
+ import React3, { useCallback as useCallback3, useMemo as useMemo3 } from "react";
8
+ import { ComputeGraph } from "@dxos/conductor";
9
+ import { DXN } from "@dxos/echo";
10
+ import { Function, Script, Trigger as Trigger2 } from "@dxos/functions";
11
+ import { Filter as Filter2, Ref as Ref2, useQuery } from "@dxos/react-client/echo";
12
+ import { Input } from "@dxos/react-ui";
13
+ import { QueryForm } from "@dxos/react-ui-components";
14
+ import { Form as Form2, FormFieldLabel, SelectField as SelectField2, omitId as omitId2, useRefQueryOptions } from "@dxos/react-ui-form";
15
+
16
+ // src/components/TriggerEditor/FunctionInputEditor.tsx
17
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
18
+ import React, { useCallback, useMemo } from "react";
19
+ import { Ref, Type } from "@dxos/echo";
20
+ import { useOnTransition, useTranslation } from "@dxos/react-ui";
21
+ import { Form, omitId, useFormValues } from "@dxos/react-ui-form";
22
+ var FunctionInputEditor = ({ type, functions, getValue, onValueChange, onQueryRefOptions }) => {
23
+ var _effect = _useSignals();
24
+ try {
25
+ const { t } = useTranslation(meta.id);
26
+ const selectedFunctionValue = useFormValues(FunctionInputEditor.displayName, [
27
+ "function"
28
+ ]);
29
+ const selectedFunctionId = useMemo(() => {
30
+ if (Ref.isRef(selectedFunctionValue)) {
31
+ return selectedFunctionValue.dxn.toString().split("dxn:echo:@:").at(1);
32
+ }
33
+ }, [
34
+ selectedFunctionValue
35
+ ]);
36
+ const selectedFunction = useMemo(() => functions.find((fn) => fn.id === selectedFunctionId), [
37
+ functions,
38
+ selectedFunctionId
39
+ ]);
40
+ useOnTransition(
41
+ // Clear function parameter input when the function changes.
42
+ selectedFunctionValue,
43
+ (prevValue) => {
44
+ if (!Ref.isRef(prevValue) || !Ref.isRef(selectedFunctionValue)) {
45
+ return false;
46
+ }
47
+ return prevValue.dxn.toString() !== selectedFunctionValue.dxn.toString();
48
+ },
49
+ (currValue) => currValue !== void 0,
50
+ () => onValueChange(type, {})
51
+ );
52
+ const inputSchema = useMemo(() => selectedFunction?.inputSchema, [
53
+ selectedFunction
54
+ ]);
55
+ const effectSchema = useMemo(() => inputSchema ? Type.toEffectSchema(inputSchema) : void 0, [
56
+ inputSchema
57
+ ]);
58
+ const propertyCount = inputSchema?.properties ? Object.keys(inputSchema.properties).length : 0;
59
+ const values = useMemo(() => getValue() ?? {}, [
60
+ getValue
61
+ ]);
62
+ const handleValuesChanged = useCallback((values2) => {
63
+ onValueChange(type, values2);
64
+ }, [
65
+ type,
66
+ onValueChange
67
+ ]);
68
+ if (selectedFunction === void 0 || effectSchema === void 0 || propertyCount === 0) {
69
+ return null;
70
+ }
71
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Form.Label, {
72
+ label: t("function parameters label"),
73
+ asChild: true
74
+ }), /* @__PURE__ */ React.createElement(Form.Root, {
75
+ schema: omitId(effectSchema),
76
+ values,
77
+ onValuesChanged: handleValuesChanged,
78
+ onQueryRefOptions
79
+ }, /* @__PURE__ */ React.createElement(Form.FieldSet, null)));
80
+ } finally {
81
+ _effect.f();
82
+ }
83
+ };
84
+ FunctionInputEditor.displayName = "AutomationTrigger.FunctionInputEditor";
85
+
86
+ // src/components/TriggerEditor/SpecSelector.tsx
87
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
88
+ import React2, { useCallback as useCallback2, useMemo as useMemo2 } from "react";
89
+ import { Filter, Query } from "@dxos/echo";
90
+ import { Trigger } from "@dxos/functions";
91
+ import { useTranslation as useTranslation2 } from "@dxos/react-ui";
92
+ import { SelectField, useFormFieldState } from "@dxos/react-ui-form";
93
+ var SpecSelector = (props) => {
94
+ var _effect = _useSignals2();
95
+ try {
96
+ const { t } = useTranslation2(meta.id);
97
+ const specProps = useFormFieldState(SpecSelector.displayName, [
98
+ "spec"
99
+ ]);
100
+ const handleTypeChange = useCallback2((_type, value) => {
101
+ const getDefaultTriggerSpec = (kind) => {
102
+ switch (kind) {
103
+ case "timer":
104
+ return {
105
+ kind: "timer",
106
+ cron: ""
107
+ };
108
+ case "subscription":
109
+ return {
110
+ kind: "subscription",
111
+ query: {
112
+ ast: Query.select(Filter.nothing()).ast
113
+ }
114
+ };
115
+ case "queue":
116
+ return {
117
+ kind: "queue",
118
+ queue: "dxn:"
119
+ };
120
+ case "email":
121
+ return {
122
+ kind: "email"
123
+ };
124
+ case "webhook":
125
+ return {
126
+ kind: "webhook"
127
+ };
128
+ default:
129
+ return void 0;
130
+ }
131
+ };
132
+ const defaultSpec = getDefaultTriggerSpec(value);
133
+ if (!defaultSpec) {
134
+ return;
135
+ }
136
+ specProps.onValueChange(props.type, defaultSpec);
137
+ }, [
138
+ props.type,
139
+ specProps
140
+ ]);
141
+ const options = useMemo2(() => Trigger.Kinds.map((kind) => ({
142
+ value: kind,
143
+ label: t(`trigger type ${kind}`)
144
+ })), [
145
+ t
146
+ ]);
147
+ return /* @__PURE__ */ React2.createElement(SelectField, {
148
+ ...props,
149
+ options,
150
+ onValueChange: handleTypeChange
151
+ });
152
+ } finally {
153
+ _effect.f();
154
+ }
155
+ };
156
+ SpecSelector.displayName = "Form.SpecSelector";
157
+
158
+ // src/components/TriggerEditor/TriggerEditor.tsx
159
+ var TriggerEditor = ({ space, types, tags, readonlySpec, trigger, ...formProps }) => {
160
+ var _effect = _useSignals3();
161
+ try {
162
+ const handleQueryRefOptions = useRefQueryOptions({
163
+ space
164
+ });
165
+ const fieldMap = useCustomInputs({
166
+ space,
167
+ types,
168
+ tags,
169
+ readonlySpec,
170
+ onQueryRefOptions: handleQueryRefOptions
171
+ });
172
+ return /* @__PURE__ */ React3.createElement(Form2.Root, {
173
+ ...formProps,
174
+ schema: omitId2(Trigger2.Trigger),
175
+ values: trigger,
176
+ fieldMap,
177
+ onQueryRefOptions: handleQueryRefOptions
178
+ }, /* @__PURE__ */ React3.createElement(Form2.Viewport, null, /* @__PURE__ */ React3.createElement(Form2.Content, null, /* @__PURE__ */ React3.createElement(Form2.FieldSet, null), /* @__PURE__ */ React3.createElement(Form2.Actions, null))));
179
+ } finally {
180
+ _effect.f();
181
+ }
182
+ };
183
+ var useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }) => {
184
+ const functions = useQuery(space, Filter2.type(Function.Function));
185
+ const workflows = useQuery(space, Filter2.type(ComputeGraph));
186
+ const scripts = useQuery(space, Filter2.type(Script.Script));
187
+ return useMemo3(() => ({
188
+ // Function selector.
189
+ ["function"]: (props) => {
190
+ const getValue = useCallback3(() => {
191
+ const formValue = props.getValue();
192
+ if (Ref2.isRef(formValue)) {
193
+ return formValue.dxn.toString();
194
+ }
195
+ return void 0;
196
+ }, [
197
+ props
198
+ ]);
199
+ const handleOnValueChange = useCallback3((_type, dxnString) => {
200
+ const dxn = DXN.parse(dxnString);
201
+ if (dxn) {
202
+ const ref = Ref2.fromDXN(dxn);
203
+ props.onValueChange(props.type, ref);
204
+ }
205
+ }, [
206
+ props.type,
207
+ props.onValueChange
208
+ ]);
209
+ return /* @__PURE__ */ React3.createElement(SelectField2, {
210
+ ...props,
211
+ getValue,
212
+ onValueChange: handleOnValueChange,
213
+ options: getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))
214
+ });
215
+ },
216
+ // Spec selector.
217
+ ["spec.kind"]: (props) => /* @__PURE__ */ React3.createElement(SpecSelector, {
218
+ ...props,
219
+ readonly: readonlySpec
220
+ }),
221
+ // TODO(wittjosiah): Copied from ViewEditor.
222
+ // Query input editor.
223
+ ["spec.query"]: (props) => {
224
+ const handleChange = useCallback3((query) => props.onValueChange(props.type, {
225
+ ast: query.ast
226
+ }), [
227
+ props.type,
228
+ props.onValueChange
229
+ ]);
230
+ return /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(FormFieldLabel, {
231
+ label: props.label,
232
+ asChild: true
233
+ }), /* @__PURE__ */ React3.createElement(QueryForm, {
234
+ initialQuery: props.getValue().ast,
235
+ types,
236
+ tags,
237
+ onChange: handleChange
238
+ }));
239
+ },
240
+ // Function input editor.
241
+ ["input"]: (props) => /* @__PURE__ */ React3.createElement(FunctionInputEditor, {
242
+ ...props,
243
+ functions,
244
+ onQueryRefOptions
245
+ })
246
+ }), [
247
+ workflows,
248
+ scripts,
249
+ functions,
250
+ readonlySpec
251
+ ]);
252
+ };
253
+ var getWorkflowOptions = (graphs) => {
254
+ return graphs.map((graph) => ({
255
+ label: `compute-${graph.id}`,
256
+ value: `dxn:echo:@:${graph.id}`
257
+ }));
258
+ };
259
+ var getFunctionOptions = (scripts, functions) => {
260
+ const getLabel = (fn) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
261
+ return functions.map((fn) => ({
262
+ label: getLabel(fn),
263
+ value: `dxn:echo:@:${fn.id}`
264
+ }));
265
+ };
266
+
267
+ export {
268
+ TriggerEditor
269
+ };
270
+ //# sourceMappingURL=chunk-WAZEZHJI.mjs.map