@dxos/plugin-automation 0.8.4-main.67995b8 → 0.8.4-main.ae835ea

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 (186) hide show
  1. package/dist/lib/browser/AutomationPanel-LBXJDM6Z.mjs +11 -0
  2. package/dist/lib/browser/AutomationSettings-IIEI5D2K.mjs +68 -0
  3. package/dist/lib/browser/AutomationSettings-IIEI5D2K.mjs.map +7 -0
  4. package/dist/lib/browser/{FunctionsContainer-IOB333TX.mjs → FunctionsContainer-IZTCGNJZ.mjs} +9 -12
  5. package/dist/lib/browser/FunctionsContainer-IZTCGNJZ.mjs.map +7 -0
  6. package/dist/lib/browser/{FunctionsPanel-56ZKRVM5.mjs → FunctionsPanel-HFCK3JRB.mjs} +3 -3
  7. package/dist/lib/browser/{app-graph-builder-ZTAUTFI4.mjs → app-graph-builder-7VKA2GS3.mjs} +12 -11
  8. package/dist/lib/browser/app-graph-builder-7VKA2GS3.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-CVYJM6OO.mjs +66 -0
  10. package/dist/lib/browser/chunk-CVYJM6OO.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-LYJVTIVD.mjs → chunk-FHSN7G4H.mjs} +25 -12
  12. package/dist/lib/browser/chunk-FHSN7G4H.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-GCGHLQM2.mjs +15 -0
  14. package/dist/lib/browser/chunk-GCGHLQM2.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-FSJZXTS2.mjs → chunk-JW7XSPYW.mjs} +69 -32
  16. package/dist/lib/browser/chunk-JW7XSPYW.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-ERTIGJYE.mjs → chunk-K5YNWESC.mjs} +68 -32
  18. package/dist/lib/browser/chunk-K5YNWESC.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-LZQFZO3B.mjs +17 -0
  20. package/dist/lib/browser/chunk-LZQFZO3B.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-XXZNGORC.mjs +14 -0
  22. package/dist/lib/browser/chunk-XXZNGORC.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-PFYRMGN2.mjs +114 -0
  26. package/dist/lib/browser/compute-runtime-PFYRMGN2.mjs.map +7 -0
  27. package/dist/lib/browser/hooks/index.mjs +11 -0
  28. package/dist/lib/browser/index.mjs +44 -19
  29. package/dist/lib/browser/index.mjs.map +4 -4
  30. package/dist/lib/browser/{intent-resolver-U3ZAQEFW.mjs → intent-resolver-5HR7M7T6.mjs} +15 -14
  31. package/dist/lib/browser/intent-resolver-5HR7M7T6.mjs.map +7 -0
  32. package/dist/lib/browser/meta.json +1 -1
  33. package/dist/lib/browser/{react-surface-4DFSM7OX.mjs → react-surface-WPMY3EX2.mjs} +18 -19
  34. package/dist/lib/browser/react-surface-WPMY3EX2.mjs.map +7 -0
  35. package/dist/lib/browser/types/index.mjs +2 -2
  36. package/dist/lib/node-esm/{AutomationPanel-YYUMSK2W.mjs → AutomationPanel-NVEIUIZP.mjs} +4 -4
  37. package/dist/lib/node-esm/AutomationSettings-VIIEPI2P.mjs +69 -0
  38. package/dist/lib/node-esm/AutomationSettings-VIIEPI2P.mjs.map +7 -0
  39. package/dist/lib/node-esm/{FunctionsContainer-DJWB6WFH.mjs → FunctionsContainer-KKRCIXGB.mjs} +9 -12
  40. package/dist/lib/node-esm/FunctionsContainer-KKRCIXGB.mjs.map +7 -0
  41. package/dist/lib/node-esm/{FunctionsPanel-KGIOZSPZ.mjs → FunctionsPanel-74ELGR7P.mjs} +3 -3
  42. package/dist/lib/node-esm/FunctionsPanel-74ELGR7P.mjs.map +7 -0
  43. package/dist/lib/node-esm/{app-graph-builder-3FP63ZSG.mjs → app-graph-builder-RTOFJNFV.mjs} +12 -11
  44. package/dist/lib/node-esm/app-graph-builder-RTOFJNFV.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-3BJ6BR3E.mjs +67 -0
  46. package/dist/lib/node-esm/chunk-3BJ6BR3E.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs +19 -0
  48. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-OEZNHUL2.mjs → chunk-ECJKIUBO.mjs} +3 -3
  50. package/dist/lib/node-esm/chunk-ECJKIUBO.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-ZGPUV5VS.mjs → chunk-JOCKHLFT.mjs} +25 -12
  52. package/dist/lib/node-esm/chunk-JOCKHLFT.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-MRYKW5TM.mjs +16 -0
  54. package/dist/lib/node-esm/chunk-MRYKW5TM.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-U5Q2NI7H.mjs +16 -0
  56. package/dist/lib/node-esm/chunk-U5Q2NI7H.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-AZH66CED.mjs → chunk-W76WUTZY.mjs} +69 -32
  58. package/dist/lib/node-esm/chunk-W76WUTZY.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-HIMYPGHF.mjs → chunk-Y7PJXFCJ.mjs} +68 -32
  60. package/dist/lib/node-esm/chunk-Y7PJXFCJ.mjs.map +7 -0
  61. package/dist/lib/node-esm/compute-runtime-IXCSD3W7.mjs +115 -0
  62. package/dist/lib/node-esm/compute-runtime-IXCSD3W7.mjs.map +7 -0
  63. package/dist/lib/node-esm/hooks/index.mjs +12 -0
  64. package/dist/lib/node-esm/hooks/index.mjs.map +7 -0
  65. package/dist/lib/node-esm/index.mjs +44 -19
  66. package/dist/lib/node-esm/index.mjs.map +4 -4
  67. package/dist/lib/node-esm/{intent-resolver-3QWXEBPX.mjs → intent-resolver-KDRYB5BC.mjs} +15 -14
  68. package/dist/lib/node-esm/intent-resolver-KDRYB5BC.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-Y2BBJV2I.mjs} +18 -19
  71. package/dist/lib/node-esm/react-surface-Y2BBJV2I.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 +19 -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 +46 -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/TriggerEditor/FunctionInputEditor.d.ts +2 -2
  96. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  97. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  98. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +7 -5
  99. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  100. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +47 -4
  101. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/TriggerSettings.d.ts +6 -0
  103. package/dist/types/src/components/TriggerSettings.d.ts.map +1 -0
  104. package/dist/types/src/components/index.d.ts +2 -2
  105. package/dist/types/src/components/index.d.ts.map +1 -1
  106. package/dist/types/src/events.d.ts +4 -0
  107. package/dist/types/src/events.d.ts.map +1 -0
  108. package/dist/types/src/hooks/index.d.ts +3 -0
  109. package/dist/types/src/hooks/index.d.ts.map +1 -0
  110. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +8 -0
  111. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -0
  112. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +11 -0
  113. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -0
  114. package/dist/types/src/index.d.ts +3 -0
  115. package/dist/types/src/index.d.ts.map +1 -1
  116. package/dist/types/src/meta.d.ts +0 -1
  117. package/dist/types/src/meta.d.ts.map +1 -1
  118. package/dist/types/src/translations.d.ts +3 -0
  119. package/dist/types/src/translations.d.ts.map +1 -1
  120. package/dist/types/src/types/schema.d.ts +1 -1
  121. package/dist/types/src/types/schema.d.ts.map +1 -1
  122. package/dist/types/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +62 -41
  124. package/src/AutomationPlugin.tsx +37 -31
  125. package/src/capabilities/app-graph-builder.ts +12 -11
  126. package/src/capabilities/capabilities.ts +48 -0
  127. package/src/capabilities/compute-runtime.ts +138 -0
  128. package/src/capabilities/index.ts +3 -0
  129. package/src/capabilities/intent-resolver.ts +11 -11
  130. package/src/capabilities/react-surface.tsx +13 -14
  131. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +15 -16
  132. package/src/components/AutomationPanel/AutomationPanel.tsx +101 -50
  133. package/src/components/AutomationSettings.tsx +30 -0
  134. package/src/components/FunctionsContainer.tsx +11 -13
  135. package/src/components/FunctionsPanel/FunctionsPanel.tsx +26 -14
  136. package/src/components/TriggerEditor/FunctionInputEditor.tsx +10 -4
  137. package/src/components/TriggerEditor/SpecSelector.tsx +23 -17
  138. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +68 -26
  139. package/src/components/TriggerEditor/TriggerEditor.tsx +45 -25
  140. package/src/components/TriggerSettings.tsx +25 -0
  141. package/src/components/index.ts +1 -1
  142. package/src/events.ts +11 -0
  143. package/src/hooks/index.ts +6 -0
  144. package/src/hooks/useComputeRuntimeCallback.ts +32 -0
  145. package/src/hooks/useTriggerRuntimeControls.ts +52 -0
  146. package/src/index.ts +3 -0
  147. package/src/meta.ts +6 -5
  148. package/src/testing/test-functions.ts +1 -1
  149. package/src/translations.ts +5 -0
  150. package/src/types/schema.ts +1 -1
  151. package/dist/lib/browser/AutomationContainer-VZNV2ZQF.mjs +0 -38
  152. package/dist/lib/browser/AutomationContainer-VZNV2ZQF.mjs.map +0 -7
  153. package/dist/lib/browser/AutomationPanel-ZWA6GOFY.mjs +0 -11
  154. package/dist/lib/browser/FunctionsContainer-IOB333TX.mjs.map +0 -7
  155. package/dist/lib/browser/app-graph-builder-ZTAUTFI4.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-ECSTS2UI.mjs +0 -14
  157. package/dist/lib/browser/chunk-ECSTS2UI.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-ERTIGJYE.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-FSJZXTS2.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-GW5U2DGT.mjs +0 -15
  161. package/dist/lib/browser/chunk-GW5U2DGT.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-HN7OHFCB.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-LYJVTIVD.mjs.map +0 -7
  164. package/dist/lib/browser/intent-resolver-U3ZAQEFW.mjs.map +0 -7
  165. package/dist/lib/browser/react-surface-4DFSM7OX.mjs.map +0 -7
  166. package/dist/lib/node-esm/AutomationContainer-WMIH3F4V.mjs +0 -39
  167. package/dist/lib/node-esm/AutomationContainer-WMIH3F4V.mjs.map +0 -7
  168. package/dist/lib/node-esm/FunctionsContainer-DJWB6WFH.mjs.map +0 -7
  169. package/dist/lib/node-esm/app-graph-builder-3FP63ZSG.mjs.map +0 -7
  170. package/dist/lib/node-esm/chunk-AZH66CED.mjs.map +0 -7
  171. package/dist/lib/node-esm/chunk-HIMYPGHF.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs +0 -17
  173. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-OEZNHUL2.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-SGZPTJ47.mjs +0 -16
  176. package/dist/lib/node-esm/chunk-SGZPTJ47.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-ZGPUV5VS.mjs.map +0 -7
  178. package/dist/lib/node-esm/intent-resolver-3QWXEBPX.mjs.map +0 -7
  179. package/dist/lib/node-esm/react-surface-3PNW7NDW.mjs.map +0 -7
  180. package/dist/types/src/components/AutomationContainer.d.ts +0 -5
  181. package/dist/types/src/components/AutomationContainer.d.ts.map +0 -1
  182. package/src/components/AutomationContainer.tsx +0 -30
  183. /package/dist/lib/browser/{AutomationPanel-ZWA6GOFY.mjs.map → AutomationPanel-LBXJDM6Z.mjs.map} +0 -0
  184. /package/dist/lib/browser/{FunctionsPanel-56ZKRVM5.mjs.map → FunctionsPanel-HFCK3JRB.mjs.map} +0 -0
  185. /package/dist/lib/{node-esm/AutomationPanel-YYUMSK2W.mjs.map → browser/hooks/index.mjs.map} +0 -0
  186. /package/dist/lib/node-esm/{FunctionsPanel-KGIOZSPZ.mjs.map → AutomationPanel-NVEIUIZP.mjs.map} +0 -0
@@ -1,15 +1,17 @@
1
1
  import {
2
- AUTOMATION_PLUGIN
3
- } from "./chunk-GW5U2DGT.mjs";
2
+ meta
3
+ } from "./chunk-LZQFZO3B.mjs";
4
4
 
5
5
  // src/components/TriggerEditor/TriggerEditor.tsx
6
6
  import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
7
7
  import React3, { useCallback as useCallback3, useMemo as useMemo3 } from "react";
8
8
  import { ComputeGraph } from "@dxos/conductor";
9
9
  import { Type as Type2 } from "@dxos/echo";
10
- import { FunctionType, FunctionTriggerSchema, ScriptType } from "@dxos/functions";
11
- import { Filter, Ref as Ref2, useQuery } from "@dxos/react-client/echo";
12
- import { Form as Form2, SelectInput as SelectInput2, useRefQueryLookupHandler } from "@dxos/react-ui-form";
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, InputHeader, SelectInput as SelectInput2, useRefQueryLookupHandler } from "@dxos/react-ui-form";
13
15
 
14
16
  // src/components/TriggerEditor/FunctionInputEditor.tsx
15
17
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
@@ -37,7 +39,12 @@ var FunctionInputEditor = ({ functions, getValue, onValueChange, onQueryRefOptio
37
39
  useOnTransition(
38
40
  // Clear function parameter input when the function changes.
39
41
  selectedFunctionValue,
40
- (prevValue) => prevValue !== void 0 && prevValue !== selectedFunctionValue,
42
+ (prevValue) => {
43
+ if (!Ref.isRef(prevValue) || !Ref.isRef(selectedFunctionValue)) {
44
+ return false;
45
+ }
46
+ return prevValue.dxn.toString() !== selectedFunctionValue.dxn.toString();
47
+ },
41
48
  (currValue) => currValue !== void 0,
42
49
  () => onValueChange("object", {})
43
50
  );
@@ -76,41 +83,44 @@ var FunctionInputEditor = ({ functions, getValue, onValueChange, onQueryRefOptio
76
83
  // src/components/TriggerEditor/SpecSelector.tsx
77
84
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
78
85
  import React2, { useCallback as useCallback2, useMemo as useMemo2 } from "react";
79
- import { TriggerKind } from "@dxos/functions";
86
+ import { Filter, Query } from "@dxos/echo";
87
+ import { Trigger } from "@dxos/functions";
80
88
  import { useTranslation } from "@dxos/react-ui";
81
89
  import { SelectInput, useInputProps } from "@dxos/react-ui-form";
82
90
  var SpecSelector = (props) => {
83
91
  var _effect = _useSignals2();
84
92
  try {
85
- const { t } = useTranslation(AUTOMATION_PLUGIN);
93
+ const { t } = useTranslation(meta.id);
86
94
  const specProps = useInputProps([
87
95
  "spec"
88
96
  ]);
89
97
  const handleTypeChange = useCallback2((_type, value) => {
90
98
  const getDefaultTriggerSpec = (kind) => {
91
99
  switch (kind) {
92
- case TriggerKind.Timer:
100
+ case "timer":
93
101
  return {
94
- kind: TriggerKind.Timer,
102
+ kind: "timer",
95
103
  cron: ""
96
104
  };
97
- case TriggerKind.Subscription:
105
+ case "subscription":
98
106
  return {
99
- kind: TriggerKind.Subscription,
100
- filter: {}
107
+ kind: "subscription",
108
+ query: {
109
+ ast: Query.select(Filter.nothing()).ast
110
+ }
101
111
  };
102
- case TriggerKind.Queue:
112
+ case "queue":
103
113
  return {
104
- kind: TriggerKind.Queue,
105
- queue: ""
114
+ kind: "queue",
115
+ queue: "dxn:"
106
116
  };
107
- case TriggerKind.Email:
117
+ case "email":
108
118
  return {
109
- kind: TriggerKind.Email
119
+ kind: "email"
110
120
  };
111
- case TriggerKind.Webhook:
121
+ case "webhook":
112
122
  return {
113
- kind: TriggerKind.Webhook
123
+ kind: "webhook"
114
124
  };
115
125
  default:
116
126
  return void 0;
@@ -124,7 +134,7 @@ var SpecSelector = (props) => {
124
134
  }, [
125
135
  specProps
126
136
  ]);
127
- const options = useMemo2(() => Object.values(TriggerKind).map((kind) => ({
137
+ const options = useMemo2(() => Trigger.Kinds.map((kind) => ({
128
138
  value: kind,
129
139
  label: t(`trigger type ${kind}`)
130
140
  })), [
@@ -141,20 +151,26 @@ var SpecSelector = (props) => {
141
151
  };
142
152
 
143
153
  // src/components/TriggerEditor/TriggerEditor.tsx
144
- var TriggerEditor = ({ space, trigger, onSave, onCancel }) => {
154
+ var TriggerEditor = ({ space, trigger, readonlySpec, types, tags, onSave, onCancel }) => {
145
155
  var _effect = _useSignals3();
146
156
  try {
147
- const handleSave = (values) => {
157
+ const handleSave = ({ id: _, ...values }) => {
148
158
  onSave?.(values);
149
159
  };
150
160
  const handleRefQueryLookup = useRefQueryLookupHandler({
151
161
  space
152
162
  });
153
- const Custom = useCustomInputs(space, handleRefQueryLookup);
163
+ const Custom = useCustomInputs({
164
+ space,
165
+ readonlySpec,
166
+ types,
167
+ tags,
168
+ onQueryRefOptions: handleRefQueryLookup
169
+ });
154
170
  return /* @__PURE__ */ React3.createElement(Form2, {
155
171
  outerSpacing: false,
156
172
  Custom,
157
- schema: FunctionTriggerSchema,
173
+ schema: Trigger2.Trigger,
158
174
  values: trigger,
159
175
  onSave: handleSave,
160
176
  onCancel,
@@ -164,10 +180,10 @@ var TriggerEditor = ({ space, trigger, onSave, onCancel }) => {
164
180
  _effect.f();
165
181
  }
166
182
  };
167
- var useCustomInputs = (space, onQueryRefOptions) => {
168
- const functions = useQuery(space, Filter.type(FunctionType));
169
- const workflows = useQuery(space, Filter.type(ComputeGraph));
170
- const scripts = useQuery(space, Filter.type(ScriptType));
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));
171
187
  return useMemo3(() => ({
172
188
  // Function selector.
173
189
  ["function"]: (props) => {
@@ -197,7 +213,27 @@ var useCustomInputs = (space, onQueryRefOptions) => {
197
213
  });
198
214
  },
199
215
  // Spec selector.
200
- ["spec.kind"]: SpecSelector,
216
+ ["spec.kind"]: (props) => /* @__PURE__ */ React3.createElement(SpecSelector, {
217
+ ...props,
218
+ readonly: readonlySpec ? "disabled-input" : false
219
+ }),
220
+ // TODO(wittjosiah): Copied from ViewEditor.
221
+ // Query input editor.
222
+ ["spec.query"]: (props) => {
223
+ const handleChange = useCallback3((query) => props.onValueChange("object", {
224
+ ast: query.ast
225
+ }), [
226
+ props.onValueChange
227
+ ]);
228
+ return /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(InputHeader, {
229
+ label: props.label
230
+ }), /* @__PURE__ */ React3.createElement(QueryForm, {
231
+ initialQuery: props.getValue().ast,
232
+ types,
233
+ tags,
234
+ onChange: handleChange
235
+ }));
236
+ },
201
237
  // Function input editor.
202
238
  ["input"]: (props) => /* @__PURE__ */ React3.createElement(FunctionInputEditor, {
203
239
  ...props,
@@ -207,7 +243,8 @@ var useCustomInputs = (space, onQueryRefOptions) => {
207
243
  }), [
208
244
  workflows,
209
245
  scripts,
210
- functions
246
+ functions,
247
+ readonlySpec
211
248
  ]);
212
249
  };
213
250
  var getWorkflowOptions = (graphs) => {
@@ -227,4 +264,4 @@ var getFunctionOptions = (scripts, functions) => {
227
264
  export {
228
265
  TriggerEditor
229
266
  };
230
- //# sourceMappingURL=chunk-FSJZXTS2.mjs.map
267
+ //# sourceMappingURL=chunk-JW7XSPYW.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/TriggerEditor/FunctionInputEditor.tsx", "../../../src/components/TriggerEditor/SpecSelector.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { ComputeGraph } from '@dxos/conductor';\nimport { type Query, Type } from '@dxos/echo';\nimport { Function, Script, Trigger } from '@dxos/functions';\nimport { Filter, Ref, type Space, useQuery } from '@dxos/react-client/echo';\nimport { Input } from '@dxos/react-ui';\nimport { QueryForm, type QueryFormProps } from '@dxos/react-ui-components';\nimport { type CustomInputMap, Form, InputHeader, SelectInput, useRefQueryLookupHandler } from '@dxos/react-ui-form';\n\nimport { FunctionInputEditor, type FunctionInputEditorProps } from './FunctionInputEditor';\nimport { SpecSelector } from './SpecSelector';\n\nexport type TriggerEditorProps = {\n space: Space;\n trigger: Trigger.Trigger;\n // TODO(wittjosiah): This needs to apply to whole spec but currently only applies to spec.kind & spec.query.\n readonlySpec?: boolean;\n onSave?: (trigger: Omit<Trigger.Trigger, 'id'>) => void;\n onCancel?: () => void;\n} & Pick<QueryFormProps, 'types' | 'tags'>;\n\nexport const TriggerEditor = ({ space, trigger, readonlySpec, types, tags, onSave, onCancel }: TriggerEditorProps) => {\n const handleSave = ({ id: _, ...values }: Trigger.Trigger) => {\n onSave?.(values);\n };\n\n const handleRefQueryLookup = useRefQueryLookupHandler({ space });\n const Custom = useCustomInputs({ space, readonlySpec, types, tags, onQueryRefOptions: handleRefQueryLookup });\n\n return (\n <Form\n outerSpacing={false}\n Custom={Custom}\n schema={Trigger.Trigger}\n values={trigger}\n onSave={handleSave}\n onCancel={onCancel}\n onQueryRefOptions={handleRefQueryLookup}\n />\n );\n};\n\ntype UseCustomInputsProps = {\n space: Space;\n readonlySpec?: boolean;\n onQueryRefOptions: FunctionInputEditorProps['onQueryRefOptions'];\n} & Pick<QueryFormProps, 'types' | 'tags'>;\n\nconst useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }: UseCustomInputsProps) => {\n const functions = useQuery(space, Filter.type(Function.Function));\n const workflows = useQuery(space, Filter.type(ComputeGraph));\n const scripts = useQuery(space, Filter.type(Script.Script));\n\n return useMemo(\n (): CustomInputMap => ({\n // Function selector.\n ['function' satisfies keyof Trigger.Trigger]: (props) => {\n const getValue = useCallback(() => {\n const formValue = props.getValue();\n if (Ref.isRef(formValue)) {\n return formValue.dxn.toString() as string;\n }\n return undefined;\n }, [props]);\n\n const handleOnValueChange = useCallback(\n (_type: any, dxnString: string) => {\n const dxn = Type.DXN.parse(dxnString);\n if (dxn) {\n const ref = Ref.fromDXN(dxn);\n props.onValueChange('object', ref);\n }\n },\n [props.onValueChange],\n );\n\n return (\n <SelectInput\n {...props}\n getValue={getValue as any}\n onValueChange={handleOnValueChange}\n options={getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))}\n />\n );\n },\n\n // Spec selector.\n ['spec.kind' as const]: (props) => <SpecSelector {...props} readonly={readonlySpec ? 'disabled-input' : false} />,\n\n // TODO(wittjosiah): Copied from ViewEditor.\n // Query input editor.\n ['spec.query' as const]: (props) => {\n const handleChange = useCallback(\n (query: Query.Any) => props.onValueChange('object', { ast: query.ast }),\n [props.onValueChange],\n );\n\n return (\n <Input.Root>\n <InputHeader label={props.label} />\n <QueryForm initialQuery={(props.getValue() as any).ast} types={types} tags={tags} onChange={handleChange} />\n </Input.Root>\n );\n },\n\n // Function input editor.\n ['input' as const]: (props) => (\n <FunctionInputEditor {...props} functions={functions} onQueryRefOptions={onQueryRefOptions} />\n ),\n }),\n [workflows, scripts, functions, readonlySpec],\n );\n};\n\nconst getWorkflowOptions = (graphs: ComputeGraph[]) => {\n return graphs.map((graph) => ({ label: `compute-${graph.id}`, value: `dxn:echo:@:${graph.id}` }));\n};\n\nconst getFunctionOptions = (scripts: Script.Script[], functions: Function.Function[]) => {\n const getLabel = (fn: Function.Function) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;\n return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:echo:@:${fn.id}` }));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Ref, Type } from '@dxos/echo';\nimport { type JsonPath } from '@dxos/echo/internal';\nimport { type Function } from '@dxos/functions';\nimport { useOnTransition } from '@dxos/react-ui';\nimport { Form, type FormInputStateProps, type QueryRefOptions, useFormValues } from '@dxos/react-ui-form';\n\nexport type FunctionInputEditorProps = {\n functions: Function.Function[];\n onQueryRefOptions: QueryRefOptions;\n} & FormInputStateProps;\n\n/**\n * Editor component for function input parameters.\n */\nexport const FunctionInputEditor = ({\n functions,\n getValue,\n onValueChange,\n onQueryRefOptions,\n}: FunctionInputEditorProps) => {\n const selectedFunctionValue = useFormValues(['function' as JsonPath]);\n const selectedFunctionId = useMemo(() => {\n if (Ref.isRef(selectedFunctionValue)) {\n return selectedFunctionValue.dxn.toString().split('dxn:echo:@:').at(1);\n }\n }, [selectedFunctionValue]);\n\n const selectedFunction = useMemo(\n () => functions.find((fn) => fn.id === selectedFunctionId),\n [functions, selectedFunctionId],\n );\n\n useOnTransition(\n // Clear function parameter input when the function changes.\n selectedFunctionValue,\n (prevValue) => {\n if (!Ref.isRef(prevValue) || !Ref.isRef(selectedFunctionValue)) {\n return false;\n }\n\n return prevValue.dxn.toString() !== selectedFunctionValue.dxn.toString();\n },\n (currValue) => currValue !== undefined,\n () => onValueChange('object', {}),\n );\n\n const inputSchema = useMemo(() => selectedFunction?.inputSchema, [selectedFunction]);\n const effectSchema = useMemo(() => (inputSchema ? Type.toEffectSchema(inputSchema) : undefined), [inputSchema]);\n const propertyCount = inputSchema?.properties ? Object.keys(inputSchema.properties).length : 0;\n\n const values = useMemo(() => getValue() ?? {}, [getValue]);\n\n const handleValuesChanged = useCallback(\n (values: any) => {\n onValueChange('object', values);\n },\n [onValueChange],\n );\n\n if (selectedFunction === undefined || effectSchema === undefined || propertyCount === 0) {\n return null;\n }\n\n return (\n <>\n <h3 className='text-md'>Function parameters</h3>\n {/* TODO(ZaymonFC): Try using <FormFields /> internal component for this nesting.\n This would allow errors to flow up to the root context. */}\n <Form\n schema={effectSchema}\n values={values}\n onValuesChanged={handleValuesChanged}\n onQueryRefOptions={onQueryRefOptions}\n outerSpacing={false}\n />\n </>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Filter, Query } from '@dxos/echo';\nimport { Trigger } from '@dxos/functions';\nimport { useTranslation } from '@dxos/react-ui';\nimport { type InputProps, SelectInput, useInputProps } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\n\nexport type SpecSelectorProps = InputProps;\n\nexport const SpecSelector = (props: SpecSelectorProps) => {\n const { t } = useTranslation(meta.id);\n const specProps = useInputProps(['spec' satisfies keyof Trigger.Trigger]);\n\n const handleTypeChange = useCallback(\n (_type: any, value: string): Trigger.Spec | undefined => {\n const getDefaultTriggerSpec = (kind: string) => {\n switch (kind) {\n case 'timer':\n return { kind: 'timer', cron: '' };\n case 'subscription':\n return {\n kind: 'subscription',\n query: {\n ast: Query.select(Filter.nothing()).ast,\n },\n };\n case 'queue':\n return { kind: 'queue', queue: 'dxn:' };\n case 'email':\n return { kind: 'email' };\n case 'webhook':\n return { kind: 'webhook' };\n default:\n return undefined;\n }\n };\n\n const defaultSpec = getDefaultTriggerSpec(value);\n if (!defaultSpec) {\n return;\n }\n\n // Update the entire spec object, not just the `spec.kind`.\n specProps.onValueChange('object', defaultSpec);\n },\n [specProps],\n );\n\n const options = useMemo(\n () =>\n Trigger.Kinds.map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n })),\n [t],\n );\n\n return <SelectInput {...props} options={options} onValueChange={handleTypeChange} />;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useMemo", "ComputeGraph", "Type", "Function", "Script", "Trigger", "Filter", "Ref", "useQuery", "Input", "QueryForm", "Form", "InputHeader", "SelectInput", "useRefQueryLookupHandler", "React", "useCallback", "useMemo", "Ref", "Type", "useOnTransition", "Form", "useFormValues", "FunctionInputEditor", "functions", "getValue", "onValueChange", "onQueryRefOptions", "selectedFunctionValue", "useFormValues", "selectedFunctionId", "useMemo", "Ref", "isRef", "dxn", "toString", "split", "at", "selectedFunction", "find", "fn", "id", "useOnTransition", "prevValue", "currValue", "undefined", "inputSchema", "effectSchema", "Type", "toEffectSchema", "propertyCount", "properties", "Object", "keys", "length", "values", "handleValuesChanged", "useCallback", "h3", "className", "Form", "schema", "onValuesChanged", "outerSpacing", "React", "useCallback", "useMemo", "Filter", "Query", "Trigger", "useTranslation", "SelectInput", "useInputProps", "SpecSelector", "props", "t", "useTranslation", "meta", "id", "specProps", "useInputProps", "handleTypeChange", "useCallback", "_type", "value", "getDefaultTriggerSpec", "kind", "cron", "query", "ast", "Query", "select", "Filter", "nothing", "queue", "undefined", "defaultSpec", "onValueChange", "options", "useMemo", "Trigger", "Kinds", "map", "label", "React", "SelectInput", "TriggerEditor", "space", "trigger", "readonlySpec", "types", "tags", "onSave", "onCancel", "handleSave", "id", "_", "values", "handleRefQueryLookup", "useRefQueryLookupHandler", "Custom", "useCustomInputs", "onQueryRefOptions", "React", "Form", "outerSpacing", "schema", "Trigger", "functions", "useQuery", "Filter", "type", "Function", "workflows", "ComputeGraph", "scripts", "Script", "useMemo", "props", "getValue", "useCallback", "formValue", "Ref", "isRef", "dxn", "toString", "undefined", "handleOnValueChange", "_type", "dxnString", "Type", "DXN", "parse", "ref", "fromDXN", "onValueChange", "SelectInput", "options", "getWorkflowOptions", "concat", "getFunctionOptions", "SpecSelector", "readonly", "handleChange", "query", "ast", "Input", "Root", "InputHeader", "label", "QueryForm", "initialQuery", "onChange", "FunctionInputEditor", "graphs", "map", "graph", "value", "getLabel", "fn", "find", "s", "source", "target", "name"]
7
+ }
@@ -1,40 +1,58 @@
1
1
  import {
2
2
  TriggerEditor
3
- } from "./chunk-FSJZXTS2.mjs";
3
+ } from "./chunk-JW7XSPYW.mjs";
4
4
  import {
5
- AUTOMATION_PLUGIN
6
- } from "./chunk-GW5U2DGT.mjs";
5
+ meta
6
+ } from "./chunk-LZQFZO3B.mjs";
7
7
 
8
8
  // src/components/AutomationPanel/AutomationPanel.tsx
9
9
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
10
- import { Schema } from "effect";
11
- import React, { useState } from "react";
12
- import { Filter, Obj } from "@dxos/echo";
13
- import { FunctionType, FunctionTrigger, FunctionTriggerSchema, ScriptType, TriggerKind } from "@dxos/functions";
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 { useTypeOptions } from "@dxos/plugin-space";
14
18
  import { useClient } from "@dxos/react-client";
15
- import { useQuery, getSpace } from "@dxos/react-client/echo";
19
+ import { getSpace, useQuery } from "@dxos/react-client/echo";
16
20
  import { Clipboard, IconButton, Input, Separator, useTranslation } from "@dxos/react-ui";
17
21
  import { ControlItem, controlItemClasses } from "@dxos/react-ui-form";
18
22
  import { List } from "@dxos/react-ui-list";
19
23
  import { ghostHover, mx } from "@dxos/react-ui-theme";
24
+ import { DataType } from "@dxos/schema";
20
25
  var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
21
- var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
26
+ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) => {
22
27
  var _effect = _useSignals();
23
28
  try {
24
- const { t } = useTranslation(AUTOMATION_PLUGIN);
29
+ const { t } = useTranslation(meta.id);
25
30
  const client = useClient();
26
- const triggers = useQuery(space, Filter.type(FunctionTrigger));
27
- const functions = useQuery(space, Filter.type(FunctionType));
28
- const scripts = useQuery(space, Filter.type(ScriptType));
31
+ const functions = useQuery(space, Filter.type(Function.Function));
32
+ const triggers = useQuery(space, Filter.type(Trigger.Trigger));
33
+ const filteredTriggers = useMemo(() => {
34
+ return object ? triggers.filter(triggerMatch(object)) : triggers;
35
+ }, [
36
+ object,
37
+ triggers
38
+ ]);
39
+ const tags = useQuery(space, Filter.type(Tag.Tag));
40
+ const types = useTypeOptions({
41
+ space,
42
+ annotation: [
43
+ "dynamic",
44
+ "limited-static",
45
+ "object-form"
46
+ ]
47
+ });
29
48
  const [trigger, setTrigger] = useState(initialTrigger);
30
49
  const [selected, setSelected] = useState();
31
50
  const handleSelect = (trigger2) => {
32
- const { id: _, ...values } = trigger2;
33
- setTrigger(values);
51
+ setTrigger(trigger2);
34
52
  setSelected(trigger2);
35
53
  };
36
54
  const handleAdd = () => {
37
- setTrigger(Obj.make(FunctionTriggerSchema, {}));
55
+ setTrigger(Trigger.make({}));
38
56
  setSelected(void 0);
39
57
  };
40
58
  const handleDelete = (trigger2) => {
@@ -46,7 +64,7 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
46
64
  if (selected) {
47
65
  Object.assign(selected, trigger2);
48
66
  } else {
49
- space.db.add(Obj.make(FunctionTrigger, trigger2));
67
+ space.db.add(Trigger.make(trigger2));
50
68
  }
51
69
  setTrigger(void 0);
52
70
  setSelected(void 0);
@@ -62,20 +80,23 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
62
80
  }, /* @__PURE__ */ React.createElement(TriggerEditor, {
63
81
  space,
64
82
  trigger,
83
+ readonlySpec: Boolean(object),
84
+ tags,
85
+ types,
65
86
  onSave: handleSave,
66
87
  onCancel: handleCancel
67
88
  }));
68
89
  }
69
90
  return /* @__PURE__ */ React.createElement("div", {
70
- className: controlItemClasses
71
- }, triggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
72
- items: triggers,
73
- isItem: Schema.is(FunctionTrigger),
91
+ className: mx(controlItemClasses, classNames)
92
+ }, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
93
+ items: filteredTriggers,
94
+ isItem: Schema.is(Trigger.Trigger),
74
95
  getId: (field) => field.id
75
- }, ({ items: triggers2 }) => /* @__PURE__ */ React.createElement("div", {
96
+ }, ({ items: filteredTriggers2 }) => /* @__PURE__ */ React.createElement("div", {
76
97
  role: "list",
77
98
  className: "flex flex-col w-full"
78
- }, triggers2?.map((trigger2) => {
99
+ }, filteredTriggers2?.map((trigger2) => {
79
100
  const copyAction = getCopyAction(client, trigger2);
80
101
  return /* @__PURE__ */ React.createElement(List.Item, {
81
102
  key: trigger2.id,
@@ -89,13 +110,13 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
89
110
  }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
90
111
  classNames: "px-1 cursor-pointer w-0 shrink truncate",
91
112
  onClick: () => handleSelect(trigger2)
92
- }, getFunctionName(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
113
+ }, getFunctionName(functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
93
114
  label: t(copyAction.translationKey),
94
115
  value: copyAction.contentProvider()
95
116
  })), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
96
117
  onClick: () => handleDelete(trigger2)
97
118
  }));
98
- }))), triggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
119
+ }))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
99
120
  classNames: "mlb-4"
100
121
  }), /* @__PURE__ */ React.createElement(IconButton, {
101
122
  icon: "ph--plus--regular",
@@ -107,13 +128,13 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
107
128
  }
108
129
  };
109
130
  var getCopyAction = (client, trigger) => {
110
- if (trigger?.spec?.kind === TriggerKind.Email) {
131
+ if (trigger?.spec?.kind === "email") {
111
132
  return {
112
133
  translationKey: "trigger copy email",
113
134
  contentProvider: () => `${getSpace(trigger).id}@dxos.network`
114
135
  };
115
136
  }
116
- if (trigger?.spec?.kind === TriggerKind.Webhook) {
137
+ if (trigger?.spec?.kind === "webhook") {
117
138
  return {
118
139
  translationKey: "trigger copy url",
119
140
  contentProvider: () => getWebhookUrl(client, trigger)
@@ -128,14 +149,29 @@ var getWebhookUrl = (client, trigger) => {
128
149
  edgeUrl.protocol = isSecure ? "https" : "http";
129
150
  return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
130
151
  };
131
- var getFunctionName = (scripts, functions, trigger) => {
152
+ var getFunctionName = (functions, trigger) => {
132
153
  const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}\u2026`;
133
154
  const functionObject = functions.find((fn) => fn === trigger.function?.target);
134
- if (!functionObject) {
135
- return shortId;
155
+ return functionObject?.name ?? shortId;
156
+ };
157
+ var scriptMatch = (script) => (trigger) => {
158
+ const fn = trigger.function?.target;
159
+ if (!Obj.instanceOf(Function.Function, fn)) {
160
+ return false;
136
161
  }
137
- return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
162
+ return fn.source?.target === script;
163
+ };
164
+ var projectMatch = (project) => {
165
+ const viewQueries = EFn.pipe(project.collections, Array.map((collection) => collection.target), Array.filter(Schema.is(DataType.View)), Array.map((view) => Obj.getSnapshot(view).query.ast), Array.map((ast) => JSON.stringify(ast)));
166
+ return (trigger) => {
167
+ const spec = Obj.getSnapshot(trigger).spec;
168
+ if (spec?.kind !== "subscription") {
169
+ return false;
170
+ }
171
+ return viewQueries.some((query) => JSON.stringify(spec.query) === query);
172
+ };
138
173
  };
174
+ var triggerMatch = Match.type().pipe(Match.withReturnType(), Match.when((obj) => Obj.instanceOf(Script.Script, obj), (obj) => scriptMatch(obj)), Match.when((obj) => Obj.instanceOf(DataType.Project, obj), (obj) => projectMatch(obj)), Match.orElse((_obj) => () => true));
139
175
 
140
176
  // src/components/AutomationPanel/index.ts
141
177
  var AutomationPanel_default = AutomationPanel;
@@ -144,4 +180,4 @@ export {
144
180
  AutomationPanel,
145
181
  AutomationPanel_default
146
182
  };
147
- //# sourceMappingURL=chunk-ERTIGJYE.mjs.map
183
+ //# sourceMappingURL=chunk-K5YNWESC.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 { 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 { DataType } from '@dxos/schema';\n\nimport { meta } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_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 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({ space, annotation: ['dynamic', 'limited-static', 'object-form'] });\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 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 w-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', 'px-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='px-1 cursor-pointer w-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.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: DataType.Project) => {\n const viewQueries = EFn.pipe(\n project.collections,\n Array.map((collection) => collection.target),\n Array.filter(Schema.is(DataType.View)),\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(DataType.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", "useTypeOptions", "useClient", "getSpace", "useQuery", "Clipboard", "IconButton", "Input", "Separator", "useTranslation", "ControlItem", "controlItemClasses", "List", "ghostHover", "mx", "DataType", "grid", "AutomationPanel", "classNames", "space", "object", "initialTrigger", "onDone", "t", "useTranslation", "meta", "id", "client", "useClient", "functions", "useQuery", "Filter", "type", "Function", "triggers", "Trigger", "filteredTriggers", "useMemo", "filter", "triggerMatch", "tags", "Tag", "types", "useTypeOptions", "annotation", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "handleAdd", "make", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "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", "ItemDeleteButton", "Separator", "icon", "spec", "kind", "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", "collections", "collection", "DataType", "View", "view", "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
+ }
@@ -0,0 +1,14 @@
1
+ // src/components/index.ts
2
+ import { lazy } from "react";
3
+ var AutomationPanel = lazy(() => import("./AutomationPanel-LBXJDM6Z.mjs"));
4
+ var AutomationSettings = lazy(() => import("./AutomationSettings-IIEI5D2K.mjs"));
5
+ var FunctionsContainer = lazy(() => import("./FunctionsContainer-IZTCGNJZ.mjs"));
6
+ var FunctionsPanel = lazy(() => import("./FunctionsPanel-HFCK3JRB.mjs"));
7
+
8
+ export {
9
+ AutomationPanel,
10
+ AutomationSettings,
11
+ FunctionsContainer,
12
+ FunctionsPanel
13
+ };
14
+ //# sourceMappingURL=chunk-XXZNGORC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './TriggerEditor';\n\nexport const AutomationPanel = lazy(() => import('./AutomationPanel'));\nexport const AutomationSettings = lazy(() => import('./AutomationSettings'));\nexport const FunctionsContainer = lazy(() => import('./FunctionsContainer'));\nexport const FunctionsPanel = lazy(() => import('./FunctionsPanel'));\n"],
5
+ "mappings": ";AAIA,SAASA,YAAY;AAId,IAAMC,kBAAkBC,KAAK,MAAM,OAAO,gCAAA,CAAA;AAC1C,IAAMC,qBAAqBD,KAAK,MAAM,OAAO,mCAAA,CAAA;AAC7C,IAAME,qBAAqBF,KAAK,MAAM,OAAO,mCAAA,CAAA;AAC7C,IAAMG,iBAAiBH,KAAK,MAAM,OAAO,+BAAA,CAAA;",
6
+ "names": ["lazy", "AutomationPanel", "lazy", "AutomationSettings", "FunctionsContainer", "FunctionsPanel"]
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-GW5U2DGT.mjs";
3
+ } from "./chunk-LZQFZO3B.mjs";
4
4
 
5
5
  // src/types/schema.ts
6
- import { Schema } from "effect";
6
+ import * as Schema from "effect/Schema";
7
7
  import { SpaceSchema } from "@dxos/react-client/echo";
8
8
  var TriggerTemplate = Schema.Union(Schema.Struct({
9
9
  type: Schema.Literal("timer"),
@@ -35,4 +35,4 @@ var AutomationAction;
35
35
  export {
36
36
  AutomationAction
37
37
  };
38
- //# sourceMappingURL=chunk-HN7OHFCB.mjs.map
38
+ //# sourceMappingURL=chunk-YBPJCY3F.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/schema.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { SpaceSchema } from '@dxos/react-client/echo';\n\nimport { meta } from '../meta';\n\nconst TriggerTemplate = Schema.Union(\n Schema.Struct({ type: Schema.Literal('timer'), cron: Schema.String }),\n Schema.Struct({ type: Schema.Literal('queue'), queueDXN: Schema.Any }),\n);\n\nexport namespace AutomationAction {\n export class CreateTriggerFromTemplate extends Schema.TaggedClass<CreateTriggerFromTemplate>()(\n `${meta.id}/action/create-trigger-from-template`,\n {\n input: Schema.Struct({\n space: SpaceSchema,\n template: TriggerTemplate,\n enabled: Schema.optional(Schema.Boolean),\n // TODO(wittjosiah): Improve how this lookup is done.\n scriptName: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n output: Schema.Void,\n },\n ) {}\n}\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,mBAAmB;AAI5B,IAAMC,kBAAyBC,aACtBC,cAAO;EAAEC,MAAaC,eAAQ,OAAA;EAAUC,MAAaC;AAAO,CAAA,GAC5DJ,cAAO;EAAEC,MAAaC,eAAQ,OAAA;EAAUG,UAAiBC;AAAI,CAAA,CAAA;UAGrDC,mBAAAA;EACR,MAAMC,kCAAyCC,mBAAW,EAC/D,GAAGC,KAAKC,EAAE,wCACV;IACEC,OAAcZ,cAAO;MACnBa,OAAOC;MACPC,UAAUjB;MACVkB,SAAgBC,gBAAgBC,cAAO;;MAEvCC,YAAmBF,gBAAgBb,aAAM;MACzCQ,OAAcK,gBAAgBG,cAAO;QAAEC,KAAYjB;QAAQkB,OAAchB;MAAI,CAAA,CAAA;IAC/E,CAAA;IACAiB,QAAeC;EACjB,CAAA,EAAA;EACC;oBAbUhB,4BAAAA;AAcf,GAfiBD,qBAAAA,mBAAAA,CAAAA,EAAAA;;",
6
+ "names": ["Schema", "SpaceSchema", "TriggerTemplate", "Union", "Struct", "type", "Literal", "cron", "String", "queueDXN", "Any", "AutomationAction", "CreateTriggerFromTemplate", "TaggedClass", "meta", "id", "input", "space", "SpaceSchema", "template", "enabled", "optional", "Boolean", "scriptName", "Record", "key", "value", "output", "Void"]
7
+ }