@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.
Files changed (140) hide show
  1. package/dist/lib/browser/{AutomationPanel-FAS6ADCW.mjs → AutomationPanel-C6MZ22CB.mjs} +3 -3
  2. package/dist/lib/browser/{AutomationSettings-XN2OIYWL.mjs → AutomationSettings-D7UO5V3Q.mjs} +10 -9
  3. package/dist/lib/browser/AutomationSettings-D7UO5V3Q.mjs.map +7 -0
  4. package/dist/lib/browser/{FunctionsContainer-6QLC7JP4.mjs → FunctionsContainer-5NHAAP5H.mjs} +8 -12
  5. package/dist/lib/browser/FunctionsContainer-5NHAAP5H.mjs.map +7 -0
  6. package/dist/lib/browser/{FunctionsPanel-ZX4J75UM.mjs → FunctionsPanel-RD22LYMR.mjs} +2 -2
  7. package/dist/lib/browser/{app-graph-builder-LAQMEBMH.mjs → app-graph-builder-HLARI3VW.mjs} +4 -3
  8. package/dist/lib/browser/app-graph-builder-HLARI3VW.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-YWLEY2FD.mjs → chunk-C273ZYLE.mjs} +100 -42
  10. package/dist/lib/browser/chunk-C273ZYLE.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-54PANILA.mjs → chunk-JFBUK3WR.mjs} +5 -5
  12. package/dist/lib/browser/{chunk-QW3EM35H.mjs → chunk-JN7QRQQX.mjs} +14 -6
  13. package/dist/lib/browser/chunk-JN7QRQQX.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-BKFQBKYO.mjs → chunk-O5Y2F33G.mjs} +2 -2
  15. package/dist/lib/browser/{chunk-RAF2FJST.mjs → chunk-P5AEO35Y.mjs} +18 -11
  16. package/dist/lib/browser/chunk-P5AEO35Y.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-BFUIVUQH.mjs → chunk-QNEQ23BF.mjs} +8 -12
  18. package/dist/lib/browser/chunk-QNEQ23BF.mjs.map +7 -0
  19. package/dist/lib/browser/cli/index.mjs +29 -28
  20. package/dist/lib/browser/cli/index.mjs.map +3 -3
  21. package/dist/lib/browser/{compute-runtime-WTWLQ67J.mjs → compute-runtime-BUBHYS4Y.mjs} +20 -15
  22. package/dist/lib/browser/compute-runtime-BUBHYS4Y.mjs.map +7 -0
  23. package/dist/lib/browser/hooks/index.mjs +1 -1
  24. package/dist/lib/browser/index.mjs +17 -16
  25. package/dist/lib/browser/index.mjs.map +3 -3
  26. package/dist/lib/browser/meta.json +1 -1
  27. package/dist/lib/browser/{operation-resolver-Q3MWOR7K.mjs → operation-resolver-IN2FRGOT.mjs} +5 -4
  28. package/dist/lib/browser/operation-resolver-IN2FRGOT.mjs.map +7 -0
  29. package/dist/lib/browser/{react-surface-EV3AC62F.mjs → react-surface-246NXXJR.mjs} +10 -9
  30. package/dist/lib/browser/react-surface-246NXXJR.mjs.map +7 -0
  31. package/dist/lib/node-esm/{AutomationPanel-B7NAGDFA.mjs → AutomationPanel-RTBY7YFM.mjs} +3 -3
  32. package/dist/lib/node-esm/{AutomationSettings-M5PMZJ6P.mjs → AutomationSettings-GK4RLSDN.mjs} +10 -9
  33. package/dist/lib/node-esm/AutomationSettings-GK4RLSDN.mjs.map +7 -0
  34. package/dist/lib/node-esm/{FunctionsContainer-J4O2ULWR.mjs → FunctionsContainer-AHHZODM5.mjs} +8 -12
  35. package/dist/lib/node-esm/FunctionsContainer-AHHZODM5.mjs.map +7 -0
  36. package/dist/lib/node-esm/{FunctionsPanel-SS6GIVNU.mjs → FunctionsPanel-V2DKWYMU.mjs} +2 -2
  37. package/dist/lib/node-esm/{app-graph-builder-4UCMXHYY.mjs → app-graph-builder-Z2TMQHVX.mjs} +4 -3
  38. package/dist/lib/node-esm/app-graph-builder-Z2TMQHVX.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-KWKWOGS5.mjs → chunk-AENSLAVD.mjs} +8 -12
  40. package/dist/lib/node-esm/chunk-AENSLAVD.mjs.map +7 -0
  41. package/dist/lib/node-esm/{chunk-LJAXQ6CX.mjs → chunk-EJPZWAGR.mjs} +14 -6
  42. package/dist/lib/node-esm/chunk-EJPZWAGR.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-7QRUPEHH.mjs → chunk-K5Z4UGIO.mjs} +5 -5
  44. package/dist/lib/node-esm/{chunk-K7GCM342.mjs → chunk-M3UPTGXF.mjs} +2 -2
  45. package/dist/lib/node-esm/{chunk-2CKVH7JC.mjs → chunk-OJEFRZEV.mjs} +100 -42
  46. package/dist/lib/node-esm/chunk-OJEFRZEV.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-HQLVREIX.mjs → chunk-Q7EMIPMW.mjs} +18 -11
  48. package/dist/lib/node-esm/chunk-Q7EMIPMW.mjs.map +7 -0
  49. package/dist/lib/node-esm/cli/index.mjs +29 -28
  50. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  51. package/dist/lib/node-esm/{compute-runtime-ZHROOBLY.mjs → compute-runtime-6UEDBN76.mjs} +20 -15
  52. package/dist/lib/node-esm/compute-runtime-6UEDBN76.mjs.map +7 -0
  53. package/dist/lib/node-esm/hooks/index.mjs +1 -1
  54. package/dist/lib/node-esm/index.mjs +17 -16
  55. package/dist/lib/node-esm/index.mjs.map +3 -3
  56. package/dist/lib/node-esm/meta.json +1 -1
  57. package/dist/lib/node-esm/{operation-resolver-R5GA4YNO.mjs → operation-resolver-67CEAKXP.mjs} +5 -4
  58. package/dist/lib/node-esm/operation-resolver-67CEAKXP.mjs.map +7 -0
  59. package/dist/lib/node-esm/{react-surface-S6VZJCEZ.mjs → react-surface-U6762KPI.mjs} +10 -9
  60. package/dist/lib/node-esm/react-surface-U6762KPI.mjs.map +7 -0
  61. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  62. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/compute-runtime/compute-runtime.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  65. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  67. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  68. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  69. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  71. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  72. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  73. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +3 -4
  74. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  75. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  76. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -1
  77. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  78. package/dist/types/src/components/TriggerSettings.d.ts.map +1 -1
  79. package/dist/types/src/components/index.d.ts +1 -1
  80. package/dist/types/src/components/index.d.ts.map +1 -1
  81. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +2 -1
  82. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
  83. package/dist/types/src/testing/test-functions.d.ts +202 -2
  84. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  85. package/dist/types/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +48 -45
  87. package/src/AutomationPlugin.tsx +7 -6
  88. package/src/capabilities/app-graph-builder/app-graph-builder.ts +3 -2
  89. package/src/capabilities/compute-runtime/compute-runtime.ts +19 -12
  90. package/src/capabilities/operation-resolver/operation-resolver.ts +4 -3
  91. package/src/capabilities/react-surface/react-surface.tsx +7 -6
  92. package/src/cli/commands/trigger/create/queue.ts +2 -2
  93. package/src/cli/commands/trigger/create/subscription.ts +2 -2
  94. package/src/cli/commands/trigger/create/timer.ts +2 -2
  95. package/src/cli/commands/trigger/list.ts +1 -1
  96. package/src/cli/commands/trigger/remove.ts +2 -2
  97. package/src/cli/commands/trigger/update/queue.ts +3 -3
  98. package/src/cli/commands/trigger/update/subscription.ts +3 -3
  99. package/src/cli/commands/trigger/update/timer.ts +3 -3
  100. package/src/cli/commands/trigger/util.ts +7 -7
  101. package/src/cli/plugin.ts +3 -2
  102. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +1 -1
  103. package/src/components/AutomationPanel/AutomationPanel.tsx +131 -65
  104. package/src/components/AutomationSettings.tsx +5 -5
  105. package/src/components/FunctionsContainer.tsx +7 -7
  106. package/src/components/FunctionsPanel/FunctionsPanel.tsx +11 -10
  107. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +4 -5
  108. package/src/components/TriggerEditor/FunctionInputEditor.tsx +12 -3
  109. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +3 -3
  110. package/src/components/TriggerSettings.tsx +5 -4
  111. package/src/hooks/useComputeRuntimeCallback.ts +1 -1
  112. package/src/hooks/useTriggerRuntimeControls.ts +22 -8
  113. package/dist/lib/browser/AutomationSettings-XN2OIYWL.mjs.map +0 -7
  114. package/dist/lib/browser/FunctionsContainer-6QLC7JP4.mjs.map +0 -7
  115. package/dist/lib/browser/app-graph-builder-LAQMEBMH.mjs.map +0 -7
  116. package/dist/lib/browser/chunk-BFUIVUQH.mjs.map +0 -7
  117. package/dist/lib/browser/chunk-QW3EM35H.mjs.map +0 -7
  118. package/dist/lib/browser/chunk-RAF2FJST.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-YWLEY2FD.mjs.map +0 -7
  120. package/dist/lib/browser/compute-runtime-WTWLQ67J.mjs.map +0 -7
  121. package/dist/lib/browser/operation-resolver-Q3MWOR7K.mjs.map +0 -7
  122. package/dist/lib/browser/react-surface-EV3AC62F.mjs.map +0 -7
  123. package/dist/lib/node-esm/AutomationSettings-M5PMZJ6P.mjs.map +0 -7
  124. package/dist/lib/node-esm/FunctionsContainer-J4O2ULWR.mjs.map +0 -7
  125. package/dist/lib/node-esm/app-graph-builder-4UCMXHYY.mjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-2CKVH7JC.mjs.map +0 -7
  127. package/dist/lib/node-esm/chunk-HQLVREIX.mjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-KWKWOGS5.mjs.map +0 -7
  129. package/dist/lib/node-esm/chunk-LJAXQ6CX.mjs.map +0 -7
  130. package/dist/lib/node-esm/compute-runtime-ZHROOBLY.mjs.map +0 -7
  131. package/dist/lib/node-esm/operation-resolver-R5GA4YNO.mjs.map +0 -7
  132. package/dist/lib/node-esm/react-surface-S6VZJCEZ.mjs.map +0 -7
  133. /package/dist/lib/browser/{AutomationPanel-FAS6ADCW.mjs.map → AutomationPanel-C6MZ22CB.mjs.map} +0 -0
  134. /package/dist/lib/browser/{FunctionsPanel-ZX4J75UM.mjs.map → FunctionsPanel-RD22LYMR.mjs.map} +0 -0
  135. /package/dist/lib/browser/{chunk-54PANILA.mjs.map → chunk-JFBUK3WR.mjs.map} +0 -0
  136. /package/dist/lib/browser/{chunk-BKFQBKYO.mjs.map → chunk-O5Y2F33G.mjs.map} +0 -0
  137. /package/dist/lib/node-esm/{AutomationPanel-B7NAGDFA.mjs.map → AutomationPanel-RTBY7YFM.mjs.map} +0 -0
  138. /package/dist/lib/node-esm/{FunctionsPanel-SS6GIVNU.mjs.map → FunctionsPanel-V2DKWYMU.mjs.map} +0 -0
  139. /package/dist/lib/node-esm/{chunk-7QRUPEHH.mjs.map → chunk-K5Z4UGIO.mjs.map} +0 -0
  140. /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-LJAXQ6CX.mjs";
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 { ControlItem, controlItemClasses } from "@dxos/react-ui-form";
23
+ import { Settings } from "@dxos/react-ui-form";
23
24
  import { List } from "@dxos/react-ui-list";
24
- import { Project } from "@dxos/types";
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 = ({ classNames, space, object, initialTrigger, onDone }) => {
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
- Object.assign(selected, trigger2);
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(ControlItem, {
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("div", {
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
- const copyAction = getCopyAction(client, trigger2);
114
- return /* @__PURE__ */ React.createElement(List.Item, {
115
- key: trigger2.id,
116
- item: trigger2,
117
- classNames: mx(grid, ghostHover, "items-center", "pli-2")
118
- }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
119
- checked: trigger2.enabled,
120
- onCheckedChange: (checked) => Obj.change(trigger2, (t2) => {
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(Project.Project, obj), (obj) => projectMatch(obj)), Match.orElse((_obj) => () => true));
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-2CKVH7JC.mjs.map
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/react";
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 [isRunningState, setIsRunningState] = useAsyncState(useComputeRuntimeCallback(db?.spaceId, () => TriggerDispatcher.pipe(Effect2.map((t) => t.running))));
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 dispatcher = yield* TriggerDispatcher;
66
- yield* dispatcher.start();
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 dispatcher = yield* TriggerDispatcher;
71
- yield* dispatcher.stop();
72
- setIsRunningState(false);
78
+ const dispatcher2 = yield* TriggerDispatcher;
79
+ yield* dispatcher2.stop();
73
80
  }));
74
81
  return {
75
82
  triggers,
76
- isRunning: isRunningState ?? false,
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-HQLVREIX.mjs.map
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-K7GCM342.mjs";
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 { Common as Common9, Plugin } from "@dxos/app-framework";
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.Service.load(trigger2.function));
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.Service.runQuery(Filter.typename(annotation.typename));
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.Service.runQuery(Filter.type(Function.Function));
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.Service.runQuery(Filter.type(Trigger.Trigger));
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.Service.load(trigger2.function) : void 0;
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.Service.runSchemaQuery({
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.Service.runQuery(Filter.type(typename));
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.Service.runQuery(Filter2.type(Function2.Function));
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.Service.add(trigger2);
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.Service.runQuery(Filter3.type(Function3.Function));
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.Service.add(trigger2);
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.Service.runQuery(Filter4.type(Function4.Function));
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.Service.add(trigger2);
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.Service.runQuery(Filter5.type(Trigger5.Trigger));
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.Service.resolve(dxn, Trigger6.Trigger);
602
- yield* Database6.Service.remove(trigger2);
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.Service.resolve(dxn, Trigger7.Trigger);
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.Service.load(trigger2.function) : void 0;
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.Service.runQuery(Filter6.type(Function5.Function));
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.Service.resolve(dxn, Trigger8.Trigger);
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.Service.load(trigger2.function) : void 0;
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.Service.runQuery(Filter7.type(Function6.Function));
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.Service.resolve(dxn, Trigger9.Trigger);
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.Service.load(trigger2.function) : void 0;
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.Service.runQuery(Filter8.type(Function7.Function));
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(Common9.Plugin.addCommandModule({
1095
+ var AutomationPlugin = Plugin.define(meta).pipe(AppPlugin.addCommandModule({
1095
1096
  commands: [
1096
1097
  trigger
1097
1098
  ]