@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,11 +1,11 @@
1
1
  import {
2
2
  AutomationPanel,
3
3
  AutomationPanel_default
4
- } from "./chunk-YWLEY2FD.mjs";
5
- import "./chunk-QW3EM35H.mjs";
4
+ } from "./chunk-C273ZYLE.mjs";
5
+ import "./chunk-JN7QRQQX.mjs";
6
6
  import "./chunk-PZNBEKO5.mjs";
7
7
  export {
8
8
  AutomationPanel,
9
9
  AutomationPanel_default as default
10
10
  };
11
- //# sourceMappingURL=AutomationPanel-FAS6ADCW.mjs.map
11
+ //# sourceMappingURL=AutomationPanel-C6MZ22CB.mjs.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  useTriggerRuntimeControls
3
- } from "./chunk-RAF2FJST.mjs";
3
+ } from "./chunk-P5AEO35Y.mjs";
4
4
  import "./chunk-JOXPQ27I.mjs";
5
5
  import {
6
6
  AutomationPanel
7
- } from "./chunk-YWLEY2FD.mjs";
8
- import "./chunk-QW3EM35H.mjs";
7
+ } from "./chunk-C273ZYLE.mjs";
8
+ import "./chunk-JN7QRQQX.mjs";
9
9
  import {
10
10
  meta
11
11
  } from "./chunk-PZNBEKO5.mjs";
@@ -13,18 +13,19 @@ import {
13
13
  // src/components/AutomationSettings.tsx
14
14
  import React2 from "react";
15
15
  import { useTranslation as useTranslation2 } from "@dxos/react-ui";
16
- import { ControlPage, ControlSection } from "@dxos/react-ui-form";
16
+ import { Settings as Settings2 } from "@dxos/react-ui-form";
17
17
 
18
18
  // src/components/TriggerSettings.tsx
19
19
  import React from "react";
20
20
  import { Input, useTranslation } from "@dxos/react-ui";
21
- import { ControlItemInput } from "@dxos/react-ui-form";
21
+ import { Settings } from "@dxos/react-ui-form";
22
22
  var TriggersSettings = ({ db }) => {
23
- const { triggers, isRunning, start, stop } = useTriggerRuntimeControls(db);
23
+ const { state, start, stop } = useTriggerRuntimeControls(db);
24
+ const isRunning = state?.enabled ?? false;
24
25
  const { t } = useTranslation(meta.id);
25
26
  return /* @__PURE__ */ React.createElement("div", {
26
27
  className: "container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]"
27
- }, /* @__PURE__ */ React.createElement(ControlItemInput, {
28
+ }, /* @__PURE__ */ React.createElement(Settings.ItemInput, {
28
29
  title: t("runtime label"),
29
30
  description: t("runtime description")
30
31
  }, /* @__PURE__ */ React.createElement(Input.Switch, {
@@ -37,7 +38,7 @@ var TriggersSettings = ({ db }) => {
37
38
  // src/components/AutomationSettings.tsx
38
39
  var AutomationSettings = (props) => {
39
40
  const { t } = useTranslation2(meta.id);
40
- return /* @__PURE__ */ React2.createElement(ControlPage, null, /* @__PURE__ */ React2.createElement(ControlSection, {
41
+ return /* @__PURE__ */ React2.createElement(Settings2.Root, null, /* @__PURE__ */ React2.createElement(Settings2.Section, {
41
42
  title: t("automation verbose label", {
42
43
  ns: meta.id
43
44
  }),
@@ -53,4 +54,4 @@ export {
53
54
  AutomationSettings,
54
55
  AutomationSettings_default as default
55
56
  };
56
- //# sourceMappingURL=AutomationSettings-XN2OIYWL.mjs.map
57
+ //# sourceMappingURL=AutomationSettings-D7UO5V3Q.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AutomationSettings.tsx", "../../../src/components/TriggerSettings.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { meta } from '../meta';\n\nimport { AutomationPanel, type AutomationPanelProps } from './AutomationPanel';\nimport { TriggersSettings } from './TriggerSettings';\n\nexport const AutomationSettings = (props: AutomationPanelProps) => {\n const { t } = useTranslation(meta.id);\n return (\n <Settings.Root>\n <Settings.Section\n title={t('automation verbose label', { ns: meta.id })}\n description={t('automation description', { ns: meta.id })}\n >\n <AutomationPanel {...props} />\n <TriggersSettings db={props.space.db} />\n </Settings.Section>\n </Settings.Root>\n );\n};\n\nexport default AutomationSettings;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Database } from '@dxos/echo';\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { useTriggerRuntimeControls } from '../hooks';\nimport { meta } from '../meta';\n\nexport const TriggersSettings = ({ db }: { db: Database.Database }) => {\n const { state, start, stop } = useTriggerRuntimeControls(db);\n const isRunning = state?.enabled ?? false;\n const { t } = useTranslation(meta.id);\n\n return (\n <div className='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'>\n <Settings.ItemInput title={t('runtime label')} description={t('runtime description')}>\n <Input.Switch classNames='justify-self-end' checked={isRunning} onCheckedChange={isRunning ? stop : start} />\n </Settings.ItemInput>\n </div>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;AAIA,OAAOA,YAAW;AAElB,SAASC,kBAAAA,uBAAsB;AAC/B,SAASC,YAAAA,iBAAgB;;;ACHzB,OAAOC,WAAW;AAGlB,SAASC,OAAOC,sBAAsB;AACtC,SAASC,gBAAgB;AAKlB,IAAMC,mBAAmB,CAAC,EAAEC,GAAE,MAA6B;AAChE,QAAM,EAAEC,OAAOC,OAAOC,KAAI,IAAKC,0BAA0BJ,EAAAA;AACzD,QAAMK,YAAYJ,OAAOK,WAAW;AACpC,QAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,EAAE;AAEpC,SACE,sBAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAACC,SAASC,WAAS;IAACC,OAAOR,EAAE,eAAA;IAAkBS,aAAaT,EAAE,qBAAA;KAC5D,sBAAA,cAACU,MAAMC,QAAM;IAACC,YAAW;IAAmBC,SAASf;IAAWgB,iBAAiBhB,YAAYF,OAAOD;;AAI5G;;;ADXO,IAAMoB,qBAAqB,CAACC,UAAAA;AACjC,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AACpC,SACE,gBAAAC,OAAA,cAACC,UAASC,MAAI,MACZ,gBAAAF,OAAA,cAACC,UAASE,SAAO;IACfC,OAAOR,EAAE,4BAA4B;MAAES,IAAIP,KAAKC;IAAG,CAAA;IACnDO,aAAaV,EAAE,0BAA0B;MAAES,IAAIP,KAAKC;IAAG,CAAA;KAEvD,gBAAAC,OAAA,cAACO,iBAAoBZ,KAAAA,GACrB,gBAAAK,OAAA,cAACQ,kBAAAA;IAAiBC,IAAId,MAAMe,MAAMD;;AAI1C;AAEA,IAAA,6BAAef;",
6
+ "names": ["React", "useTranslation", "Settings", "React", "Input", "useTranslation", "Settings", "TriggersSettings", "db", "state", "start", "stop", "useTriggerRuntimeControls", "isRunning", "enabled", "t", "useTranslation", "meta", "id", "div", "className", "Settings", "ItemInput", "title", "description", "Input", "Switch", "classNames", "checked", "onCheckedChange", "AutomationSettings", "props", "t", "useTranslation", "meta", "id", "React", "Settings", "Root", "Section", "title", "ns", "description", "AutomationPanel", "TriggersSettings", "db", "space"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  FunctionsPanel
3
- } from "./chunk-BFUIVUQH.mjs";
3
+ } from "./chunk-QNEQ23BF.mjs";
4
4
  import {
5
5
  meta
6
6
  } from "./chunk-PZNBEKO5.mjs";
@@ -8,7 +8,7 @@ import {
8
8
  // src/components/FunctionsContainer.tsx
9
9
  import React2 from "react";
10
10
  import { useTranslation as useTranslation2 } from "@dxos/react-ui";
11
- import { ControlPage, ControlSection } from "@dxos/react-ui-form";
11
+ import { Settings as Settings2 } from "@dxos/react-ui-form";
12
12
 
13
13
  // src/components/FunctionsRegistry/FunctionsRegistry.tsx
14
14
  import * as Schema from "effect/Schema";
@@ -18,9 +18,8 @@ import { Function } from "@dxos/functions";
18
18
  import { getDeployedFunctions } from "@dxos/functions-runtime/edge";
19
19
  import { useClient } from "@dxos/react-client";
20
20
  import { Filter, Query, useQuery } from "@dxos/react-client/echo";
21
- import { useAsyncEffect } from "@dxos/react-ui";
22
- import { IconButton, useTranslation } from "@dxos/react-ui";
23
- import { controlItemClasses } from "@dxos/react-ui-form";
21
+ import { IconButton, useAsyncEffect, useTranslation } from "@dxos/react-ui";
22
+ import { Settings } from "@dxos/react-ui-form";
24
23
  import { List } from "@dxos/react-ui-list";
25
24
  import { ghostHover, mx } from "@dxos/ui-theme";
26
25
  var grid = "grid grid-cols-[1fr_1fr_auto] min-bs-[2.5rem]";
@@ -59,10 +58,7 @@ var FunctionsRegistry = ({ space }) => {
59
58
  }, [
60
59
  space
61
60
  ]);
62
- return /* @__PURE__ */ React.createElement("div", {
63
- role: "none",
64
- className: mx(controlItemClasses)
65
- }, functions.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
61
+ return /* @__PURE__ */ React.createElement(Settings.Container, null, functions.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
66
62
  items: functions,
67
63
  isItem: Schema.is(Function.Function),
68
64
  getId: (func) => func.id
@@ -101,7 +97,7 @@ var FunctionsRegistry = ({ space }) => {
101
97
  // src/components/FunctionsContainer.tsx
102
98
  var FunctionsContainer = ({ space }) => {
103
99
  const { t } = useTranslation2(meta.id);
104
- return /* @__PURE__ */ React2.createElement(ControlPage, null, /* @__PURE__ */ React2.createElement(ControlSection, {
100
+ return /* @__PURE__ */ React2.createElement(Settings2.Root, null, /* @__PURE__ */ React2.createElement(Settings2.Section, {
105
101
  title: t("functions verbose label", {
106
102
  ns: meta.id
107
103
  }),
@@ -110,7 +106,7 @@ var FunctionsContainer = ({ space }) => {
110
106
  })
111
107
  }, /* @__PURE__ */ React2.createElement(FunctionsPanel, {
112
108
  space
113
- })), /* @__PURE__ */ React2.createElement(ControlSection, {
109
+ })), /* @__PURE__ */ React2.createElement(Settings2.Section, {
114
110
  title: t("functions registry verbose label", {
115
111
  ns: meta.id
116
112
  }),
@@ -126,4 +122,4 @@ export {
126
122
  FunctionsContainer,
127
123
  FunctionsContainer_default as default
128
124
  };
129
- //# sourceMappingURL=FunctionsContainer-6QLC7JP4.mjs.map
125
+ //# sourceMappingURL=FunctionsContainer-5NHAAP5H.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/FunctionsContainer.tsx", "../../../src/components/FunctionsRegistry/FunctionsRegistry.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { meta } from '../meta';\n\nimport { FunctionsPanel } from './FunctionsPanel';\nimport { FunctionsRegistry } from './FunctionsRegistry';\n\nexport const FunctionsContainer = ({ space }: { space: Space }) => {\n const { t } = useTranslation(meta.id);\n return (\n <Settings.Root>\n <Settings.Section\n title={t('functions verbose label', { ns: meta.id })}\n description={t('functions description', { ns: meta.id })}\n >\n <FunctionsPanel space={space} />\n </Settings.Section>\n <Settings.Section\n title={t('functions registry verbose label', { ns: meta.id })}\n description={t('functions registry description', { ns: meta.id })}\n >\n <FunctionsRegistry space={space} />\n </Settings.Section>\n </Settings.Root>\n );\n};\n\nexport default FunctionsContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport { useState } from 'react';\nimport React, { useCallback } from 'react';\n\nimport { Function } from '@dxos/functions';\nimport { getDeployedFunctions } from '@dxos/functions-runtime/edge';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, Query, type Space, useQuery } from '@dxos/react-client/echo';\nimport { IconButton, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nconst grid = 'grid grid-cols-[1fr_1fr_auto] min-bs-[2.5rem]';\n\ntype FunctionsRegistryProps = {\n space: Space;\n};\n\nexport const FunctionsRegistry = ({ space }: FunctionsRegistryProps) => {\n const client = useClient();\n const [loading, setLoading] = useState(true);\n const [functions, setFunctions] = useState<Function.Function[]>([]);\n const { t } = useTranslation(meta.id);\n\n const dbFunctions = useQuery(space.db, Filter.type(Function.Function));\n\n const state = (func: Function.Function) => {\n const dbFunction = dbFunctions.find((f) => f.key === func.key);\n if (!dbFunction) {\n return 'import';\n }\n if (dbFunction.version === func.version && dbFunction.updated === func.updated) {\n return 'none';\n }\n return 'update';\n };\n\n useAsyncEffect(async () => {\n setLoading(true);\n const functions = await getDeployedFunctions(client, true);\n setFunctions(functions);\n setLoading(false);\n }, []);\n\n const hanleImportOrUpdate = useCallback(\n async (func: Function.Function) => {\n const functions = await space.db.query(Query.type(Function.Function, { key: func.key })).run();\n const [existingFunc] = functions;\n if (!existingFunc) {\n space.db.add(func);\n return;\n }\n Function.setFrom(existingFunc, func);\n },\n [space],\n );\n\n return (\n <Settings.Container>\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 <div className='text-xs text-description truncate'>{func.key}</div>\n </div>\n <div className='flex flex-col truncate'>\n <div className='text-xs text-description truncate'>{func.version}</div>\n <div className='text-xs text-description truncate'>\n {func.updated ? `Uploaded ${new Date(func.updated).toLocaleString()}` : ''}\n </div>\n </div>\n\n <IconButton\n iconOnly\n icon={state(func) === 'update' ? 'ph--arrows-clockwise--regular' : 'ph--download--regular'}\n label={\n state(func) === 'update' ? t('update function button label') : t('import function button label')\n }\n disabled={state(func) === 'none'}\n onClick={() => hanleImportOrUpdate(func)}\n />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n )}\n\n {functions.length === 0 && !loading && (\n <div className='text-center plb-4 text-gray-500'>{t('no functions found')}</div>\n )}\n {loading && <div className='text-center plb-4 text-gray-500'>{t('loading functions')}</div>}\n </Settings.Container>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useTranslation", "Settings", "Schema", "useState", "React", "useCallback", "Function", "getDeployedFunctions", "useClient", "Filter", "Query", "useQuery", "IconButton", "useAsyncEffect", "useTranslation", "Settings", "List", "ghostHover", "mx", "grid", "FunctionsRegistry", "space", "client", "useClient", "loading", "setLoading", "useState", "functions", "setFunctions", "t", "useTranslation", "meta", "id", "dbFunctions", "useQuery", "db", "Filter", "type", "Function", "state", "func", "dbFunction", "find", "f", "key", "version", "updated", "useAsyncEffect", "getDeployedFunctions", "hanleImportOrUpdate", "useCallback", "query", "Query", "run", "existingFunc", "add", "setFrom", "Settings", "Container", "length", "List", "Root", "items", "isItem", "is", "getId", "div", "role", "className", "map", "Item", "item", "classNames", "mx", "ghostHover", "ItemTitle", "name", "Date", "toLocaleString", "IconButton", "iconOnly", "icon", "label", "disabled", "onClick", "FunctionsContainer", "space", "t", "useTranslation", "meta", "id", "React", "Settings", "Root", "Section", "title", "ns", "description", "FunctionsPanel", "FunctionsRegistry"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  FunctionsPanel,
3
3
  FunctionsPanel_default
4
- } from "./chunk-BFUIVUQH.mjs";
4
+ } from "./chunk-QNEQ23BF.mjs";
5
5
  import "./chunk-PZNBEKO5.mjs";
6
6
  export {
7
7
  FunctionsPanel,
8
8
  FunctionsPanel_default as default
9
9
  };
10
- //# sourceMappingURL=FunctionsPanel-ZX4J75UM.mjs.map
10
+ //# sourceMappingURL=FunctionsPanel-RD22LYMR.mjs.map
@@ -4,7 +4,8 @@ import {
4
4
 
5
5
  // src/capabilities/app-graph-builder/app-graph-builder.ts
6
6
  import * as Effect from "effect/Effect";
7
- import { Capability, Common } from "@dxos/app-framework";
7
+ import { Capability } from "@dxos/app-framework";
8
+ import { AppCapabilities } from "@dxos/app-toolkit";
8
9
  import { Script } from "@dxos/functions";
9
10
  import { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
10
11
  import { GraphBuilder, NodeMatcher } from "@dxos/plugin-graph";
@@ -76,9 +77,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
76
77
  ])
77
78
  })
78
79
  ]);
79
- return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);
80
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
80
81
  }));
81
82
  export {
82
83
  app_graph_builder_default as default
83
84
  };
84
- //# sourceMappingURL=app-graph-builder-LAQMEBMH.mjs.map
85
+ //# sourceMappingURL=app-graph-builder-HLARI3VW.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Script } from '@dxos/functions';\nimport { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\nimport { meta as spaceMeta } from '@dxos/plugin-space';\n\nimport { meta } from '../../meta';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* Effect.all([\n GraphBuilder.createExtension({\n id: `${meta.id}/space-settings-automation`,\n match: NodeMatcher.whenNodeType(`${spaceMeta.id}/settings`),\n connector: (node) =>\n Effect.succeed([\n {\n id: `automation-${node.id}`,\n type: `${meta.id}/space-settings-automation`,\n data: `${meta.id}/space-settings-automation`,\n properties: {\n label: ['automation panel label', { ns: meta.id }],\n icon: 'ph--lightning--regular',\n },\n },\n ]),\n }),\n GraphBuilder.createExtension({\n id: `${meta.id}/space-settings-functions`,\n match: NodeMatcher.whenNodeType(`${spaceMeta.id}/settings`),\n connector: (node) =>\n Effect.succeed([\n {\n id: `functions-${node.id}`,\n type: `${meta.id}/space-settings-functions`,\n data: `${meta.id}/space-settings-functions`,\n properties: {\n label: ['functions panel label', { ns: meta.id }],\n icon: 'ph--function--regular',\n },\n },\n ]),\n }),\n GraphBuilder.createTypeExtension({\n id: `${meta.id}/script-companion`,\n type: Script.Script,\n connector: (script) =>\n Effect.succeed([\n {\n id: [script.id, 'automation'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'automation',\n properties: {\n label: ['script automation label', { ns: meta.id }],\n icon: 'ph--lightning--regular',\n disposition: 'hidden',\n },\n },\n ]),\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,cAAc;AACvB,SAASC,2BAA2BC,4BAA4B;AAChE,SAASC,cAAcC,mBAAmB;AAC1C,SAASC,QAAQC,iBAAiB;AAIlC,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAcC,WAAI;IACnCC,aAAaC,gBAAgB;MAC3BC,IAAI,GAAGC,KAAKD,EAAE;MACdE,OAAOC,YAAYC,aAAa,GAAGC,UAAUL,EAAE,WAAW;MAC1DM,WAAW,CAACC,SACHC,eAAQ;QACb;UACER,IAAI,cAAcO,KAAKP,EAAE;UACzBS,MAAM,GAAGR,KAAKD,EAAE;UAChBU,MAAM,GAAGT,KAAKD,EAAE;UAChBW,YAAY;YACVC,OAAO;cAAC;cAA0B;gBAAEC,IAAIZ,KAAKD;cAAG;;YAChDc,MAAM;UACR;QACF;OACD;IACL,CAAA;IACAhB,aAAaC,gBAAgB;MAC3BC,IAAI,GAAGC,KAAKD,EAAE;MACdE,OAAOC,YAAYC,aAAa,GAAGC,UAAUL,EAAE,WAAW;MAC1DM,WAAW,CAACC,SACHC,eAAQ;QACb;UACER,IAAI,aAAaO,KAAKP,EAAE;UACxBS,MAAM,GAAGR,KAAKD,EAAE;UAChBU,MAAM,GAAGT,KAAKD,EAAE;UAChBW,YAAY;YACVC,OAAO;cAAC;cAAyB;gBAAEC,IAAIZ,KAAKD;cAAG;;YAC/Cc,MAAM;UACR;QACF;OACD;IACL,CAAA;IACAhB,aAAaiB,oBAAoB;MAC/Bf,IAAI,GAAGC,KAAKD,EAAE;MACdS,MAAMO,OAAOA;MACbV,WAAW,CAACW,WACHT,eAAQ;QACb;UACER,IAAI;YAACiB,OAAOjB;YAAI;YAAckB,KAAKC,yBAAAA;UACnCV,MAAMW;UACNV,MAAM;UACNC,YAAY;YACVC,OAAO;cAAC;cAA2B;gBAAEC,IAAIZ,KAAKD;cAAG;;YACjDc,MAAM;YACNO,aAAa;UACf;QACF;OACD;IACL,CAAA;GACD;AAED,SAAO5B,WAAW6B,YAAYC,gBAAgBC,iBAAiB5B,UAAAA;AACjE,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "AppCapabilities", "Script", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "GraphBuilder", "NodeMatcher", "meta", "spaceMeta", "Capability", "makeModule", "fnUntraced", "extensions", "all", "GraphBuilder", "createExtension", "id", "meta", "match", "NodeMatcher", "whenNodeType", "spaceMeta", "connector", "node", "succeed", "type", "data", "properties", "label", "ns", "icon", "createTypeExtension", "Script", "script", "join", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "disposition", "contributes", "AppCapabilities", "AppGraphBuilder"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TriggerEditor
3
- } from "./chunk-QW3EM35H.mjs";
3
+ } from "./chunk-JN7QRQQX.mjs";
4
4
  import {
5
5
  meta
6
6
  } from "./chunk-PZNBEKO5.mjs";
@@ -10,21 +10,22 @@ import * as Array from "effect/Array";
10
10
  import * as EFn from "effect/Function";
11
11
  import * as Match from "effect/Match";
12
12
  import * as Schema from "effect/Schema";
13
- import React, { useMemo, useState } from "react";
13
+ import React, { useCallback, useMemo, useState } from "react";
14
14
  import { Filter, Obj, Tag } from "@dxos/echo";
15
15
  import { Function, Script, Trigger } from "@dxos/functions";
16
+ import { KEY_QUEUE_CURSOR } from "@dxos/functions-runtime";
16
17
  import { FunctionsServiceClient } from "@dxos/functions-runtime/edge";
17
18
  import { useTypeOptions } from "@dxos/plugin-space";
18
19
  import { useClient } from "@dxos/react-client";
19
- import { useQuery } from "@dxos/react-client/echo";
20
+ import { useObject, useQuery } from "@dxos/react-client/echo";
20
21
  import { Clipboard, IconButton, Input, Separator, useTranslation } from "@dxos/react-ui";
21
- import { ControlItem, controlItemClasses } from "@dxos/react-ui-form";
22
+ import { Settings } from "@dxos/react-ui-form";
22
23
  import { List } from "@dxos/react-ui-list";
23
- import { Project } from "@dxos/types";
24
+ import { Pipeline } from "@dxos/types";
24
25
  import { ghostHover, mx } from "@dxos/ui-theme";
25
26
  import { isNonNullable } from "@dxos/util";
26
27
  var grid = "grid grid-cols-[40px_1fr_32px_32px] min-bs-[2.5rem]";
27
- var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) => {
28
+ var AutomationPanel = ({ space, object, initialTrigger, onDone }) => {
28
29
  const { t } = useTranslation(meta.id);
29
30
  const client = useClient();
30
31
  const functionsServiceClient = useMemo(() => FunctionsServiceClient.fromClient(client), [
@@ -71,7 +72,9 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
71
72
  };
72
73
  const handleSave = (trigger2) => {
73
74
  if (selected) {
74
- Object.assign(selected, trigger2);
75
+ Obj.change(selected, (mutable) => {
76
+ Object.assign(mutable, trigger2);
77
+ });
75
78
  } else {
76
79
  space.db.add(Trigger.make(trigger2));
77
80
  }
@@ -86,8 +89,16 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
86
89
  const handleForceRunTrigger = async (trigger2) => {
87
90
  await functionsServiceClient.forceRunCronTrigger(space.id, trigger2.id);
88
91
  };
92
+ const handleResetCursor = async (trigger2) => {
93
+ Obj.change(trigger2, (t2) => {
94
+ Obj.deleteKeys(t2, KEY_QUEUE_CURSOR);
95
+ });
96
+ await space.db.flush({
97
+ indexes: true
98
+ });
99
+ };
89
100
  if (trigger) {
90
- return /* @__PURE__ */ React.createElement(ControlItem, {
101
+ return /* @__PURE__ */ React.createElement(Settings.Item, {
91
102
  title: t("trigger editor title")
92
103
  }, /* @__PURE__ */ React.createElement(TriggerEditor, {
93
104
  db: space.db,
@@ -99,44 +110,22 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
99
110
  onCancel: handleCancel
100
111
  }));
101
112
  }
102
- return /* @__PURE__ */ React.createElement("div", {
103
- className: mx(controlItemClasses, classNames)
104
- }, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
113
+ return /* @__PURE__ */ React.createElement(Settings.Container, null, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
105
114
  items: filteredTriggers,
106
115
  isItem: Schema.is(Trigger.Trigger),
107
116
  getId: (field) => field.id
108
117
  }, ({ items: filteredTriggers2 }) => /* @__PURE__ */ React.createElement("div", {
109
118
  role: "list",
110
119
  className: "flex flex-col is-full"
111
- }, filteredTriggers2?.map((trigger2) => {
112
- const copyAction = getCopyAction(client, trigger2);
113
- return /* @__PURE__ */ React.createElement(List.Item, {
114
- key: trigger2.id,
115
- item: trigger2,
116
- classNames: mx(grid, ghostHover, "items-center", "pli-2")
117
- }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
118
- checked: trigger2.enabled,
119
- onCheckedChange: (checked) => Obj.change(trigger2, (t2) => {
120
- t2.enabled = checked;
121
- })
122
- })), /* @__PURE__ */ React.createElement("div", {
123
- className: "flex"
124
- }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
125
- classNames: "pli-1 cursor-pointer is-0 shrink truncate",
126
- onClick: () => handleSelect(trigger2)
127
- }, getFunctionName(functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
128
- label: t(copyAction.translationKey),
129
- value: copyAction.contentProvider()
130
- })), /* @__PURE__ */ React.createElement(List.ItemButton, {
131
- autoHide: false,
132
- disabled: !trigger2.enabled || trigger2.spec?.kind !== "timer",
133
- icon: "ph--play--regular",
134
- label: "Force run",
135
- onClick: () => handleForceRunTrigger(trigger2)
136
- }), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
137
- onClick: () => handleDelete(trigger2)
138
- }));
139
- }))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
120
+ }, filteredTriggers2?.map((trigger2) => /* @__PURE__ */ React.createElement(TriggerListItem, {
121
+ key: trigger2.id,
122
+ trigger: trigger2,
123
+ functions,
124
+ onSelect: handleSelect,
125
+ onDelete: handleDelete,
126
+ onResetCursor: handleResetCursor,
127
+ onForceRun: handleForceRunTrigger
128
+ })))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
140
129
  classNames: "mlb-4"
141
130
  }), /* @__PURE__ */ React.createElement(IconButton, {
142
131
  icon: "ph--plus--regular",
@@ -144,6 +133,75 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
144
133
  onClick: handleAdd
145
134
  }));
146
135
  };
136
+ var TriggerListItem = ({ trigger, functions, onSelect, onDelete, onResetCursor, onForceRun }) => {
137
+ const client = useClient();
138
+ const copyAction = getCopyAction(client, trigger);
139
+ const { t } = useTranslation(meta.id);
140
+ const cursor = Obj.getKeys(trigger, KEY_QUEUE_CURSOR).at(0)?.id;
141
+ const [snapshot, updateTrigger] = useObject(trigger);
142
+ const enabled = snapshot.enabled ?? false;
143
+ const onEnabledChange = (checked) => {
144
+ updateTrigger((trigger2) => {
145
+ trigger2.enabled = checked;
146
+ });
147
+ };
148
+ const handleSelect = useCallback(() => {
149
+ onSelect?.(trigger);
150
+ }, [
151
+ onSelect,
152
+ trigger
153
+ ]);
154
+ const handleDelete = useCallback(() => {
155
+ onDelete?.(trigger);
156
+ }, [
157
+ onDelete,
158
+ trigger
159
+ ]);
160
+ const handleResetCursor = useCallback(() => {
161
+ onResetCursor?.(trigger);
162
+ }, [
163
+ onResetCursor,
164
+ trigger
165
+ ]);
166
+ const handleForceRun = useCallback(() => {
167
+ onForceRun?.(trigger);
168
+ }, [
169
+ onForceRun,
170
+ trigger
171
+ ]);
172
+ return /* @__PURE__ */ React.createElement(List.Item, {
173
+ key: trigger.id,
174
+ item: snapshot,
175
+ classNames: mx(grid, ghostHover, "items-center", "pli-2")
176
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
177
+ checked: enabled,
178
+ onCheckedChange: onEnabledChange
179
+ })), /* @__PURE__ */ React.createElement("div", {
180
+ className: "flex"
181
+ }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
182
+ classNames: "pli-1 cursor-pointer is-0 shrink truncate",
183
+ onClick: handleSelect
184
+ }, getFunctionName(functions, trigger) ?? "\u2205", cursor && /* @__PURE__ */ React.createElement("div", {
185
+ className: "text-xs text-description truncate ml-4"
186
+ }, "Position: ", cursor)), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
187
+ label: t(copyAction.translationKey),
188
+ value: copyAction.contentProvider()
189
+ })), trigger.spec?.kind === "timer" && onForceRun && /* @__PURE__ */ React.createElement(List.ItemButton, {
190
+ autoHide: false,
191
+ disabled: !enabled || trigger.spec?.kind !== "timer",
192
+ icon: "ph--play--regular",
193
+ label: "Force run",
194
+ onClick: handleForceRun
195
+ }), trigger.spec?.kind === "queue" && onResetCursor && /* @__PURE__ */ React.createElement(List.ItemButton, {
196
+ autoHide: false,
197
+ disabled: !cursor,
198
+ icon: "ph--arrow-clockwise--regular",
199
+ label: "Reset cursor",
200
+ onClick: handleResetCursor
201
+ }), onDelete && /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
202
+ onClick: handleDelete
203
+ }));
204
+ };
147
205
  var getCopyAction = (client, trigger) => {
148
206
  if (trigger?.spec?.kind === "email") {
149
207
  return {
@@ -188,7 +246,7 @@ var projectMatch = (project) => {
188
246
  return viewQueries.some((query) => JSON.stringify(spec.query) === query);
189
247
  };
190
248
  };
191
- 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));
249
+ 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));
192
250
 
193
251
  // src/components/AutomationPanel/index.ts
194
252
  var AutomationPanel_default = AutomationPanel;
@@ -197,4 +255,4 @@ export {
197
255
  AutomationPanel,
198
256
  AutomationPanel_default
199
257
  };
200
- //# sourceMappingURL=chunk-YWLEY2FD.mjs.map
258
+ //# sourceMappingURL=chunk-C273ZYLE.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
+ }
@@ -1,9 +1,9 @@
1
1
  // src/components/index.ts
2
2
  import { lazy } from "react";
3
- var AutomationPanel = lazy(() => import("./AutomationPanel-FAS6ADCW.mjs"));
4
- var AutomationSettings = lazy(() => import("./AutomationSettings-XN2OIYWL.mjs"));
5
- var FunctionsContainer = lazy(() => import("./FunctionsContainer-6QLC7JP4.mjs"));
6
- var FunctionsPanel = lazy(() => import("./FunctionsPanel-ZX4J75UM.mjs"));
3
+ var AutomationPanel = lazy(() => import("./AutomationPanel-C6MZ22CB.mjs"));
4
+ var AutomationSettings = lazy(() => import("./AutomationSettings-D7UO5V3Q.mjs"));
5
+ var FunctionsContainer = lazy(() => import("./FunctionsContainer-5NHAAP5H.mjs"));
6
+ var FunctionsPanel = lazy(() => import("./FunctionsPanel-RD22LYMR.mjs"));
7
7
 
8
8
  export {
9
9
  AutomationPanel,
@@ -11,4 +11,4 @@ export {
11
11
  FunctionsContainer,
12
12
  FunctionsPanel
13
13
  };
14
- //# sourceMappingURL=chunk-54PANILA.mjs.map
14
+ //# sourceMappingURL=chunk-JFBUK3WR.mjs.map
@@ -14,7 +14,7 @@ import { Form as Form2, FormFieldLabel, SelectField as SelectField2, omitId } fr
14
14
 
15
15
  // src/components/TriggerEditor/FunctionInputEditor.tsx
16
16
  import React, { useCallback, useMemo } from "react";
17
- import { Ref, Type } from "@dxos/echo";
17
+ import { Obj, Ref, Type } from "@dxos/echo";
18
18
  import { useOnTransition, useTranslation } from "@dxos/react-ui";
19
19
  import { Form, useFormValues } from "@dxos/react-ui-form";
20
20
  var FunctionInputEditor = ({ type, functions, db, getValue, onValueChange }) => {
@@ -52,11 +52,18 @@ var FunctionInputEditor = ({ type, functions, db, getValue, onValueChange }) =>
52
52
  inputSchema
53
53
  ]);
54
54
  const propertyCount = inputSchema?.properties ? Object.keys(inputSchema.properties).length : 0;
55
- const values = useMemo(() => getValue() ?? {}, [
55
+ const defaultValues = useMemo(() => {
56
+ const raw = getValue() ?? {};
57
+ return Obj.isObject(raw) ? {
58
+ ...Obj.getSnapshot(raw)
59
+ } : {
60
+ ...raw
61
+ };
62
+ }, [
56
63
  getValue
57
64
  ]);
58
- const handleValuesChanged = useCallback((values2) => {
59
- onValueChange(type, values2);
65
+ const handleValuesChanged = useCallback((values) => {
66
+ onValueChange(type, values);
60
67
  }, [
61
68
  type,
62
69
  onValueChange
@@ -68,8 +75,9 @@ var FunctionInputEditor = ({ type, functions, db, getValue, onValueChange }) =>
68
75
  label: t("function parameters label"),
69
76
  asChild: true
70
77
  }), /* @__PURE__ */ React.createElement(Form.Root, {
78
+ key: selectedFunction.id,
71
79
  schema: effectSchema,
72
- values,
80
+ defaultValues,
73
81
  db,
74
82
  onValuesChanged: handleValuesChanged
75
83
  }, /* @__PURE__ */ React.createElement(Form.FieldSet, null)));
@@ -245,4 +253,4 @@ var getFunctionOptions = (scripts, functions) => {
245
253
  export {
246
254
  TriggerEditor
247
255
  };
248
- //# sourceMappingURL=chunk-QW3EM35H.mjs.map
256
+ //# sourceMappingURL=chunk-JN7QRQQX.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/TriggerEditor/FunctionInputEditor.tsx", "../../../src/components/TriggerEditor/SpecSelector.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { ComputeGraph } from '@dxos/conductor';\nimport { DXN, type Database, type Query } from '@dxos/echo';\nimport { Function, Script, Trigger } from '@dxos/functions';\nimport { Filter, Ref, useQuery } from '@dxos/react-client/echo';\nimport { Input } from '@dxos/react-ui';\nimport { QueryForm, type QueryFormProps } from '@dxos/react-ui-components';\nimport {\n type ExcludeId,\n Form,\n FormFieldLabel,\n type FormFieldMap,\n type FormRootProps,\n SelectField,\n omitId,\n} from '@dxos/react-ui-form';\n\nimport { FunctionInputEditor } from './FunctionInputEditor';\nimport { SpecSelector } from './SpecSelector';\n\ntype TriggerFormSchema = ExcludeId<typeof Trigger.Trigger>;\n\nexport type TriggerEditorProps = {\n db: Database.Database;\n trigger: Trigger.Trigger;\n // TODO(wittjosiah): This needs to apply to whole spec but currently only applies to spec.kind & spec.query.\n readonlySpec?: boolean;\n} &\n // prettier-ignore\n Pick<QueryFormProps, 'types' | 'tags'> &\n Pick<FormRootProps<TriggerFormSchema>, 'onSave' | 'onCancel'>;\n\nexport const TriggerEditor = ({ db, types, tags, readonlySpec, trigger, ...formProps }: TriggerEditorProps) => {\n const fieldMap = useCustomInputs({\n db,\n types,\n tags,\n readonlySpec,\n });\n\n return (\n <Form.Root<TriggerFormSchema>\n {...formProps}\n schema={omitId(Trigger.Trigger)}\n values={trigger}\n db={db}\n fieldMap={fieldMap}\n >\n <Form.Viewport>\n <Form.Content>\n <Form.FieldSet />\n <Form.Actions />\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\ntype UseCustomInputsProps = {\n db: Database.Database;\n readonlySpec?: boolean;\n} & Pick<QueryFormProps, 'types' | 'tags'>;\n\nconst useCustomInputs = ({ db, readonlySpec, types, tags }: UseCustomInputsProps): FormFieldMap => {\n const functions = useQuery(db, Filter.type(Function.Function));\n const workflows = useQuery(db, Filter.type(ComputeGraph));\n const scripts = useQuery(db, Filter.type(Script.Script));\n\n return useMemo(\n (): FormFieldMap => ({\n // Function selector.\n ['function' satisfies keyof Trigger.Trigger]: (props) => {\n const getValue = useCallback(() => {\n const formValue = props.getValue();\n if (Ref.isRef(formValue)) {\n return formValue.dxn.toString() as string;\n }\n return undefined;\n }, [props]);\n\n const handleOnValueChange = useCallback(\n (_type: any, dxnString: string) => {\n const dxn = DXN.parse(dxnString);\n if (dxn) {\n const ref = Ref.fromDXN(dxn);\n props.onValueChange(props.type, ref);\n }\n },\n [props.type, props.onValueChange],\n );\n\n return (\n <SelectField\n {...props}\n getValue={getValue as any}\n onValueChange={handleOnValueChange}\n options={getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))}\n />\n );\n },\n\n // Spec selector.\n ['spec.kind' as const]: (props) => <SpecSelector {...props} readonly={readonlySpec} />,\n\n // TODO(wittjosiah): Copied from ViewEditor.\n // Query input editor.\n ['spec.query' as const]: (props) => {\n const handleChange = useCallback(\n (query: Query.Any) => props.onValueChange(props.type, { ast: query.ast }),\n [props.type, props.onValueChange],\n );\n\n return (\n <Input.Root>\n <FormFieldLabel label={props.label} asChild />\n <QueryForm initialQuery={(props.getValue() as any).ast} types={types} tags={tags} onChange={handleChange} />\n </Input.Root>\n );\n },\n\n // Function input editor.\n ['input' as const]: (props) => <FunctionInputEditor {...props} functions={functions} db={db} />,\n }),\n [workflows, scripts, functions, readonlySpec],\n );\n};\n\nconst getWorkflowOptions = (graphs: ComputeGraph[]) => {\n return graphs.map((graph) => ({ label: `compute-${graph.id}`, value: `dxn:echo:@:${graph.id}` }));\n};\n\nconst getFunctionOptions = (scripts: Script.Script[], functions: Function.Function[]) => {\n const getLabel = (fn: Function.Function) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;\n return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:echo:@:${fn.id}` }));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as SchemaAST from 'effect/SchemaAST';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { type Database, Obj, Ref, Type } from '@dxos/echo';\nimport { type JsonPath } from '@dxos/echo/internal';\nimport { type Function } from '@dxos/functions';\nimport { useOnTransition, useTranslation } from '@dxos/react-ui';\nimport { Form, type FormFieldStateProps, type FormRootProps, useFormValues } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\n\nexport type FunctionInputEditorProps = {\n type: SchemaAST.AST;\n functions: Function.Function[];\n db?: Database.Database;\n} & FormFieldStateProps;\n\nexport const FunctionInputEditor = ({ type, functions, db, getValue, onValueChange }: FunctionInputEditorProps) => {\n const { t } = useTranslation(meta.id);\n const selectedFunctionValue = useFormValues(FunctionInputEditor.displayName, ['function' as JsonPath]);\n const selectedFunctionId = useMemo(() => {\n if (Ref.isRef(selectedFunctionValue)) {\n return selectedFunctionValue.dxn.toString().split('dxn:echo:@:').at(1);\n }\n }, [selectedFunctionValue]);\n\n const selectedFunction = useMemo(\n () => functions.find((fn) => fn.id === selectedFunctionId),\n [functions, selectedFunctionId],\n );\n\n useOnTransition(\n // Clear function parameter input when the function changes.\n selectedFunctionValue,\n (prevValue) => {\n if (!Ref.isRef(prevValue) || !Ref.isRef(selectedFunctionValue)) {\n return false;\n }\n\n return prevValue.dxn.toString() !== selectedFunctionValue.dxn.toString();\n },\n (currValue) => currValue !== undefined,\n () => onValueChange(type, {}),\n );\n\n const inputSchema = useMemo(() => selectedFunction?.inputSchema, [selectedFunction]);\n const effectSchema = useMemo(() => (inputSchema ? Type.toEffectSchema(inputSchema) : undefined), [inputSchema]);\n const propertyCount = inputSchema?.properties ? Object.keys(inputSchema.properties).length : 0;\n const defaultValues = useMemo(() => {\n const raw = getValue() ?? {};\n return Obj.isObject(raw) ? { ...Obj.getSnapshot(raw) } : { ...raw };\n }, [getValue]);\n\n const handleValuesChanged = useCallback<NonNullable<FormRootProps['onValuesChanged']>>(\n (values) => {\n onValueChange(type, values);\n },\n [type, onValueChange],\n );\n\n if (selectedFunction === undefined || effectSchema === undefined || propertyCount === 0) {\n return null;\n }\n\n return (\n <>\n <Form.Label label={t('function parameters label')} asChild />\n <Form.Root\n key={selectedFunction.id}\n schema={effectSchema}\n defaultValues={defaultValues}\n db={db}\n onValuesChanged={handleValuesChanged}\n >\n <Form.FieldSet />\n </Form.Root>\n </>\n );\n};\n\nFunctionInputEditor.displayName = 'AutomationTrigger.FunctionInputEditor';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Filter, Query } from '@dxos/echo';\nimport { Trigger } from '@dxos/functions';\nimport { useTranslation } from '@dxos/react-ui';\nimport { type FormFieldComponentProps, SelectField, useFormFieldState } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\n\nexport type SpecSelectorProps = FormFieldComponentProps;\n\nexport const SpecSelector = (props: SpecSelectorProps) => {\n const { t } = useTranslation(meta.id);\n const specProps = useFormFieldState(SpecSelector.displayName, ['spec' satisfies keyof Trigger.Trigger]);\n\n const handleTypeChange = useCallback(\n (_type: any, value: string): Trigger.Spec | undefined => {\n const getDefaultTriggerSpec = (kind: string) => {\n switch (kind) {\n case 'timer':\n return { kind: 'timer', cron: '' };\n case 'subscription':\n return {\n kind: 'subscription',\n query: {\n ast: Query.select(Filter.nothing()).ast,\n },\n };\n case 'queue':\n return { kind: 'queue', queue: 'dxn:' };\n case 'email':\n return { kind: 'email' };\n case 'webhook':\n return { kind: 'webhook' };\n default:\n return undefined;\n }\n };\n\n const defaultSpec = getDefaultTriggerSpec(value);\n if (!defaultSpec) {\n return;\n }\n\n // Update the entire spec object, not just the `spec.kind`.\n specProps.onValueChange(props.type, defaultSpec);\n },\n [props.type, specProps],\n );\n\n const options = useMemo(\n () =>\n Trigger.Kinds.map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n })),\n [t],\n );\n\n return <SelectField {...props} options={options} onValueChange={handleTypeChange} />;\n};\n\nSpecSelector.displayName = 'Form.SpecSelector';\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useMemo", "ComputeGraph", "DXN", "Function", "Script", "Trigger", "Filter", "Ref", "useQuery", "Input", "QueryForm", "Form", "FormFieldLabel", "SelectField", "omitId", "React", "useCallback", "useMemo", "Obj", "Ref", "Type", "useOnTransition", "useTranslation", "Form", "useFormValues", "FunctionInputEditor", "type", "functions", "db", "getValue", "onValueChange", "t", "useTranslation", "meta", "id", "selectedFunctionValue", "useFormValues", "displayName", "selectedFunctionId", "useMemo", "Ref", "isRef", "dxn", "toString", "split", "at", "selectedFunction", "find", "fn", "useOnTransition", "prevValue", "currValue", "undefined", "inputSchema", "effectSchema", "Type", "toEffectSchema", "propertyCount", "properties", "Object", "keys", "length", "defaultValues", "raw", "Obj", "isObject", "getSnapshot", "handleValuesChanged", "useCallback", "values", "Form", "Label", "label", "asChild", "Root", "key", "schema", "onValuesChanged", "FieldSet", "React", "useCallback", "useMemo", "Filter", "Query", "Trigger", "useTranslation", "SelectField", "useFormFieldState", "SpecSelector", "props", "t", "useTranslation", "meta", "id", "specProps", "useFormFieldState", "displayName", "handleTypeChange", "useCallback", "_type", "value", "getDefaultTriggerSpec", "kind", "cron", "query", "ast", "Query", "select", "Filter", "nothing", "queue", "undefined", "defaultSpec", "onValueChange", "type", "options", "useMemo", "Trigger", "Kinds", "map", "label", "React", "SelectField", "TriggerEditor", "db", "types", "tags", "readonlySpec", "trigger", "formProps", "fieldMap", "useCustomInputs", "React", "Form", "Root", "schema", "omitId", "Trigger", "values", "Viewport", "Content", "FieldSet", "Actions", "functions", "useQuery", "Filter", "type", "Function", "workflows", "ComputeGraph", "scripts", "Script", "useMemo", "props", "getValue", "useCallback", "formValue", "Ref", "isRef", "dxn", "toString", "undefined", "handleOnValueChange", "_type", "dxnString", "DXN", "parse", "ref", "fromDXN", "onValueChange", "SelectField", "options", "getWorkflowOptions", "concat", "getFunctionOptions", "SpecSelector", "readonly", "handleChange", "query", "ast", "Input", "FormFieldLabel", "label", "asChild", "QueryForm", "initialQuery", "onChange", "FunctionInputEditor", "graphs", "map", "graph", "id", "value", "getLabel", "fn", "find", "s", "source", "target", "name"]
7
+ }