@oomol-lab/open-flow 0.1.0-beta.76 → 0.1.0-beta.78

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 (74) hide show
  1. package/README.md +3 -0
  2. package/dist/browser/{ContentIcon-Cm1hbVzW.js → ContentIcon-CMn0c-kl.js} +99 -6
  3. package/dist/browser/{FlowCanvas-NzKtla_c.js → FlowCanvas-BQGBcfoL.js} +1709 -613
  4. package/dist/browser/{createResourceDialog-BgdedQqu.js → createResourceDialog-DCGxfKFM.js} +63 -57
  5. package/dist/browser/{dialog-aSElFFw2.js → dialog-WzR4CRFH.js} +76 -77
  6. package/dist/browser/{exportSvg-Dcz4HTo_.js → exportSvg-CYwyYiuH.js} +2 -2
  7. package/dist/browser/{flowChanges-NZyS7HSp.js → flowChanges-Bz4dbDN_.js} +6875 -11091
  8. package/dist/browser/{flowWorkspace-Bl0SDehy.js → flowWorkspace-BI6L6a4r.js} +1415 -3037
  9. package/dist/browser/licenses.md +1 -1
  10. package/dist/browser/preview.css +619 -462
  11. package/dist/browser/preview.js +9016 -14956
  12. package/dist/browser/theme.css +4 -2
  13. package/dist/browser/{tooltip-3XMK9jkr.js → tooltip-BDcVTNpu.js} +65 -2
  14. package/dist/browser/{typeScriptSession-C9sBGOKZ.js → typeScriptSession-CRoezJPN.js} +1 -1
  15. package/dist/browser/ui.css +112 -24
  16. package/dist/browser/ui.js +3 -2
  17. package/dist/browser/workbench.css +10020 -9842
  18. package/dist/browser/workbench.d.ts +5 -2
  19. package/dist/browser/workbench.js +2382 -2668
  20. package/dist/browser/{workbenchSelect-DBGP7Y4Z.js → workbenchSelect-DtAd0zc4.js} +2 -2
  21. package/dist/command/index.js +48 -48
  22. package/dist/common/authoring.d.ts +4 -4
  23. package/dist/common/authoringExamples.d.ts +3 -2
  24. package/dist/common/authoringSchema.d.ts +15 -4
  25. package/dist/common/control-api-conformance.js +155 -15
  26. package/dist/common/control-api-errors.d.ts +12 -0
  27. package/dist/common/control-api.d.ts +39 -2
  28. package/dist/common/control-api.js +180 -37
  29. package/dist/common/control-requests.d.ts +23 -3
  30. package/dist/common/control-requests.js +141 -14
  31. package/dist/common/engine-contract.d.ts +3 -2
  32. package/dist/common/flow-authoring.js +47 -7
  33. package/dist/common/flow-change-schema.d.ts +1 -1
  34. package/dist/common/flow-change.d.ts +2 -2
  35. package/dist/common/flow-change.js +48 -8
  36. package/dist/common/flow-encoding.js +47 -7
  37. package/dist/common/flow-semantics.js +86 -8
  38. package/dist/common/flow-state.d.ts +100 -0
  39. package/dist/common/flow-state.js +5794 -0
  40. package/dist/common/mcp.d.ts +96 -3
  41. package/dist/common/mcp.js +158 -13
  42. package/dist/common/run-events.js +19 -8
  43. package/dist/common/runtime-contract.d.ts +14 -0
  44. package/dist/common/runtime-contract.js +124 -17
  45. package/dist/common/runtime-nodejs-compat.js +11 -12
  46. package/dist/common/scheduler-node-execution.d.ts +1 -0
  47. package/dist/common/scheduler.d.ts +2 -1
  48. package/dist/common/scheduler.js +95 -40
  49. package/dist/common/state-conformance.d.ts +16 -0
  50. package/dist/common/tags.d.ts +4 -0
  51. package/dist/index.d.ts +11 -0
  52. package/package.json +5 -1
  53. package/src/control/common/api.ts +101 -11
  54. package/src/control/common/authoring.ts +7 -1
  55. package/src/control/common/authoringExamples.ts +9 -0
  56. package/src/control/common/authoringSchema.ts +18 -12
  57. package/src/control/common/errors.ts +6 -0
  58. package/src/control/common/flowDecoders.ts +1 -0
  59. package/src/control/common/mcp.ts +16 -0
  60. package/src/control/common/requests.ts +16 -2
  61. package/src/control/common/tags.ts +20 -0
  62. package/src/execution/common/events.ts +22 -7
  63. package/src/execution/common/node-execution.ts +3 -0
  64. package/src/execution/common/scheduler.ts +29 -13
  65. package/src/flow/common/change.ts +2 -1
  66. package/src/flow/common/changeSchema.ts +11 -1
  67. package/src/flow/common/errorHandling.ts +1 -1
  68. package/src/flow/common/semantics.ts +27 -1
  69. package/src/runtime/common/engineContract.ts +6 -3
  70. package/src/runtime/common/nodejsGuest.generated.json +11 -12
  71. package/src/runtime/common/runtime.ts +122 -7
  72. package/src/state/common/conformance.ts +81 -0
  73. package/src/state/common/state.ts +141 -0
  74. package/src/types/index.ts +11 -0
@@ -1,14 +1,15 @@
1
1
  import { l as useTranslate } from "./dist-BFmpkX4P.js";
2
- import { vr as Button } from "./tooltip-3XMK9jkr.js";
3
- import { $t as Input, a as DialogFooter, d as Field, f as FieldDescription, h as FieldLabel, i as DialogDescription, l as Icon, m as FieldGroup, n as DialogClose, o as DialogHeader, p as FieldError, r as DialogContent, s as DialogTitle, t as Dialog, u as Spinner } from "./dialog-aSElFFw2.js";
4
- import { t as WorkbenchSelect } from "./workbenchSelect-DBGP7Y4Z.js";
2
+ import { xr as Button } from "./tooltip-BDcVTNpu.js";
3
+ import { a as DialogFooter, d as Field, f as FieldDescription, h as FieldLabel, i as DialogDescription, l as Icon, m as FieldGroup, n as DialogClose, nn as Input, o as DialogHeader, p as FieldError, r as DialogContent, s as DialogTitle, t as Dialog, u as Spinner } from "./dialog-WzR4CRFH.js";
4
+ import { t as WorkbenchSelect } from "./workbenchSelect-DtAd0zc4.js";
5
5
  import { useEffect, useRef, useState } from "react";
6
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/workbench/browser/runtime/shell/createResourceDialog.tsx
8
- function CreateResourceDialog({ disabled, field, id, issue, label, name, onNameChange, onOpenChange, onSubmit, pending, submitLabel, sourceUrl, title }) {
8
+ function CreateResourceDialog({ disabled, tagField, field, id, issue, label, name, onNameChange, onOpenChange, onSubmit, pending, submitLabel, sourceUrl, title }) {
9
9
  const t = useTranslate();
10
10
  const input = useRef(null);
11
11
  const portal = useRef(null);
12
+ const [root, setRoot] = useState(null);
12
13
  const [open, setOpen] = useState(false);
13
14
  const showIssue = name.length > 0 && issue != null;
14
15
  const message = showIssue ? t(`resource.nameIssue.${issue}`, { max: 80 }) : t("resource.nameHint", { max: 80 });
@@ -27,6 +28,7 @@ function CreateResourceDialog({ disabled, field, id, issue, label, name, onNameC
27
28
  },
28
29
  open,
29
30
  children: /* @__PURE__ */ jsx(DialogContent, {
31
+ ref: setRoot,
30
32
  container: portal.current,
31
33
  initialFocus: () => input.current,
32
34
  showCloseButton: false,
@@ -56,63 +58,67 @@ function CreateResourceDialog({ disabled, field, id, issue, label, name, onNameC
56
58
  })] }),
57
59
  /* @__PURE__ */ jsxs(FieldGroup, {
58
60
  className: "gap-4",
59
- children: [/* @__PURE__ */ jsxs(Field, {
60
- "data-invalid": showIssue,
61
- children: [
62
- /* @__PURE__ */ jsx(FieldLabel, {
63
- htmlFor: id,
64
- children: label
65
- }),
66
- /* @__PURE__ */ jsx(Input, {
67
- autoComplete: "off",
68
- "aria-describedby": messageId,
69
- "aria-invalid": showIssue,
70
- id,
71
- name: "resource-name",
72
- onChange: (event) => onNameChange(event.target.value),
73
- ref: input,
74
- required: true,
75
- value: name
76
- }),
77
- showIssue ? /* @__PURE__ */ jsx(FieldError, {
78
- id: messageId,
79
- children: message
80
- }) : /* @__PURE__ */ jsx(FieldDescription, {
81
- id: messageId,
82
- children: message
83
- })
84
- ]
85
- }), field != null && /* @__PURE__ */ jsxs(Field, { children: [
86
- /* @__PURE__ */ jsx(FieldLabel, {
87
- htmlFor: field.state == "ready" ? fieldId : void 0,
88
- children: field.label
89
- }),
90
- field.state == "ready" ? /* @__PURE__ */ jsx(WorkbenchSelect, {
91
- ariaLabel: field.ariaLabel,
92
- className: "w-full",
93
- id: fieldId,
94
- onValueChange: field.onValueChange,
95
- options: field.options,
96
- portalRoot: portal.current,
97
- value: field.value
98
- }) : /* @__PURE__ */ jsxs("div", {
99
- className: "flex min-h-9 items-center gap-2 rounded-lg border bg-muted/30 px-3 py-2 text-sm text-muted-foreground",
100
- role: field.state == "error" ? "alert" : "status",
61
+ children: [
62
+ /* @__PURE__ */ jsxs(Field, {
63
+ "data-invalid": showIssue,
101
64
  children: [
102
- field.state == "loading" && /* @__PURE__ */ jsx(Spinner, { "aria-hidden": "true" }),
103
- /* @__PURE__ */ jsx("span", { children: field.status }),
104
- field.state == "error" && /* @__PURE__ */ jsx(Button, {
105
- className: "ml-auto bg-background",
106
- onClick: field.onRetry,
107
- size: "sm",
108
- type: "button",
109
- variant: "outline",
110
- children: field.retry
65
+ /* @__PURE__ */ jsx(FieldLabel, {
66
+ htmlFor: id,
67
+ children: label
68
+ }),
69
+ /* @__PURE__ */ jsx(Input, {
70
+ autoComplete: "off",
71
+ "aria-describedby": messageId,
72
+ "aria-invalid": showIssue,
73
+ id,
74
+ name: "resource-name",
75
+ onChange: (event) => onNameChange(event.target.value),
76
+ ref: input,
77
+ required: true,
78
+ value: name
79
+ }),
80
+ showIssue ? /* @__PURE__ */ jsx(FieldError, {
81
+ id: messageId,
82
+ children: message
83
+ }) : /* @__PURE__ */ jsx(FieldDescription, {
84
+ id: messageId,
85
+ children: message
111
86
  })
112
87
  ]
113
88
  }),
114
- /* @__PURE__ */ jsx(FieldDescription, { children: field.description })
115
- ] })]
89
+ tagField?.(root),
90
+ field != null && /* @__PURE__ */ jsxs(Field, { children: [
91
+ /* @__PURE__ */ jsx(FieldLabel, {
92
+ htmlFor: field.state == "ready" ? fieldId : void 0,
93
+ children: field.label
94
+ }),
95
+ field.state == "ready" ? /* @__PURE__ */ jsx(WorkbenchSelect, {
96
+ ariaLabel: field.ariaLabel,
97
+ className: "w-full",
98
+ id: fieldId,
99
+ onValueChange: field.onValueChange,
100
+ options: field.options,
101
+ portalRoot: root,
102
+ value: field.value
103
+ }) : /* @__PURE__ */ jsxs("div", {
104
+ className: "flex min-h-9 items-center gap-2 rounded-lg border bg-muted/30 px-3 py-2 text-sm text-muted-foreground",
105
+ role: field.state == "error" ? "alert" : "status",
106
+ children: [
107
+ field.state == "loading" && /* @__PURE__ */ jsx(Spinner, { "aria-hidden": "true" }),
108
+ /* @__PURE__ */ jsx("span", { children: field.status }),
109
+ field.state == "error" && /* @__PURE__ */ jsx(Button, {
110
+ className: "ml-auto bg-background",
111
+ onClick: field.onRetry,
112
+ size: "sm",
113
+ type: "button",
114
+ variant: "outline",
115
+ children: field.retry
116
+ })
117
+ ]
118
+ }),
119
+ /* @__PURE__ */ jsx(FieldDescription, { children: field.description })
120
+ ] })
121
+ ]
116
122
  }),
117
123
  /* @__PURE__ */ jsxs(DialogFooter, {
118
124
  className: "mx-0 mb-0 border-0 bg-transparent p-0 pt-1",
@@ -1,5 +1,5 @@
1
1
  import { a as toPlainObject, i as isString } from "./dist-BFmpkX4P.js";
2
- import { $ as useAnchoredPopupScrollLock, A as string, An as ownerDocument, At as useTriggerDataForwarding, Bn as useValueChanged, Br as isElement, C as literal, Cn as activeElement, Cr as useRenderElement, Ct as useSyncedFloatingRootContext, D as preprocess, Dt as PopupTriggerMap, E as object, Er as NOOP, Et as popupStoreSelectors, F as IndexGuessBehavior, Ft as FloatingFocusManager, Gn as closePress, Ht as FloatingPortal, I as useCompositeListItem, Ir as useStableCallback, Jn as imperativeAction, Jt as ReactStore, Ln as transitionStatusMapping, Lr as useRefWithInit, M as unknown, Mn as createLucideIcon, Mr as formatErrorMessage, Mt as platform, N as _isoDateTime, Nn as useTransitionStatus, Nr as mergeProps, Nt as useDismiss, O as record$1, Or as useMergedRefs, Ot as useImplicitActiveTrigger, P as Separator, Pn as useOpenChangeComplete, Pr as useIsoLayoutEffect, Pt as useClick, Q as useToolbarRootContext, Qn as itemPress, Rn as useAnimationFrame, T as number, Tn as getTarget, Tr as EMPTY_OBJECT, Tt as createInitialPopupStoreState, U as COMPOSITE_KEYS, Un as cancelOpen, Ut as CLICK_TRIGGER_IDENTIFIER, Vn as createChangeEventDetails, Wt as DROPDOWN_COLLISION_AVOIDANCE, Xt as useStore, Yt as Store, _ as array, _r as useControlled, _t as useRole, an as useTimeout, br as cn, cr as useFormContext, ct as inertValue, dr as useBaseUiId, dt as popupStateMapping, er as none, et as useScrollLock, f as isTimeZone, ft as pressableTriggerOpenStateMapping, g as _enum, gr as visuallyHiddenInput, gt as useTypeahead, h as ZodType, hr as visuallyHidden, i as TooltipTrigger, it as useAnchorPositioning, j as union, jn as Check, k as strictObject, kn as isWebKit, kr as useButton, kt as useOpenStateTransitions, lr as useRegisterFieldControl, lt as getPseudoElementBounds, m as ZodISODateTime, mr as fieldValidityMapping, mt as useOpenInteractionType, n as TooltipContent, nn as useValueAsRef, nt as getDisabledMountTransitionStyles, or as windowResize, ot as useDirection, pt as triggerOpenStateMapping, qt as addEventListener, rn as useOnFirstRender, rt as InternalBackdrop, sr as useLabelableContext, st as CompositeList, t as Tooltip, tn as createSelector, tt as usePositioner, ur as useFieldRootContext, ut as CommonPopupDataAttributes, v as boolean, vr as Button, vt as useListNavigation, w as never, wn as contains, wr as EMPTY_ARRAY, wt as useFloatingRootContext, x as json$1, xn as getFloatingFocusElement, xr as cva, y as discriminatedUnion, yn as rectToClientRect, yr as buttonVariants, yt as useInteractions, zr as getWindow } from "./tooltip-3XMK9jkr.js";
2
+ import { $ as useToolbarRootContext, A as string, At as useImplicitActiveTrigger, Bn as transitionStatusMapping, Br as useRefWithInit, C as literal, Cn as getFloatingFocusElement, Cr as cn, D as preprocess, Dn as getTarget, Dr as EMPTY_ARRAY, Dt as createInitialPopupStoreState, E as object, En as contains, Er as useRenderElement, Et as useFloatingRootContext, F as IndexGuessBehavior, Fn as createLucideIcon, Fr as formatErrorMessage, Ft as useDismiss, Gt as CLICK_TRIGGER_IDENTIFIER, Hr as getWindow, I as useCompositeListItem, In as useTransitionStatus, Ir as mergeProps, It as useClick, Jn as closePress, Kn as cancelOpen, Kt as DROPDOWN_COLLISION_AVOIDANCE, Ln as useOpenChangeComplete, Lr as useIsoLayoutEffect, Lt as FloatingFocusManager, M as unknown, Mn as ownerDocument, Mr as useButton, Mt as useTriggerDataForwarding, N as _isoDateTime, Nn as useLabelableId, O as record$1, Or as EMPTY_OBJECT, Ot as popupStoreSelectors, P as Separator, Pn as Check, Pt as platform, Qt as useStore, Sr as buttonVariants, T as number, Tn as activeElement, Tt as useSyncedFloatingRootContext, U as COMPOSITE_KEYS, Un as useValueChanged, Vn as useAnimationFrame, Wn as createChangeEventDetails, Wt as FloatingPortal, Xt as ReactStore, Yt as addEventListener, Zn as imperativeAction, Zt as Store, _ as array, _r as fieldValidityMapping, an as useOnFirstRender, at as useAnchorPositioning, br as useControlled, bt as useListNavigation, ct as CompositeList, dr as useFormContext, dt as CommonPopupDataAttributes, et as useAnchoredPopupScrollLock, f as isTimeZone, fr as useRegisterFieldControl, ft as popupStateMapping, g as _enum, gt as serializeValue, h as ZodType, ht as useOpenInteractionType, i as TooltipTrigger, in as useValueAsRef, it as InternalBackdrop, j as union, jn as isWebKit, jr as useMergedRefs, jt as useOpenStateTransitions, k as strictObject, kt as PopupTriggerMap, lr as windowResize, lt as inertValue, m as ZodISODateTime, mr as useBaseUiId, mt as triggerOpenStateMapping, n as TooltipContent, nt as usePositioner, pr as useFieldRootContext, pt as pressableTriggerOpenStateMapping, rn as createSelector, rr as none, rt as getDisabledMountTransitionStyles, sn as useTimeout, st as useDirection, t as Tooltip, tr as itemPress, tt as useScrollLock, ur as useLabelableContext, ut as getPseudoElementBounds, v as boolean, vr as visuallyHidden, vt as useTypeahead, w as never, wr as cva, x as json$1, xn as rectToClientRect, xr as Button, xt as useInteractions, y as discriminatedUnion, yr as visuallyHiddenInput, yt as useRole, zr as useStableCallback } from "./tooltip-BDcVTNpu.js";
3
3
  import * as React from "react";
4
4
  import { useMemo } from "react";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -221,57 +221,6 @@ var X = createLucideIcon("X", [["path", {
221
221
  key: "d8bk6v"
222
222
  }]]);
223
223
  //#endregion
224
- //#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/internals/labelable-provider/useLabelableId.js
225
- function useLabelableId(params = {}) {
226
- const { id, implicit = false, controlRef } = params;
227
- const { controlId, registerControlId } = useLabelableContext();
228
- const defaultId = useBaseUiId(id);
229
- const controlIdForEffect = implicit ? controlId : void 0;
230
- const controlSourceRef = useRefWithInit(() => Symbol("labelable-control"));
231
- const hasRegisteredRef = React.useRef(false);
232
- const hadExplicitIdRef = React.useRef(id != null);
233
- const unregisterControlId = useStableCallback(() => {
234
- if (!hasRegisteredRef.current || registerControlId === NOOP) return;
235
- hasRegisteredRef.current = false;
236
- registerControlId(controlSourceRef.current, void 0);
237
- });
238
- useIsoLayoutEffect(() => {
239
- if (registerControlId === NOOP) return;
240
- let nextId;
241
- if (implicit) {
242
- const elem = controlRef?.current;
243
- if (isElement(elem) && elem.closest("label") != null) nextId = id ?? null;
244
- else nextId = controlIdForEffect ?? defaultId;
245
- } else if (id != null) {
246
- hadExplicitIdRef.current = true;
247
- nextId = id;
248
- } else if (hadExplicitIdRef.current) nextId = defaultId;
249
- else {
250
- unregisterControlId();
251
- return;
252
- }
253
- if (nextId === void 0) {
254
- unregisterControlId();
255
- return;
256
- }
257
- hasRegisteredRef.current = true;
258
- registerControlId(controlSourceRef.current, nextId);
259
- }, [
260
- id,
261
- controlRef,
262
- controlIdForEffect,
263
- registerControlId,
264
- implicit,
265
- defaultId,
266
- controlSourceRef,
267
- unregisterControlId
268
- ]);
269
- React.useEffect(() => {
270
- return unregisterControlId;
271
- }, [unregisterControlId]);
272
- return controlId ?? defaultId;
273
- }
274
- //#endregion
275
224
  //#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/field/control/FieldControl.js
276
225
  /**
277
226
  * The form control to label and validate.
@@ -455,17 +404,6 @@ function removeItem(selectedValues, itemValue, comparer) {
455
404
  return selectedValues.filter((selectedValue) => !compareItemEquality(itemValue, selectedValue, comparer));
456
405
  }
457
406
  //#endregion
458
- //#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/internals/serializeValue.js
459
- function serializeValue(value) {
460
- if (value == null) return "";
461
- if (typeof value === "string") return value;
462
- try {
463
- return JSON.stringify(value);
464
- } catch {
465
- return String(value);
466
- }
467
- }
468
- //#endregion
469
407
  //#region ../../node_modules/.bun/@base-ui+react@1.4.1+fa6c2f29eeb10566/node_modules/@base-ui/react/esm/internals/resolveValueLabel.js
470
408
  function isGroupedItems(items) {
471
409
  return items != null && items.length > 0 && typeof items[0] === "object" && items[0] != null && "items" in items[0];
@@ -2310,6 +2248,11 @@ function SelectScrollDownButton({ className, ...props }) {
2310
2248
  });
2311
2249
  }
2312
2250
  //#endregion
2251
+ //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/classic/iso.js
2252
+ function datetime(params) {
2253
+ return _isoDateTime(ZodISODateTime, params);
2254
+ }
2255
+ //#endregion
2313
2256
  //#region ../../node_modules/.bun/dequal@2.0.3/node_modules/dequal/lite/index.mjs
2314
2257
  var has = Object.prototype.hasOwnProperty;
2315
2258
  function dequal(foo, bar) {
@@ -2333,11 +2276,63 @@ function dequal(foo, bar) {
2333
2276
  }
2334
2277
  return foo !== foo && bar !== bar;
2335
2278
  }
2336
- //#endregion
2337
- //#region ../../node_modules/.bun/zod@4.6.5/node_modules/zod/v4/classic/iso.js
2338
- function datetime(params) {
2339
- return _isoDateTime(ZodISODateTime, params);
2279
+ strictObject({
2280
+ scope: _enum(["draft", "live"]),
2281
+ values: boolean().optional()
2282
+ });
2283
+ strictObject({
2284
+ scope: _enum(["draft", "live"]),
2285
+ key: string().min(1).refine((key) => new TextEncoder().encode(key).length <= 256).optional()
2286
+ });
2287
+ strictObject({
2288
+ scope: _enum(["draft", "live"]),
2289
+ space: string().regex(/^(flow|node:.+)$/)
2290
+ });
2291
+ var skipDuplicatesConfigSchema = strictObject({ fields: array(string().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) });
2292
+ var skipDuplicatesExecutorSchema = skipDuplicatesConfigSchema.extend({ kind: literal("skip-duplicates") });
2293
+ function skipDuplicatesTask(config = skipDuplicatesConfigSchema.parse({}), name = "Skip Duplicates") {
2294
+ return {
2295
+ name,
2296
+ executor: {
2297
+ ...config,
2298
+ kind: "skip-duplicates"
2299
+ },
2300
+ inputs: [{
2301
+ handle: "items",
2302
+ jsonSchema: { type: "array" },
2303
+ nullable: false
2304
+ }],
2305
+ outputs: ["items", "duplicates"].map((handle) => ({
2306
+ handle,
2307
+ jsonSchema: { type: "array" },
2308
+ nullable: false
2309
+ }))
2310
+ };
2340
2311
  }
2312
+ var flowStateViewSchema = object({
2313
+ version: literal(1),
2314
+ scope: _enum(["draft", "live"]),
2315
+ limits: object({
2316
+ maxValueBytes: number().positive(),
2317
+ maxValues: number().int().positive(),
2318
+ maxSpaces: number().int().positive(),
2319
+ maxIdentities: number().positive(),
2320
+ maxRunWrites: number().positive()
2321
+ }),
2322
+ values: array(object({
2323
+ key: string(),
2324
+ size: number().nonnegative(),
2325
+ updatedAt: number(),
2326
+ value: json$1().optional()
2327
+ })),
2328
+ spaces: array(object({
2329
+ space: string(),
2330
+ count: number().nonnegative(),
2331
+ pendingCount: number().nonnegative(),
2332
+ reservedCount: number().nonnegative(),
2333
+ updatedAt: number()
2334
+ }))
2335
+ });
2341
2336
  //#endregion
2342
2337
  //#region ../../node_modules/.bun/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/deep-compare-strict.js
2343
2338
  function deepCompareStrict(a, b) {
@@ -7060,7 +7055,8 @@ var managedFields = object({
7060
7055
  flowId: text,
7061
7056
  revisionId: text
7062
7057
  }),
7063
- httpRequestExecutorSchema
7058
+ httpRequestExecutorSchema,
7059
+ skipDuplicatesExecutorSchema
7064
7060
  ])
7065
7061
  });
7066
7062
  var managed = managedFields.transform(limitDecisionTask);
@@ -7330,7 +7326,8 @@ var revision = object({
7330
7326
  literal(9),
7331
7327
  literal(10),
7332
7328
  literal(11),
7333
- literal(12)
7329
+ literal(12),
7330
+ literal(13)
7334
7331
  ]),
7335
7332
  document,
7336
7333
  modules: record$1(text, module)
@@ -7532,6 +7529,7 @@ var variants = new Map(Object.entries(shapes).map(([kind, shape]) => [kind, shap
7532
7529
  })]));
7533
7530
  array(union([...variants.values()])).min(1);
7534
7531
  function checkModelVersion(content) {
7532
+ if (content.modelVersion < 13 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind === "task" && "executor" in candidateNode.task && candidateNode.task.executor.kind === "skip-duplicates")) throw new Error("Skip Duplicates requires Flow model v13.");
7535
7533
  if (content.modelVersion < 12 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind == "task" && "moduleId" in candidateNode.task && candidateNode.task.capabilities?.some((item) => item.kind == "http"))) throw new TypeError("Code HTTP access requires Flow model version 12.");
7536
7534
  if (content.modelVersion < 11 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind == "task" && "executor" in candidateNode.task && candidateNode.task.executor.kind == "http-request")) throw new TypeError("HTTP Request requires Flow model version 11.");
7537
7535
  if (content.modelVersion < 11 && Object.values(content.document.graph.nodes).some((candidateNode) => candidateNode.kind == "task" && ("moduleId" in candidateNode.task ? candidateNode.task.capabilities?.some((item) => item.kind == "workflow") : candidateNode.task.executor.kind == "agent" && candidateNode.task.executor.tools.some((item) => item.kind == "workflow")))) throw new TypeError("Workflow tools require Flow model version 11.");
@@ -7771,7 +7769,7 @@ var nodeErrorSchema = {
7771
7769
  }
7772
7770
  };
7773
7771
  function supportsNodeErrorHandling(node) {
7774
- return supportsNodeRetry(node);
7772
+ return supportsNodeRetry(node) || node.kind === "task" && "executor" in node.task && node.task.executor.kind === "skip-duplicates";
7775
7773
  }
7776
7774
  function nodeSystemOutputPorts(node) {
7777
7775
  return supportsNodeErrorHandling(node) && node.onError == "error" ? { error: {
@@ -7941,10 +7939,10 @@ function upgradeRevisionContent(content) {
7941
7939
  function upgradeDecodedRevisionContent(content) {
7942
7940
  const graph = content.document.graph;
7943
7941
  const hasManual = Object.values(graph.nodes).some((node) => node.kind == "manual");
7944
- if (!hasManual && content.modelVersion == 12) return content;
7942
+ if (!hasManual && content.modelVersion == 13) return content;
7945
7943
  return {
7946
7944
  ...content,
7947
- modelVersion: 12,
7945
+ modelVersion: 13,
7948
7946
  document: {
7949
7947
  ...content.document,
7950
7948
  graph: hasManual ? {
@@ -7991,7 +7989,7 @@ function invalid(message) {
7991
7989
  throw new FlowChangeError(message);
7992
7990
  }
7993
7991
  function applyFlowChanges(content, operations) {
7994
- const source = content.modelVersion != 12 || Object.values(content.document.graph.nodes).some((node) => node.kind == "manual") ? decodeRevisionContent(content) : content;
7992
+ const source = content.modelVersion != 13 || Object.values(content.document.graph.nodes).some((node) => node.kind == "manual") ? decodeRevisionContent(content) : content;
7995
7993
  const document = { ...source.document };
7996
7994
  const modules = { ...source.modules };
7997
7995
  for (const operation of operations) switch (operation.kind) {
@@ -8439,7 +8437,7 @@ function applyFlowChanges(content, operations) {
8439
8437
  assertDocumentHttpAuthBindings(document);
8440
8438
  return upgradeDecodedRevisionContent({
8441
8439
  document,
8442
- modelVersion: 12,
8440
+ modelVersion: 13,
8443
8441
  modules
8444
8442
  });
8445
8443
  }
@@ -9284,10 +9282,11 @@ function DialogOverlay({ className, ...props }) {
9284
9282
  ...props
9285
9283
  });
9286
9284
  }
9287
- function DialogContent({ children, className, closeLabel = "Close", container, showCloseButton = true, ...props }) {
9285
+ var DialogContent = React.forwardRef(function DialogContent({ children, className, closeLabel = "Close", container, showCloseButton = true, ...props }, ref) {
9288
9286
  return /* @__PURE__ */ jsxs(DialogPortal, {
9289
9287
  container,
9290
9288
  children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(DialogPopup, {
9289
+ ref,
9291
9290
  "data-slot": "dialog-content",
9292
9291
  className: cn("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] grid-cols-[minmax(0,1fr)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg bg-popover [--ui-control-background:var(--ui-popover)] p-4 text-sm text-popover-foreground shadow-lg ring-1 ring-foreground/10 outline-none sm:max-w-sm transition-opacity duration-150 ease-out data-starting-style:opacity-0 data-ending-style:opacity-0 motion-reduce:transition-none", className),
9293
9292
  ...props,
@@ -9310,7 +9309,7 @@ function DialogContent({ children, className, closeLabel = "Close", container, s
9310
9309
  })] })]
9311
9310
  })]
9312
9311
  });
9313
- }
9312
+ });
9314
9313
  function DialogHeader({ className, ...props }) {
9315
9314
  return /* @__PURE__ */ jsx("div", {
9316
9315
  "data-slot": "dialog-header",
@@ -9340,4 +9339,4 @@ function DialogDescription({ className, ...props }) {
9340
9339
  });
9341
9340
  }
9342
9341
  //#endregion
9343
- export { waitAutoContinueSchema as $, Input as $t, comparisonIssue as A, variableInputCompatible as At, authoringDefinitionSchemas as B, SelectTrigger as Bt, upgradeManualTrigger as C, limitDecisionQuestions as Ct, nodeSystemOutputPorts as D, matchesSchema as Dt, nodeErrorSchema as E, comparePorts as Et, operatorsForType as F, SelectChevron as Ft, workflowAgentToolSchema as G, stringifyAsLabel as Gt, connectorCapabilitySchema as H, resolveAriaLabelledBy as Ht, otherwiseOutput as I, SelectContent as It, webhookResponseAllowsBody as J, defaultItemEquality as Jt, webhookHeaderValuePort as K, stringifyAsValue as Kt, unaryOperator as L, SelectGroup as Lt, mapConditionSources as M, format as Mt, nodeInputMappings as N, dequal as Nt, supportsNodeErrorHandling as O, portsAssignable as Ot, operandHandle as P, Select as Pt, workflowOutputsPort as Q, Label as Qt, valueType as R, SelectItem as Rt, resourceNameIssue as S, defaultDecisionQuestion as St, workflowToolNameIssue as T, webhookSupportsBody as Tt, decodeRevisionContent as U, hasNullItemLabel as Ut, connectorAgentToolSchema as V, SelectValue as Vt, httpCapabilitySchema as W, isGroupedItems as Wt, webhookResponseTimeout as X, removeItem as Xt, webhookResponseInputs as Y, findItemIndex as Yt, webhookStatusCodePort as Z, selectedValueIncludes as Zt, applyFlowChanges as _, isHttpHost as _t, DialogFooter as a, httpHeaderSchema as at, nodeNameIssue as b, decisionQuestionIssues as bt, DialogTrigger as c, httpRequestInputs as ct, Field as d, withHttpParameterFields as dt, useLabelableId as en, defaultNodeRetry as et, FieldDescription as f, withHttpParameterSource as ft, FlowChangeError as g, renamedPort as gt, FieldLabel as h, renameOutputMapping as ht, DialogDescription as i, checkJsonDepth as it, conditionInputPorts as j, isSchemaKeyword as jt, clearConditionBindings as k, schemaObject as kt, Icon as l, httpRequestIssues as lt, FieldGroup as m, remapInputMappings as mt, DialogClose as n, retryConfigurationSchema as nt, DialogHeader as o, httpQuerySchema as ot, FieldError as p, httpHeaderNameIssue as pt, webhookHeadersPort as q, compareItemEquality as qt, DialogContent as r, supportsNodeRetry as rt, DialogTitle as s, httpRequestConfigSchema as st, Dialog as t, ChevronDown as tn, nodeRetryLimits as tt, Spinner as u, httpRequestTask as ut, isTriggerNode as v, decisionLimits as vt, upgradeRevisionContent as w, webhookMethods as wt, normalizeNodeName as x, decisionTask as xt, nextNodeName as y, decisionModel as yt, agentToolFields as z, SelectSeparator as zt };
9342
+ export { waitAutoContinueSchema as $, removeItem as $t, comparisonIssue as A, variableInputCompatible as At, authoringDefinitionSchemas as B, SelectGroup as Bt, upgradeManualTrigger as C, limitDecisionQuestions as Ct, nodeSystemOutputPorts as D, matchesSchema as Dt, nodeErrorSchema as E, comparePorts as Et, operatorsForType as F, skipDuplicatesTask as Ft, workflowAgentToolSchema as G, resolveAriaLabelledBy as Gt, connectorCapabilitySchema as H, SelectSeparator as Ht, otherwiseOutput as I, dequal as It, webhookResponseAllowsBody as J, stringifyAsLabel as Jt, webhookHeaderValuePort as K, hasNullItemLabel as Kt, unaryOperator as L, Select as Lt, mapConditionSources as M, format as Mt, nodeInputMappings as N, flowStateViewSchema as Nt, supportsNodeErrorHandling as O, portsAssignable as Ot, operandHandle as P, skipDuplicatesConfigSchema as Pt, workflowOutputsPort as Q, findItemIndex as Qt, valueType as R, SelectChevron as Rt, resourceNameIssue as S, defaultDecisionQuestion as St, workflowToolNameIssue as T, webhookSupportsBody as Tt, decodeRevisionContent as U, SelectTrigger as Ut, connectorAgentToolSchema as V, SelectItem as Vt, httpCapabilitySchema as W, SelectValue as Wt, webhookResponseTimeout as X, compareItemEquality as Xt, webhookResponseInputs as Y, stringifyAsValue as Yt, webhookStatusCodePort as Z, defaultItemEquality as Zt, applyFlowChanges as _, isHttpHost as _t, DialogFooter as a, httpHeaderSchema as at, nodeNameIssue as b, decisionQuestionIssues as bt, DialogTrigger as c, httpRequestInputs as ct, Field as d, withHttpParameterFields as dt, selectedValueIncludes as en, defaultNodeRetry as et, FieldDescription as f, withHttpParameterSource as ft, FlowChangeError as g, renamedPort as gt, FieldLabel as h, renameOutputMapping as ht, DialogDescription as i, checkJsonDepth as it, conditionInputPorts as j, isSchemaKeyword as jt, clearConditionBindings as k, schemaObject as kt, Icon as l, httpRequestIssues as lt, FieldGroup as m, remapInputMappings as mt, DialogClose as n, Input as nn, retryConfigurationSchema as nt, DialogHeader as o, httpQuerySchema as ot, FieldError as p, httpHeaderNameIssue as pt, webhookHeadersPort as q, isGroupedItems as qt, DialogContent as r, ChevronDown as rn, supportsNodeRetry as rt, DialogTitle as s, httpRequestConfigSchema as st, Dialog as t, Label as tn, nodeRetryLimits as tt, Spinner as u, httpRequestTask as ut, isTriggerNode as v, decisionLimits as vt, upgradeRevisionContent as w, webhookMethods as wt, normalizeNodeName as x, decisionTask as xt, nextNodeName as y, decisionModel as yt, agentToolFields as z, SelectContent as zt };
@@ -1,5 +1,5 @@
1
- import { n as IconImageCrossOriginContext, o as IconifyProvider } from "./ContentIcon-Cm1hbVzW.js";
2
- import { t as FlowCanvas, v as CanvasStore } from "./FlowCanvas-NzKtla_c.js";
1
+ import { n as IconImageCrossOriginContext, o as IconifyProvider } from "./ContentIcon-CMn0c-kl.js";
2
+ import { t as FlowCanvas, x as CanvasStore } from "./FlowCanvas-BQGBcfoL.js";
3
3
  import { createElement } from "react";
4
4
  import { createRoot } from "react-dom/client";
5
5
  //#region ../../node_modules/.bun/html-to-image@1.11.11/node_modules/html-to-image/es/util.js