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

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 (196) hide show
  1. package/dist/lib/browser/AutomationPanel-M4M77L4V.mjs +11 -0
  2. package/dist/lib/browser/AutomationSettings-4HCI6KJR.mjs +68 -0
  3. package/dist/lib/browser/AutomationSettings-4HCI6KJR.mjs.map +7 -0
  4. package/dist/lib/browser/FunctionsContainer-CDVBRQCT.mjs +144 -0
  5. package/dist/lib/browser/FunctionsContainer-CDVBRQCT.mjs.map +7 -0
  6. package/dist/lib/browser/{FunctionsPanel-56ZKRVM5.mjs → FunctionsPanel-CRW6SJUN.mjs} +3 -3
  7. package/dist/lib/browser/{app-graph-builder-ZTAUTFI4.mjs → app-graph-builder-W7LLC6XW.mjs} +13 -12
  8. package/dist/lib/browser/app-graph-builder-W7LLC6XW.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-4MBM6C6A.mjs +100 -0
  10. package/dist/lib/browser/chunk-4MBM6C6A.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-FSJZXTS2.mjs → chunk-7W6QMY3L.mjs} +71 -34
  12. package/dist/lib/browser/chunk-7W6QMY3L.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-CZVA5NMD.mjs +14 -0
  14. package/dist/lib/browser/chunk-CZVA5NMD.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-LZQFZO3B.mjs +17 -0
  16. package/dist/lib/browser/chunk-LZQFZO3B.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-ERTIGJYE.mjs → chunk-T6ZESHDY.mjs} +79 -35
  18. package/dist/lib/browser/chunk-T6ZESHDY.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-LYJVTIVD.mjs → chunk-TWWFNOIR.mjs} +30 -15
  20. package/dist/lib/browser/chunk-TWWFNOIR.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-XAKZ4ANY.mjs +15 -0
  22. package/dist/lib/browser/chunk-XAKZ4ANY.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-HN7OHFCB.mjs → chunk-YBPJCY3F.mjs} +3 -3
  24. package/dist/lib/browser/chunk-YBPJCY3F.mjs.map +7 -0
  25. package/dist/lib/browser/compute-runtime-B4XJVY4Y.mjs +113 -0
  26. package/dist/lib/browser/compute-runtime-B4XJVY4Y.mjs.map +7 -0
  27. package/dist/lib/browser/hooks/index.mjs +13 -0
  28. package/dist/lib/browser/index.mjs +48 -19
  29. package/dist/lib/browser/index.mjs.map +4 -4
  30. package/dist/lib/browser/{intent-resolver-U3ZAQEFW.mjs → intent-resolver-5HR7M7T6.mjs} +15 -14
  31. package/dist/lib/browser/intent-resolver-5HR7M7T6.mjs.map +7 -0
  32. package/dist/lib/browser/meta.json +1 -1
  33. package/dist/lib/browser/{react-surface-4DFSM7OX.mjs → react-surface-TKU2EQ5A.mjs} +20 -20
  34. package/dist/lib/browser/react-surface-TKU2EQ5A.mjs.map +7 -0
  35. package/dist/lib/browser/types/index.mjs +2 -2
  36. package/dist/lib/node-esm/{AutomationPanel-YYUMSK2W.mjs → AutomationPanel-F5CTC6AT.mjs} +4 -4
  37. package/dist/lib/node-esm/AutomationSettings-BQLJIFRT.mjs +69 -0
  38. package/dist/lib/node-esm/AutomationSettings-BQLJIFRT.mjs.map +7 -0
  39. package/dist/lib/node-esm/FunctionsContainer-ZHHJPQAZ.mjs +145 -0
  40. package/dist/lib/node-esm/FunctionsContainer-ZHHJPQAZ.mjs.map +7 -0
  41. package/dist/lib/node-esm/{FunctionsPanel-KGIOZSPZ.mjs → FunctionsPanel-RVVCS6VH.mjs} +3 -3
  42. package/dist/lib/node-esm/FunctionsPanel-RVVCS6VH.mjs.map +7 -0
  43. package/dist/lib/node-esm/{app-graph-builder-3FP63ZSG.mjs → app-graph-builder-SLQOO7GH.mjs} +13 -12
  44. package/dist/lib/node-esm/app-graph-builder-SLQOO7GH.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-3IYSC75Z.mjs +16 -0
  46. package/dist/lib/node-esm/chunk-3IYSC75Z.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-7B6NAAI6.mjs +101 -0
  48. package/dist/lib/node-esm/chunk-7B6NAAI6.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs +19 -0
  50. package/dist/lib/node-esm/chunk-CEVIVRTY.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-AZH66CED.mjs → chunk-CF2SWXPW.mjs} +71 -34
  52. package/dist/lib/node-esm/chunk-CF2SWXPW.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-OEZNHUL2.mjs → chunk-ECJKIUBO.mjs} +3 -3
  54. package/dist/lib/node-esm/chunk-ECJKIUBO.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-HIMYPGHF.mjs → chunk-F76XVENA.mjs} +79 -35
  56. package/dist/lib/node-esm/chunk-F76XVENA.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-KB7NFEYY.mjs +16 -0
  58. package/dist/lib/node-esm/chunk-KB7NFEYY.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-ZGPUV5VS.mjs → chunk-RVK52XGK.mjs} +30 -15
  60. package/dist/lib/node-esm/chunk-RVK52XGK.mjs.map +7 -0
  61. package/dist/lib/node-esm/compute-runtime-JUWTQXOV.mjs +114 -0
  62. package/dist/lib/node-esm/compute-runtime-JUWTQXOV.mjs.map +7 -0
  63. package/dist/lib/node-esm/hooks/index.mjs +14 -0
  64. package/dist/lib/node-esm/hooks/index.mjs.map +7 -0
  65. package/dist/lib/node-esm/index.mjs +48 -19
  66. package/dist/lib/node-esm/index.mjs.map +4 -4
  67. package/dist/lib/node-esm/{intent-resolver-3QWXEBPX.mjs → intent-resolver-KDRYB5BC.mjs} +15 -14
  68. package/dist/lib/node-esm/intent-resolver-KDRYB5BC.mjs.map +7 -0
  69. package/dist/lib/node-esm/meta.json +1 -1
  70. package/dist/lib/node-esm/{react-surface-3PNW7NDW.mjs → react-surface-7QROSEGH.mjs} +20 -20
  71. package/dist/lib/node-esm/react-surface-7QROSEGH.mjs.map +7 -0
  72. package/dist/lib/node-esm/types/index.mjs +2 -2
  73. package/dist/types/src/AutomationPlugin.d.ts +1 -1
  74. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  76. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/capabilities.d.ts +20 -0
  78. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/compute-runtime.d.ts +5 -0
  80. package/dist/types/src/capabilities/compute-runtime.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/index.d.ts +5 -3
  82. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  84. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  86. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  87. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +6 -5
  88. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  89. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +48 -4
  90. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/AutomationSettings.d.ts +5 -0
  92. package/dist/types/src/components/AutomationSettings.d.ts.map +1 -0
  93. package/dist/types/src/components/FunctionsContainer.d.ts.map +1 -1
  94. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  95. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts +8 -0
  96. package/dist/types/src/components/FunctionsRegistry/FunctionsRegistry.d.ts.map +1 -0
  97. package/dist/types/src/components/FunctionsRegistry/index.d.ts +2 -0
  98. package/dist/types/src/components/FunctionsRegistry/index.d.ts.map +1 -0
  99. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +2 -2
  100. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  101. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  102. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +7 -5
  103. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  104. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +49 -4
  105. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/TriggerSettings.d.ts +6 -0
  107. package/dist/types/src/components/TriggerSettings.d.ts.map +1 -0
  108. package/dist/types/src/components/index.d.ts +2 -2
  109. package/dist/types/src/components/index.d.ts.map +1 -1
  110. package/dist/types/src/events.d.ts +4 -0
  111. package/dist/types/src/events.d.ts.map +1 -0
  112. package/dist/types/src/hooks/index.d.ts +3 -0
  113. package/dist/types/src/hooks/index.d.ts.map +1 -0
  114. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +12 -0
  115. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -0
  116. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +11 -0
  117. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -0
  118. package/dist/types/src/index.d.ts +3 -0
  119. package/dist/types/src/index.d.ts.map +1 -1
  120. package/dist/types/src/meta.d.ts +0 -1
  121. package/dist/types/src/meta.d.ts.map +1 -1
  122. package/dist/types/src/testing/test-functions.d.ts +2 -3
  123. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  124. package/dist/types/src/translations.d.ts +5 -0
  125. package/dist/types/src/translations.d.ts.map +1 -1
  126. package/dist/types/src/types/schema.d.ts +1 -1
  127. package/dist/types/src/types/schema.d.ts.map +1 -1
  128. package/dist/types/tsconfig.tsbuildinfo +1 -1
  129. package/package.json +65 -42
  130. package/src/AutomationPlugin.tsx +37 -31
  131. package/src/capabilities/app-graph-builder.ts +16 -15
  132. package/src/capabilities/capabilities.ts +41 -0
  133. package/src/capabilities/compute-runtime.ts +129 -0
  134. package/src/capabilities/index.ts +3 -0
  135. package/src/capabilities/intent-resolver.ts +11 -11
  136. package/src/capabilities/react-surface.tsx +15 -15
  137. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +16 -17
  138. package/src/components/AutomationPanel/AutomationPanel.tsx +112 -53
  139. package/src/components/AutomationSettings.tsx +30 -0
  140. package/src/components/FunctionsContainer.tsx +18 -13
  141. package/src/components/FunctionsPanel/FunctionsPanel.tsx +35 -16
  142. package/src/components/FunctionsRegistry/FunctionsRegistry.tsx +127 -0
  143. package/src/components/FunctionsRegistry/index.ts +5 -0
  144. package/src/components/TriggerEditor/FunctionInputEditor.tsx +10 -4
  145. package/src/components/TriggerEditor/SpecSelector.tsx +23 -17
  146. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +71 -28
  147. package/src/components/TriggerEditor/TriggerEditor.tsx +46 -26
  148. package/src/components/TriggerSettings.tsx +25 -0
  149. package/src/components/index.ts +1 -1
  150. package/src/events.ts +11 -0
  151. package/src/hooks/index.ts +6 -0
  152. package/src/hooks/useComputeRuntimeCallback.ts +68 -0
  153. package/src/hooks/useTriggerRuntimeControls.ts +53 -0
  154. package/src/index.ts +3 -0
  155. package/src/meta.ts +6 -5
  156. package/src/testing/test-functions.ts +3 -3
  157. package/src/translations.ts +7 -0
  158. package/src/types/schema.ts +1 -1
  159. package/dist/lib/browser/AutomationContainer-VZNV2ZQF.mjs +0 -38
  160. package/dist/lib/browser/AutomationContainer-VZNV2ZQF.mjs.map +0 -7
  161. package/dist/lib/browser/AutomationPanel-ZWA6GOFY.mjs +0 -11
  162. package/dist/lib/browser/FunctionsContainer-IOB333TX.mjs +0 -39
  163. package/dist/lib/browser/FunctionsContainer-IOB333TX.mjs.map +0 -7
  164. package/dist/lib/browser/app-graph-builder-ZTAUTFI4.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-ECSTS2UI.mjs +0 -14
  166. package/dist/lib/browser/chunk-ECSTS2UI.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-ERTIGJYE.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-FSJZXTS2.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-GW5U2DGT.mjs +0 -15
  170. package/dist/lib/browser/chunk-GW5U2DGT.mjs.map +0 -7
  171. package/dist/lib/browser/chunk-HN7OHFCB.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-LYJVTIVD.mjs.map +0 -7
  173. package/dist/lib/browser/intent-resolver-U3ZAQEFW.mjs.map +0 -7
  174. package/dist/lib/browser/react-surface-4DFSM7OX.mjs.map +0 -7
  175. package/dist/lib/node-esm/AutomationContainer-WMIH3F4V.mjs +0 -39
  176. package/dist/lib/node-esm/AutomationContainer-WMIH3F4V.mjs.map +0 -7
  177. package/dist/lib/node-esm/FunctionsContainer-DJWB6WFH.mjs +0 -40
  178. package/dist/lib/node-esm/FunctionsContainer-DJWB6WFH.mjs.map +0 -7
  179. package/dist/lib/node-esm/app-graph-builder-3FP63ZSG.mjs.map +0 -7
  180. package/dist/lib/node-esm/chunk-AZH66CED.mjs.map +0 -7
  181. package/dist/lib/node-esm/chunk-HIMYPGHF.mjs.map +0 -7
  182. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs +0 -17
  183. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs.map +0 -7
  184. package/dist/lib/node-esm/chunk-OEZNHUL2.mjs.map +0 -7
  185. package/dist/lib/node-esm/chunk-SGZPTJ47.mjs +0 -16
  186. package/dist/lib/node-esm/chunk-SGZPTJ47.mjs.map +0 -7
  187. package/dist/lib/node-esm/chunk-ZGPUV5VS.mjs.map +0 -7
  188. package/dist/lib/node-esm/intent-resolver-3QWXEBPX.mjs.map +0 -7
  189. package/dist/lib/node-esm/react-surface-3PNW7NDW.mjs.map +0 -7
  190. package/dist/types/src/components/AutomationContainer.d.ts +0 -5
  191. package/dist/types/src/components/AutomationContainer.d.ts.map +0 -1
  192. package/src/components/AutomationContainer.tsx +0 -30
  193. /package/dist/lib/browser/{AutomationPanel-ZWA6GOFY.mjs.map → AutomationPanel-M4M77L4V.mjs.map} +0 -0
  194. /package/dist/lib/browser/{FunctionsPanel-56ZKRVM5.mjs.map → FunctionsPanel-CRW6SJUN.mjs.map} +0 -0
  195. /package/dist/lib/{node-esm/AutomationPanel-YYUMSK2W.mjs.map → browser/hooks/index.mjs.map} +0 -0
  196. /package/dist/lib/node-esm/{FunctionsPanel-KGIOZSPZ.mjs.map → AutomationPanel-F5CTC6AT.mjs.map} +0 -0
@@ -1,41 +1,67 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  TriggerEditor
4
- } from "./chunk-AZH66CED.mjs";
4
+ } from "./chunk-CF2SWXPW.mjs";
5
5
  import {
6
- AUTOMATION_PLUGIN
7
- } from "./chunk-NK5N3QKD.mjs";
6
+ meta
7
+ } from "./chunk-CEVIVRTY.mjs";
8
8
 
9
9
  // src/components/AutomationPanel/AutomationPanel.tsx
10
10
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
11
- import { Schema } from "effect";
12
- import React, { useState } from "react";
13
- import { Filter, Obj } from "@dxos/echo";
14
- import { FunctionType, FunctionTrigger, FunctionTriggerSchema, ScriptType, TriggerKind } from "@dxos/functions";
11
+ import * as Array from "effect/Array";
12
+ import * as EFn from "effect/Function";
13
+ import * as Match from "effect/Match";
14
+ import * as Schema from "effect/Schema";
15
+ import React, { useMemo, useState } from "react";
16
+ import { Filter, Obj, Tag } from "@dxos/echo";
17
+ import { Function, Script, Trigger } from "@dxos/functions";
18
+ import { useTypeOptions } from "@dxos/plugin-space";
15
19
  import { useClient } from "@dxos/react-client";
16
- import { useQuery, getSpace } from "@dxos/react-client/echo";
20
+ import { getSpace, useQuery } from "@dxos/react-client/echo";
17
21
  import { Clipboard, IconButton, Input, Separator, useTranslation } from "@dxos/react-ui";
18
22
  import { ControlItem, controlItemClasses } from "@dxos/react-ui-form";
19
23
  import { List } from "@dxos/react-ui-list";
20
24
  import { ghostHover, mx } from "@dxos/react-ui-theme";
25
+ import { Project } from "@dxos/types";
26
+ import { isNonNullable } from "@dxos/util";
21
27
  var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
22
- var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
28
+ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) => {
23
29
  var _effect = _useSignals();
24
30
  try {
25
- const { t } = useTranslation(AUTOMATION_PLUGIN);
31
+ const { t } = useTranslation(meta.id);
26
32
  const client = useClient();
27
- const triggers = useQuery(space, Filter.type(FunctionTrigger));
28
- const functions = useQuery(space, Filter.type(FunctionType));
29
- const scripts = useQuery(space, Filter.type(ScriptType));
33
+ const functions = useQuery(space, Filter.type(Function.Function));
34
+ const triggers = useQuery(space, Filter.type(Trigger.Trigger));
35
+ const filteredTriggers = useMemo(() => {
36
+ return object ? triggers.filter(triggerMatch(object)) : triggers;
37
+ }, [
38
+ object,
39
+ triggers
40
+ ]);
41
+ const tags = useQuery(space, Filter.type(Tag.Tag));
42
+ const types = useTypeOptions({
43
+ space,
44
+ annotation: {
45
+ location: [
46
+ "database",
47
+ "runtime"
48
+ ],
49
+ kind: [
50
+ "user"
51
+ ],
52
+ registered: [
53
+ "registered"
54
+ ]
55
+ }
56
+ });
30
57
  const [trigger, setTrigger] = useState(initialTrigger);
31
58
  const [selected, setSelected] = useState();
32
59
  const handleSelect = (trigger2) => {
33
- const { id: _, ...values } = trigger2;
34
- setTrigger(values);
60
+ setTrigger(trigger2);
35
61
  setSelected(trigger2);
36
62
  };
37
63
  const handleAdd = () => {
38
- setTrigger(Obj.make(FunctionTriggerSchema, {}));
64
+ setTrigger(Trigger.make({}));
39
65
  setSelected(void 0);
40
66
  };
41
67
  const handleDelete = (trigger2) => {
@@ -47,7 +73,7 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
47
73
  if (selected) {
48
74
  Object.assign(selected, trigger2);
49
75
  } else {
50
- space.db.add(Obj.make(FunctionTrigger, trigger2));
76
+ space.db.add(Trigger.make(trigger2));
51
77
  }
52
78
  setTrigger(void 0);
53
79
  setSelected(void 0);
@@ -63,40 +89,43 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
63
89
  }, /* @__PURE__ */ React.createElement(TriggerEditor, {
64
90
  space,
65
91
  trigger,
92
+ readonlySpec: Boolean(object),
93
+ tags,
94
+ types,
66
95
  onSave: handleSave,
67
96
  onCancel: handleCancel
68
97
  }));
69
98
  }
70
99
  return /* @__PURE__ */ React.createElement("div", {
71
- className: controlItemClasses
72
- }, triggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
73
- items: triggers,
74
- isItem: Schema.is(FunctionTrigger),
100
+ className: mx(controlItemClasses, classNames)
101
+ }, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
102
+ items: filteredTriggers,
103
+ isItem: Schema.is(Trigger.Trigger),
75
104
  getId: (field) => field.id
76
- }, ({ items: triggers2 }) => /* @__PURE__ */ React.createElement("div", {
105
+ }, ({ items: filteredTriggers2 }) => /* @__PURE__ */ React.createElement("div", {
77
106
  role: "list",
78
- className: "flex flex-col w-full"
79
- }, triggers2?.map((trigger2) => {
107
+ className: "flex flex-col is-full"
108
+ }, filteredTriggers2?.map((trigger2) => {
80
109
  const copyAction = getCopyAction(client, trigger2);
81
110
  return /* @__PURE__ */ React.createElement(List.Item, {
82
111
  key: trigger2.id,
83
112
  item: trigger2,
84
- classNames: mx(grid, ghostHover, "items-center", "px-2")
113
+ classNames: mx(grid, ghostHover, "items-center", "pli-2")
85
114
  }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
86
115
  checked: trigger2.enabled,
87
116
  onCheckedChange: (checked) => trigger2.enabled = checked
88
117
  })), /* @__PURE__ */ React.createElement("div", {
89
118
  className: "flex"
90
119
  }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
91
- classNames: "px-1 cursor-pointer w-0 shrink truncate",
120
+ classNames: "pli-1 cursor-pointer is-0 shrink truncate",
92
121
  onClick: () => handleSelect(trigger2)
93
- }, getFunctionName(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
122
+ }, getFunctionName(functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
94
123
  label: t(copyAction.translationKey),
95
124
  value: copyAction.contentProvider()
96
125
  })), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
97
126
  onClick: () => handleDelete(trigger2)
98
127
  }));
99
- }))), triggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
128
+ }))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
100
129
  classNames: "mlb-4"
101
130
  }), /* @__PURE__ */ React.createElement(IconButton, {
102
131
  icon: "ph--plus--regular",
@@ -108,13 +137,13 @@ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
108
137
  }
109
138
  };
110
139
  var getCopyAction = (client, trigger) => {
111
- if (trigger?.spec?.kind === TriggerKind.Email) {
140
+ if (trigger?.spec?.kind === "email") {
112
141
  return {
113
142
  translationKey: "trigger copy email",
114
143
  contentProvider: () => `${getSpace(trigger).id}@dxos.network`
115
144
  };
116
145
  }
117
- if (trigger?.spec?.kind === TriggerKind.Webhook) {
146
+ if (trigger?.spec?.kind === "webhook") {
118
147
  return {
119
148
  translationKey: "trigger copy url",
120
149
  contentProvider: () => getWebhookUrl(client, trigger)
@@ -129,14 +158,29 @@ var getWebhookUrl = (client, trigger) => {
129
158
  edgeUrl.protocol = isSecure ? "https" : "http";
130
159
  return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
131
160
  };
132
- var getFunctionName = (scripts, functions, trigger) => {
161
+ var getFunctionName = (functions, trigger) => {
133
162
  const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}\u2026`;
134
163
  const functionObject = functions.find((fn) => fn === trigger.function?.target);
135
- if (!functionObject) {
136
- return shortId;
164
+ return functionObject?.name ?? shortId;
165
+ };
166
+ var scriptMatch = (script) => (trigger) => {
167
+ const fn = trigger.function?.target;
168
+ if (!Obj.instanceOf(Function.Function, fn)) {
169
+ return false;
137
170
  }
138
- return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
171
+ return fn.source?.target === script;
172
+ };
173
+ var projectMatch = (project) => {
174
+ const viewQueries = EFn.pipe(project.columns, Array.map((column) => column.view.target), Array.filter(isNonNullable), Array.map((view) => Obj.getSnapshot(view).query.ast), Array.map((ast) => JSON.stringify(ast)));
175
+ return (trigger) => {
176
+ const spec = Obj.getSnapshot(trigger).spec;
177
+ if (spec?.kind !== "subscription") {
178
+ return false;
179
+ }
180
+ return viewQueries.some((query) => JSON.stringify(spec.query) === query);
181
+ };
139
182
  };
183
+ 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));
140
184
 
141
185
  // src/components/AutomationPanel/index.ts
142
186
  var AutomationPanel_default = AutomationPanel;
@@ -145,4 +189,4 @@ export {
145
189
  AutomationPanel,
146
190
  AutomationPanel_default
147
191
  };
148
- //# sourceMappingURL=chunk-HIMYPGHF.mjs.map
192
+ //# sourceMappingURL=chunk-F76XVENA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as EFn from 'effect/Function';\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\nimport React, { useMemo, useState } from 'react';\n\nimport { Filter, Obj, Tag } from '@dxos/echo';\nimport { Function, Script, Trigger } from '@dxos/functions';\nimport { useTypeOptions } from '@dxos/plugin-space';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { type Space, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Clipboard, IconButton, Input, Separator, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { ControlItem, controlItemClasses } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\nimport { Project } from '@dxos/types';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = ThemedClassName<{\n space: Space;\n object?: Obj.Any;\n initialTrigger?: Trigger.Trigger;\n onDone?: () => void;\n}>;\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }: AutomationPanelProps) => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const functions = useQuery(space, Filter.type(Function.Function));\n const triggers = useQuery(space, Filter.type(Trigger.Trigger));\n const filteredTriggers = useMemo(() => {\n return object ? triggers.filter(triggerMatch(object)) : triggers;\n }, [object, triggers]);\n const tags = useQuery(space, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n space,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n registered: ['registered'],\n },\n });\n\n const [trigger, setTrigger] = useState<Trigger.Trigger | undefined>(initialTrigger);\n const [selected, setSelected] = useState<Trigger.Trigger>();\n\n const handleSelect = (trigger: Trigger.Trigger) => {\n setTrigger(trigger);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(Trigger.make({}));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: Trigger.Trigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(Trigger.make(trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n onDone?.();\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n onDone?.();\n };\n\n if (trigger) {\n return (\n <ControlItem title={t('trigger editor title')}>\n <TriggerEditor\n space={space}\n trigger={trigger}\n readonlySpec={Boolean(object)}\n tags={tags}\n types={types}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </ControlItem>\n );\n }\n\n return (\n <div className={mx(controlItemClasses, classNames)}>\n {filteredTriggers.length > 0 && (\n <List.Root<Trigger.Trigger>\n items={filteredTriggers}\n isItem={Schema.is(Trigger.Trigger)}\n getId={(field) => field.id}\n >\n {({ items: filteredTriggers }) => (\n <div role='list' className='flex flex-col is-full'>\n {filteredTriggers?.map((trigger) => {\n const copyAction = getCopyAction(client, trigger);\n return (\n <List.Item<Trigger.Trigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center', 'pli-2')}\n >\n <Input.Root>\n <Input.Switch\n checked={trigger.enabled}\n onCheckedChange={(checked) => (trigger.enabled = checked)}\n />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle\n classNames='pli-1 cursor-pointer is-0 shrink truncate'\n onClick={() => handleSelect(trigger)}\n >\n {getFunctionName(functions, trigger) ?? '∅'}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose copy action */}\n {copyAction && (\n <Clipboard.IconButton\n label={t(copyAction.translationKey)}\n value={copyAction.contentProvider()}\n />\n )}\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n );\n })}\n </div>\n )}\n </List.Root>\n )}\n {filteredTriggers.length > 0 && <Separator classNames='mlb-4' />}\n <IconButton icon='ph--plus--regular' label={t('new trigger label')} onClick={handleAdd} />\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: Trigger.Trigger | undefined) => {\n if (trigger?.spec?.kind === 'email') {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.kind === 'webhook') {\n return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };\n }\n\n return undefined;\n};\n\nconst getWebhookUrl = (client: Client, trigger: Trigger.Trigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (functions: Function.Function[], trigger: Trigger.Trigger) => {\n // TODO(wittjosiah): Truncation should be done in the UI.\n // Warning that the List component is currently a can of worms.\n const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}…`;\n const functionObject = functions.find((fn) => fn === trigger.function?.target);\n return functionObject?.name ?? shortId;\n};\n\nconst scriptMatch = (script: Script.Script) => (trigger: Trigger.Trigger) => {\n const fn = trigger.function?.target;\n if (!Obj.instanceOf(Function.Function, fn)) {\n return false;\n }\n\n return fn.source?.target === script;\n};\n\nconst projectMatch = (project: Project.Project) => {\n const viewQueries = EFn.pipe(\n project.columns,\n Array.map((column) => column.view.target),\n Array.filter(isNonNullable),\n Array.map((view) => Obj.getSnapshot(view).query.ast),\n Array.map((ast) => JSON.stringify(ast)),\n );\n\n return (trigger: Trigger.Trigger) => {\n const spec = Obj.getSnapshot(trigger).spec;\n if (spec?.kind !== 'subscription') {\n return false;\n }\n\n // TODO(wittjosiah): Implement better way of comparing query ASTs.\n return viewQueries.some((query) => JSON.stringify(spec.query) === query);\n };\n};\n\nconst triggerMatch = Match.type<Obj.Any>().pipe(\n Match.withReturnType<(trigger: Trigger.Trigger) => boolean>(),\n Match.when(\n (obj) => Obj.instanceOf(Script.Script, obj),\n (obj) => scriptMatch(obj),\n ),\n Match.when(\n (obj) => Obj.instanceOf(Project.Project, obj),\n (obj) => projectMatch(obj),\n ),\n Match.orElse((_obj) => () => true),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport * from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
+ "mappings": ";;;;;;;;;;AAIA,YAAYA,WAAW;AACvB,YAAYC,SAAS;AACrB,YAAYC,WAAW;AACvB,YAAYC,YAAY;AACxB,OAAOC,SAASC,SAASC,gBAAgB;AAEzC,SAASC,QAAQC,KAAKC,WAAW;AACjC,SAASC,UAAUC,QAAQC,eAAe;AAC1C,SAASC,sBAAsB;AAC/B,SAAsBC,iBAAiB;AACvC,SAAqBC,UAAUC,gBAAgB;AAC/C,SAASC,WAAWC,YAAYC,OAAOC,WAAiCC,sBAAsB;AAC9F,SAASC,aAAaC,0BAA0B;AAChD,SAASC,YAAY;AACrB,SAASC,YAAYC,UAAU;AAC/B,SAASC,eAAe;AACxB,SAASC,qBAAqB;AAK9B,IAAMC,OAAO;AAUN,IAAMC,kBAAkB,CAAC,EAAEC,YAAYC,OAAOC,QAAQC,gBAAgBC,OAAM,MAAwB;;;AACzG,UAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,EAAE;AACpC,UAAMC,SAASC,UAAAA;AACf,UAAMC,YAAYC,SAASX,OAAOY,OAAOC,KAAKC,SAASA,QAAQ,CAAA;AAC/D,UAAMC,WAAWJ,SAASX,OAAOY,OAAOC,KAAKG,QAAQA,OAAO,CAAA;AAC5D,UAAMC,mBAAmBC,QAAQ,MAAA;AAC/B,aAAOjB,SAASc,SAASI,OAAOC,aAAanB,MAAAA,CAAAA,IAAWc;IAC1D,GAAG;MAACd;MAAQc;KAAS;AACrB,UAAMM,OAAOV,SAASX,OAAOY,OAAOC,KAAKS,IAAIA,GAAG,CAAA;AAChD,UAAMC,QAAQC,eAAe;MAC3BxB;MACAyB,YAAY;QACVC,UAAU;UAAC;UAAY;;QACvBC,MAAM;UAAC;;QACPC,YAAY;UAAC;;MACf;IACF,CAAA;AAEA,UAAM,CAACC,SAASC,UAAAA,IAAcC,SAAsC7B,cAAAA;AACpE,UAAM,CAAC8B,UAAUC,WAAAA,IAAeF,SAAAA;AAEhC,UAAMG,eAAe,CAACL,aAAAA;AACpBC,iBAAWD,QAAAA;AACXI,kBAAYJ,QAAAA;IACd;AAEA,UAAMM,YAAY,MAAA;AAChBL,iBAAWd,QAAQoB,KAAK,CAAC,CAAA,CAAA;AACzBH,kBAAYI,MAAAA;IACd;AAEA,UAAMC,eAAe,CAACT,aAAAA;AACpB7B,YAAMuC,GAAGC,OAAOX,QAAAA;AAChBC,iBAAWO,MAAAA;AACXJ,kBAAYI,MAAAA;IACd;AAEA,UAAMI,aAA2C,CAACZ,aAAAA;AAChD,UAAIG,UAAU;AACZU,eAAOC,OAAOX,UAAUH,QAAAA;MAC1B,OAAO;AACL7B,cAAMuC,GAAGK,IAAI5B,QAAQoB,KAAKP,QAAAA,CAAAA;MAC5B;AAEAC,iBAAWO,MAAAA;AACXJ,kBAAYI,MAAAA;AACZlC,eAAAA;IACF;AAEA,UAAM0C,eAA+C,MAAA;AACnDf,iBAAWO,MAAAA;AACXlC,eAAAA;IACF;AAEA,QAAI0B,SAAS;AACX,aACE,sBAAA,cAACiB,aAAAA;QAAYC,OAAO3C,EAAE,sBAAA;SACpB,sBAAA,cAAC4C,eAAAA;QACChD;QACA6B;QACAoB,cAAcC,QAAQjD,MAAAA;QACtBoB;QACAE;QACA4B,QAAQV;QACRW,UAAUP;;IAIlB;AAEA,WACE,sBAAA,cAACQ,OAAAA;MAAIC,WAAWC,GAAGC,oBAAoBzD,UAAAA;OACpCkB,iBAAiBwC,SAAS,KACzB,sBAAA,cAACC,KAAKC,MAAI;MACRC,OAAO3C;MACP4C,QAAeC,UAAG9C,QAAQA,OAAO;MACjC+C,OAAO,CAACC,UAAUA,MAAMzD;OAEvB,CAAC,EAAEqD,OAAO3C,kBAAgB,MACzB,sBAAA,cAACoC,OAAAA;MAAIY,MAAK;MAAOX,WAAU;OACxBrC,mBAAkBiD,IAAI,CAACrC,aAAAA;AACtB,YAAMsC,aAAaC,cAAc5D,QAAQqB,QAAAA;AACzC,aACE,sBAAA,cAAC6B,KAAKW,MAAI;QACRC,KAAKzC,SAAQtB;QACbgE,MAAM1C;QACN9B,YAAYwD,GAAG1D,MAAM2E,YAAY,gBAAgB,OAAA;SAEjD,sBAAA,cAACC,MAAMd,MAAI,MACT,sBAAA,cAACc,MAAMC,QAAM;QACXC,SAAS9C,SAAQ+C;QACjBC,iBAAiB,CAACF,YAAa9C,SAAQ+C,UAAUD;WAIrD,sBAAA,cAACtB,OAAAA;QAAIC,WAAW;SACd,sBAAA,cAACI,KAAKoB,WAAS;QACb/E,YAAW;QACXgF,SAAS,MAAM7C,aAAaL,QAAAA;SAE3BmD,gBAAgBtE,WAAWmB,QAAAA,KAAY,QAAA,GAIzCsC,cACC,sBAAA,cAACc,UAAUC,YAAU;QACnBC,OAAO/E,EAAE+D,WAAWiB,cAAc;QAClCC,OAAOlB,WAAWmB,gBAAe;WAKvC,sBAAA,cAAC5B,KAAK6B,kBAAgB;QAACR,SAAS,MAAMzC,aAAaT,QAAAA;;IAGzD,CAAA,CAAA,CAAA,GAKPZ,iBAAiBwC,SAAS,KAAK,sBAAA,cAAC+B,WAAAA;MAAUzF,YAAW;QACtD,sBAAA,cAACmF,YAAAA;MAAWO,MAAK;MAAoBN,OAAO/E,EAAE,mBAAA;MAAsB2E,SAAS5C;;;;;AAGnF;AAEA,IAAMiC,gBAAgB,CAAC5D,QAAgBqB,YAAAA;AACrC,MAAIA,SAAS6D,MAAM/D,SAAS,SAAS;AACnC,WAAO;MAAEyD,gBAAgB;MAAsBE,iBAAiB,MAAM,GAAGK,SAAS9D,OAAAA,EAAUtB,EAAE;IAAgB;EAChH;AAEA,MAAIsB,SAAS6D,MAAM/D,SAAS,WAAW;AACrC,WAAO;MAAEyD,gBAAgB;MAAoBE,iBAAiB,MAAMM,cAAcpF,QAAQqB,OAAAA;IAAS;EACrG;AAEA,SAAOQ;AACT;AAEA,IAAMuD,gBAAgB,CAACpF,QAAgBqB,YAAAA;AACrC,QAAMgE,UAAUF,SAAS9D,OAAAA,EAAUtB;AACnC,QAAMuF,UAAU,IAAIC,IAAIvF,OAAOwF,OAAOC,OAAOC,QAASC,SAAUC,KAAMC,GAAG;AACzE,QAAMC,WAAWR,QAAQS,SAASC,WAAW,OAAA,KAAYV,QAAQS,SAASC,WAAW,KAAA;AACrFV,UAAQS,WAAWD,WAAW,UAAU;AACxC,SAAO,IAAIP,IAAI,YAAYF,OAAAA,IAAWhE,QAAQtB,EAAE,IAAIuF,OAAAA,EAASW,SAAQ;AACvE;AAEA,IAAMzB,kBAAkB,CAACtE,WAAgCmB,YAAAA;AAGvD,QAAM6E,UAAU7E,QAAQ8E,YAAY,GAAG9E,QAAQ8E,SAASC,IAAIH,SAAQ,EAAGI,MAAM,GAAG,EAAA,CAAA;AAChF,QAAMC,iBAAiBpG,UAAUqG,KAAK,CAACC,OAAOA,OAAOnF,QAAQ8E,UAAUM,MAAAA;AACvE,SAAOH,gBAAgBI,QAAQR;AACjC;AAEA,IAAMS,cAAc,CAACC,WAA0B,CAACvF,YAAAA;AAC9C,QAAMmF,KAAKnF,QAAQ8E,UAAUM;AAC7B,MAAI,CAACI,IAAIC,WAAWxG,SAASA,UAAUkG,EAAAA,GAAK;AAC1C,WAAO;EACT;AAEA,SAAOA,GAAGO,QAAQN,WAAWG;AAC/B;AAEA,IAAMI,eAAe,CAACC,YAAAA;AACpB,QAAMC,cAAkBC,SACtBF,QAAQG,SACF1D,UAAI,CAAC2D,WAAWA,OAAOC,KAAKb,MAAM,GAClC9F,aAAO4G,aAAAA,GACP7D,UAAI,CAAC4D,SAAST,IAAIW,YAAYF,IAAAA,EAAMG,MAAMC,GAAG,GAC7ChE,UAAI,CAACgE,QAAQC,KAAKC,UAAUF,GAAAA,CAAAA,CAAAA;AAGpC,SAAO,CAACrG,YAAAA;AACN,UAAM6D,OAAO2B,IAAIW,YAAYnG,OAAAA,EAAS6D;AACtC,QAAIA,MAAM/D,SAAS,gBAAgB;AACjC,aAAO;IACT;AAGA,WAAO+F,YAAYW,KAAK,CAACJ,UAAUE,KAAKC,UAAU1C,KAAKuC,KAAK,MAAMA,KAAAA;EACpE;AACF;AAEA,IAAM7G,eAAqBP,WAAI,EAAY8G,KACnCW,qBAAc,GACdC,WACJ,CAACC,QAAQnB,IAAIC,WAAWmB,OAAOA,QAAQD,GAAAA,GACvC,CAACA,QAAQrB,YAAYqB,GAAAA,CAAAA,GAEjBD,WACJ,CAACC,QAAQnB,IAAIC,WAAWoB,QAAQA,SAASF,GAAAA,GACzC,CAACA,QAAQhB,aAAagB,GAAAA,CAAAA,GAElBG,aAAO,CAACC,SAAS,MAAM,IAAA,CAAA;;;AC5N/B,IAAA,0BAAeC;",
6
+ "names": ["Array", "EFn", "Match", "Schema", "React", "useMemo", "useState", "Filter", "Obj", "Tag", "Function", "Script", "Trigger", "useTypeOptions", "useClient", "getSpace", "useQuery", "Clipboard", "IconButton", "Input", "Separator", "useTranslation", "ControlItem", "controlItemClasses", "List", "ghostHover", "mx", "Project", "isNonNullable", "grid", "AutomationPanel", "classNames", "space", "object", "initialTrigger", "onDone", "t", "useTranslation", "meta", "id", "client", "useClient", "functions", "useQuery", "Filter", "type", "Function", "triggers", "Trigger", "filteredTriggers", "useMemo", "filter", "triggerMatch", "tags", "Tag", "types", "useTypeOptions", "annotation", "location", "kind", "registered", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "handleAdd", "make", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "ControlItem", "title", "TriggerEditor", "readonlySpec", "Boolean", "onSave", "onCancel", "div", "className", "mx", "controlItemClasses", "length", "List", "Root", "items", "isItem", "is", "getId", "field", "role", "map", "copyAction", "getCopyAction", "Item", "key", "item", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Clipboard", "IconButton", "label", "translationKey", "value", "contentProvider", "ItemDeleteButton", "Separator", "icon", "spec", "getSpace", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "values", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "dxn", "slice", "functionObject", "find", "fn", "target", "name", "scriptMatch", "script", "Obj", "instanceOf", "source", "projectMatch", "project", "viewQueries", "pipe", "columns", "column", "view", "isNonNullable", "getSnapshot", "query", "ast", "JSON", "stringify", "some", "withReturnType", "when", "obj", "Script", "Project", "orElse", "_obj", "AutomationPanel"]
7
+ }
@@ -0,0 +1,16 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ meta
4
+ } from "./chunk-CEVIVRTY.mjs";
5
+
6
+ // src/capabilities/capabilities.ts
7
+ import { defineCapability } from "@dxos/app-framework";
8
+ (function(AutomationCapabilities2) {
9
+ AutomationCapabilities2.ComputeRuntime = defineCapability(`${meta.id}/capability/compute-runtime`);
10
+ })(AutomationCapabilities || (AutomationCapabilities = {}));
11
+ var AutomationCapabilities;
12
+
13
+ export {
14
+ AutomationCapabilities
15
+ };
16
+ //# sourceMappingURL=chunk-KB7NFEYY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/capabilities.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as ManagedRuntime from 'effect/ManagedRuntime';\n\nimport { type AiService, type ToolExecutionService, type ToolResolverService } from '@dxos/ai';\nimport { defineCapability } from '@dxos/app-framework';\nimport type { CredentialsService, DatabaseService, FunctionInvocationService, QueueService } from '@dxos/functions';\nimport type { InvocationTracer, TriggerDispatcher, TriggerStateStore } from '@dxos/functions-runtime';\nimport type { SpaceId } from '@dxos/keys';\n\nimport { meta } from '../meta';\n\nexport namespace AutomationCapabilities {\n /**\n * Service stack for executing agents, functions, and triggers.\n */\n export type ComputeServices =\n | TriggerDispatcher\n | AiService.AiService\n | DatabaseService\n | QueueService\n | CredentialsService\n | FunctionInvocationService\n | InvocationTracer\n | TriggerStateStore\n // TODO(dmaretskyi): Those should be provided at AI-chat call site.\n | ToolResolverService\n | ToolExecutionService;\n\n export type ComputeRuntime = ManagedRuntime.ManagedRuntime<AutomationCapabilities.ComputeServices, never>;\n export interface ComputeRuntimeProvider {\n getRuntime(spaceId: SpaceId): ComputeRuntime;\n }\n\n /**\n * Runtime for executing agents, functions, and triggers.\n */\n export const ComputeRuntime = defineCapability<ComputeRuntimeProvider>(`${meta.id}/capability/compute-runtime`);\n}\n"],
5
+ "mappings": ";;;;;;AAOA,SAASA,wBAAwB;UAOhBC,yBAAAA;0BAyBFC,iBAAiBC,iBAAyC,GAAGC,KAAKC,EAAE,6BAA6B;AAChH,GA1BiBJ,2BAAAA,yBAAAA,CAAAA,EAAAA;;",
6
+ "names": ["defineCapability", "AutomationCapabilities", "ComputeRuntime", "defineCapability", "meta", "id"]
7
+ }
@@ -1,16 +1,19 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- AUTOMATION_PLUGIN
4
- } from "./chunk-NK5N3QKD.mjs";
3
+ meta
4
+ } from "./chunk-CEVIVRTY.mjs";
5
5
 
6
6
  // src/components/FunctionsPanel/FunctionsPanel.tsx
7
7
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
8
- import { Schema } from "effect";
8
+ import * as Schema from "effect/Schema";
9
9
  import React, { useCallback, useMemo } from "react";
10
- import { createIntent, LayoutAction, useIntentDispatcher } from "@dxos/app-framework";
11
- import { FunctionType, ScriptType } from "@dxos/functions";
12
- import { Filter, fullyQualifiedId, useQuery } from "@dxos/react-client/echo";
13
- import { Button, useTranslation } from "@dxos/react-ui";
10
+ import { LayoutAction, createIntent } from "@dxos/app-framework";
11
+ import { useIntentDispatcher } from "@dxos/app-framework/react";
12
+ import { Obj } from "@dxos/echo";
13
+ import { Function, Script } from "@dxos/functions";
14
+ import { SpaceAction } from "@dxos/plugin-space/types";
15
+ import { Filter, useQuery } from "@dxos/react-client/echo";
16
+ import { Button, IconButton, useTranslation } from "@dxos/react-ui";
14
17
  import { controlItemClasses } from "@dxos/react-ui-form";
15
18
  import { List } from "@dxos/react-ui-list";
16
19
  import { ghostHover, mx } from "@dxos/react-ui-theme";
@@ -18,9 +21,9 @@ var grid = "grid grid-cols-[1fr_auto] min-bs-[2.5rem]";
18
21
  var FunctionsPanel = ({ space }) => {
19
22
  var _effect = _useSignals();
20
23
  try {
21
- const { t } = useTranslation(AUTOMATION_PLUGIN);
22
- const functions = useQuery(space, Filter.type(FunctionType));
23
- const scripts = useQuery(space, Filter.type(ScriptType));
24
+ const { t } = useTranslation(meta.id);
25
+ const functions = useQuery(space, Filter.type(Function.Function));
26
+ const scripts = useQuery(space, Filter.type(Script.Script));
24
27
  const { dispatchPromise: dispatch } = useIntentDispatcher();
25
28
  const functionToScriptMap = useMemo(() => functions.reduce((map, func) => {
26
29
  const scriptId = func.source?.target?.id;
@@ -47,7 +50,7 @@ var FunctionsPanel = ({ space }) => {
47
50
  void dispatch(createIntent(LayoutAction.Open, {
48
51
  part: "main",
49
52
  subject: [
50
- fullyQualifiedId(script)
53
+ Obj.getDXN(script).toString()
51
54
  ]
52
55
  }));
53
56
  }
@@ -55,16 +58,23 @@ var FunctionsPanel = ({ space }) => {
55
58
  functionToScriptMap,
56
59
  dispatch
57
60
  ]);
61
+ const handleDelete = useCallback((func) => dispatch(createIntent(SpaceAction.RemoveObjects, {
62
+ objects: [
63
+ func
64
+ ]
65
+ })), [
66
+ dispatch
67
+ ]);
58
68
  return /* @__PURE__ */ React.createElement("div", {
59
69
  role: "none",
60
70
  className: mx(controlItemClasses)
61
71
  }, functions.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
62
72
  items: functions,
63
- isItem: Schema.is(FunctionType),
73
+ isItem: Schema.is(Function.Function),
64
74
  getId: (func) => func.id
65
75
  }, ({ items }) => /* @__PURE__ */ React.createElement("div", {
66
76
  role: "list",
67
- className: "flex flex-col w-full"
77
+ className: "flex flex-col is-full"
68
78
  }, items?.map((func) => /* @__PURE__ */ React.createElement(List.Item, {
69
79
  key: func.id,
70
80
  item: func,
@@ -77,7 +87,12 @@ var FunctionsPanel = ({ space }) => {
77
87
  className: "text-xs text-description truncate"
78
88
  }, getScriptName(func))), functionToScriptMap[func.id] && /* @__PURE__ */ React.createElement(Button, {
79
89
  onClick: () => handleGoToScript(func)
80
- }, t("go to function source button label")))))), functions.length === 0 && /* @__PURE__ */ React.createElement("div", {
90
+ }, t("go to function source button label")), /* @__PURE__ */ React.createElement(IconButton, {
91
+ iconOnly: true,
92
+ icon: "ph--trash--regular",
93
+ label: t("delete function button label"),
94
+ onClick: () => handleDelete(func)
95
+ }))))), functions.length === 0 && /* @__PURE__ */ React.createElement("div", {
81
96
  className: "text-center plb-4 text-gray-500"
82
97
  }, t("no functions found")));
83
98
  } finally {
@@ -92,4 +107,4 @@ export {
92
107
  FunctionsPanel,
93
108
  FunctionsPanel_default
94
109
  };
95
- //# sourceMappingURL=chunk-ZGPUV5VS.mjs.map
110
+ //# sourceMappingURL=chunk-RVK52XGK.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/FunctionsPanel/FunctionsPanel.tsx", "../../../src/components/FunctionsPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { LayoutAction, createIntent } from '@dxos/app-framework';\nimport { useIntentDispatcher } from '@dxos/app-framework/react';\nimport { Obj } from '@dxos/echo';\nimport { Function, Script } from '@dxos/functions';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\nimport { Button, IconButton, useTranslation } from '@dxos/react-ui';\nimport { controlItemClasses } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../../meta';\n\nconst grid = 'grid grid-cols-[1fr_auto] min-bs-[2.5rem]';\n\nexport type FunctionsPanelProps = {\n space: Space;\n};\n\nexport const FunctionsPanel = ({ space }: FunctionsPanelProps) => {\n const { t } = useTranslation(meta.id);\n const functions = useQuery(space, Filter.type(Function.Function));\n const scripts = useQuery(space, Filter.type(Script.Script));\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const functionToScriptMap = useMemo(\n () =>\n functions.reduce(\n (map, func) => {\n const scriptId = func.source?.target?.id;\n if (scriptId) {\n const script = scripts.find((s) => s.id === scriptId);\n if (script) {\n map[func.id] = script;\n }\n }\n return map;\n },\n {} as Record<string, Script.Script>,\n ),\n [functions, scripts],\n );\n\n const getScriptName = useCallback(\n (func: Function.Function) => {\n const script = functionToScriptMap[func.id];\n return script?.name;\n },\n [functionToScriptMap],\n );\n\n const handleGoToScript = useCallback(\n (func: Function.Function) => {\n const script = functionToScriptMap[func.id];\n if (script) {\n void dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n subject: [Obj.getDXN(script).toString()],\n }),\n );\n }\n },\n [functionToScriptMap, dispatch],\n );\n\n const handleDelete = useCallback(\n (func: Function.Function) => dispatch(createIntent(SpaceAction.RemoveObjects, { objects: [func] })),\n [dispatch],\n );\n\n return (\n <div role='none' className={mx(controlItemClasses)}>\n {functions.length > 0 && (\n <List.Root<Function.Function> items={functions} isItem={Schema.is(Function.Function)} getId={(func) => func.id}>\n {({ items }) => (\n <div role='list' className='flex flex-col is-full'>\n {items?.map((func) => (\n <List.Item<Function.Function>\n key={func.id}\n item={func}\n classNames={mx(grid, ghostHover, 'items-center', 'pli-2', 'min-bs-[3rem]')}\n >\n <div className='flex flex-col truncate'>\n <List.ItemTitle classNames='truncate'>{func.name}</List.ItemTitle>\n {getScriptName(func) && (\n <div className='text-xs text-description truncate'>{getScriptName(func)}</div>\n )}\n </div>\n {functionToScriptMap[func.id] && (\n <Button onClick={() => handleGoToScript(func)}>{t('go to function source button label')}</Button>\n )}\n <IconButton\n iconOnly\n icon='ph--trash--regular'\n label={t('delete function button label')}\n onClick={() => handleDelete(func)}\n />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n )}\n\n {functions.length === 0 && <div className='text-center plb-4 text-gray-500'>{t('no functions found')}</div>}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { FunctionsPanel } from './FunctionsPanel';\n\nexport * from './FunctionsPanel';\nexport default FunctionsPanel;\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "React", "useCallback", "useMemo", "LayoutAction", "createIntent", "useIntentDispatcher", "Obj", "Function", "Script", "SpaceAction", "Filter", "useQuery", "Button", "IconButton", "useTranslation", "controlItemClasses", "List", "ghostHover", "mx", "grid", "FunctionsPanel", "space", "t", "useTranslation", "meta", "id", "functions", "useQuery", "Filter", "type", "Function", "scripts", "Script", "dispatchPromise", "dispatch", "useIntentDispatcher", "functionToScriptMap", "useMemo", "reduce", "map", "func", "scriptId", "source", "target", "script", "find", "s", "getScriptName", "useCallback", "name", "handleGoToScript", "createIntent", "LayoutAction", "Open", "part", "subject", "Obj", "getDXN", "toString", "handleDelete", "SpaceAction", "RemoveObjects", "objects", "div", "role", "className", "mx", "controlItemClasses", "length", "List", "Root", "items", "isItem", "is", "getId", "Item", "key", "item", "classNames", "ghostHover", "ItemTitle", "Button", "onClick", "IconButton", "iconOnly", "icon", "label", "FunctionsPanel"]
7
+ }
@@ -0,0 +1,114 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ AutomationCapabilities
4
+ } from "./chunk-KB7NFEYY.mjs";
5
+ import "./chunk-CEVIVRTY.mjs";
6
+
7
+ // src/capabilities/compute-runtime.ts
8
+ import * as BrowserKeyValueStore from "@effect/platform-browser/BrowserKeyValueStore";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Layer from "effect/Layer";
11
+ import * as ManagedRuntime from "effect/ManagedRuntime";
12
+ import { Capabilities, contributes } from "@dxos/app-framework";
13
+ import { GenericToolkit, makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from "@dxos/assistant";
14
+ import { Resource } from "@dxos/context";
15
+ import { Query, Ref } from "@dxos/echo";
16
+ import { CredentialsService, DatabaseService, QueueService } from "@dxos/functions";
17
+ import { FunctionImplementationResolver, FunctionInvocationServiceLayerWithLocalLoopbackExecutor, InvocationTracer, RemoteFunctionExecutionService, TriggerDispatcher } from "@dxos/functions-runtime";
18
+ import { TriggerStateStore } from "@dxos/functions-runtime";
19
+ import { invariant } from "@dxos/invariant";
20
+ import { ClientCapabilities } from "@dxos/plugin-client";
21
+ import { SpaceProperties } from "@dxos/react-client/echo";
22
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-automation/src/capabilities/compute-runtime.ts";
23
+ var compute_runtime_default = (async (context) => {
24
+ const provider = await new ComputeRuntimeProviderImpl(context).open();
25
+ return contributes(AutomationCapabilities.ComputeRuntime, provider, async () => {
26
+ await provider.close();
27
+ });
28
+ });
29
+ var ComputeRuntimeProviderImpl = class extends Resource {
30
+ #runtimes = /* @__PURE__ */ new Map();
31
+ #context;
32
+ constructor(context) {
33
+ super();
34
+ this.#context = context;
35
+ }
36
+ async _open() {
37
+ }
38
+ async _close() {
39
+ await Promise.all(Array.from(this.#runtimes.values()).map((rt) => rt.dispose()));
40
+ this.#runtimes.clear();
41
+ }
42
+ getRuntime(spaceId) {
43
+ if (this.#runtimes.has(spaceId)) {
44
+ return this.#runtimes.get(spaceId);
45
+ }
46
+ const layer = Layer.unwrapEffect(Effect.gen(this, function* () {
47
+ const client = this.#context.getCapability(ClientCapabilities.Client);
48
+ const serviceLayer = this.#context.getCapability(Capabilities.AiServiceLayer) ?? Layer.die("AiService not found");
49
+ const functions = this.#context.getCapabilities(Capabilities.Functions).flat();
50
+ const toolkits = this.#context.getCapabilities(Capabilities.Toolkit);
51
+ const mergedToolkit = GenericToolkit.merge(...toolkits);
52
+ const toolkit = mergedToolkit.toolkit;
53
+ const toolkitLayer = mergedToolkit.layer;
54
+ const space = client.spaces.get(spaceId);
55
+ invariant(space, void 0, {
56
+ F: __dxlog_file,
57
+ L: 72,
58
+ S: this,
59
+ A: [
60
+ "space",
61
+ ""
62
+ ]
63
+ });
64
+ yield* Effect.promise(() => space.waitUntilReady());
65
+ return Layer.mergeAll(TriggerDispatcher.layer({
66
+ timeControl: "natural"
67
+ })).pipe(Layer.provideMerge(Layer.mergeAll(InvocationTracerLive, TriggerStateStore.layerKv.pipe(Layer.provide(BrowserKeyValueStore.layerLocalStorage)), makeToolResolverFromFunctions(functions, toolkit), makeToolExecutionServiceFromFunctions(toolkit, toolkitLayer))), Layer.provideMerge(Layer.mergeAll(FunctionInvocationServiceLayerWithLocalLoopbackExecutor.pipe(Layer.provideMerge(FunctionImplementationResolver.layerTest({
68
+ functions
69
+ })), Layer.provideMerge(RemoteFunctionExecutionService.fromClient(
70
+ client,
71
+ // If agent is not enabled do not provide spaceId because space context will be unavailable on EDGE.
72
+ client.config.get("runtime.client.edgeFeatures.agents") ? spaceId : void 0
73
+ )), Layer.provideMerge(serviceLayer), Layer.provideMerge(CredentialsService.layerFromDatabase()), Layer.provideMerge(space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable), Layer.provideMerge(space ? QueueService.layer(space.queues) : QueueService.notAvailable)))));
74
+ }));
75
+ const runtime = ManagedRuntime.make(layer);
76
+ this.#runtimes.set(spaceId, runtime);
77
+ return runtime;
78
+ }
79
+ };
80
+ var InvocationTracerLive = Layer.unwrapEffect(Effect.gen(function* () {
81
+ const { objects: [properties] } = yield* DatabaseService.runQuery(Query.type(SpaceProperties));
82
+ invariant(properties, void 0, {
83
+ F: __dxlog_file,
84
+ L: 118,
85
+ S: this,
86
+ A: [
87
+ "properties",
88
+ ""
89
+ ]
90
+ });
91
+ if (!properties.invocationTraceQueue || !properties.invocationTraceQueue.target) {
92
+ const queue2 = yield* QueueService.createQueue({
93
+ subspaceTag: "trace"
94
+ });
95
+ properties.invocationTraceQueue = Ref.fromDXN(queue2.dxn);
96
+ }
97
+ const queue = properties.invocationTraceQueue.target;
98
+ invariant(queue, void 0, {
99
+ F: __dxlog_file,
100
+ L: 126,
101
+ S: this,
102
+ A: [
103
+ "queue",
104
+ ""
105
+ ]
106
+ });
107
+ return InvocationTracer.layerLive({
108
+ invocationTraceQueue: queue
109
+ });
110
+ }));
111
+ export {
112
+ compute_runtime_default as default
113
+ };
114
+ //# sourceMappingURL=compute-runtime-JUWTQXOV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/compute-runtime.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as BrowserKeyValueStore from '@effect/platform-browser/BrowserKeyValueStore';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\n\nimport { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';\nimport { GenericToolkit, makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';\nimport { Resource } from '@dxos/context';\nimport { Query, Ref } from '@dxos/echo';\nimport { CredentialsService, DatabaseService, QueueService } from '@dxos/functions';\nimport {\n FunctionImplementationResolver,\n FunctionInvocationServiceLayerWithLocalLoopbackExecutor,\n InvocationTracer,\n RemoteFunctionExecutionService,\n TriggerDispatcher,\n} from '@dxos/functions-runtime';\nimport { TriggerStateStore } from '@dxos/functions-runtime';\nimport { invariant } from '@dxos/invariant';\nimport { type SpaceId } from '@dxos/keys';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { SpaceProperties } from '@dxos/react-client/echo';\n\nimport { AutomationCapabilities } from './capabilities';\n\nexport default async (context: PluginContext) => {\n const provider = await new ComputeRuntimeProviderImpl(context).open();\n return contributes(AutomationCapabilities.ComputeRuntime, provider, async () => {\n await provider.close();\n });\n};\n\nclass ComputeRuntimeProviderImpl extends Resource implements AutomationCapabilities.ComputeRuntimeProvider {\n readonly #runtimes = new Map<SpaceId, AutomationCapabilities.ComputeRuntime>();\n readonly #context: PluginContext;\n\n constructor(context: PluginContext) {\n super();\n this.#context = context;\n }\n\n protected override async _open() {}\n\n protected override async _close() {\n await Promise.all(Array.from(this.#runtimes.values()).map((rt) => rt.dispose()));\n this.#runtimes.clear();\n }\n\n getRuntime(spaceId: SpaceId): AutomationCapabilities.ComputeRuntime {\n if (this.#runtimes.has(spaceId)) {\n return this.#runtimes.get(spaceId)!;\n }\n\n const layer = Layer.unwrapEffect(\n Effect.gen(this, function* () {\n const client = this.#context.getCapability(ClientCapabilities.Client);\n const serviceLayer =\n this.#context.getCapability(Capabilities.AiServiceLayer) ?? Layer.die('AiService not found');\n\n // TODO(dmaretskyi): Make these reactive.\n const functions = this.#context.getCapabilities(Capabilities.Functions).flat();\n const toolkits = this.#context.getCapabilities(Capabilities.Toolkit);\n const mergedToolkit = GenericToolkit.merge(...toolkits);\n const toolkit = mergedToolkit.toolkit;\n const toolkitLayer = mergedToolkit.layer;\n\n const space = client.spaces.get(spaceId);\n invariant(space);\n yield* Effect.promise(() => space.waitUntilReady());\n\n return Layer.mergeAll(TriggerDispatcher.layer({ timeControl: 'natural' })).pipe(\n Layer.provideMerge(\n Layer.mergeAll(\n InvocationTracerLive,\n TriggerStateStore.layerKv.pipe(Layer.provide(BrowserKeyValueStore.layerLocalStorage)),\n makeToolResolverFromFunctions(functions, toolkit),\n makeToolExecutionServiceFromFunctions(toolkit, toolkitLayer),\n ),\n ),\n Layer.provideMerge(\n Layer.mergeAll(\n FunctionInvocationServiceLayerWithLocalLoopbackExecutor.pipe(\n Layer.provideMerge(FunctionImplementationResolver.layerTest({ functions })),\n Layer.provideMerge(\n RemoteFunctionExecutionService.fromClient(\n client,\n // If agent is not enabled do not provide spaceId because space context will be unavailable on EDGE.\n client.config.get('runtime.client.edgeFeatures.agents') ? spaceId : undefined,\n ),\n ),\n Layer.provideMerge(serviceLayer),\n Layer.provideMerge(CredentialsService.layerFromDatabase()),\n Layer.provideMerge(space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable),\n Layer.provideMerge(space ? QueueService.layer(space.queues) : QueueService.notAvailable),\n ),\n ),\n ),\n );\n }),\n );\n\n const runtime = ManagedRuntime.make(layer);\n this.#runtimes.set(spaceId, runtime);\n\n return runtime;\n }\n}\n\nconst InvocationTracerLive = Layer.unwrapEffect(\n Effect.gen(function* () {\n const {\n objects: [properties],\n } = yield* DatabaseService.runQuery(Query.type(SpaceProperties));\n invariant(properties);\n // TODO(burdon): Check ref target has loaded?\n if (!properties.invocationTraceQueue || !properties.invocationTraceQueue.target) {\n const queue = yield* QueueService.createQueue({ subspaceTag: 'trace' });\n properties.invocationTraceQueue = Ref.fromDXN(queue.dxn);\n }\n\n const queue = properties.invocationTraceQueue.target;\n invariant(queue);\n return InvocationTracer.layerLive({ invocationTraceQueue: queue });\n }),\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["BrowserKeyValueStore", "Effect", "Layer", "ManagedRuntime", "Capabilities", "contributes", "GenericToolkit", "makeToolExecutionServiceFromFunctions", "makeToolResolverFromFunctions", "Resource", "Query", "Ref", "CredentialsService", "DatabaseService", "QueueService", "FunctionImplementationResolver", "FunctionInvocationServiceLayerWithLocalLoopbackExecutor", "InvocationTracer", "RemoteFunctionExecutionService", "TriggerDispatcher", "TriggerStateStore", "invariant", "ClientCapabilities", "SpaceProperties", "context", "provider", "ComputeRuntimeProviderImpl", "open", "contributes", "AutomationCapabilities", "ComputeRuntime", "close", "Resource", "Map", "_open", "_close", "Promise", "all", "Array", "from", "values", "map", "rt", "dispose", "clear", "getRuntime", "spaceId", "has", "get", "layer", "unwrapEffect", "gen", "client", "getCapability", "ClientCapabilities", "Client", "serviceLayer", "Capabilities", "AiServiceLayer", "die", "functions", "getCapabilities", "Functions", "flat", "toolkits", "Toolkit", "mergedToolkit", "GenericToolkit", "merge", "toolkit", "toolkitLayer", "space", "spaces", "invariant", "promise", "waitUntilReady", "mergeAll", "TriggerDispatcher", "timeControl", "pipe", "provideMerge", "InvocationTracerLive", "TriggerStateStore", "layerKv", "provide", "layerLocalStorage", "makeToolResolverFromFunctions", "makeToolExecutionServiceFromFunctions", "FunctionInvocationServiceLayerWithLocalLoopbackExecutor", "FunctionImplementationResolver", "layerTest", "RemoteFunctionExecutionService", "fromClient", "config", "undefined", "CredentialsService", "layerFromDatabase", "DatabaseService", "db", "notAvailable", "QueueService", "queues", "runtime", "make", "set", "objects", "properties", "runQuery", "Query", "type", "SpaceProperties", "invocationTraceQueue", "target", "queue", "createQueue", "subspaceTag", "Ref", "fromDXN", "dxn", "InvocationTracer", "layerLive"]
7
+ }
@@ -0,0 +1,14 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ invokeFunctionWithTracing,
4
+ useComputeRuntimeCallback,
5
+ useTriggerRuntimeControls
6
+ } from "../chunk-7B6NAAI6.mjs";
7
+ import "../chunk-KB7NFEYY.mjs";
8
+ import "../chunk-CEVIVRTY.mjs";
9
+ export {
10
+ invokeFunctionWithTracing,
11
+ useComputeRuntimeCallback,
12
+ useTriggerRuntimeControls
13
+ };
14
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }