@dxos/plugin-automation 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb
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.
- package/dist/lib/browser/{AutomationPanel-FAS6ADCW.mjs → AutomationPanel-C6MZ22CB.mjs} +3 -3
- package/dist/lib/browser/{AutomationSettings-XN2OIYWL.mjs → AutomationSettings-D7UO5V3Q.mjs} +10 -9
- package/dist/lib/browser/AutomationSettings-D7UO5V3Q.mjs.map +7 -0
- package/dist/lib/browser/{FunctionsContainer-6QLC7JP4.mjs → FunctionsContainer-5NHAAP5H.mjs} +8 -12
- package/dist/lib/browser/FunctionsContainer-5NHAAP5H.mjs.map +7 -0
- package/dist/lib/browser/{FunctionsPanel-ZX4J75UM.mjs → FunctionsPanel-RD22LYMR.mjs} +2 -2
- package/dist/lib/browser/{app-graph-builder-LAQMEBMH.mjs → app-graph-builder-HLARI3VW.mjs} +4 -3
- package/dist/lib/browser/app-graph-builder-HLARI3VW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YWLEY2FD.mjs → chunk-C273ZYLE.mjs} +100 -42
- package/dist/lib/browser/chunk-C273ZYLE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-54PANILA.mjs → chunk-JFBUK3WR.mjs} +5 -5
- package/dist/lib/browser/{chunk-QW3EM35H.mjs → chunk-JN7QRQQX.mjs} +14 -6
- package/dist/lib/browser/chunk-JN7QRQQX.mjs.map +7 -0
- package/dist/lib/browser/{chunk-BKFQBKYO.mjs → chunk-O5Y2F33G.mjs} +2 -2
- package/dist/lib/browser/{chunk-RAF2FJST.mjs → chunk-P5AEO35Y.mjs} +18 -11
- package/dist/lib/browser/chunk-P5AEO35Y.mjs.map +7 -0
- package/dist/lib/browser/{chunk-BFUIVUQH.mjs → chunk-QNEQ23BF.mjs} +8 -12
- package/dist/lib/browser/chunk-QNEQ23BF.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +29 -28
- package/dist/lib/browser/cli/index.mjs.map +3 -3
- package/dist/lib/browser/{compute-runtime-WTWLQ67J.mjs → compute-runtime-BUBHYS4Y.mjs} +20 -15
- package/dist/lib/browser/compute-runtime-BUBHYS4Y.mjs.map +7 -0
- package/dist/lib/browser/hooks/index.mjs +1 -1
- package/dist/lib/browser/index.mjs +17 -16
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-Q3MWOR7K.mjs → operation-resolver-IN2FRGOT.mjs} +5 -4
- package/dist/lib/browser/operation-resolver-IN2FRGOT.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-EV3AC62F.mjs → react-surface-246NXXJR.mjs} +10 -9
- package/dist/lib/browser/react-surface-246NXXJR.mjs.map +7 -0
- package/dist/lib/node-esm/{AutomationPanel-B7NAGDFA.mjs → AutomationPanel-RTBY7YFM.mjs} +3 -3
- package/dist/lib/node-esm/{AutomationSettings-M5PMZJ6P.mjs → AutomationSettings-GK4RLSDN.mjs} +10 -9
- package/dist/lib/node-esm/AutomationSettings-GK4RLSDN.mjs.map +7 -0
- package/dist/lib/node-esm/{FunctionsContainer-J4O2ULWR.mjs → FunctionsContainer-AHHZODM5.mjs} +8 -12
- package/dist/lib/node-esm/FunctionsContainer-AHHZODM5.mjs.map +7 -0
- package/dist/lib/node-esm/{FunctionsPanel-SS6GIVNU.mjs → FunctionsPanel-V2DKWYMU.mjs} +2 -2
- package/dist/lib/node-esm/{app-graph-builder-4UCMXHYY.mjs → app-graph-builder-Z2TMQHVX.mjs} +4 -3
- package/dist/lib/node-esm/app-graph-builder-Z2TMQHVX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-KWKWOGS5.mjs → chunk-AENSLAVD.mjs} +8 -12
- package/dist/lib/node-esm/chunk-AENSLAVD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LJAXQ6CX.mjs → chunk-EJPZWAGR.mjs} +14 -6
- package/dist/lib/node-esm/chunk-EJPZWAGR.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7QRUPEHH.mjs → chunk-K5Z4UGIO.mjs} +5 -5
- package/dist/lib/node-esm/{chunk-K7GCM342.mjs → chunk-M3UPTGXF.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-2CKVH7JC.mjs → chunk-OJEFRZEV.mjs} +100 -42
- package/dist/lib/node-esm/chunk-OJEFRZEV.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-HQLVREIX.mjs → chunk-Q7EMIPMW.mjs} +18 -11
- package/dist/lib/node-esm/chunk-Q7EMIPMW.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +29 -28
- package/dist/lib/node-esm/cli/index.mjs.map +3 -3
- package/dist/lib/node-esm/{compute-runtime-ZHROOBLY.mjs → compute-runtime-6UEDBN76.mjs} +20 -15
- package/dist/lib/node-esm/compute-runtime-6UEDBN76.mjs.map +7 -0
- package/dist/lib/node-esm/hooks/index.mjs +1 -1
- package/dist/lib/node-esm/index.mjs +17 -16
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{operation-resolver-R5GA4YNO.mjs → operation-resolver-67CEAKXP.mjs} +5 -4
- package/dist/lib/node-esm/operation-resolver-67CEAKXP.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-S6VZJCEZ.mjs → react-surface-U6762KPI.mjs} +10 -9
- package/dist/lib/node-esm/react-surface-U6762KPI.mjs.map +7 -0
- package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/compute-runtime/compute-runtime.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/cli/plugin.d.ts.map +1 -1
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +3 -4
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
- package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
- package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -1
- package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
- package/dist/types/src/components/TriggerSettings.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +2 -1
- package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
- package/dist/types/src/testing/test-functions.d.ts +202 -2
- package/dist/types/src/testing/test-functions.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +48 -45
- package/src/AutomationPlugin.tsx +7 -6
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +3 -2
- package/src/capabilities/compute-runtime/compute-runtime.ts +19 -12
- package/src/capabilities/operation-resolver/operation-resolver.ts +4 -3
- package/src/capabilities/react-surface/react-surface.tsx +7 -6
- package/src/cli/commands/trigger/create/queue.ts +2 -2
- package/src/cli/commands/trigger/create/subscription.ts +2 -2
- package/src/cli/commands/trigger/create/timer.ts +2 -2
- package/src/cli/commands/trigger/list.ts +1 -1
- package/src/cli/commands/trigger/remove.ts +2 -2
- package/src/cli/commands/trigger/update/queue.ts +3 -3
- package/src/cli/commands/trigger/update/subscription.ts +3 -3
- package/src/cli/commands/trigger/update/timer.ts +3 -3
- package/src/cli/commands/trigger/util.ts +7 -7
- package/src/cli/plugin.ts +3 -2
- package/src/components/AutomationPanel/AutomationPanel.stories.tsx +1 -1
- package/src/components/AutomationPanel/AutomationPanel.tsx +131 -65
- package/src/components/AutomationSettings.tsx +5 -5
- package/src/components/FunctionsContainer.tsx +7 -7
- package/src/components/FunctionsPanel/FunctionsPanel.tsx +11 -10
- package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +4 -5
- package/src/components/TriggerEditor/FunctionInputEditor.tsx +12 -3
- package/src/components/TriggerEditor/TriggerEditor.stories.tsx +3 -3
- package/src/components/TriggerSettings.tsx +5 -4
- package/src/hooks/useComputeRuntimeCallback.ts +1 -1
- package/src/hooks/useTriggerRuntimeControls.ts +22 -8
- package/dist/lib/browser/AutomationSettings-XN2OIYWL.mjs.map +0 -7
- package/dist/lib/browser/FunctionsContainer-6QLC7JP4.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-LAQMEBMH.mjs.map +0 -7
- package/dist/lib/browser/chunk-BFUIVUQH.mjs.map +0 -7
- package/dist/lib/browser/chunk-QW3EM35H.mjs.map +0 -7
- package/dist/lib/browser/chunk-RAF2FJST.mjs.map +0 -7
- package/dist/lib/browser/chunk-YWLEY2FD.mjs.map +0 -7
- package/dist/lib/browser/compute-runtime-WTWLQ67J.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-Q3MWOR7K.mjs.map +0 -7
- package/dist/lib/browser/react-surface-EV3AC62F.mjs.map +0 -7
- package/dist/lib/node-esm/AutomationSettings-M5PMZJ6P.mjs.map +0 -7
- package/dist/lib/node-esm/FunctionsContainer-J4O2ULWR.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-4UCMXHYY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2CKVH7JC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HQLVREIX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KWKWOGS5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LJAXQ6CX.mjs.map +0 -7
- package/dist/lib/node-esm/compute-runtime-ZHROOBLY.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-R5GA4YNO.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-S6VZJCEZ.mjs.map +0 -7
- /package/dist/lib/browser/{AutomationPanel-FAS6ADCW.mjs.map → AutomationPanel-C6MZ22CB.mjs.map} +0 -0
- /package/dist/lib/browser/{FunctionsPanel-ZX4J75UM.mjs.map → FunctionsPanel-RD22LYMR.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-54PANILA.mjs.map → chunk-JFBUK3WR.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-BKFQBKYO.mjs.map → chunk-O5Y2F33G.mjs.map} +0 -0
- /package/dist/lib/node-esm/{AutomationPanel-B7NAGDFA.mjs.map → AutomationPanel-RTBY7YFM.mjs.map} +0 -0
- /package/dist/lib/node-esm/{FunctionsPanel-SS6GIVNU.mjs.map → FunctionsPanel-V2DKWYMU.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-7QRUPEHH.mjs.map → chunk-K5Z4UGIO.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-K7GCM342.mjs.map → chunk-M3UPTGXF.mjs.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
TriggerEditor
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-EJPZWAGR.mjs";
|
|
5
5
|
import {
|
|
6
6
|
meta
|
|
7
7
|
} from "./chunk-5FXNN3MV.mjs";
|
|
@@ -11,21 +11,22 @@ import * as Array from "effect/Array";
|
|
|
11
11
|
import * as EFn from "effect/Function";
|
|
12
12
|
import * as Match from "effect/Match";
|
|
13
13
|
import * as Schema from "effect/Schema";
|
|
14
|
-
import React, { useMemo, useState } from "react";
|
|
14
|
+
import React, { useCallback, useMemo, useState } from "react";
|
|
15
15
|
import { Filter, Obj, Tag } from "@dxos/echo";
|
|
16
16
|
import { Function, Script, Trigger } from "@dxos/functions";
|
|
17
|
+
import { KEY_QUEUE_CURSOR } from "@dxos/functions-runtime";
|
|
17
18
|
import { FunctionsServiceClient } from "@dxos/functions-runtime/edge";
|
|
18
19
|
import { useTypeOptions } from "@dxos/plugin-space";
|
|
19
20
|
import { useClient } from "@dxos/react-client";
|
|
20
|
-
import { useQuery } from "@dxos/react-client/echo";
|
|
21
|
+
import { useObject, useQuery } from "@dxos/react-client/echo";
|
|
21
22
|
import { Clipboard, IconButton, Input, Separator, useTranslation } from "@dxos/react-ui";
|
|
22
|
-
import {
|
|
23
|
+
import { Settings } from "@dxos/react-ui-form";
|
|
23
24
|
import { List } from "@dxos/react-ui-list";
|
|
24
|
-
import {
|
|
25
|
+
import { Pipeline } from "@dxos/types";
|
|
25
26
|
import { ghostHover, mx } from "@dxos/ui-theme";
|
|
26
27
|
import { isNonNullable } from "@dxos/util";
|
|
27
28
|
var grid = "grid grid-cols-[40px_1fr_32px_32px] min-bs-[2.5rem]";
|
|
28
|
-
var AutomationPanel = ({
|
|
29
|
+
var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
|
|
29
30
|
const { t } = useTranslation(meta.id);
|
|
30
31
|
const client = useClient();
|
|
31
32
|
const functionsServiceClient = useMemo(() => FunctionsServiceClient.fromClient(client), [
|
|
@@ -72,7 +73,9 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
|
|
|
72
73
|
};
|
|
73
74
|
const handleSave = (trigger2) => {
|
|
74
75
|
if (selected) {
|
|
75
|
-
|
|
76
|
+
Obj.change(selected, (mutable) => {
|
|
77
|
+
Object.assign(mutable, trigger2);
|
|
78
|
+
});
|
|
76
79
|
} else {
|
|
77
80
|
space.db.add(Trigger.make(trigger2));
|
|
78
81
|
}
|
|
@@ -87,8 +90,16 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
|
|
|
87
90
|
const handleForceRunTrigger = async (trigger2) => {
|
|
88
91
|
await functionsServiceClient.forceRunCronTrigger(space.id, trigger2.id);
|
|
89
92
|
};
|
|
93
|
+
const handleResetCursor = async (trigger2) => {
|
|
94
|
+
Obj.change(trigger2, (t2) => {
|
|
95
|
+
Obj.deleteKeys(t2, KEY_QUEUE_CURSOR);
|
|
96
|
+
});
|
|
97
|
+
await space.db.flush({
|
|
98
|
+
indexes: true
|
|
99
|
+
});
|
|
100
|
+
};
|
|
90
101
|
if (trigger) {
|
|
91
|
-
return /* @__PURE__ */ React.createElement(
|
|
102
|
+
return /* @__PURE__ */ React.createElement(Settings.Item, {
|
|
92
103
|
title: t("trigger editor title")
|
|
93
104
|
}, /* @__PURE__ */ React.createElement(TriggerEditor, {
|
|
94
105
|
db: space.db,
|
|
@@ -100,44 +111,22 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
|
|
|
100
111
|
onCancel: handleCancel
|
|
101
112
|
}));
|
|
102
113
|
}
|
|
103
|
-
return /* @__PURE__ */ React.createElement(
|
|
104
|
-
className: mx(controlItemClasses, classNames)
|
|
105
|
-
}, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
|
|
114
|
+
return /* @__PURE__ */ React.createElement(Settings.Container, null, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
|
|
106
115
|
items: filteredTriggers,
|
|
107
116
|
isItem: Schema.is(Trigger.Trigger),
|
|
108
117
|
getId: (field) => field.id
|
|
109
118
|
}, ({ items: filteredTriggers2 }) => /* @__PURE__ */ React.createElement("div", {
|
|
110
119
|
role: "list",
|
|
111
120
|
className: "flex flex-col is-full"
|
|
112
|
-
}, filteredTriggers2?.map((trigger2) => {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
t2.enabled = checked;
|
|
122
|
-
})
|
|
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, {
|
|
121
|
+
}, filteredTriggers2?.map((trigger2) => /* @__PURE__ */ React.createElement(TriggerListItem, {
|
|
122
|
+
key: trigger2.id,
|
|
123
|
+
trigger: trigger2,
|
|
124
|
+
functions,
|
|
125
|
+
onSelect: handleSelect,
|
|
126
|
+
onDelete: handleDelete,
|
|
127
|
+
onResetCursor: handleResetCursor,
|
|
128
|
+
onForceRun: handleForceRunTrigger
|
|
129
|
+
})))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
|
|
141
130
|
classNames: "mlb-4"
|
|
142
131
|
}), /* @__PURE__ */ React.createElement(IconButton, {
|
|
143
132
|
icon: "ph--plus--regular",
|
|
@@ -145,6 +134,75 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
|
|
|
145
134
|
onClick: handleAdd
|
|
146
135
|
}));
|
|
147
136
|
};
|
|
137
|
+
var TriggerListItem = ({ trigger, functions, onSelect, onDelete, onResetCursor, onForceRun }) => {
|
|
138
|
+
const client = useClient();
|
|
139
|
+
const copyAction = getCopyAction(client, trigger);
|
|
140
|
+
const { t } = useTranslation(meta.id);
|
|
141
|
+
const cursor = Obj.getKeys(trigger, KEY_QUEUE_CURSOR).at(0)?.id;
|
|
142
|
+
const [snapshot, updateTrigger] = useObject(trigger);
|
|
143
|
+
const enabled = snapshot.enabled ?? false;
|
|
144
|
+
const onEnabledChange = (checked) => {
|
|
145
|
+
updateTrigger((trigger2) => {
|
|
146
|
+
trigger2.enabled = checked;
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
const handleSelect = useCallback(() => {
|
|
150
|
+
onSelect?.(trigger);
|
|
151
|
+
}, [
|
|
152
|
+
onSelect,
|
|
153
|
+
trigger
|
|
154
|
+
]);
|
|
155
|
+
const handleDelete = useCallback(() => {
|
|
156
|
+
onDelete?.(trigger);
|
|
157
|
+
}, [
|
|
158
|
+
onDelete,
|
|
159
|
+
trigger
|
|
160
|
+
]);
|
|
161
|
+
const handleResetCursor = useCallback(() => {
|
|
162
|
+
onResetCursor?.(trigger);
|
|
163
|
+
}, [
|
|
164
|
+
onResetCursor,
|
|
165
|
+
trigger
|
|
166
|
+
]);
|
|
167
|
+
const handleForceRun = useCallback(() => {
|
|
168
|
+
onForceRun?.(trigger);
|
|
169
|
+
}, [
|
|
170
|
+
onForceRun,
|
|
171
|
+
trigger
|
|
172
|
+
]);
|
|
173
|
+
return /* @__PURE__ */ React.createElement(List.Item, {
|
|
174
|
+
key: trigger.id,
|
|
175
|
+
item: snapshot,
|
|
176
|
+
classNames: mx(grid, ghostHover, "items-center", "pli-2")
|
|
177
|
+
}, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
|
|
178
|
+
checked: enabled,
|
|
179
|
+
onCheckedChange: onEnabledChange
|
|
180
|
+
})), /* @__PURE__ */ React.createElement("div", {
|
|
181
|
+
className: "flex"
|
|
182
|
+
}, /* @__PURE__ */ React.createElement(List.ItemTitle, {
|
|
183
|
+
classNames: "pli-1 cursor-pointer is-0 shrink truncate",
|
|
184
|
+
onClick: handleSelect
|
|
185
|
+
}, getFunctionName(functions, trigger) ?? "\u2205", cursor && /* @__PURE__ */ React.createElement("div", {
|
|
186
|
+
className: "text-xs text-description truncate ml-4"
|
|
187
|
+
}, "Position: ", cursor)), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
|
|
188
|
+
label: t(copyAction.translationKey),
|
|
189
|
+
value: copyAction.contentProvider()
|
|
190
|
+
})), trigger.spec?.kind === "timer" && onForceRun && /* @__PURE__ */ React.createElement(List.ItemButton, {
|
|
191
|
+
autoHide: false,
|
|
192
|
+
disabled: !enabled || trigger.spec?.kind !== "timer",
|
|
193
|
+
icon: "ph--play--regular",
|
|
194
|
+
label: "Force run",
|
|
195
|
+
onClick: handleForceRun
|
|
196
|
+
}), trigger.spec?.kind === "queue" && onResetCursor && /* @__PURE__ */ React.createElement(List.ItemButton, {
|
|
197
|
+
autoHide: false,
|
|
198
|
+
disabled: !cursor,
|
|
199
|
+
icon: "ph--arrow-clockwise--regular",
|
|
200
|
+
label: "Reset cursor",
|
|
201
|
+
onClick: handleResetCursor
|
|
202
|
+
}), onDelete && /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
|
|
203
|
+
onClick: handleDelete
|
|
204
|
+
}));
|
|
205
|
+
};
|
|
148
206
|
var getCopyAction = (client, trigger) => {
|
|
149
207
|
if (trigger?.spec?.kind === "email") {
|
|
150
208
|
return {
|
|
@@ -189,7 +247,7 @@ var projectMatch = (project) => {
|
|
|
189
247
|
return viewQueries.some((query) => JSON.stringify(spec.query) === query);
|
|
190
248
|
};
|
|
191
249
|
};
|
|
192
|
-
var triggerMatch = Match.type().pipe(Match.withReturnType(), Match.when((obj) => Obj.instanceOf(Script.Script, obj), (obj) => scriptMatch(obj)), Match.when((obj) => Obj.instanceOf(
|
|
250
|
+
var triggerMatch = Match.type().pipe(Match.withReturnType(), Match.when((obj) => Obj.instanceOf(Script.Script, obj), (obj) => scriptMatch(obj)), Match.when((obj) => Obj.instanceOf(Pipeline.Pipeline, obj), (obj) => projectMatch(obj)), Match.orElse((_obj) => () => true));
|
|
193
251
|
|
|
194
252
|
// src/components/AutomationPanel/index.ts
|
|
195
253
|
var AutomationPanel_default = AutomationPanel;
|
|
@@ -198,4 +256,4 @@ export {
|
|
|
198
256
|
AutomationPanel,
|
|
199
257
|
AutomationPanel_default
|
|
200
258
|
};
|
|
201
|
-
//# sourceMappingURL=chunk-
|
|
259
|
+
//# sourceMappingURL=chunk-OJEFRZEV.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, { useCallback, useMemo, useState } from 'react';\n\nimport { Filter, Obj, Tag } from '@dxos/echo';\nimport { Function, Script, Trigger } from '@dxos/functions';\nimport { KEY_QUEUE_CURSOR } from '@dxos/functions-runtime';\nimport { FunctionsServiceClient } from '@dxos/functions-runtime/edge';\nimport { useTypeOptions } from '@dxos/plugin-space';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { type Space, useObject, useQuery } from '@dxos/react-client/echo';\nimport { Clipboard, IconButton, Input, Separator, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { Pipeline } from '@dxos/types';\nimport { ghostHover, mx } from '@dxos/ui-theme';\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 = {\n space: Space;\n object?: Obj.Unknown;\n initialTrigger?: Trigger.Trigger;\n onDone?: () => void;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ 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.db, Filter.type(Function.Function));\n const triggers = useQuery(space.db, Filter.type(Trigger.Trigger));\n const filteredTriggers = useMemo(() => {\n return object ? triggers.filter(triggerMatch(object)) : triggers;\n }, [object, triggers]);\n const tags = useQuery(space.db, 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 Obj.change(selected, (mutable) => {\n Object.assign(mutable, trigger);\n });\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 const handleResetCursor = async (trigger: Trigger.Trigger) => {\n Obj.change(trigger, (t) => {\n Obj.deleteKeys(t, KEY_QUEUE_CURSOR);\n });\n await space.db.flush({ indexes: true });\n };\n\n if (trigger) {\n return (\n <Settings.Item title={t('trigger editor title')}>\n <TriggerEditor\n db={space.db}\n trigger={trigger}\n readonlySpec={Boolean(object)}\n tags={tags}\n types={types}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </Settings.Item>\n );\n }\n\n return (\n <Settings.Container>\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 <TriggerListItem\n key={trigger.id}\n trigger={trigger}\n functions={functions}\n onSelect={handleSelect}\n onDelete={handleDelete}\n onResetCursor={handleResetCursor}\n onForceRun={handleForceRunTrigger}\n />\n ))}\n </div>\n )}\n </List.Root>\n )}\n\n {filteredTriggers.length > 0 && <Separator classNames='mlb-4' />}\n <IconButton icon='ph--plus--regular' label={t('new trigger label')} onClick={handleAdd} />\n </Settings.Container>\n );\n};\n\nconst TriggerListItem = ({\n trigger,\n functions,\n onSelect,\n onDelete,\n onResetCursor,\n onForceRun,\n}: {\n trigger: Trigger.Trigger;\n functions: Function.Function[];\n onSelect?: (trigger: Trigger.Trigger) => void;\n onDelete?: (trigger: Trigger.Trigger) => void;\n onResetCursor?: (trigger: Trigger.Trigger) => void;\n onForceRun?: (trigger: Trigger.Trigger) => void;\n}) => {\n const client = useClient();\n const copyAction = getCopyAction(client, trigger);\n const { t } = useTranslation(meta.id);\n const cursor = Obj.getKeys(trigger, KEY_QUEUE_CURSOR).at(0)?.id;\n const [snapshot, updateTrigger] = useObject(trigger);\n\n const enabled = snapshot.enabled ?? false;\n const onEnabledChange = (checked: boolean) => {\n updateTrigger((trigger) => {\n trigger.enabled = checked;\n });\n };\n\n const handleSelect = useCallback(() => {\n onSelect?.(trigger);\n }, [onSelect, trigger]);\n\n const handleDelete = useCallback(() => {\n onDelete?.(trigger);\n }, [onDelete, trigger]);\n\n const handleResetCursor = useCallback(() => {\n onResetCursor?.(trigger);\n }, [onResetCursor, trigger]);\n\n const handleForceRun = useCallback(() => {\n onForceRun?.(trigger);\n }, [onForceRun, trigger]);\n\n return (\n <List.Item<Obj.Snapshot<Trigger.Trigger>>\n key={trigger.id}\n item={snapshot}\n classNames={mx(grid, ghostHover, 'items-center', 'pli-2')}\n >\n <Input.Root>\n <Input.Switch checked={enabled} onCheckedChange={onEnabledChange} />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle classNames='pli-1 cursor-pointer is-0 shrink truncate' onClick={handleSelect}>\n {getFunctionName(functions, trigger) ?? '∅'}\n {cursor && <div className='text-xs text-description truncate ml-4'>Position: {cursor}</div>}\n </List.ItemTitle>\n\n {copyAction && (\n <Clipboard.IconButton label={t(copyAction.translationKey)} value={copyAction.contentProvider()} />\n )}\n </div>\n\n {trigger.spec?.kind === 'timer' && onForceRun && (\n <List.ItemButton\n autoHide={false}\n disabled={!enabled || trigger.spec?.kind !== 'timer'}\n icon='ph--play--regular'\n label='Force run'\n onClick={handleForceRun}\n />\n )}\n {trigger.spec?.kind === 'queue' && onResetCursor && (\n <List.ItemButton\n autoHide={false}\n disabled={!cursor}\n icon='ph--arrow-clockwise--regular'\n label='Reset cursor'\n onClick={handleResetCursor}\n />\n )}\n\n {onDelete && <List.ItemDeleteButton onClick={handleDelete} />}\n </List.Item>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: Trigger.Trigger | undefined) => {\n if (trigger?.spec?.kind === 'email') {\n return {\n translationKey: 'trigger copy email' as const,\n contentProvider: () => `${Obj.getDatabase(trigger)!.spaceId}@dxos.network`,\n };\n }\n\n if (trigger?.spec?.kind === 'webhook') {\n return {\n translationKey: 'trigger copy url' as const,\n contentProvider: () => getWebhookUrl(client, trigger!),\n };\n }\n\n return undefined;\n};\n\nconst getWebhookUrl = (client: Client, trigger: Trigger.Trigger) => {\n const spaceId = Obj.getDatabase(trigger)!.spaceId;\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: Pipeline.Pipeline) => {\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.Unknown>().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(Pipeline.Pipeline, 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", "useCallback", "useMemo", "useState", "Filter", "Obj", "Tag", "Function", "Script", "Trigger", "KEY_QUEUE_CURSOR", "FunctionsServiceClient", "useTypeOptions", "useClient", "useObject", "useQuery", "Clipboard", "IconButton", "Input", "Separator", "useTranslation", "Settings", "List", "Pipeline", "ghostHover", "mx", "isNonNullable", "grid", "AutomationPanel", "space", "object", "initialTrigger", "onDone", "t", "useTranslation", "meta", "id", "client", "useClient", "functionsServiceClient", "useMemo", "FunctionsServiceClient", "fromClient", "functions", "useQuery", "db", "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", "remove", "handleSave", "Obj", "change", "mutable", "Object", "assign", "add", "handleCancel", "handleForceRunTrigger", "forceRunCronTrigger", "handleResetCursor", "deleteKeys", "KEY_QUEUE_CURSOR", "flush", "indexes", "Settings", "Item", "title", "TriggerEditor", "readonlySpec", "Boolean", "onSave", "onCancel", "Container", "length", "List", "Root", "items", "isItem", "is", "getId", "field", "div", "role", "className", "map", "TriggerListItem", "key", "onSelect", "onDelete", "onResetCursor", "onForceRun", "Separator", "classNames", "IconButton", "icon", "label", "onClick", "copyAction", "getCopyAction", "cursor", "getKeys", "at", "snapshot", "updateTrigger", "useObject", "enabled", "onEnabledChange", "checked", "useCallback", "handleForceRun", "item", "mx", "ghostHover", "Input", "Switch", "onCheckedChange", "ItemTitle", "getFunctionName", "Clipboard", "translationKey", "value", "contentProvider", "spec", "ItemButton", "autoHide", "disabled", "ItemDeleteButton", "getDatabase", "spaceId", "getWebhookUrl", "edgeUrl", "URL", "config", "values", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "dxn", "slice", "functionObject", "find", "fn", "target", "name", "scriptMatch", "script", "instanceOf", "source", "projectMatch", "project", "viewQueries", "pipe", "columns", "column", "view", "isNonNullable", "getSnapshot", "query", "ast", "JSON", "stringify", "some", "withReturnType", "when", "obj", "Script", "Pipeline", "orElse", "_obj", "AutomationPanel"]
|
|
7
|
+
}
|
|
@@ -8,7 +8,7 @@ import * as Cause from "effect/Cause";
|
|
|
8
8
|
import * as Effect from "effect/Effect";
|
|
9
9
|
import * as Exit from "effect/Exit";
|
|
10
10
|
import { useCallback } from "react";
|
|
11
|
-
import { useCapability } from "@dxos/app-framework/
|
|
11
|
+
import { useCapability } from "@dxos/app-framework/ui";
|
|
12
12
|
import { FunctionInvocationService, TracingService } from "@dxos/functions";
|
|
13
13
|
import { log } from "@dxos/log";
|
|
14
14
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-automation/src/hooks/useComputeRuntimeCallback.ts";
|
|
@@ -52,28 +52,35 @@ var invokeFunctionWithTracing = (functionDef, inputData) => Effect.gen(function*
|
|
|
52
52
|
});
|
|
53
53
|
|
|
54
54
|
// src/hooks/useTriggerRuntimeControls.ts
|
|
55
|
+
import { Atom, useAtomValue } from "@effect-atom/atom-react";
|
|
55
56
|
import * as Effect2 from "effect/Effect";
|
|
57
|
+
import { useEffect, useState } from "react";
|
|
56
58
|
import { Filter } from "@dxos/echo";
|
|
57
59
|
import { Trigger } from "@dxos/functions";
|
|
58
60
|
import { TriggerDispatcher } from "@dxos/functions-runtime";
|
|
59
61
|
import { useQuery } from "@dxos/react-client/echo";
|
|
60
|
-
import { useAsyncState } from "@dxos/react-ui";
|
|
61
62
|
var useTriggerRuntimeControls = (db) => {
|
|
62
63
|
const triggers = useQuery(db, Filter.type(Trigger.Trigger));
|
|
63
|
-
const [
|
|
64
|
+
const [dispatcher, setDispatcher] = useState(void 0);
|
|
65
|
+
const init = useComputeRuntimeCallback(db?.spaceId, Effect2.fnUntraced(function* () {
|
|
66
|
+
const dispatcher2 = yield* TriggerDispatcher;
|
|
67
|
+
setDispatcher(dispatcher2);
|
|
68
|
+
}));
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
void init();
|
|
71
|
+
}, []);
|
|
72
|
+
const state = useAtomValue(dispatcher?.state ?? Atom.make(void 0));
|
|
64
73
|
const start = useComputeRuntimeCallback(db?.spaceId, Effect2.fnUntraced(function* () {
|
|
65
|
-
const
|
|
66
|
-
yield*
|
|
67
|
-
setIsRunningState(true);
|
|
74
|
+
const dispatcher2 = yield* TriggerDispatcher;
|
|
75
|
+
yield* dispatcher2.start();
|
|
68
76
|
}));
|
|
69
77
|
const stop = useComputeRuntimeCallback(db?.spaceId, Effect2.fnUntraced(function* () {
|
|
70
|
-
const
|
|
71
|
-
yield*
|
|
72
|
-
setIsRunningState(false);
|
|
78
|
+
const dispatcher2 = yield* TriggerDispatcher;
|
|
79
|
+
yield* dispatcher2.stop();
|
|
73
80
|
}));
|
|
74
81
|
return {
|
|
75
82
|
triggers,
|
|
76
|
-
|
|
83
|
+
state,
|
|
77
84
|
start: () => void start(),
|
|
78
85
|
stop: () => void stop()
|
|
79
86
|
};
|
|
@@ -84,4 +91,4 @@ export {
|
|
|
84
91
|
invokeFunctionWithTracing,
|
|
85
92
|
useTriggerRuntimeControls
|
|
86
93
|
};
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
94
|
+
//# sourceMappingURL=chunk-Q7EMIPMW.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/useComputeRuntimeCallback.ts", "../../../src/hooks/useTriggerRuntimeControls.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Cause from 'effect/Cause';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport { type DependencyList, useCallback } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { type Key } from '@dxos/echo';\nimport { type FunctionDefinition, FunctionInvocationService, TracingService } from '@dxos/functions';\nimport { log } from '@dxos/log';\n\nimport { AutomationCapabilities } from '../types';\n\n/**\n * Create an effectful function that has access to compute services\n */\n// TODO(burdon): Factor out (figure out cross-plugin capabilities dependencies).\nexport const useComputeRuntimeCallback = <T>(\n id: Key.SpaceId | undefined,\n fn: () => Effect.Effect<T, any, AutomationCapabilities.ComputeServices>,\n deps?: DependencyList,\n): (() => Promise<T>) => {\n const computeRuntime = useCapability(AutomationCapabilities.ComputeRuntime);\n const runtime = id !== undefined ? computeRuntime.getRuntime(id) : undefined;\n\n return useCallback(() => {\n if (!runtime) {\n throw new TypeError('Space not provided to useComputeRuntimeCallback');\n }\n\n return runtime.runPromise(fn());\n }, [runtime, ...(deps ?? [])]);\n};\n\n// TODO(wittjosiah): Function invoking should automatically be traced (DX-647).\nexport const invokeFunctionWithTracing = <I, O>(functionDef: FunctionDefinition<I, O>, inputData: I) =>\n Effect.gen(function* () {\n const tracer = yield* TracingService;\n const trace = yield* tracer.traceInvocationStart({\n target: undefined,\n payload: {\n data: {},\n },\n });\n\n // Invoke the function.\n const result = yield* FunctionInvocationService.invokeFunction(functionDef, inputData).pipe(\n Effect.provide(trace.invocationTraceQueue ? TracingService.layerInvocation(trace) : TracingService.layerNoop),\n Effect.exit,\n );\n\n if (Exit.isFailure(result)) {\n const error = Cause.prettyErrors(result.cause)[0];\n log.error(error.message, error.cause ?? error.stack);\n }\n\n yield* tracer.traceInvocationEnd({\n trace,\n // TODO(dmaretskyi): Might miss errors.\n exception: Exit.isFailure(result) ? Cause.prettyErrors(result.cause)[0] : undefined,\n });\n\n return result;\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, useAtomValue } from '@effect-atom/atom-react';\nimport type * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport { useEffect, useState } from 'react';\n\nimport { type Database, Filter } from '@dxos/echo';\nimport { Trigger } from '@dxos/functions';\nimport { TriggerDispatcher, type TriggerDispatcherState } from '@dxos/functions-runtime';\nimport { useQuery } from '@dxos/react-client/echo';\n\nimport { useComputeRuntimeCallback } from './useComputeRuntimeCallback';\n\ninterface TriggerRuntimeControls {\n triggers: Trigger.Trigger[];\n\n state: TriggerDispatcherState | undefined;\n\n start: () => void;\n stop: () => void;\n}\n\nexport const useTriggerRuntimeControls = (db: Database.Database | undefined): TriggerRuntimeControls => {\n const triggers = useQuery(db, Filter.type(Trigger.Trigger));\n\n const [dispatcher, setDispatcher] = useState<Context.Tag.Service<TriggerDispatcher> | undefined>(undefined);\n\n const init = useComputeRuntimeCallback(\n db?.spaceId,\n Effect.fnUntraced(function* () {\n const dispatcher = yield* TriggerDispatcher;\n setDispatcher(dispatcher);\n }),\n );\n\n useEffect(() => {\n void init();\n }, []);\n\n const state = useAtomValue(dispatcher?.state ?? Atom.make(undefined));\n\n const start = useComputeRuntimeCallback(\n db?.spaceId,\n Effect.fnUntraced(function* () {\n const dispatcher = yield* TriggerDispatcher;\n yield* dispatcher.start();\n }),\n );\n\n const stop = useComputeRuntimeCallback(\n db?.spaceId,\n Effect.fnUntraced(function* () {\n const dispatcher = yield* TriggerDispatcher;\n yield* dispatcher.stop();\n }),\n );\n\n return {\n triggers,\n state,\n start: () => void start(),\n stop: () => void stop(),\n };\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,UAAU;AACtB,SAA8BC,mBAAmB;AAEjD,SAASC,qBAAqB;AAE9B,SAAkCC,2BAA2BC,sBAAsB;AACnF,SAASC,WAAW;;AAQb,IAAMC,4BAA4B,CACvCC,IACAC,IACAC,SAAAA;AAEA,QAAMC,iBAAiBC,cAAcC,uBAAuBC,cAAc;AAC1E,QAAMC,UAAUP,OAAOQ,SAAYL,eAAeM,WAAWT,EAAAA,IAAMQ;AAEnE,SAAOE,YAAY,MAAA;AACjB,QAAI,CAACH,SAAS;AACZ,YAAM,IAAII,UAAU,iDAAA;IACtB;AAEA,WAAOJ,QAAQK,WAAWX,GAAAA,CAAAA;EAC5B,GAAG;IAACM;OAAaL,QAAQ,CAAA;GAAI;AAC/B;AAGO,IAAMW,4BAA4B,CAAOC,aAAuCC,cAC9EC,WAAI,aAAA;AACT,QAAMC,SAAS,OAAOC;AACtB,QAAMC,QAAQ,OAAOF,OAAOG,qBAAqB;IAC/CC,QAAQb;IACRc,SAAS;MACPC,MAAM,CAAC;IACT;EACF,CAAA;AAGA,QAAMC,SAAS,OAAOC,0BAA0BC,eAAeZ,aAAaC,SAAAA,EAAWY,KAC9EC,eAAQT,MAAMU,uBAAuBX,eAAeY,gBAAgBX,KAAAA,IAASD,eAAea,SAAS,GACrGC,WAAI;AAGb,MAASC,eAAUT,MAAAA,GAAS;AAC1B,UAAMU,QAAcC,mBAAaX,OAAOY,KAAK,EAAE,CAAA;AAC/CC,QAAIH,MAAMA,MAAMI,SAASJ,MAAME,SAASF,MAAMK,OAAK;;;;;;EACrD;AAEA,SAAOtB,OAAOuB,mBAAmB;IAC/BrB;;IAEAsB,WAAgBR,eAAUT,MAAAA,IAAgBW,mBAAaX,OAAOY,KAAK,EAAE,CAAA,IAAK5B;EAC5E,CAAA;AAEA,SAAOgB;AACT,CAAA;;;AC9DF,SAASkB,MAAMC,oBAAoB;AAEnC,YAAYC,aAAY;AACxB,SAASC,WAAWC,gBAAgB;AAEpC,SAAwBC,cAAc;AACtC,SAASC,eAAe;AACxB,SAASC,yBAAsD;AAC/D,SAASC,gBAAgB;AAalB,IAAMC,4BAA4B,CAACC,OAAAA;AACxC,QAAMC,WAAWC,SAASF,IAAIG,OAAOC,KAAKC,QAAQA,OAAO,CAAA;AAEzD,QAAM,CAACC,YAAYC,aAAAA,IAAiBC,SAA6DC,MAAAA;AAEjG,QAAMC,OAAOC,0BACXX,IAAIY,SACGC,mBAAW,aAAA;AAChB,UAAMP,cAAa,OAAOQ;AAC1BP,kBAAcD,WAAAA;EAChB,CAAA,CAAA;AAGFS,YAAU,MAAA;AACR,SAAKL,KAAAA;EACP,GAAG,CAAA,CAAE;AAEL,QAAMM,QAAQC,aAAaX,YAAYU,SAASE,KAAKC,KAAKV,MAAAA,CAAAA;AAE1D,QAAMW,QAAQT,0BACZX,IAAIY,SACGC,mBAAW,aAAA;AAChB,UAAMP,cAAa,OAAOQ;AAC1B,WAAOR,YAAWc,MAAK;EACzB,CAAA,CAAA;AAGF,QAAMC,OAAOV,0BACXX,IAAIY,SACGC,mBAAW,aAAA;AAChB,UAAMP,cAAa,OAAOQ;AAC1B,WAAOR,YAAWe,KAAI;EACxB,CAAA,CAAA;AAGF,SAAO;IACLpB;IACAe;IACAI,OAAO,MAAM,KAAKA,MAAAA;IAClBC,MAAM,MAAM,KAAKA,KAAAA;EACnB;AACF;",
|
|
6
|
+
"names": ["Cause", "Effect", "Exit", "useCallback", "useCapability", "FunctionInvocationService", "TracingService", "log", "useComputeRuntimeCallback", "id", "fn", "deps", "computeRuntime", "useCapability", "AutomationCapabilities", "ComputeRuntime", "runtime", "undefined", "getRuntime", "useCallback", "TypeError", "runPromise", "invokeFunctionWithTracing", "functionDef", "inputData", "gen", "tracer", "TracingService", "trace", "traceInvocationStart", "target", "payload", "data", "result", "FunctionInvocationService", "invokeFunction", "pipe", "provide", "invocationTraceQueue", "layerInvocation", "layerNoop", "exit", "isFailure", "error", "prettyErrors", "cause", "log", "message", "stack", "traceInvocationEnd", "exception", "Atom", "useAtomValue", "Effect", "useEffect", "useState", "Filter", "Trigger", "TriggerDispatcher", "useQuery", "useTriggerRuntimeControls", "db", "triggers", "useQuery", "Filter", "type", "Trigger", "dispatcher", "setDispatcher", "useState", "undefined", "init", "useComputeRuntimeCallback", "spaceId", "fnUntraced", "TriggerDispatcher", "useEffect", "state", "useAtomValue", "Atom", "make", "start", "stop"]
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
ComputeRuntime
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-M3UPTGXF.mjs";
|
|
5
5
|
import {
|
|
6
6
|
AutomationEvents
|
|
7
7
|
} from "../chunk-RX52VKI2.mjs";
|
|
@@ -10,7 +10,8 @@ import {
|
|
|
10
10
|
} from "../chunk-5FXNN3MV.mjs";
|
|
11
11
|
|
|
12
12
|
// src/cli/plugin.ts
|
|
13
|
-
import {
|
|
13
|
+
import { Plugin } from "@dxos/app-framework";
|
|
14
|
+
import { AppPlugin } from "@dxos/app-toolkit";
|
|
14
15
|
import { ClientEvents } from "@dxos/plugin-client/types";
|
|
15
16
|
|
|
16
17
|
// src/cli/commands/trigger/index.ts
|
|
@@ -74,7 +75,7 @@ var getTriggerRemoteStatus = (trigger2, remoteCronIds) => {
|
|
|
74
75
|
return remoteCronIds.includes(trigger2.id) ? "available" : "not available";
|
|
75
76
|
};
|
|
76
77
|
var printTrigger = Effect.fn(function* (trigger2, remoteStatus) {
|
|
77
|
-
const fn6 = trigger2.function && (yield* Database.
|
|
78
|
+
const fn6 = trigger2.function && (yield* Database.load(trigger2.function));
|
|
78
79
|
return FormBuilder.make({
|
|
79
80
|
title: trigger2.id
|
|
80
81
|
}).pipe(FormBuilder.set("status", trigger2.enabled ? "enabled" : "disabled", trigger2.enabled ? Ansi.green : Ansi.blackBright), FormBuilder.option("kind", Option.fromNullable(trigger2.spec?.kind)), FormBuilder.option("remote", Option.fromNullable(remoteStatus), Match.type().pipe(Match.withReturnType(), Match.when("available", () => Ansi.green), Match.when("not available", () => Ansi.yellow), Match.when("n/a", () => Ansi.blackBright), Match.exhaustive)), FormBuilder.when(fn6, FormBuilder.nest("function", FormBuilder.make().pipe(FormBuilder.set("key", fn6.key), FormBuilder.set("dxn", fn6.dxn?.toString())))), FormBuilder.nestedOption("spec", Option.fromNullable(trigger2.spec).pipe(Option.map(printSpec))), FormBuilder.build);
|
|
@@ -203,7 +204,7 @@ var promptForSchemaInput = Effect.fn(function* (schema, defaults) {
|
|
|
203
204
|
inputObj[key] = templateStr === "" && defaultValue !== void 0 ? defaultValue : templateStr;
|
|
204
205
|
} else {
|
|
205
206
|
const annotation = Annotation.ReferenceAnnotation.getFromAst(propType).pipe(Option.getOrThrow);
|
|
206
|
-
const objects = yield* Database.
|
|
207
|
+
const objects = yield* Database.runQuery(Filter.typename(annotation.typename));
|
|
207
208
|
if (objects.length === 0) {
|
|
208
209
|
inputObj[key] = void 0;
|
|
209
210
|
} else {
|
|
@@ -229,7 +230,7 @@ var promptForSchemaInput = Effect.fn(function* (schema, defaults) {
|
|
|
229
230
|
return inputObj;
|
|
230
231
|
});
|
|
231
232
|
var selectFunction = Effect.fn(function* () {
|
|
232
|
-
const functions = yield* Database.
|
|
233
|
+
const functions = yield* Database.runQuery(Filter.type(Function.Function));
|
|
233
234
|
if (functions.length === 0) {
|
|
234
235
|
return yield* Effect.fail(new Error("No functions available"));
|
|
235
236
|
}
|
|
@@ -244,13 +245,13 @@ var selectFunction = Effect.fn(function* () {
|
|
|
244
245
|
return String(selected);
|
|
245
246
|
});
|
|
246
247
|
var selectTrigger = Effect.fn(function* (kind) {
|
|
247
|
-
const triggers = yield* Database.
|
|
248
|
+
const triggers = yield* Database.runQuery(Filter.type(Trigger.Trigger));
|
|
248
249
|
const filteredTriggers = kind ? triggers.filter((trigger2) => trigger2.spec?.kind === kind) : triggers;
|
|
249
250
|
if (filteredTriggers.length === 0) {
|
|
250
251
|
return yield* Effect.fail(new Error(kind ? `No ${kind} triggers available` : "No triggers available"));
|
|
251
252
|
}
|
|
252
253
|
const choices = yield* Effect.all(filteredTriggers.map((trigger2) => Effect.gen(function* () {
|
|
253
|
-
const fn6 = trigger2.function ? yield* Database.
|
|
254
|
+
const fn6 = trigger2.function ? yield* Database.load(trigger2.function) : void 0;
|
|
254
255
|
const functionName = fn6 && Obj.instanceOf(Function.Function, fn6) ? fn6.name ?? fn6.key ?? fn6.id : void 0;
|
|
255
256
|
const title = functionName ?? trigger2.id;
|
|
256
257
|
const description = `${trigger2.enabled ? "enabled" : "disabled"} - ${trigger2.spec?.kind ?? "unknown"}`;
|
|
@@ -267,7 +268,7 @@ var selectTrigger = Effect.fn(function* (kind) {
|
|
|
267
268
|
return String(selected);
|
|
268
269
|
});
|
|
269
270
|
var selectQueue = Effect.fn(function* () {
|
|
270
|
-
const schemas = yield* Database.
|
|
271
|
+
const schemas = yield* Database.runSchemaQuery({
|
|
271
272
|
location: [
|
|
272
273
|
"database",
|
|
273
274
|
"runtime"
|
|
@@ -284,7 +285,7 @@ var selectQueue = Effect.fn(function* () {
|
|
|
284
285
|
for (const schema of queueSchemas) {
|
|
285
286
|
yield* Effect.gen(function* () {
|
|
286
287
|
const typename = Type.getTypename(schema);
|
|
287
|
-
const objects = yield* Database.
|
|
288
|
+
const objects = yield* Database.runQuery(Filter.type(typename));
|
|
288
289
|
for (const obj of objects) {
|
|
289
290
|
const queueRef = obj.queue;
|
|
290
291
|
if (!queueRef) {
|
|
@@ -327,7 +328,7 @@ var queue = Command.make("queue", {
|
|
|
327
328
|
onNone: () => selectFunction(),
|
|
328
329
|
onSome: (id) => Effect2.succeed(id)
|
|
329
330
|
});
|
|
330
|
-
const functions = yield* Database2.
|
|
331
|
+
const functions = yield* Database2.runQuery(Filter2.type(Function2.Function));
|
|
331
332
|
const fn6 = functions.find((fn7) => fn7.id === functionId);
|
|
332
333
|
if (!fn6) {
|
|
333
334
|
return yield* Effect2.fail(new Error(`Function not found: ${functionId}`));
|
|
@@ -356,7 +357,7 @@ var queue = Command.make("queue", {
|
|
|
356
357
|
},
|
|
357
358
|
input
|
|
358
359
|
});
|
|
359
|
-
yield* Database2.
|
|
360
|
+
yield* Database2.add(trigger2);
|
|
360
361
|
if (json) {
|
|
361
362
|
yield* Console2.log(JSON.stringify(trigger2, null, 2));
|
|
362
363
|
} else {
|
|
@@ -394,7 +395,7 @@ var subscription = Command2.make("subscription", {
|
|
|
394
395
|
onNone: () => selectFunction(),
|
|
395
396
|
onSome: (id) => Effect3.succeed(id)
|
|
396
397
|
});
|
|
397
|
-
const functions = yield* Database3.
|
|
398
|
+
const functions = yield* Database3.runQuery(Filter3.type(Function3.Function));
|
|
398
399
|
const fn6 = functions.find((fn7) => fn7.id === functionId);
|
|
399
400
|
if (!fn6) {
|
|
400
401
|
return yield* Effect3.fail(new Error(`Function not found: ${functionId}`));
|
|
@@ -452,7 +453,7 @@ var subscription = Command2.make("subscription", {
|
|
|
452
453
|
},
|
|
453
454
|
input
|
|
454
455
|
});
|
|
455
|
-
yield* Database3.
|
|
456
|
+
yield* Database3.add(trigger2);
|
|
456
457
|
if (json) {
|
|
457
458
|
yield* Console3.log(JSON.stringify(trigger2, null, 2));
|
|
458
459
|
} else {
|
|
@@ -488,7 +489,7 @@ var timer = Command3.make("timer", {
|
|
|
488
489
|
onNone: () => selectFunction(),
|
|
489
490
|
onSome: (id) => Effect4.succeed(id)
|
|
490
491
|
});
|
|
491
|
-
const functions = yield* Database4.
|
|
492
|
+
const functions = yield* Database4.runQuery(Filter4.type(Function4.Function));
|
|
492
493
|
const fn6 = functions.find((fn7) => fn7.id === functionId);
|
|
493
494
|
if (!fn6) {
|
|
494
495
|
return yield* Effect4.fail(new Error(`Function not found: ${functionId}`));
|
|
@@ -519,7 +520,7 @@ var timer = Command3.make("timer", {
|
|
|
519
520
|
},
|
|
520
521
|
input
|
|
521
522
|
});
|
|
522
|
-
yield* Database4.
|
|
523
|
+
yield* Database4.add(trigger2);
|
|
523
524
|
if (json) {
|
|
524
525
|
yield* Console4.log(JSON.stringify(trigger2, null, 2));
|
|
525
526
|
} else {
|
|
@@ -550,7 +551,7 @@ var list = Command5.make("list", {
|
|
|
550
551
|
spaceId: Common4.spaceId.pipe(Options5.optional)
|
|
551
552
|
}, Effect5.fn(function* ({ spaceId: spaceIdOption }) {
|
|
552
553
|
const { json } = yield* CommandConfig4;
|
|
553
|
-
const triggers = yield* Database5.
|
|
554
|
+
const triggers = yield* Database5.runQuery(Filter5.type(Trigger5.Trigger));
|
|
554
555
|
const remoteCronIds = yield* Effect5.gen(function* () {
|
|
555
556
|
const client = yield* ClientService;
|
|
556
557
|
const spaceId = yield* spaceIdWithDefault(spaceIdOption);
|
|
@@ -598,8 +599,8 @@ var remove = Command6.make("remove", {
|
|
|
598
599
|
onSome: (id) => Effect6.succeed(id)
|
|
599
600
|
});
|
|
600
601
|
const dxn = DXN2.fromLocalObjectId(triggerId);
|
|
601
|
-
const trigger2 = yield* Database6.
|
|
602
|
-
yield* Database6.
|
|
602
|
+
const trigger2 = yield* Database6.resolve(dxn, Trigger6.Trigger);
|
|
603
|
+
yield* Database6.remove(trigger2);
|
|
603
604
|
if (json) {
|
|
604
605
|
yield* Console6.log(JSON.stringify({
|
|
605
606
|
id: trigger2.id,
|
|
@@ -639,7 +640,7 @@ var queue2 = Command7.make("queue", {
|
|
|
639
640
|
onSome: (id) => Effect7.succeed(id)
|
|
640
641
|
});
|
|
641
642
|
const dxn = DXN3.fromLocalObjectId(triggerId);
|
|
642
|
-
const trigger2 = yield* Database7.
|
|
643
|
+
const trigger2 = yield* Database7.resolve(dxn, Trigger7.Trigger);
|
|
643
644
|
if (trigger2.spec?.kind !== "queue") {
|
|
644
645
|
return yield* Effect7.fail(new Error(`Invalid trigger type: ${trigger2.spec?.kind}`));
|
|
645
646
|
}
|
|
@@ -657,7 +658,7 @@ var queue2 = Command7.make("queue", {
|
|
|
657
658
|
});
|
|
658
659
|
})).pipe(Command7.withDescription("Update a queue trigger."), Command7.provide(({ spaceId }) => spaceLayer6(spaceId, true)), Command7.provideEffectDiscard(() => withTypes5(Function5.Function, Trigger7.Trigger)));
|
|
659
660
|
var updateFunction = Effect7.fn(function* (trigger2, functionIdOption) {
|
|
660
|
-
let currentFn = trigger2.function ? yield* Database7.
|
|
661
|
+
let currentFn = trigger2.function ? yield* Database7.load(trigger2.function) : void 0;
|
|
661
662
|
if (currentFn && !Obj2.instanceOf(Function5.Function, currentFn)) {
|
|
662
663
|
currentFn = void 0;
|
|
663
664
|
}
|
|
@@ -674,7 +675,7 @@ var updateFunction = Effect7.fn(function* (trigger2, functionIdOption) {
|
|
|
674
675
|
onNone: () => selectFunction(),
|
|
675
676
|
onSome: (id) => Effect7.succeed(id)
|
|
676
677
|
});
|
|
677
|
-
const functions = yield* Database7.
|
|
678
|
+
const functions = yield* Database7.runQuery(Filter6.type(Function5.Function));
|
|
678
679
|
const foundFn = functions.find((fn6) => fn6.id === functionId);
|
|
679
680
|
if (!foundFn || !Obj2.instanceOf(Function5.Function, foundFn)) {
|
|
680
681
|
return yield* Effect7.fail(new Error(`Function not found: ${functionId}`));
|
|
@@ -777,7 +778,7 @@ var subscription2 = Command8.make("subscription", {
|
|
|
777
778
|
onSome: (id) => Effect8.succeed(id)
|
|
778
779
|
});
|
|
779
780
|
const dxn = DXN4.fromLocalObjectId(triggerId);
|
|
780
|
-
const trigger2 = yield* Database8.
|
|
781
|
+
const trigger2 = yield* Database8.resolve(dxn, Trigger8.Trigger);
|
|
781
782
|
if (trigger2.spec?.kind !== "subscription") {
|
|
782
783
|
return yield* Effect8.fail(new Error(`Invalid trigger type: ${trigger2.spec?.kind}`));
|
|
783
784
|
}
|
|
@@ -805,7 +806,7 @@ var extractCurrentTypename = (spec) => {
|
|
|
805
806
|
}, (f) => Option7.fromNullable(f.typename).pipe(Option7.flatMap((dxn) => Option7.fromNullable(DXN4.tryParse(dxn))), Option7.flatMap((dxn) => Option7.fromNullable(dxn.asTypeDXN()?.type)))), Match2.orElse(() => Option7.none()))), Match2.orElse(() => Option7.none()));
|
|
806
807
|
};
|
|
807
808
|
var updateFunction2 = Effect8.fn(function* (trigger2, functionIdOption) {
|
|
808
|
-
let currentFn = trigger2.function ? yield* Database8.
|
|
809
|
+
let currentFn = trigger2.function ? yield* Database8.load(trigger2.function) : void 0;
|
|
809
810
|
if (currentFn && !Obj3.instanceOf(Function6.Function, currentFn)) {
|
|
810
811
|
currentFn = void 0;
|
|
811
812
|
}
|
|
@@ -822,7 +823,7 @@ var updateFunction2 = Effect8.fn(function* (trigger2, functionIdOption) {
|
|
|
822
823
|
onNone: () => selectFunction(),
|
|
823
824
|
onSome: (id) => Effect8.succeed(id)
|
|
824
825
|
});
|
|
825
|
-
const functions = yield* Database8.
|
|
826
|
+
const functions = yield* Database8.runQuery(Filter7.type(Function6.Function));
|
|
826
827
|
const foundFn = functions.find((fn6) => fn6.id === functionId);
|
|
827
828
|
if (!foundFn || !Obj3.instanceOf(Function6.Function, foundFn)) {
|
|
828
829
|
return yield* Effect8.fail(new Error(`Function not found: ${functionId}`));
|
|
@@ -965,7 +966,7 @@ var timer2 = Command9.make("timer", {
|
|
|
965
966
|
onSome: (id) => Effect9.succeed(id)
|
|
966
967
|
});
|
|
967
968
|
const dxn = DXN5.fromLocalObjectId(triggerId);
|
|
968
|
-
const trigger2 = yield* Database9.
|
|
969
|
+
const trigger2 = yield* Database9.resolve(dxn, Trigger9.Trigger);
|
|
969
970
|
if (!trigger2.spec || trigger2.spec?.kind !== "timer") {
|
|
970
971
|
return yield* Effect9.fail(new Error(`Invalid trigger type: ${trigger2.spec?.kind}`));
|
|
971
972
|
}
|
|
@@ -983,7 +984,7 @@ var timer2 = Command9.make("timer", {
|
|
|
983
984
|
});
|
|
984
985
|
})).pipe(Command9.withDescription("Update a timer trigger."), Command9.provide(({ spaceId }) => spaceLayer8(spaceId, true)), Command9.provideEffectDiscard(() => withTypes7(Function7.Function, Trigger9.Trigger)));
|
|
985
986
|
var updateFunction3 = Effect9.fn(function* (trigger2, functionIdOption) {
|
|
986
|
-
let currentFn = trigger2.function ? yield* Database9.
|
|
987
|
+
let currentFn = trigger2.function ? yield* Database9.load(trigger2.function) : void 0;
|
|
987
988
|
if (currentFn && !Obj4.instanceOf(Function7.Function, currentFn)) {
|
|
988
989
|
currentFn = void 0;
|
|
989
990
|
}
|
|
@@ -1000,7 +1001,7 @@ var updateFunction3 = Effect9.fn(function* (trigger2, functionIdOption) {
|
|
|
1000
1001
|
onNone: () => selectFunction(),
|
|
1001
1002
|
onSome: (id) => Effect9.succeed(id)
|
|
1002
1003
|
});
|
|
1003
|
-
const functions = yield* Database9.
|
|
1004
|
+
const functions = yield* Database9.runQuery(Filter8.type(Function7.Function));
|
|
1004
1005
|
const foundFn = functions.find((fn6) => fn6.id === functionId);
|
|
1005
1006
|
if (!foundFn || !Obj4.instanceOf(Function7.Function, foundFn)) {
|
|
1006
1007
|
return yield* Effect9.fail(new Error(`Function not found: ${functionId}`));
|
|
@@ -1091,7 +1092,7 @@ var trigger = Command11.make("trigger").pipe(Command11.withDescription("Manage E
|
|
|
1091
1092
|
]));
|
|
1092
1093
|
|
|
1093
1094
|
// src/cli/plugin.ts
|
|
1094
|
-
var AutomationPlugin = Plugin.define(meta).pipe(
|
|
1095
|
+
var AutomationPlugin = Plugin.define(meta).pipe(AppPlugin.addCommandModule({
|
|
1095
1096
|
commands: [
|
|
1096
1097
|
trigger
|
|
1097
1098
|
]
|