@oomol-lab/open-flow 0.1.0-beta.77 → 0.1.0-beta.79

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 (64) hide show
  1. package/README.md +2 -0
  2. package/dist/browser/{ContentIcon-VZQO8VZU.js → ContentIcon-CMn0c-kl.js} +93 -3
  3. package/dist/browser/{FlowCanvas-BNGDMaWr.js → FlowCanvas-BQGBcfoL.js} +1675 -591
  4. package/dist/browser/{createResourceDialog-BmtakfVg.js → createResourceDialog-DkovGogv.js} +3 -3
  5. package/dist/browser/{dialog-BcFBfRB1.js → dialog-CFFuRM8s.js} +37 -86
  6. package/dist/browser/{exportSvg-CG8hEUNk.js → exportSvg-CYwyYiuH.js} +2 -2
  7. package/dist/browser/{flowChanges-BGo_4Ypo.js → flowChanges-CN2R-m1M.js} +1258 -422
  8. package/dist/browser/{flowWorkspace-BFHGev7s.js → flowWorkspace-CXVL1FNv.js} +634 -628
  9. package/dist/browser/licenses.md +1 -1
  10. package/dist/browser/preview.css +512 -462
  11. package/dist/browser/preview.js +8183 -6384
  12. package/dist/browser/{tooltip-BAWSUexx.js → tooltip-BDcVTNpu.js} +65 -2
  13. package/dist/browser/{typeScriptSession-CRoezJPN.js → typeScriptSession-CoEIptNC.js} +1 -1
  14. package/dist/browser/ui.css +5 -24
  15. package/dist/browser/workbench.css +512 -462
  16. package/dist/browser/workbench.d.ts +2 -3
  17. package/dist/browser/workbench.js +65 -690
  18. package/dist/browser/{workbenchSelect-CjK-xdm3.js → workbenchSelect-CkOS95gX.js} +2 -2
  19. package/dist/command/index.js +31 -31
  20. package/dist/common/authoring.d.ts +3 -3
  21. package/dist/common/authoringExamples.d.ts +3 -3
  22. package/dist/common/authoringSchema.d.ts +14 -22
  23. package/dist/common/control-api-conformance.js +91 -25
  24. package/dist/common/control-api.d.ts +8 -3
  25. package/dist/common/control-api.js +51 -25
  26. package/dist/common/control-requests.d.ts +9 -3
  27. package/dist/common/control-requests.js +54 -42
  28. package/dist/common/flow-authoring.js +32 -19
  29. package/dist/common/flow-change.d.ts +1 -1
  30. package/dist/common/flow-change.js +32 -19
  31. package/dist/common/flow-encoding.js +31 -18
  32. package/dist/common/flow-semantics.js +41 -26
  33. package/dist/common/flow-state.d.ts +49 -43
  34. package/dist/common/flow-state.js +95 -110
  35. package/dist/common/mcp.d.ts +35 -4
  36. package/dist/common/mcp.js +51 -26
  37. package/dist/common/run-events.js +19 -9
  38. package/dist/common/runtime-contract.d.ts +4 -1
  39. package/dist/common/runtime-contract.js +66 -17
  40. package/dist/common/runtime-nodejs-compat.js +11 -12
  41. package/dist/common/scheduler.d.ts +2 -1
  42. package/dist/common/scheduler.js +82 -55
  43. package/dist/common/state-conformance.d.ts +3 -3
  44. package/dist/index.d.ts +1 -0
  45. package/package.json +1 -1
  46. package/src/control/common/api.ts +36 -7
  47. package/src/control/common/authoring.ts +6 -5
  48. package/src/control/common/authoringExamples.ts +6 -5
  49. package/src/control/common/authoringSchema.ts +7 -7
  50. package/src/control/common/conformance.ts +31 -0
  51. package/src/control/common/mcp.ts +7 -2
  52. package/src/control/common/requests.ts +10 -1
  53. package/src/execution/common/events.ts +22 -10
  54. package/src/execution/common/node-execution.ts +1 -1
  55. package/src/execution/common/scheduler.ts +28 -14
  56. package/src/flow/common/change.ts +1 -1
  57. package/src/flow/common/changeSchema.ts +4 -4
  58. package/src/flow/common/errorHandling.ts +1 -1
  59. package/src/flow/common/semantics.ts +12 -6
  60. package/src/runtime/common/nodejsGuest.generated.json +11 -12
  61. package/src/runtime/common/runtime.ts +45 -12
  62. package/src/state/common/conformance.ts +32 -21
  63. package/src/state/common/state.ts +85 -80
  64. package/src/types/index.ts +1 -0
@@ -1,9 +1,9 @@
1
1
  import { o as __toESM, t as __commonJSMin } from "./rolldown-runtime-CEgmsyvS.js";
2
- import { $ as ko_default$2, C as DropdownMenuContent, N as DropdownMenuTrigger, Q as ru_default$2, T as DropdownMenuItem, X as zh_TW_default$2, Y as waitBranchLocales, Z as zh_CN_default$2, a as spriteIcon, at as Checkbox, d as PopoverContent, et as ja_default$2, g as PopoverTrigger, h as PopoverTitle, i as placeholderIcon, it as providerIconAppearance, k as DropdownMenuSeparator, l as wrapLayout, nt as en_default$2, q as uiLocales, r as imageIcon, rt as I18n, tt as fr_default$2, u as Popover, x as DropdownMenu } from "./ContentIcon-VZQO8VZU.js";
2
+ import { $ as zh_CN_default$2, A as DropdownMenuSeparator, E as DropdownMenuItem, P as DropdownMenuTrigger, Q as zh_TW_default$2, S as DropdownMenu, Y as uiLocales, Z as waitBranchLocales, _ as PopoverTrigger, a as spriteIcon, at as I18n, d as Popover, et as ru_default$2, f as PopoverContent, g as PopoverTitle, i as placeholderIcon, it as en_default$2, l as wrapLayout, nt as ja_default$2, ot as providerIconAppearance, r as imageIcon, rt as fr_default$2, st as Checkbox, tt as ko_default$2, u as canvasDirection, w as DropdownMenuContent } from "./ContentIcon-CMn0c-kl.js";
3
3
  import { a as derive, i as compute, l as val, t as arrayShallowEqual } from "./dist-bO8nvHFH.js";
4
4
  import { a as toPlainObject, l as useTranslate, o as I18nProvider, u as useVal } from "./dist-BFmpkX4P.js";
5
- import { $n as itemPress, A as strictObject, Ar as useButton, C as lazy$1, Cn as isInteractiveElement, D as object$1, Dn as isAndroid, Dr as NOOP, E as number, En as getTarget, Er as EMPTY_OBJECT, Fn as useOpenChangeComplete, Fr as useIsoLayoutEffect, Ft as useClick, Gt as DROPDOWN_COLLISION_AVOIDANCE, Hn as createChangeEventDetails, I as IndexGuessBehavior, It as FloatingFocusManager, Kn as closePress, L as useCompositeListItem, Lr as useStableCallback, M as union, N as unknown, Nr as formatErrorMessage, On as isFirefox, Pn as useTransitionStatus, Pr as mergeProps, Pt as useDismiss, Qn as inputPress, Rn as transitionStatusMapping, Rr as useRefWithInit, S as json$3, Sr as cva, Tn as contains, Tr as EMPTY_ARRAY, Tt as useFloatingRootContext, Un as createGenericEventDetails, Ut as FloatingPortal, Vn as useValueChanged, Vr as isElement, Xn as inputChange, Xt as Store, Zn as inputClear, Zt as useStore, _r as visuallyHiddenInput, _t as useTypeahead, at as useAnchorPositioning, b as discriminatedUnion, br as buttonVariants, bt as useInteractions, cr as useLabelableContext, ct as CompositeList, dr as useFieldRootContext, er as listNavigation, et as useAnchoredPopupScrollLock, fr as useBaseUiId, ft as popupStateMapping, g as _enum, gr as visuallyHidden, hr as fieldValidityMapping, ht as useOpenInteractionType, i as TooltipTrigger, in as useOnFirstRender, it as InternalBackdrop, j as string$1, jn as ownerDocument, k as record$2, kr as useMergedRefs, lr as useFormContext, lt as inertValue, mr as DEFAULT_FIELD_STATE_ATTRIBUTES, n as TooltipContent, nn as createSelector, nt as usePositioner, on as useTimeout, p as timeZoneOffsetMinutes, pt as pressableTriggerOpenStateMapping, qn as escapeKey, rn as useValueAsRef, rt as getDisabledMountTransitionStyles, st as useDirection, t as Tooltip, tr as none, ur as useRegisterFieldControl, ut as getPseudoElementBounds, v as array, vr as useControlled, w as literal, wr as useRenderElement, x as int, xn as stopEvent, xr as cn, y as boolean, yr as Button, yt as useListNavigation } from "./tooltip-BAWSUexx.js";
6
- import { $t as removeItem, B as authoringDefinitionSchemas, Bt as SelectGroup, D as nodeSystemOutputPorts, Dt as matchesSchema, Et as comparePorts, Ft as flowStateViewSchema, G as workflowAgentToolSchema, Gt as resolveAriaLabelledBy, H as connectorCapabilitySchema, I as otherwiseOutput, It as dequal$1, J as webhookResponseAllowsBody, Jt as stringifyAsLabel, K as webhookHeaderValuePort, Kt as hasNullItemLabel, Lt as Select, Mt as format, N as nodeInputMappings, Nt as dedupeConfigSchema, Ot as portsAssignable, Pt as dedupeTask, Q as workflowOutputsPort, Qt as findItemIndex, S as resourceNameIssue, Tt as webhookSupportsBody, U as decodeRevisionContent, Ut as SelectTrigger, V as connectorAgentToolSchema, Vt as SelectItem, W as httpCapabilitySchema, Wt as SelectValue, Xt as compareItemEquality, Y as webhookResponseInputs, Yt as stringifyAsValue, Z as webhookStatusCodePort, Zt as defaultItemEquality, _ as applyFlowChanges$1, a as DialogFooter, ct as httpRequestInputs, d as Field, dt as withHttpParameterFields, en as selectedValueIncludes, ft as withHttpParameterSource, gt as renamedPort, h as FieldLabel, ht as renameOutputMapping, i as DialogDescription, it as checkJsonDepth, j as conditionInputPorts, jt as isSchemaKeyword, k as clearConditionBindings, kt as schemaObject, mt as remapInputMappings, n as DialogClose, nn as Input, nt as retryConfigurationSchema, o as DialogHeader, p as FieldError, pt as httpHeaderNameIssue, q as webhookHeadersPort, qt as isGroupedItems, r as DialogContent, rn as useLabelableId, s as DialogTitle, st as httpRequestConfigSchema, t as Dialog, tn as Label, ut as httpRequestTask, v as isTriggerNode, x as normalizeNodeName, xt as decisionTask, y as nextNodeName, z as agentToolFields, zt as SelectContent } from "./dialog-BcFBfRB1.js";
5
+ import { $n as inputClear, A as string$1, Bn as transitionStatusMapping, Br as useRefWithInit, C as literal, Cr as cn, Dn as getTarget, Dr as EMPTY_ARRAY, E as object$2, En as contains, Er as useRenderElement, Et as useFloatingRootContext, F as IndexGuessBehavior, Fr as formatErrorMessage, Ft as useDismiss, Gn as createGenericEventDetails, I as useCompositeListItem, In as useTransitionStatus, Ir as mergeProps, It as useClick, Jn as closePress, Kt as DROPDOWN_COLLISION_AVOIDANCE, Ln as useOpenChangeComplete, Lr as useIsoLayoutEffect, Lt as FloatingFocusManager, M as unknown, Mn as ownerDocument, Mr as useButton, Nn as useLabelableId, O as record$3, On as isAndroid, Or as EMPTY_OBJECT, Qn as inputChange, Qt as useStore, S as lazy$1, Sn as stopEvent, Sr as buttonVariants, T as number, Un as useValueChanged, Ur as isElement, Wn as createChangeEventDetails, Wt as FloatingPortal, Yn as escapeKey, Zt as Store, _ as array, _r as fieldValidityMapping, an as useOnFirstRender, at as useAnchorPositioning, b as int, br as useControlled, bt as useListNavigation, ct as CompositeList, dr as useFormContext, er as inputPress, et as useAnchoredPopupScrollLock, fr as useRegisterFieldControl, ft as popupStateMapping, g as _enum, gr as DEFAULT_FIELD_STATE_ATTRIBUTES, ht as useOpenInteractionType, i as TooltipTrigger, in as useValueAsRef, it as InternalBackdrop, j as union, jr as useMergedRefs, k as strictObject, kn as isFirefox, kr as NOOP, lt as inertValue, mr as useBaseUiId, n as TooltipContent, nr as listNavigation, nt as usePositioner, p as timeZoneOffsetMinutes, 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, ur as useLabelableContext, ut as getPseudoElementBounds, v as boolean, vr as visuallyHidden, vt as useTypeahead, wn as isInteractiveElement, wr as cva, x as json$3, xr as Button, xt as useInteractions, y as discriminatedUnion, yr as visuallyHiddenInput, zr as useStableCallback } from "./tooltip-BDcVTNpu.js";
6
+ import { $t as findItemIndex, B as authoringDefinitionSchemas, Bt as SelectContent, D as nodeSystemOutputPorts, Dt as matchesSchema, Et as comparePorts, Ft as skipDuplicatesConfigSchema, G as workflowAgentToolSchema, Gt as SelectValue, H as connectorCapabilitySchema, Ht as SelectItem, I as otherwiseOutput, It as skipDuplicatesTask, J as webhookResponseAllowsBody, Jt as isGroupedItems, K as webhookHeaderValuePort, Kt as resolveAriaLabelledBy, Lt as dequal$1, Mt as format, N as nodeInputMappings, Nt as flowStateValuesSchema, Ot as portsAssignable, Pt as flowStateViewSchema, Q as workflowOutputsPort, Qt as defaultItemEquality, Rt as Select, S as resourceNameIssue, Tt as webhookSupportsBody, U as decodeRevisionContent, V as connectorAgentToolSchema, Vt as SelectGroup, W as httpCapabilitySchema, Wt as SelectTrigger, Xt as stringifyAsValue, Y as webhookResponseInputs, Yt as stringifyAsLabel, Z as webhookStatusCodePort, Zt as compareItemEquality, _ as applyFlowChanges$1, a as DialogFooter, ct as httpRequestInputs, d as Field, dt as withHttpParameterFields, en as removeItem, ft as withHttpParameterSource, gt as renamedPort, h as FieldLabel, ht as renameOutputMapping, i as DialogDescription, it as checkJsonDepth, j as conditionInputPorts, jt as isSchemaKeyword, k as clearConditionBindings, kt as schemaObject, mt as remapInputMappings, n as DialogClose, nn as Label, nt as retryConfigurationSchema, o as DialogHeader, p as FieldError, pt as httpHeaderNameIssue, q as webhookHeadersPort, qt as hasNullItemLabel, r as DialogContent, rn as Input, s as DialogTitle, st as httpRequestConfigSchema, t as Dialog, tn as selectedValueIncludes, ut as httpRequestTask, v as isTriggerNode, x as normalizeNodeName, xt as decisionTask, y as nextNodeName, z as agentToolFields } from "./dialog-CFFuRM8s.js";
7
7
  import { a as uiLanguages, n as isUiLanguage, r as resolveUiLanguage } from "./languages-gYzoQqCi.js";
8
8
  import "./lib-Dws05GHj.js";
9
9
  import { i as objectValue, s as valueType, t as initialValue } from "./value-BbFQZZ_V.js";
@@ -209,7 +209,7 @@ var InvalidResponseError = class extends ApiError {
209
209
  function invalidResponse(detail) {
210
210
  throw new InvalidResponseError(detail);
211
211
  }
212
- function record$1(value) {
212
+ function record$2(value) {
213
213
  if (value == null || typeof value != "object" || Array.isArray(value)) return invalidResponse("Expected an object.");
214
214
  return value;
215
215
  }
@@ -235,7 +235,7 @@ function jsonValue(value) {
235
235
  if (value === null || typeof value == "boolean" || typeof value == "string") return value;
236
236
  if (typeof value == "number" && Number.isFinite(value)) return value;
237
237
  if (Array.isArray(value)) return value.map(jsonValue);
238
- const source = record$1(value);
238
+ const source = record$2(value);
239
239
  return Object.fromEntries(Object.entries(source).map(([key, item]) => [key, jsonValue(item)]));
240
240
  }
241
241
  function optionalString(value) {
@@ -347,7 +347,7 @@ function nodeWorkflowReferences(node) {
347
347
  }
348
348
  //#endregion
349
349
  //#region src/workflow/common/workflow.ts
350
- var portSchema = object$1({
350
+ var portSchema = object$2({
351
351
  handle: string$1().min(1),
352
352
  jsonSchema: json$3(),
353
353
  nullable: boolean(),
@@ -367,7 +367,7 @@ function comparablePorts(value) {
367
367
  function sameWorkflowInterface(left, right) {
368
368
  return dequal$1(comparablePorts(left.inputs), comparablePorts(right.inputs)) && dequal$1(comparablePorts(left.outputs), comparablePorts(right.outputs));
369
369
  }
370
- var workflowContractSchema = object$1({
370
+ var workflowContractSchema = object$2({
371
371
  version: literal(1),
372
372
  flowId: string$1().min(1),
373
373
  name: string$1(),
@@ -423,17 +423,17 @@ function withWorkflowTask(node, task) {
423
423
  inputs: Object.fromEntries(Object.entries(node.inputs).filter(([handle]) => task.inputs.some((port) => "handle" in port && port.handle == handle)))
424
424
  };
425
425
  }
426
- var workflowReferencesSchema = object$1({
426
+ var workflowReferencesSchema = object$2({
427
427
  version: literal(1),
428
428
  direction: _enum(["incoming", "outgoing"]),
429
429
  total: int().nonnegative(),
430
430
  nextOffset: int().nonnegative().optional(),
431
- references: array(object$1({
431
+ references: array(object$2({
432
432
  flowId: string$1(),
433
433
  name: string$1().nullable(),
434
434
  available: boolean(),
435
435
  draft: boolean(),
436
- live: object$1({
436
+ live: object$2({
437
437
  publicationId: string$1(),
438
438
  enabled: boolean()
439
439
  }).nullable()
@@ -480,7 +480,7 @@ var methods = [
480
480
  "patch",
481
481
  "trace"
482
482
  ];
483
- function object(value) {
483
+ function object$1(value) {
484
484
  if (value == null || typeof value != "object" || Array.isArray(value)) throw new Error("Expected an OpenAPI object.");
485
485
  return value;
486
486
  }
@@ -490,30 +490,30 @@ function httpUrl(value, base) {
490
490
  return url.href;
491
491
  }
492
492
  function parseOpenApi(value) {
493
- const doc = object(value);
493
+ const doc = object$1(value);
494
494
  if (typeof doc.openapi != "string" || !/^3\.[01]\.\d+$/.test(doc.openapi)) throw new Error("Only OpenAPI 3.0 and 3.1 JSON documents are supported.");
495
- object(doc.paths);
495
+ object$1(doc.paths);
496
496
  return doc;
497
497
  }
498
498
  function pointer(doc, ref) {
499
499
  if (!ref.startsWith("#/")) throw new Error("External OpenAPI references are not supported.");
500
500
  let value = doc;
501
501
  for (const key of decodeURIComponent(ref.slice(2)).split("/").map((part) => part.replace(/~1/g, "/").replace(/~0/g, "~"))) {
502
- const source = object(value);
502
+ const source = object$1(value);
503
503
  if (!Object.hasOwn(source, key)) throw new Error("An OpenAPI reference is missing.");
504
504
  value = source[key];
505
505
  }
506
506
  return value;
507
507
  }
508
508
  function resolved(doc, value) {
509
- let result = object(value);
509
+ let result = object$1(value);
510
510
  const seen = /* @__PURE__ */ new Set();
511
511
  while (typeof result.$ref == "string") {
512
512
  if (seen.has(result.$ref)) throw new Error("Circular non-schema reference is unsupported.");
513
513
  seen.add(result.$ref);
514
514
  const { $ref, ...siblings } = result;
515
515
  result = {
516
- ...object(pointer(doc, $ref)),
516
+ ...object$1(pointer(doc, $ref)),
517
517
  ...siblings
518
518
  };
519
519
  }
@@ -521,10 +521,10 @@ function resolved(doc, value) {
521
521
  }
522
522
  function listOperations(documentValue) {
523
523
  const doc = parseOpenApi(documentValue);
524
- return Object.entries(object(doc.paths)).flatMap(([path, value]) => {
524
+ return Object.entries(object$1(doc.paths)).flatMap(([path, value]) => {
525
525
  const item = resolved(doc, value);
526
526
  return methods.filter((method) => item[method] != null).map((method) => {
527
- const op = object(item[method]);
527
+ const op = object$1(item[method]);
528
528
  return {
529
529
  method,
530
530
  path,
@@ -535,11 +535,11 @@ function listOperations(documentValue) {
535
535
  });
536
536
  }
537
537
  function operation(doc, path, method) {
538
- const item = resolved(doc, object(doc.paths)[path]);
538
+ const item = resolved(doc, object$1(doc.paths)[path]);
539
539
  if (!methods.includes(method) || item[method] == null) throw new Error("The selected operation is no longer available.");
540
540
  return {
541
541
  item,
542
- op: object(item[method])
542
+ op: object$1(item[method])
543
543
  };
544
544
  }
545
545
  function servers(value, path, method) {
@@ -547,11 +547,11 @@ function servers(value, path, method) {
547
547
  const { item, op } = operation(doc, path, method);
548
548
  const entries = op.servers ?? item.servers ?? doc.servers;
549
549
  if (!Array.isArray(entries) || entries.length == 0) return [{ url: "/" }];
550
- return entries.map(object);
550
+ return entries.map(object$1);
551
551
  }
552
552
  function serverAddress(server, sourceUrl, variables = {}) {
553
553
  return httpUrl(String(server.url).replace(/\{([^}]+)\}/g, (_, name) => {
554
- const definition = object(object(server.variables)[name]);
554
+ const definition = object$1(object$1(server.variables)[name]);
555
555
  const value = variables[name] ?? definition.default;
556
556
  if (typeof value != "string" || Array.isArray(definition.enum) && !definition.enum.includes(value)) throw new Error("A server variable is invalid.");
557
557
  return value;
@@ -567,14 +567,14 @@ function securityOptions(value, path, method) {
567
567
  auth: []
568
568
  }];
569
569
  return requirements.map((entry) => {
570
- const names = Object.keys(object(entry));
570
+ const names = Object.keys(object$1(entry));
571
571
  const label = names.join(" + ") || "None";
572
572
  try {
573
573
  if (!names.length) return {
574
574
  label,
575
575
  auth: []
576
576
  };
577
- const schemes = object(object(doc.components).securitySchemes);
577
+ const schemes = object$1(object$1(doc.components).securitySchemes);
578
578
  return {
579
579
  label,
580
580
  auth: names.map((id) => {
@@ -627,7 +627,7 @@ function snapshot$7(documentValue, path, method) {
627
627
  let target = result;
628
628
  for (const key of keys.slice(0, -1)) {
629
629
  if (!Object.hasOwn(target, key)) target[key] = {};
630
- target = object(target[key]);
630
+ target = object$1(target[key]);
631
631
  }
632
632
  target[keys.at(-1)] = structuredClone(value);
633
633
  visit(value);
@@ -638,7 +638,7 @@ function snapshot$7(documentValue, path, method) {
638
638
  value.forEach(visit);
639
639
  return;
640
640
  }
641
- if (typeof object(value).$ref == "string") copy(object(value).$ref);
641
+ if (typeof object$1(value).$ref == "string") copy(object$1(value).$ref);
642
642
  for (const [key, child] of Object.entries(value)) if (![
643
643
  "example",
644
644
  "examples",
@@ -646,7 +646,7 @@ function snapshot$7(documentValue, path, method) {
646
646
  ].includes(key)) visit(child);
647
647
  }
648
648
  visit(result);
649
- for (const entry of security) for (const name of Object.keys(object(entry))) copy(`#/components/securitySchemes/${name.replace(/~/g, "~0").replace(/\//g, "~1")}`);
649
+ for (const entry of security) for (const name of Object.keys(object$1(entry))) copy(`#/components/securitySchemes/${name.replace(/~/g, "~0").replace(/\//g, "~1")}`);
650
650
  return structuredClone(result);
651
651
  }
652
652
  function schema$1(doc, schemaValue) {
@@ -654,7 +654,7 @@ function schema$1(doc, schemaValue) {
654
654
  const ids = /* @__PURE__ */ new Map();
655
655
  function convert(value) {
656
656
  if (typeof value == "boolean") return value;
657
- const source = object(value);
657
+ const source = object$1(value);
658
658
  if (source.format == "binary" || source.$dynamicRef != null || source.$id != null) throw new Error("Binary and dynamically scoped schemas are unsupported.");
659
659
  const result = {};
660
660
  for (const [key, child] of Object.entries(source)) {
@@ -680,7 +680,7 @@ function schema$1(doc, schemaValue) {
680
680
  "$defs",
681
681
  "definitions",
682
682
  "dependentSchemas"
683
- ].includes(key)) result[key] = Object.fromEntries(Object.entries(object(child)).map(([name, childSchema]) => [name, convert(childSchema)]));
683
+ ].includes(key)) result[key] = Object.fromEntries(Object.entries(object$1(child)).map(([name, childSchema]) => [name, convert(childSchema)]));
684
684
  else if ([
685
685
  "allOf",
686
686
  "anyOf",
@@ -715,18 +715,18 @@ function schema$1(doc, schemaValue) {
715
715
  return result;
716
716
  }
717
717
  let converted = convert(schemaValue);
718
- if (typeof converted == "object" && converted != null && typeof object(converted).$ref == "string") {
719
- const id = String(object(converted).$ref).slice(8);
720
- const { $ref: _ref, ...siblings } = object(converted);
718
+ if (typeof converted == "object" && converted != null && typeof object$1(converted).$ref == "string") {
719
+ const id = String(object$1(converted).$ref).slice(8);
720
+ const { $ref: _ref, ...siblings } = object$1(converted);
721
721
  converted = {
722
- ...object(defs[id]),
722
+ ...object$1(defs[id]),
723
723
  ...siblings
724
724
  };
725
725
  }
726
726
  if (typeof converted == "boolean") return converted;
727
727
  return {
728
728
  $schema: "https://json-schema.org/draft/2020-12/schema",
729
- ...object(converted),
729
+ ...object$1(converted),
730
730
  ...Object.keys(defs).length ? { $defs: defs } : {}
731
731
  };
732
732
  }
@@ -752,12 +752,12 @@ function parameters(config) {
752
752
  }
753
753
  function jsonContent(doc, value) {
754
754
  const content = resolved(doc, value);
755
- const media = object(content.content);
755
+ const media = object$1(content.content);
756
756
  const mediaType = media["application/json"] != null ? "application/json" : Object.keys(media).find((key) => /^application\/.+\+json$/.test(key));
757
757
  const json = mediaType == null ? void 0 : media[mediaType];
758
758
  if (json == null) throw new Error("Only JSON request and response bodies are supported.");
759
759
  return {
760
- schema: schema$1(doc, object(json).schema ?? {}),
760
+ schema: schema$1(doc, object$1(json).schema ?? {}),
761
761
  required: content.required === true,
762
762
  mediaType
763
763
  };
@@ -777,7 +777,7 @@ function openApiTask(config, name = "OpenAPI") {
777
777
  const params = parameters(config);
778
778
  const inputs = params.map((p) => {
779
779
  const jsonSchema = schema$1(doc, p.schema ?? {});
780
- const defaultValue = typeof jsonSchema == "boolean" ? void 0 : object(jsonSchema).default;
780
+ const defaultValue = typeof jsonSchema == "boolean" ? void 0 : object$1(jsonSchema).default;
781
781
  return {
782
782
  handle: `${p.in}.${p.name}`,
783
783
  jsonSchema,
@@ -807,14 +807,14 @@ function openApiTask(config, name = "OpenAPI") {
807
807
  jsonSchema: { type: "string" },
808
808
  nullable: false
809
809
  })));
810
- const responses = object(op.responses);
810
+ const responses = object$1(op.responses);
811
811
  const schemas = [];
812
812
  for (const [status, response] of Object.entries(responses)) if (/^2\d\d$|^2XX$/.test(status) || status == "default") {
813
813
  const r = resolved(doc, response);
814
814
  if (r.content == null) schemas.push({ type: "null" });
815
815
  else {
816
816
  jsonContent(doc, r);
817
- for (const [mediaType, media] of Object.entries(object(r.content))) if (/^application\/(json|.+\+json)$/.test(mediaType)) schemas.push(schema$1(doc, object(media).schema ?? {}));
817
+ for (const [mediaType, media] of Object.entries(object$1(r.content))) if (/^application\/(json|.+\+json)$/.test(mediaType)) schemas.push(schema$1(doc, object$1(media).schema ?? {}));
818
818
  }
819
819
  }
820
820
  if (!schemas.length) throw new Error("A successful JSON response definition is required.");
@@ -928,7 +928,7 @@ var authoringOpenApiSchema = strictObject({
928
928
  //#region src/control/common/authoringSchema.ts
929
929
  var id$2 = string$1().min(1);
930
930
  var json$2 = json$3();
931
- var patch = record$2(id$2, json$2);
931
+ var patch = record$3(id$2, json$2);
932
932
  var type = _enum([
933
933
  "start",
934
934
  "outputs",
@@ -946,7 +946,7 @@ var type = _enum([
946
946
  "decision",
947
947
  "openapi",
948
948
  "http-request",
949
- "dedupe",
949
+ "skip-duplicates",
950
950
  "condition",
951
951
  "value",
952
952
  "wait",
@@ -998,7 +998,7 @@ var operand = union([
998
998
  system,
999
999
  variable$1
1000
1000
  ]);
1001
- var toolSources = record$2(id$2, agentToolFields.inputs.element.shape.source).optional().describe("Tool input sources by name. The platform resolves types from the selected Action or workflow. New inputs default to model-provided; omitted existing sources are preserved.");
1001
+ var toolSources = record$3(id$2, agentToolFields.inputs.element.shape.source).optional().describe("Tool input sources by name. The platform resolves types from the selected Action or workflow. New inputs default to model-provided; omitted existing sources are preserved.");
1002
1002
  var agentTool$1 = union([workflowAgentToolSchema.omit({
1003
1003
  id: true,
1004
1004
  inputs: true,
@@ -1020,7 +1020,7 @@ var authoringCapabilities = array(union([
1020
1020
  var notification = strictObject({
1021
1021
  ...authoringDefinitionSchemas.connector.shape,
1022
1022
  messageHandle: id$2,
1023
- inputs: record$2(id$2, union([strictObject({
1023
+ inputs: record$3(id$2, union([strictObject({
1024
1024
  kind: literal("value"),
1025
1025
  value: json$2
1026
1026
  }), strictObject({
@@ -1033,14 +1033,14 @@ var field = strictObject({
1033
1033
  nullable: boolean().optional(),
1034
1034
  description: string$1().optional()
1035
1035
  });
1036
- var inputFields = record$2(id$2, field.extend({ default: json$2.optional() })).describe("Optional business input constraints by name. A binding to a new Code, Agent, LLM, Wait or Approval input automatically declares an input accepting any JSON. Existing constraints are preserved. Omitted schema accepts any JSON; omitted nullable is true. Use default for inherited values; input.set supplies data.");
1037
- var flowInputFields = record$2(id$2, field).describe("Workflow input definitions by name. Omitted schema accepts any JSON; omitted nullable is true. No defaults. Supply call values as trigger.outputs.");
1036
+ var inputFields = record$3(id$2, field.extend({ default: json$2.optional() })).describe("Optional business input constraints by name. A binding to a new Code, Agent, LLM, Wait or Approval input automatically declares an input accepting any JSON. Existing constraints are preserved. Omitted schema accepts any JSON; omitted nullable is true. Use default for inherited values; input.set supplies data.");
1037
+ var flowInputFields = record$3(id$2, field).describe("Workflow input definitions by name. Omitted schema accepts any JSON; omitted nullable is true. No defaults. Supply call values as trigger.outputs.");
1038
1038
  var flowOutputFields = flowInputFields.describe("Workflow output definitions by name. Omitted schema accepts any JSON; omitted nullable is true. No defaults. Set values on the Outputs node with input.set or node.add.inputs.");
1039
- var flowInputFieldsView = record$2(id$2, field.extend({
1039
+ var flowInputFieldsView = record$3(id$2, field.extend({
1040
1040
  schema: json$2,
1041
1041
  nullable: boolean()
1042
1042
  }));
1043
- var outputFields = record$2(id$2, field).describe("Code return fields by name. Omitted schema accepts any JSON; omitted nullable is true.");
1043
+ var outputFields = record$3(id$2, field).describe("Code return fields by name. Omitted schema accepts any JSON; omitted nullable is true.");
1044
1044
  var expression = strictObject({
1045
1045
  left: operand,
1046
1046
  operator: authoringDefinitionSchemas.condition.shape.cases.element.shape.groups.element.shape.expressions.element.shape.operator,
@@ -1077,7 +1077,7 @@ var authoringConfigurations = {
1077
1077
  "connector": authoringDefinitionSchemas.connector.omit({ outputMode: true }).strict(),
1078
1078
  "openapi": authoringOpenApiSchema,
1079
1079
  "http-request": httpRequestConfigSchema,
1080
- "dedupe": dedupeConfigSchema,
1080
+ "skip-duplicates": skipDuplicatesConfigSchema,
1081
1081
  "agent": authoringDefinitionSchemas.agent.omit({
1082
1082
  prompt: true,
1083
1083
  tools: true
@@ -1107,7 +1107,7 @@ var authoringConfigurations = {
1107
1107
  }),
1108
1108
  "approval": strictObject({ inputs: inputFields })
1109
1109
  };
1110
- var metadata$1 = {
1110
+ var metadata$2 = {
1111
1111
  onError: _enum(["stop", "error"]).optional(),
1112
1112
  name: id$2.optional(),
1113
1113
  description: string$1().optional(),
@@ -1117,7 +1117,7 @@ var metadata$1 = {
1117
1117
  retry: retryConfigurationSchema.partial().optional().describe("Node retry policy for Code, Connector, OpenAPI, LLM and AI Decision. Omitted update fields preserve the policy; use clear: [[\"retry\"]] to disable it. maxRetries counts additional attempts; intervalMs is 1000–60000 in whole seconds.")
1118
1118
  };
1119
1119
  var updates = strictObject({
1120
- ...metadata$1,
1120
+ ...metadata$2,
1121
1121
  config: patch.optional().describe("Recursively merge configuration; omitted fields remain unchanged and arrays replace as a whole. This includes schema objects: {} does not clear an existing schema. Use clear paths to remove fields, e.g. [\"config\",\"inputs\",\"amount\",\"schema\",\"type\"].")
1122
1122
  });
1123
1123
  var authoringEditSchema = discriminatedUnion("op", [
@@ -1129,7 +1129,7 @@ var authoringEditSchema = discriminatedUnion("op", [
1129
1129
  onError: _enum(["stop", "error"]).optional(),
1130
1130
  retry: retryConfigurationSchema.optional(),
1131
1131
  config: patch.optional(),
1132
- inputs: record$2(id$2, authoringSourceSchema).optional().describe("Input data sources, applied after creation, as input.set operations. Execution edges are separate."),
1132
+ inputs: record$3(id$2, authoringSourceSchema).optional().describe("Input data sources, applied after creation, as input.set operations. Execution edges are separate."),
1133
1133
  code: string$1().optional(),
1134
1134
  prompt: string$1().optional()
1135
1135
  }),
@@ -1205,7 +1205,7 @@ strictObject({
1205
1205
  action: id$2.optional()
1206
1206
  }).refine((v) => v.type == null || v.action == null, "Choose type or action.");
1207
1207
  `${[...findEngineContract(currentEngineContract).builtinModules].filter((name) => !name.startsWith("node:")).join(", ")}`;
1208
- var authoringDiagnosticSchema = object$1({
1208
+ var authoringDiagnosticSchema = object$2({
1209
1209
  code: id$2,
1210
1210
  message: string$1(),
1211
1211
  nodes: array(id$2),
@@ -1213,24 +1213,24 @@ var authoringDiagnosticSchema = object$1({
1213
1213
  line: number().optional(),
1214
1214
  column: number().optional()
1215
1215
  });
1216
- var authoringCheckResponse = object$1({
1216
+ var authoringCheckResponse = object$2({
1217
1217
  flowId: id$2,
1218
1218
  revisionId: id$2,
1219
1219
  valid: boolean(),
1220
1220
  diagnostics: array(authoringDiagnosticSchema),
1221
1221
  version: literal(1)
1222
1222
  });
1223
- var authoringEditResponse = object$1({
1223
+ var authoringEditResponse = object$2({
1224
1224
  flowId: id$2,
1225
1225
  saved: literal(true),
1226
1226
  revision: id$2,
1227
- nodes: record$2(id$2, id$2),
1228
- changes: array(object$1({
1227
+ nodes: record$3(id$2, id$2),
1228
+ changes: array(object$2({
1229
1229
  index: int(),
1230
1230
  op: id$2,
1231
1231
  node: id$2.optional()
1232
1232
  })),
1233
- validation: object$1({
1233
+ validation: object$2({
1234
1234
  status: _enum([
1235
1235
  "valid",
1236
1236
  "invalid",
@@ -1240,21 +1240,21 @@ var authoringEditResponse = object$1({
1240
1240
  }),
1241
1241
  version: literal(1)
1242
1242
  });
1243
- var authoringReadResponse = object$1({
1243
+ var authoringReadResponse = object$2({
1244
1244
  flowId: id$2,
1245
1245
  revision: id$2,
1246
- data: object$1({
1247
- nodes: array(record$2(string$1(), json$2)).optional(),
1246
+ data: object$2({
1247
+ nodes: array(record$3(string$1(), json$2)).optional(),
1248
1248
  edges: array(json$2).optional(),
1249
- text: record$2(string$1(), json$2).optional()
1249
+ text: record$3(string$1(), json$2).optional()
1250
1250
  }),
1251
1251
  version: literal(1)
1252
1252
  });
1253
- var authoringSearchResponse = object$1({
1253
+ var authoringSearchResponse = object$2({
1254
1254
  flowId: id$2,
1255
1255
  revision: id$2,
1256
- data: object$1({
1257
- matches: array(object$1({
1256
+ data: object$2({
1257
+ matches: array(object$2({
1258
1258
  node: id$2.optional(),
1259
1259
  field: id$2,
1260
1260
  line: int().optional(),
@@ -1268,8 +1268,8 @@ var authoringSearchResponse = object$1({
1268
1268
  //#endregion
1269
1269
  //#region src/control/common/publicationDecoders.ts
1270
1270
  function publication$7(value) {
1271
- const source = record$1(value);
1272
- const liveEnd = source.liveEnd == null ? void 0 : record$1(source.liveEnd);
1271
+ const source = record$2(value);
1272
+ const liveEnd = source.liveEnd == null ? void 0 : record$2(source.liveEnd);
1273
1273
  if (liveEnd != null && typeof liveEnd.enabled != "boolean") return invalidResponse();
1274
1274
  const operation = source.operation;
1275
1275
  const sourcePublicationId = source.sourcePublicationId;
@@ -1297,7 +1297,7 @@ function publication$7(value) {
1297
1297
  };
1298
1298
  }
1299
1299
  function publishOperation(value) {
1300
- const source = record$1(value);
1300
+ const source = record$2(value);
1301
1301
  const status = source.status;
1302
1302
  const common = {
1303
1303
  createdAt: string(source.createdAt),
@@ -1350,7 +1350,7 @@ function publishOperation(value) {
1350
1350
  "updatedAt",
1351
1351
  "version"
1352
1352
  ]);
1353
- const issue = record$1(source.issue);
1353
+ const issue = record$2(source.issue);
1354
1354
  const nodeId = issue.nodeId;
1355
1355
  requiredFields(issue, [
1356
1356
  "code",
@@ -1371,7 +1371,7 @@ function publishOperation(value) {
1371
1371
  }
1372
1372
  }
1373
1373
  function live(value) {
1374
- const source = record$1(value);
1374
+ const source = record$2(value);
1375
1375
  const status = source.status;
1376
1376
  const candidate = source.publication;
1377
1377
  if (source.version != 1 || typeof source.hasUnpublishedChanges != "boolean") return invalidResponse();
@@ -1388,7 +1388,7 @@ function live(value) {
1388
1388
  };
1389
1389
  }
1390
1390
  function publicationPage(value) {
1391
- const source = record$1(value);
1391
+ const source = record$2(value);
1392
1392
  const nextCursor = source.nextCursor;
1393
1393
  const total = source.total;
1394
1394
  if (source.version != 1 || !Array.isArray(source.publications)) return invalidResponse();
@@ -1416,7 +1416,7 @@ var configInputsSchema = array(union([strictObject({
1416
1416
  //#endregion
1417
1417
  //#region src/control/common/triggerDecoders.ts
1418
1418
  function triggerKeySummary(value) {
1419
- const source = record$1(value);
1419
+ const source = record$2(value);
1420
1420
  const type = source.type;
1421
1421
  if (type != "integration" && type != "poll") return invalidResponse();
1422
1422
  return {
@@ -1429,7 +1429,7 @@ function triggerKeySummary(value) {
1429
1429
  };
1430
1430
  }
1431
1431
  function triggerKey(value) {
1432
- const source = record$1(value);
1432
+ const source = record$2(value);
1433
1433
  const summary = triggerKeySummary(source);
1434
1434
  const base = {
1435
1435
  configInputs: configInputsSchema.parse(source.configInputs),
@@ -1439,7 +1439,7 @@ function triggerKey(value) {
1439
1439
  key: summary.key,
1440
1440
  name: summary.name,
1441
1441
  outputs: (Array.isArray(source.outputs) ? source.outputs : invalidResponse()).map((entry) => {
1442
- const port = record$1(entry);
1442
+ const port = record$2(entry);
1443
1443
  return Object.assign({
1444
1444
  handle: string(port.handle),
1445
1445
  jsonSchema: jsonValue(port.jsonSchema),
@@ -1452,8 +1452,8 @@ function triggerKey(value) {
1452
1452
  ...base,
1453
1453
  type: "poll"
1454
1454
  };
1455
- const endpoint = record$1(source.endpoint);
1456
- const body = record$1(endpoint.body);
1455
+ const endpoint = record$2(source.endpoint);
1456
+ const body = record$2(endpoint.body);
1457
1457
  if (!Array.isArray(endpoint.methods) || !Array.isArray(body.formats) || typeof body.allowArray != "boolean" || typeof body.allowEmpty != "boolean") return invalidResponse();
1458
1458
  const methods = endpoint.methods.map(string);
1459
1459
  const formats = body.formats.map(string);
@@ -1509,9 +1509,9 @@ var triggerActivityKinds = /* @__PURE__ */ new Set([
1509
1509
  "operator.resumed"
1510
1510
  ]);
1511
1511
  function triggerBinding(value) {
1512
- const source = record$1(value);
1512
+ const source = record$2(value);
1513
1513
  const health = source.health;
1514
- const listener = source.listener == null ? void 0 : record$1(source.listener);
1514
+ const listener = source.listener == null ? void 0 : record$2(source.listener);
1515
1515
  if (listener != null && listener.health != "healthy" && listener.health != "failed" && listener.health != "needs_reauth") return invalidResponse();
1516
1516
  const kind = source.kind;
1517
1517
  const runtimeVersion = integer(source.runtimeVersion);
@@ -1537,7 +1537,7 @@ function triggerBinding(value) {
1537
1537
  };
1538
1538
  }
1539
1539
  function triggerBindingDetail(value) {
1540
- const source = record$1(value);
1540
+ const source = record$2(value);
1541
1541
  if (source.version != 1) return invalidResponse();
1542
1542
  return {
1543
1543
  binding: triggerBinding(source.binding),
@@ -1545,7 +1545,7 @@ function triggerBindingDetail(value) {
1545
1545
  };
1546
1546
  }
1547
1547
  function triggerActivity(value) {
1548
- const source = record$1(value);
1548
+ const source = record$2(value);
1549
1549
  const kind = source.kind;
1550
1550
  if (typeof kind != "string" || !triggerActivityKinds.has(kind)) return invalidResponse();
1551
1551
  const errorCode = optionalString(source.errorCode);
@@ -1560,7 +1560,7 @@ function triggerActivity(value) {
1560
1560
  };
1561
1561
  }
1562
1562
  function triggerActivityPage(value) {
1563
- const source = record$1(value);
1563
+ const source = record$2(value);
1564
1564
  const nextCursor = optionalString(source.nextCursor);
1565
1565
  if (source.version != 1 || !Array.isArray(source.activities)) return invalidResponse();
1566
1566
  return {
@@ -1570,12 +1570,12 @@ function triggerActivityPage(value) {
1570
1570
  };
1571
1571
  }
1572
1572
  function pollTriggerTestResult(value) {
1573
- const source = record$1(value);
1573
+ const source = record$2(value);
1574
1574
  const filtered = integer(source.filtered);
1575
1575
  if (source.version != 1 || !Array.isArray(source.events) || typeof source.hasMore != "boolean" || filtered < 0) return invalidResponse();
1576
1576
  return {
1577
1577
  events: source.events.map((event) => {
1578
- const object = record$1(event);
1578
+ const object = record$2(event);
1579
1579
  return Object.fromEntries(Object.entries(object).map(([key, item]) => [key, jsonValue(item)]));
1580
1580
  }),
1581
1581
  filtered,
@@ -1585,65 +1585,65 @@ function pollTriggerTestResult(value) {
1585
1585
  }
1586
1586
  //#endregion
1587
1587
  //#region src/control/common/liveDetails.ts
1588
- var metadata = {
1588
+ var metadata$1 = {
1589
1589
  nodeId: string$1().min(1),
1590
1590
  name: string$1(),
1591
1591
  description: string$1().optional()
1592
1592
  };
1593
1593
  var binding = unknown().transform(triggerBinding);
1594
- var provider = {
1594
+ var provider$1 = {
1595
1595
  provider: string$1().min(1),
1596
- inputs: record$2(string$1(), discriminatedUnion("kind", [object$1({
1596
+ inputs: record$3(string$1(), discriminatedUnion("kind", [object$2({
1597
1597
  kind: literal("value"),
1598
1598
  value: json$3()
1599
- }), object$1({ kind: literal("unset") })]))
1599
+ }), object$2({ kind: literal("unset") })]))
1600
1600
  };
1601
1601
  var entrySchema = discriminatedUnion("type", [
1602
- object$1({
1603
- ...metadata,
1602
+ object$2({
1603
+ ...metadata$1,
1604
1604
  type: literal("start"),
1605
1605
  config: authoringConfigurations.start
1606
1606
  }),
1607
- object$1({
1608
- ...metadata,
1607
+ object$2({
1608
+ ...metadata$1,
1609
1609
  type: literal("manual"),
1610
- config: object$1({})
1610
+ config: object$2({})
1611
1611
  }),
1612
- object$1({
1613
- ...metadata,
1612
+ object$2({
1613
+ ...metadata$1,
1614
1614
  type: literal("webhook"),
1615
1615
  config: authoringConfigurations.webhook,
1616
1616
  binding
1617
1617
  }),
1618
- object$1({
1619
- ...metadata,
1618
+ object$2({
1619
+ ...metadata$1,
1620
1620
  type: literal("cron"),
1621
1621
  config: authoringConfigurations.cron,
1622
1622
  binding
1623
1623
  }),
1624
- object$1({
1625
- ...metadata,
1624
+ object$2({
1625
+ ...metadata$1,
1626
1626
  type: literal("error"),
1627
1627
  config: authoringConfigurations.error,
1628
1628
  binding
1629
1629
  }),
1630
- object$1({
1631
- ...metadata,
1632
- ...provider,
1630
+ object$2({
1631
+ ...metadata$1,
1632
+ ...provider$1,
1633
1633
  type: literal("poll"),
1634
1634
  config: authoringConfigurations.poll,
1635
1635
  binding
1636
1636
  }),
1637
- object$1({
1638
- ...metadata,
1639
- ...provider,
1637
+ object$2({
1638
+ ...metadata$1,
1639
+ ...provider$1,
1640
1640
  type: literal("integration"),
1641
1641
  config: authoringConfigurations.integration,
1642
1642
  binding
1643
1643
  })
1644
1644
  ]);
1645
1645
  function decodeLiveDetails(value) {
1646
- const source = record$1(value);
1646
+ const source = record$2(value);
1647
1647
  const flowId = string(source.flowId);
1648
1648
  if (source.version != 1 || !Array.isArray(source.entries)) return invalidResponse();
1649
1649
  if (source.publication === null) {
@@ -1857,7 +1857,7 @@ var envelope = strictObject({
1857
1857
  version: literal(1),
1858
1858
  name: string$1().optional(),
1859
1859
  content: unknown(),
1860
- presentation: record$2(string$1(), json$3()).optional()
1860
+ presentation: record$3(string$1(), json$3()).optional()
1861
1861
  });
1862
1862
  /** Structural decoding only: incomplete drafts are supported, repair is never attempted. */
1863
1863
  function decodeWorkflowFile(value) {
@@ -1948,10 +1948,10 @@ function parseProviderAccessSource(value) {
1948
1948
  //#endregion
1949
1949
  //#region src/control/common/connectorDecoders.ts
1950
1950
  function leinaBots(value) {
1951
- const source = record$1(value);
1951
+ const source = record$2(value);
1952
1952
  if (!Array.isArray(source.bots)) return invalidResponse("Leina bots: expected an array.");
1953
1953
  const bots = source.bots.map((entry) => {
1954
- const bot = record$1(entry);
1954
+ const bot = record$2(entry);
1955
1955
  if (!Array.isArray(bot.platforms)) return invalidResponse("Leina platforms: expected an array.");
1956
1956
  return {
1957
1957
  leinaId: string(bot.leinaId),
@@ -1964,7 +1964,7 @@ function leinaBots(value) {
1964
1964
  return bots;
1965
1965
  }
1966
1966
  function accessPermissions(value) {
1967
- const source = record$1(value);
1967
+ const source = record$2(value);
1968
1968
  exact(source, [
1969
1969
  "actionIds",
1970
1970
  "allActions",
@@ -1996,7 +1996,7 @@ function accessPermissions(value) {
1996
1996
  };
1997
1997
  }
1998
1998
  function accessBinding(value, candidate) {
1999
- const source = record$1(value);
1999
+ const source = record$2(value);
2000
2000
  const policyRevision = source.policyRevision;
2001
2001
  const status = source.status;
2002
2002
  const isDefault = source.isDefault;
@@ -2043,7 +2043,7 @@ function accessMode(value) {
2043
2043
  return value;
2044
2044
  }
2045
2045
  function connectorAccess$7(value) {
2046
- const source = record$1(value);
2046
+ const source = record$2(value);
2047
2047
  exact(source, [
2048
2048
  "accessRevision",
2049
2049
  "bindings",
@@ -2090,7 +2090,7 @@ function connectorAccess$7(value) {
2090
2090
  function accessGrants(value) {
2091
2091
  if (!Array.isArray(value)) return invalidResponse();
2092
2092
  const bindings = value.map((candidate) => {
2093
- const entry = record$1(candidate);
2093
+ const entry = record$2(candidate);
2094
2094
  exact(entry, [
2095
2095
  "accessBindingId",
2096
2096
  "connectionId",
@@ -2119,7 +2119,7 @@ function accessGrants(value) {
2119
2119
  return bindings;
2120
2120
  }
2121
2121
  function connectorAccessSnapshot(value) {
2122
- const source = record$1(value);
2122
+ const source = record$2(value);
2123
2123
  exact(source, [
2124
2124
  "mode",
2125
2125
  "sharedAccessDigest",
@@ -2141,7 +2141,7 @@ function connectorAccessSnapshot(value) {
2141
2141
  };
2142
2142
  }
2143
2143
  function connectorAccessCandidates(value, providerId) {
2144
- const source = record$1(value);
2144
+ const source = record$2(value);
2145
2145
  exact(source, [
2146
2146
  "candidates",
2147
2147
  "mode",
@@ -2162,18 +2162,18 @@ function connectorAccessCandidates(value, providerId) {
2162
2162
  };
2163
2163
  }
2164
2164
  function connectorAccessCandidatesBatch(value, providerIds) {
2165
- const source = record$1(value);
2165
+ const source = record$2(value);
2166
2166
  exact(source, ["results", "version"]);
2167
2167
  if (source.version != 1) return invalidResponse("version: expected 1.");
2168
2168
  if (!Array.isArray(source.results)) return invalidResponse("results: expected an array.");
2169
2169
  const remaining = new Set(providerIds);
2170
2170
  const results = source.results.map((entry) => {
2171
- const item = record$1(entry);
2171
+ const item = record$2(entry);
2172
2172
  const providerId = string(item.providerId);
2173
2173
  if (!remaining.delete(providerId)) return invalidResponse("results[].providerId: duplicate or unrequested provider.");
2174
2174
  if (!Object.hasOwn(item, "error")) return connectorAccessCandidates(item, providerId);
2175
2175
  exact(item, ["providerId", "error"]);
2176
- const error = record$1(item.error);
2176
+ const error = record$2(item.error);
2177
2177
  exact(error, ["code", "message"]);
2178
2178
  return {
2179
2179
  providerId,
@@ -2190,7 +2190,7 @@ function connectorAccessCandidatesBatch(value, providerIds) {
2190
2190
  };
2191
2191
  }
2192
2192
  function connection(value) {
2193
- const source = record$1(value);
2193
+ const source = record$2(value);
2194
2194
  requiredFields(source, [
2195
2195
  ...Object.hasOwn(source, "providerAccountId") ? ["providerAccountId"] : [],
2196
2196
  ...Object.hasOwn(source, "alias") ? ["alias"] : [],
@@ -2216,8 +2216,8 @@ function connection(value) {
2216
2216
  status
2217
2217
  };
2218
2218
  }
2219
- function port(value, input = false) {
2220
- const source = record$1(value);
2219
+ function port$1(value, input = false) {
2220
+ const source = record$2(value);
2221
2221
  const description = source.description;
2222
2222
  const hasValue = input && Object.hasOwn(source, "value");
2223
2223
  requiredFields(source, [
@@ -2236,13 +2236,13 @@ function port(value, input = false) {
2236
2236
  };
2237
2237
  }
2238
2238
  function inputPort(value) {
2239
- return port(value, true);
2239
+ return port$1(value, true);
2240
2240
  }
2241
2241
  function ports(value, decode) {
2242
- return Object.fromEntries(Object.entries(record$1(value)).map(([handle, candidate]) => [handle, decode(candidate)]));
2242
+ return Object.fromEntries(Object.entries(record$2(value)).map(([handle, candidate]) => [handle, decode(candidate)]));
2243
2243
  }
2244
2244
  function connectorActionMetadata(value) {
2245
- const source = record$1(value);
2245
+ const source = record$2(value);
2246
2246
  const homepageUrl = source.homepageUrl;
2247
2247
  const icon = source.icon;
2248
2248
  requiredFields(source, [
@@ -2275,13 +2275,13 @@ function connectorActionMetadata(value) {
2275
2275
  ...providerIconAppearance(source.iconSprite, source.iconSpritePosition),
2276
2276
  inputs: ports(source.inputs, inputPort),
2277
2277
  name: string(source.name),
2278
- outputs: ports(source.outputs, port),
2278
+ outputs: ports(source.outputs, port$1),
2279
2279
  serviceId: string(source.serviceId),
2280
2280
  serviceName: string(source.serviceName)
2281
2281
  };
2282
2282
  }
2283
2283
  function connectorAction(value) {
2284
- const { defaultConnection, ...metadata } = record$1(value);
2284
+ const { defaultConnection, ...metadata } = record$2(value);
2285
2285
  const action = connectorActionMetadata(metadata);
2286
2286
  if (defaultConnection == null) return action;
2287
2287
  const preferred = connection(defaultConnection);
@@ -2292,7 +2292,7 @@ function connectorAction(value) {
2292
2292
  };
2293
2293
  }
2294
2294
  function connectorProvider(value) {
2295
- const source = record$1(value);
2295
+ const source = record$2(value);
2296
2296
  const homepageUrl = source.homepageUrl;
2297
2297
  const icon = source.icon;
2298
2298
  if (source.noSetup !== void 0 && typeof source.noSetup != "boolean") return invalidResponse();
@@ -2940,7 +2940,7 @@ function inputSourceCandidates(graph, target, handle, inputPort) {
2940
2940
  //#region src/event-source/common/view.ts
2941
2941
  var id$1 = string$1().min(1).max(256);
2942
2942
  /** Public projection of a source that Connector validates and Open Flow exposes unchanged. */
2943
- var eventSourceViewSchema = object$1({
2943
+ var eventSourceViewSchema = object$2({
2944
2944
  appId: id$1.nullable(),
2945
2945
  workspaceId: id$1.optional(),
2946
2946
  installationId: id$1.optional(),
@@ -2965,7 +2965,7 @@ var eventSourceViewSchema = object$1({
2965
2965
  var id = string$1().min(1).max(256);
2966
2966
  var eventType = string$1().regex(/^[a-z][a-z0-9_.:]{0,127}$/);
2967
2967
  var name = string$1().trim().min(1).max(128);
2968
- var eventSourceSchema = object$1({
2968
+ var eventSourceSchema = object$2({
2969
2969
  version: literal(1),
2970
2970
  sourceId: id,
2971
2971
  revision: int().positive(),
@@ -2988,7 +2988,7 @@ var eventSourceSchema = object$1({
2988
2988
  endpointUrl: string$1().nullable(),
2989
2989
  lastReceivedAt: string$1().nullable(),
2990
2990
  updatedAt: string$1(),
2991
- consumers: array(object$1({
2991
+ consumers: array(object$2({
2992
2992
  flowId: id,
2993
2993
  flowName: string$1(),
2994
2994
  triggerNodeId: id
@@ -2998,7 +2998,7 @@ function decodeEventSource(value) {
2998
2998
  return eventSourceSchema.parse(value);
2999
2999
  }
3000
3000
  function decodeEventSources(value) {
3001
- return object$1({
3001
+ return object$2({
3002
3002
  version: literal(1),
3003
3003
  sources: array(eventSourceSchema),
3004
3004
  teamId: id.nullable().optional()
@@ -3007,7 +3007,7 @@ function decodeEventSources(value) {
3007
3007
  //#endregion
3008
3008
  //#region src/control/common/triggerCatalog.ts
3009
3009
  function decodeTriggerCatalog(value) {
3010
- const source = record$1(value);
3010
+ const source = record$2(value);
3011
3011
  requiredFields(source, [
3012
3012
  "version",
3013
3013
  "locale",
@@ -3016,12 +3016,12 @@ function decodeTriggerCatalog(value) {
3016
3016
  ]);
3017
3017
  if (source.version != 3 || !isUiLanguage(source.locale) || !Array.isArray(source.definitions)) return invalidResponse();
3018
3018
  const definitions = source.definitions.map(triggerKey);
3019
- const entries = record$1(source.display);
3019
+ const entries = record$2(source.display);
3020
3020
  const keys = new Set(definitions.map((definition) => definition.key));
3021
3021
  if (keys.size != definitions.length || Object.keys(entries).length != keys.size) return invalidResponse();
3022
3022
  const display = Object.fromEntries(definitions.map((definition) => {
3023
3023
  const { key } = definition;
3024
- const copy = record$1(entries[key]);
3024
+ const copy = record$2(entries[key]);
3025
3025
  requiredFields(copy, [
3026
3026
  "configInputs",
3027
3027
  "configInputLabels",
@@ -3045,12 +3045,12 @@ function decodeTriggerCatalog(value) {
3045
3045
  };
3046
3046
  }
3047
3047
  function descriptions(value, handles) {
3048
- const source = record$1(value);
3048
+ const source = record$2(value);
3049
3049
  exact(source, handles);
3050
3050
  return Object.fromEntries(Object.entries(source).map(([handle, description]) => [handle, string(description)]));
3051
3051
  }
3052
3052
  function labels(value, handles) {
3053
- const source = record$1(value);
3053
+ const source = record$2(value);
3054
3054
  if (Object.keys(source).some((handle) => !handles.includes(handle))) return invalidResponse();
3055
3055
  return Object.fromEntries(Object.entries(source).map(([handle, label]) => {
3056
3056
  const text = string(label);
@@ -3066,7 +3066,7 @@ strictObject({
3066
3066
  //#endregion
3067
3067
  //#region src/control/common/results.ts
3068
3068
  var json$1 = json$3();
3069
- var entry = object$1({
3069
+ var entry = object$2({
3070
3070
  pointer: string$1(),
3071
3071
  type: _enum([
3072
3072
  "object",
@@ -3085,17 +3085,17 @@ var page = entry.extend({
3085
3085
  nextOffset: number().int().positive().optional(),
3086
3086
  entries: array(entry).optional()
3087
3087
  });
3088
- var result = object$1({
3088
+ var result = object$2({
3089
3089
  resultId: string$1().min(1),
3090
3090
  callId: string$1().min(1),
3091
3091
  toolId: string$1().min(1),
3092
3092
  source: discriminatedUnion("kind", [
3093
- object$1({
3093
+ object$2({
3094
3094
  kind: literal("connector"),
3095
3095
  action: string$1().min(1)
3096
3096
  }),
3097
- object$1({ kind: literal("code") }),
3098
- object$1({
3097
+ object$2({ kind: literal("code") }),
3098
+ object$2({
3099
3099
  kind: literal("workflow"),
3100
3100
  flowId: string$1().min(1)
3101
3101
  })
@@ -3104,13 +3104,13 @@ var result = object$1({
3104
3104
  digest: string$1().regex(/^[a-f0-9]{64}$/),
3105
3105
  createdAt: string$1().datetime()
3106
3106
  });
3107
- var listSchema = object$1({
3107
+ var listSchema = object$2({
3108
3108
  version: literal(1),
3109
3109
  runId: string$1(),
3110
3110
  results: array(result),
3111
3111
  nextAfter: string$1().optional()
3112
3112
  });
3113
- var readSchema = object$1({
3113
+ var readSchema = object$2({
3114
3114
  version: literal(1),
3115
3115
  runId: string$1(),
3116
3116
  result,
@@ -3130,7 +3130,7 @@ function schemaPath$1(value) {
3130
3130
  return value.map((part) => typeof part == "string" || Number.isSafeInteger(part) ? part : invalidResponse());
3131
3131
  }
3132
3132
  function schemaMismatch(value) {
3133
- const source = record$1(value);
3133
+ const source = record$2(value);
3134
3134
  const kind = string(source.kind);
3135
3135
  if (kind == "artifact" || kind == "binary" || kind == "nullable") return { kind };
3136
3136
  if (kind == "schema") return {
@@ -3147,8 +3147,8 @@ function schemaMismatch(value) {
3147
3147
  };
3148
3148
  }
3149
3149
  function diagnostic(value) {
3150
- const source = record$1(value);
3151
- const values = source.values == null ? void 0 : record$1(source.values);
3150
+ const source = record$2(value);
3151
+ const values = source.values == null ? void 0 : record$2(source.values);
3152
3152
  return {
3153
3153
  code: string(source.code),
3154
3154
  column: integer(source.column),
@@ -3161,7 +3161,7 @@ function diagnostic(value) {
3161
3161
  };
3162
3162
  }
3163
3163
  function flowCheck(value) {
3164
- const source = record$1(value);
3164
+ const source = record$2(value);
3165
3165
  if (source.version != 1 || typeof source.valid != "boolean" || !Array.isArray(source.diagnostics)) return invalidResponse();
3166
3166
  return {
3167
3167
  closureDigest: string(source.closureDigest),
@@ -3177,7 +3177,7 @@ function flowCheck(value) {
3177
3177
  }
3178
3178
  //#endregion
3179
3179
  //#region src/control/common/connectorQueries.ts
3180
- var scope$1 = (flowId) => flowId == null ? "" : `?flowId=${encodeURIComponent(flowId)}`;
3180
+ var scope$2 = (flowId) => flowId == null ? "" : `?flowId=${encodeURIComponent(flowId)}`;
3181
3181
  function connectorProvidersQuery(flowId, locale) {
3182
3182
  const parameters = new URLSearchParams({
3183
3183
  ...flowId == null ? {} : { flowId },
@@ -3186,7 +3186,7 @@ function connectorProvidersQuery(flowId, locale) {
3186
3186
  return {
3187
3187
  path: `/v1/connector/providers${parameters ? `?${parameters}` : ""}`,
3188
3188
  decode: (value) => {
3189
- const source = record$1(value);
3189
+ const source = record$2(value);
3190
3190
  requiredFields(source, ["providers", "version"]);
3191
3191
  if (source.version != 1 || !Array.isArray(source.providers)) return invalidResponse();
3192
3192
  return source.providers.map(connectorProvider);
@@ -3201,7 +3201,7 @@ function connectorActionQuery(actionId, flowId, locale) {
3201
3201
  return {
3202
3202
  path: `/v1/connector/actions/${encodeURIComponent(actionId)}${parameters ? `?${parameters}` : ""}`,
3203
3203
  decode: (value) => {
3204
- const source = record$1(value);
3204
+ const source = record$2(value);
3205
3205
  requiredFields(source, ["action", "version"]);
3206
3206
  if (source.version != 1) return invalidResponse();
3207
3207
  return connectorAction(source.action);
@@ -3210,9 +3210,9 @@ function connectorActionQuery(actionId, flowId, locale) {
3210
3210
  }
3211
3211
  function allConnectorConnectionsQuery(flowId) {
3212
3212
  return {
3213
- path: `/v1/connector/connections${scope$1(flowId)}`,
3213
+ path: `/v1/connector/connections${scope$2(flowId)}`,
3214
3214
  decode: (value) => {
3215
- const source = record$1(value);
3215
+ const source = record$2(value);
3216
3216
  requiredFields(source, ["connections", "version"]);
3217
3217
  if (source.version != 1 || !Array.isArray(source.connections)) return invalidResponse();
3218
3218
  return source.connections.map(connection);
@@ -3221,9 +3221,9 @@ function allConnectorConnectionsQuery(flowId) {
3221
3221
  }
3222
3222
  function connectorConnectionsQuery(serviceId, flowId) {
3223
3223
  return {
3224
- path: `/v1/connector/connections/${encodeURIComponent(serviceId)}${scope$1(flowId)}`,
3224
+ path: `/v1/connector/connections/${encodeURIComponent(serviceId)}${scope$2(flowId)}`,
3225
3225
  decode: (value) => {
3226
- const source = record$1(value);
3226
+ const source = record$2(value);
3227
3227
  requiredFields(source, [
3228
3228
  "connections",
3229
3229
  "serviceId",
@@ -3240,9 +3240,9 @@ function strings(value) {
3240
3240
  return Array.isArray(value) ? value.map(string) : invalidResponse();
3241
3241
  }
3242
3242
  function resourceReferences(input) {
3243
- const source = record$1(input);
3244
- const draft = source.draft === null ? null : record$1(source.draft);
3245
- const shared = record$1(source.sharedAccess);
3243
+ const source = record$2(input);
3244
+ const draft = source.draft === null ? null : record$2(source.draft);
3245
+ const shared = record$2(source.sharedAccess);
3246
3246
  if (draft != null && !Array.isArray(draft.connections)) return invalidResponse();
3247
3247
  if (!Array.isArray(shared.bindings)) return invalidResponse();
3248
3248
  const accessRevision = integer(shared.accessRevision);
@@ -3253,7 +3253,7 @@ function resourceReferences(input) {
3253
3253
  variableNames: strings(draft.variableNames),
3254
3254
  errorSourceFlowIds: strings(draft.errorSourceFlowIds),
3255
3255
  connections: draft.connections.map((value) => {
3256
- const connection = record$1(value);
3256
+ const connection = record$2(value);
3257
3257
  return {
3258
3258
  providerId: string(connection.providerId),
3259
3259
  connectionId: string(connection.connectionId)
@@ -3264,7 +3264,7 @@ function resourceReferences(input) {
3264
3264
  accessRevision,
3265
3265
  providerIds: strings(shared.providerIds),
3266
3266
  bindings: shared.bindings.map((value) => {
3267
- const binding = record$1(value);
3267
+ const binding = record$2(value);
3268
3268
  return {
3269
3269
  providerId: string(binding.providerId),
3270
3270
  connectionId: binding.connectionId === null ? null : string(binding.connectionId),
@@ -3275,11 +3275,11 @@ function resourceReferences(input) {
3275
3275
  };
3276
3276
  }
3277
3277
  function flow(value) {
3278
- const source = record$1(value);
3278
+ const source = record$2(value);
3279
3279
  const status = source.status;
3280
3280
  if (source.version != 1) return invalidResponse();
3281
3281
  if (status != "active" && status != "retiring") return invalidResponse();
3282
- const target = source.live == null ? void 0 : record$1(source.live);
3282
+ const target = source.live == null ? void 0 : record$2(source.live);
3283
3283
  if (target != null && (typeof target.enabled != "boolean" || typeof target.hasStart != "boolean")) return invalidResponse();
3284
3284
  return {
3285
3285
  ...target == null ? {} : { live: {
@@ -3301,7 +3301,7 @@ function flow(value) {
3301
3301
  };
3302
3302
  }
3303
3303
  function flowListItem(value) {
3304
- const source = record$1(value);
3304
+ const source = record$2(value);
3305
3305
  const referenceCount = integer(source.referenceCount);
3306
3306
  if (referenceCount < 0) return invalidResponse();
3307
3307
  return {
@@ -3310,7 +3310,7 @@ function flowListItem(value) {
3310
3310
  };
3311
3311
  }
3312
3312
  function flowPage(value) {
3313
- const source = record$1(value);
3313
+ const source = record$2(value);
3314
3314
  if (source.version != 1 || !Array.isArray(source.flows)) return invalidResponse();
3315
3315
  const nextCursor = source.nextCursor;
3316
3316
  const total = source.total;
@@ -3324,7 +3324,7 @@ function flowPage(value) {
3324
3324
  };
3325
3325
  }
3326
3326
  function variable(value) {
3327
- const source = record$1(value);
3327
+ const source = record$2(value);
3328
3328
  requiredFields(source, [
3329
3329
  "name",
3330
3330
  "updatedAt",
@@ -3346,7 +3346,7 @@ function variable(value) {
3346
3346
  };
3347
3347
  }
3348
3348
  function variableListItem(value) {
3349
- const { referenceCount, ...fields } = record$1(value);
3349
+ const { referenceCount, ...fields } = record$2(value);
3350
3350
  const count = integer(referenceCount);
3351
3351
  if (count < 0) return invalidResponse();
3352
3352
  return {
@@ -3355,7 +3355,7 @@ function variableListItem(value) {
3355
3355
  };
3356
3356
  }
3357
3357
  function errorListener(value) {
3358
- const source = record$1(value);
3358
+ const source = record$2(value);
3359
3359
  if (typeof source.enabled != "boolean") return invalidResponse();
3360
3360
  return {
3361
3361
  flowId: string(source.flowId),
@@ -3366,13 +3366,13 @@ function errorListener(value) {
3366
3366
  };
3367
3367
  }
3368
3368
  function variableReferences(input) {
3369
- const source = record$1(input);
3369
+ const source = record$2(input);
3370
3370
  requiredFields(source, ["version", "references"]);
3371
3371
  if (source.version != 1 || !Array.isArray(source.references)) return invalidResponse();
3372
3372
  return {
3373
3373
  version: 1,
3374
3374
  references: source.references.map((value) => {
3375
- const item = record$1(value);
3375
+ const item = record$2(value);
3376
3376
  requiredFields(item, [
3377
3377
  "flowId",
3378
3378
  "flowName",
@@ -3380,7 +3380,7 @@ function variableReferences(input) {
3380
3380
  "live"
3381
3381
  ]);
3382
3382
  if (typeof item.draft != "boolean") return invalidResponse();
3383
- const live = item.live === null ? null : record$1(item.live);
3383
+ const live = item.live === null ? null : record$2(item.live);
3384
3384
  if (live != null) {
3385
3385
  requiredFields(live, ["publicationId", "enabled"]);
3386
3386
  if (typeof live.enabled != "boolean") return invalidResponse();
@@ -3400,7 +3400,7 @@ function variableReferences(input) {
3400
3400
  //#endregion
3401
3401
  //#region src/control/common/revisionDecoders.ts
3402
3402
  function revisionMetadata(value) {
3403
- const source = record$1(value);
3403
+ const source = record$2(value);
3404
3404
  const parentRevisionId = source.parentRevisionId;
3405
3405
  if (source.version != 1 || parentRevisionId !== null && typeof parentRevisionId != "string") return invalidResponse();
3406
3406
  return {
@@ -3415,7 +3415,7 @@ function revisionMetadata(value) {
3415
3415
  };
3416
3416
  }
3417
3417
  function draft(value) {
3418
- const source = record$1(value);
3418
+ const source = record$2(value);
3419
3419
  try {
3420
3420
  return {
3421
3421
  ...revisionMetadata(source),
@@ -3426,17 +3426,17 @@ function draft(value) {
3426
3426
  }
3427
3427
  }
3428
3428
  function presentation(value) {
3429
- const source = record$1(value);
3429
+ const source = record$2(value);
3430
3430
  if (source.version != 1 || integer(source.revision) < 1) return invalidResponse();
3431
3431
  return {
3432
3432
  revision: integer(source.revision),
3433
3433
  updatedAt: string(source.updatedAt),
3434
- value: Object.fromEntries(Object.entries(record$1(source.value)).map(([key, item]) => [key, jsonValue(item)])),
3434
+ value: Object.fromEntries(Object.entries(record$2(source.value)).map(([key, item]) => [key, jsonValue(item)])),
3435
3435
  version: 1
3436
3436
  };
3437
3437
  }
3438
3438
  function draftChange(value) {
3439
- const source = record$1(value);
3439
+ const source = record$2(value);
3440
3440
  if (source.version != 1) return invalidResponse();
3441
3441
  return {
3442
3442
  revision: revisionMetadata(source.revision),
@@ -3444,7 +3444,7 @@ function draftChange(value) {
3444
3444
  };
3445
3445
  }
3446
3446
  function draftSync(value) {
3447
- const source = record$1(value);
3447
+ const source = record$2(value);
3448
3448
  if (source.version != 1 || source.kind != "snapshot") return invalidResponse();
3449
3449
  return {
3450
3450
  draft: draft(source.draft),
@@ -3474,7 +3474,7 @@ function runStatus(value) {
3474
3474
  return typeof value == "string" && runStatusSet.has(value) ? value : invalidResponse();
3475
3475
  }
3476
3476
  function run$7(value) {
3477
- const source = record$1(value);
3477
+ const source = record$2(value);
3478
3478
  const kind = source.source;
3479
3479
  const startedAt = source.startedAt;
3480
3480
  const finishedAt = source.finishedAt;
@@ -3494,7 +3494,7 @@ function run$7(value) {
3494
3494
  };
3495
3495
  }
3496
3496
  function runWaiting(value) {
3497
- const source = record$1(value);
3497
+ const source = record$2(value);
3498
3498
  requiredFields(source, [
3499
3499
  "actions",
3500
3500
  "expiresAt",
@@ -3516,7 +3516,7 @@ function runWaiting(value) {
3516
3516
  };
3517
3517
  }
3518
3518
  function workflowIdentity(value) {
3519
- const ref = record$1(value);
3519
+ const ref = record$2(value);
3520
3520
  return {
3521
3521
  flowId: string(ref.flowId),
3522
3522
  runId: string(ref.runId),
@@ -3526,7 +3526,7 @@ function workflowIdentity(value) {
3526
3526
  };
3527
3527
  }
3528
3528
  function runInitiator(value) {
3529
- const source = record$1(value);
3529
+ const source = record$2(value);
3530
3530
  if (![
3531
3531
  "workbench",
3532
3532
  "cli",
@@ -3541,7 +3541,7 @@ function runInitiator(value) {
3541
3541
  };
3542
3542
  }
3543
3543
  function runDetails(value) {
3544
- const source = record$1(value);
3544
+ const source = record$2(value);
3545
3545
  const summary = run$7(source);
3546
3546
  const eventsExpiresAt = source.eventsExpiresAt;
3547
3547
  if (eventsExpiresAt != null && typeof eventsExpiresAt != "string") return invalidResponse();
@@ -3565,7 +3565,7 @@ function runDetails(value) {
3565
3565
  ...errorHandling(source),
3566
3566
  ...source.triggerNodeId === void 0 ? {} : { triggerNodeId: string(source.triggerNodeId) },
3567
3567
  ...source.caller === void 0 ? {} : { caller: workflowIdentity(source.caller) },
3568
- ...source.calls === void 0 ? {} : { calls: source.calls.map((item) => Object.assign(workflowIdentity(item), { status: record$1(item).status === null ? null : runStatus(record$1(item).status) })) },
3568
+ ...source.calls === void 0 ? {} : { calls: source.calls.map((item) => Object.assign(workflowIdentity(item), { status: record$2(item).status === null ? null : runStatus(record$2(item).status) })) },
3569
3569
  closureDigest: string(source.closureDigest),
3570
3570
  engineContract: string(source.engineContract),
3571
3571
  engineDigest: string(source.engineDigest),
@@ -3592,7 +3592,7 @@ function runDetails(value) {
3592
3592
  }
3593
3593
  }
3594
3594
  function runPage(value) {
3595
- const source = record$1(value);
3595
+ const source = record$2(value);
3596
3596
  const nextCursor = source.nextCursor;
3597
3597
  if (source.version != 1 || !Array.isArray(source.runs)) return invalidResponse();
3598
3598
  if (nextCursor != null && typeof nextCursor != "string") return invalidResponse();
@@ -3604,7 +3604,7 @@ function runPage(value) {
3604
3604
  };
3605
3605
  }
3606
3606
  function runCancellation(value) {
3607
- const source = record$1(value);
3607
+ const source = record$2(value);
3608
3608
  const status = runStatus(source.status);
3609
3609
  if (source.version != 1 || typeof source.cancelAccepted != "boolean" || status == "queued" || status == "starting" || status == "running" || status == "waiting") return invalidResponse();
3610
3610
  return {
@@ -3615,7 +3615,7 @@ function runCancellation(value) {
3615
3615
  };
3616
3616
  }
3617
3617
  function waitResolution(value) {
3618
- const source = record$1(value);
3618
+ const source = record$2(value);
3619
3619
  requiredFields(source, [
3620
3620
  "action",
3621
3621
  "comment",
@@ -3641,7 +3641,7 @@ function waitResolution(value) {
3641
3641
  };
3642
3642
  }
3643
3643
  function runResult(value) {
3644
- const source = record$1(value);
3644
+ const source = record$2(value);
3645
3645
  const status = source.status;
3646
3646
  if (source.version != 1) return invalidResponse();
3647
3647
  const base = {
@@ -3662,7 +3662,7 @@ function runResult(value) {
3662
3662
  status: "canceled"
3663
3663
  };
3664
3664
  if (status == "failed") {
3665
- const error = record$1(source.error);
3665
+ const error = record$2(source.error);
3666
3666
  return {
3667
3667
  ...base,
3668
3668
  error: runFailure(error),
@@ -3670,7 +3670,7 @@ function runResult(value) {
3670
3670
  };
3671
3671
  }
3672
3672
  if (status == "indeterminate") {
3673
- const error = record$1(source.error);
3673
+ const error = record$2(source.error);
3674
3674
  return {
3675
3675
  ...base,
3676
3676
  error: runFailure(error),
@@ -3680,7 +3680,7 @@ function runResult(value) {
3680
3680
  return invalidResponse();
3681
3681
  }
3682
3682
  function errorHandling(source) {
3683
- const errorSource = source.errorSource == null ? void 0 : record$1(source.errorSource);
3683
+ const errorSource = source.errorSource == null ? void 0 : record$2(source.errorSource);
3684
3684
  if (source.errorDispatches != null && !Array.isArray(source.errorDispatches)) return invalidResponse();
3685
3685
  return {
3686
3686
  ...errorSource == null ? {} : { errorSource: {
@@ -3688,7 +3688,7 @@ function errorHandling(source) {
3688
3688
  runId: string(errorSource.runId)
3689
3689
  } },
3690
3690
  ...source.errorDispatches == null ? {} : { errorDispatches: source.errorDispatches.map((value) => {
3691
- const dispatch = record$1(value);
3691
+ const dispatch = record$2(value);
3692
3692
  const flowId = string(dispatch.flowId);
3693
3693
  switch (dispatch.status) {
3694
3694
  case "pending": return {
@@ -3747,7 +3747,7 @@ function normalizeFlowQuery(query = {}) {
3747
3747
  };
3748
3748
  }
3749
3749
  function decodeTag(value) {
3750
- const source = record$1(value);
3750
+ const source = record$2(value);
3751
3751
  if (source.version != 1) return invalidResponse();
3752
3752
  return {
3753
3753
  tagId: string(source.tagId),
@@ -3756,7 +3756,7 @@ function decodeTag(value) {
3756
3756
  };
3757
3757
  }
3758
3758
  function decodeTagListItem(value) {
3759
- const source = record$1(value);
3759
+ const source = record$2(value);
3760
3760
  const referenceCount = integer(source.referenceCount);
3761
3761
  if (referenceCount < 0) return invalidResponse();
3762
3762
  return {
@@ -3770,14 +3770,14 @@ function isRunTerminalEvent(event) {
3770
3770
  return event?.kind == "run.completed" || event?.kind == "run.failed" || event?.kind == "run.canceled" || event?.kind == "run.indeterminate";
3771
3771
  }
3772
3772
  function decodeRunEvent(value) {
3773
- const source = record$1(value);
3773
+ const source = record$2(value);
3774
3774
  const sequence = integer(source.sequence);
3775
3775
  if (sequence < 0) return invalidResponse();
3776
3776
  const base = {
3777
3777
  createdAt: string(source.createdAt),
3778
3778
  sequence
3779
3779
  };
3780
- const payload = record$1(source.payload);
3780
+ const payload = record$2(source.payload);
3781
3781
  const kind = source.kind;
3782
3782
  switch (kind) {
3783
3783
  case "run.queued": return {
@@ -3871,7 +3871,7 @@ function decodeRunEvent(value) {
3871
3871
  switch (kind) {
3872
3872
  case "node.started": {
3873
3873
  const nodeKind = payload.nodeKind;
3874
- if (nodeKind !== void 0 && nodeKind !== "approval" && nodeKind !== "condition" && nodeKind !== "connector" && nodeKind !== "javascript" && nodeKind !== "decision" && nodeKind !== "openapi" && nodeKind !== "http-request" && nodeKind !== "dedupe" && nodeKind !== "llm" && nodeKind !== "agent" && nodeKind !== "value" && nodeKind !== "outputs" && nodeKind !== "webhook-response" && nodeKind !== "workflow" && nodeKind !== "wait") return invalidResponse();
3874
+ if (nodeKind !== void 0 && nodeKind !== "approval" && nodeKind !== "condition" && nodeKind !== "connector" && nodeKind !== "javascript" && nodeKind !== "decision" && nodeKind !== "openapi" && nodeKind !== "http-request" && nodeKind !== "skip-duplicates" && nodeKind !== "llm" && nodeKind !== "agent" && nodeKind !== "value" && nodeKind !== "outputs" && nodeKind !== "webhook-response" && nodeKind !== "workflow" && nodeKind !== "wait") return invalidResponse();
3875
3875
  return {
3876
3876
  ...base,
3877
3877
  kind,
@@ -3888,19 +3888,19 @@ function decodeRunEvent(value) {
3888
3888
  kind,
3889
3889
  payload: {
3890
3890
  ...node,
3891
- ...payload.systemOutputs === void 0 ? {} : { systemOutputs: Object.fromEntries(Object.entries(record$1(payload.systemOutputs)).map(([key, item]) => [key, jsonValue(item)])) },
3892
- outputs: Object.fromEntries(Object.entries(record$1(payload.outputs)).map(([key, item]) => [key, jsonValue(item)]))
3891
+ ...payload.systemOutputs === void 0 ? {} : { systemOutputs: Object.fromEntries(Object.entries(record$2(payload.systemOutputs)).map(([key, item]) => [key, jsonValue(item)])) },
3892
+ outputs: Object.fromEntries(Object.entries(record$2(payload.outputs)).map(([key, item]) => [key, jsonValue(item)]))
3893
3893
  }
3894
3894
  };
3895
3895
  case "node.failed": {
3896
- const error = record$1(payload.error);
3896
+ const error = record$2(payload.error);
3897
3897
  return {
3898
3898
  ...base,
3899
3899
  kind,
3900
3900
  payload: {
3901
3901
  ...node,
3902
3902
  ...payload.handled === true ? { handled: true } : {},
3903
- ...payload.systemOutputs === void 0 ? {} : { systemOutputs: Object.fromEntries(Object.entries(record$1(payload.systemOutputs)).map(([key, item]) => [key, jsonValue(item)])) },
3903
+ ...payload.systemOutputs === void 0 ? {} : { systemOutputs: Object.fromEntries(Object.entries(record$2(payload.systemOutputs)).map(([key, item]) => [key, jsonValue(item)])) },
3904
3904
  error: {
3905
3905
  code: string(error.code),
3906
3906
  message: string(error.message)
@@ -3930,7 +3930,7 @@ function decodeRunEvent(value) {
3930
3930
  }
3931
3931
  };
3932
3932
  case "node.artifact": {
3933
- const artifact = record$1(payload.artifact);
3933
+ const artifact = record$2(payload.artifact);
3934
3934
  const size = integer(artifact.size);
3935
3935
  const digest = string(artifact.digest);
3936
3936
  if (artifact.kind != "artifact" || size < 0 || !/^sha256:[0-9a-f]{64}$/.test(digest)) return invalidResponse();
@@ -3959,7 +3959,7 @@ function eventProgress(value) {
3959
3959
  return typeof value == "number" && Number.isFinite(value) && value >= 0 && value <= 100 ? value : invalidResponse();
3960
3960
  }
3961
3961
  function runEvents(value) {
3962
- const source = record$1(value);
3962
+ const source = record$2(value);
3963
3963
  const eventsExpiresAt = source.eventsExpiresAt;
3964
3964
  const nextAfter = integer(source.nextAfter);
3965
3965
  if (source.version != 1 || !Array.isArray(source.events) || typeof source.done != "boolean" || typeof source.historyComplete != "boolean") return invalidResponse();
@@ -3985,7 +3985,7 @@ var ControlClient = class {
3985
3985
  this.requestControl = requestControl;
3986
3986
  }
3987
3987
  async loadOpenApiDocument(url, signal) {
3988
- const result = record$1(await this.request("/v1/openapi/document", {
3988
+ const result = record$2(await this.request("/v1/openapi/document", {
3989
3989
  method: "POST",
3990
3990
  body: JSON.stringify({
3991
3991
  url,
@@ -4012,7 +4012,7 @@ var ControlClient = class {
4012
4012
  return decodeEventSources(await this.request("/v1/event-sources" + (flowId == null ? "" : `?flowId=${segment$1(flowId)}`), { signal }));
4013
4013
  }
4014
4014
  async listEventSourceConnections(teamId, signal, kind = "feishu") {
4015
- const source = record$1(await this.request(`/v1/event-sources/connections?kind=${kind}${teamId == null ? "" : `&teamId=${segment$1(teamId)}`}`, { signal }));
4015
+ const source = record$2(await this.request(`/v1/event-sources/connections?kind=${kind}${teamId == null ? "" : `&teamId=${segment$1(teamId)}`}`, { signal }));
4016
4016
  requiredFields(source, ["version", "connections"]);
4017
4017
  if (source.version != 1 || !Array.isArray(source.connections)) return invalidResponse();
4018
4018
  return source.connections.map(connection);
@@ -4039,7 +4039,7 @@ var ControlClient = class {
4039
4039
  });
4040
4040
  }
4041
4041
  async listVariables() {
4042
- const source = record$1(await this.request("/v1/variables"));
4042
+ const source = record$2(await this.request("/v1/variables"));
4043
4043
  requiredFields(source, ["variables", "version"]);
4044
4044
  if (source.version != 1 || !Array.isArray(source.variables)) return invalidResponse();
4045
4045
  return {
@@ -4071,7 +4071,7 @@ var ControlClient = class {
4071
4071
  }));
4072
4072
  }
4073
4073
  async deleteVariable(name) {
4074
- const source = record$1(await this.request(`/v1/variables/${segment$1(name)}`, { method: "DELETE" }));
4074
+ const source = record$2(await this.request(`/v1/variables/${segment$1(name)}`, { method: "DELETE" }));
4075
4075
  requiredFields(source, ["version"]);
4076
4076
  if (source.version != 1) return invalidResponse();
4077
4077
  }
@@ -4096,12 +4096,13 @@ var ControlClient = class {
4096
4096
  })
4097
4097
  }));
4098
4098
  }
4099
- async createFlow(name, idempotencyKey = `flow-${randomId()}`, teamId, tagIds) {
4099
+ async createFlow(name, idempotencyKey = `flow-${randomId()}`, teamId, tagIds, initialPresentation) {
4100
4100
  return flow(await this.request("/v1/flows", {
4101
4101
  body: JSON.stringify({
4102
4102
  name,
4103
4103
  ...teamId == null ? {} : { teamId },
4104
4104
  ...tagIds == null ? {} : { tagIds },
4105
+ ...initialPresentation == null ? {} : { presentation: initialPresentation },
4105
4106
  version: 1
4106
4107
  }),
4107
4108
  headers: { "idempotency-key": idempotencyKey },
@@ -4109,7 +4110,7 @@ var ControlClient = class {
4109
4110
  }));
4110
4111
  }
4111
4112
  async broadcastCanvas(flowId, command) {
4112
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/canvas`, {
4113
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/canvas`, {
4113
4114
  method: "POST",
4114
4115
  body: JSON.stringify({
4115
4116
  version: 1,
@@ -4132,12 +4133,12 @@ var ControlClient = class {
4132
4133
  return flow(await this.request(`/v1/flows/${segment$1(flowId)}`));
4133
4134
  }
4134
4135
  async getErrorListeners(flowId, signal) {
4135
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/error-listeners`, { signal }));
4136
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/error-listeners`, { signal }));
4136
4137
  if (source.version != 1 || !Array.isArray(source.listeners)) return invalidResponse();
4137
4138
  return source.listeners.map(errorListener);
4138
4139
  }
4139
4140
  async listTags(signal) {
4140
- const source = record$1(await this.request("/v1/tags", { signal }));
4141
+ const source = record$2(await this.request("/v1/tags", { signal }));
4141
4142
  if (source.version != 1 || !Array.isArray(source.tags)) return invalidResponse();
4142
4143
  return {
4143
4144
  tags: source.tags.map(decodeTagListItem),
@@ -4163,7 +4164,7 @@ var ControlClient = class {
4163
4164
  }));
4164
4165
  }
4165
4166
  async deleteTag(tagId) {
4166
- if (record$1(await this.request(`/v1/tags/${segment$1(tagId)}`, { method: "DELETE" })).version != 1) invalidResponse();
4167
+ if (record$2(await this.request(`/v1/tags/${segment$1(tagId)}`, { method: "DELETE" })).version != 1) invalidResponse();
4167
4168
  }
4168
4169
  async setFlowTags(flowId, tagIds) {
4169
4170
  return flow(await this.request(`/v1/flows/${segment$1(flowId)}/tags`, {
@@ -4183,16 +4184,28 @@ var ControlClient = class {
4183
4184
  })
4184
4185
  }));
4185
4186
  }
4186
- async getFlowState(flowId, scope, values = false) {
4187
- const result = flowStateViewSchema.safeParse(await this.request(`/v1/flows/${segment$1(flowId)}/state?scope=${scope}&values=${values}`));
4187
+ async getFlowState(flowId, scope) {
4188
+ const result = flowStateViewSchema.safeParse(await this.request(`/v1/flows/${segment$1(flowId)}/state?scope=${scope}`));
4188
4189
  return result.success && result.data.scope === scope ? result.data : invalidResponse();
4189
4190
  }
4191
+ async getFlowStateValues(flowId, scope, keys, signal) {
4192
+ const result = flowStateValuesSchema.safeParse(await this.request(`/v1/flows/${segment$1(flowId)}/state/read`, {
4193
+ method: "POST",
4194
+ body: JSON.stringify({
4195
+ version: 1,
4196
+ scope,
4197
+ keys
4198
+ }),
4199
+ signal
4200
+ }));
4201
+ return result.success && result.data.scope === scope && result.data.values.length === keys.length && result.data.values.every((item, index) => item.key === keys[index]) ? result.data : invalidResponse();
4202
+ }
4190
4203
  async clearFlowState(flowId, scope, key) {
4191
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/state?scope=${scope}${key == null ? "" : `&key=${encodeURIComponent(key)}`}`, { method: "DELETE" }));
4204
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/state?scope=${scope}${key == null ? "" : `&key=${encodeURIComponent(key)}`}`, { method: "DELETE" }));
4192
4205
  if (source.version !== 1 || source.cleared !== true) invalidResponse();
4193
4206
  }
4194
4207
  async clearFlowDedupe(flowId, scope, space) {
4195
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/dedupe?scope=${scope}&space=${encodeURIComponent(space)}`, { method: "DELETE" }));
4208
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/dedupe?scope=${scope}&space=${encodeURIComponent(space)}`, { method: "DELETE" }));
4196
4209
  if (source.version !== 1 || source.cleared !== true) invalidResponse();
4197
4210
  }
4198
4211
  async renameFlow(flowId, name) {
@@ -4202,12 +4215,12 @@ var ControlClient = class {
4202
4215
  return flow(await this.request(`/v1/flows/${segment$1(flowId)}`, { method: "DELETE" }));
4203
4216
  }
4204
4217
  async listTriggerKeys(signal, locale) {
4205
- const source = record$1(await this.request(`/v1/trigger-keys${locale == null ? "" : `?locale=${encodeURIComponent(locale)}`}`, { signal }));
4218
+ const source = record$2(await this.request(`/v1/trigger-keys${locale == null ? "" : `?locale=${encodeURIComponent(locale)}`}`, { signal }));
4206
4219
  if (source.version != 1 || !Array.isArray(source.keys)) return invalidResponse();
4207
4220
  return source.keys.map(triggerKeySummary);
4208
4221
  }
4209
4222
  async listTriggerDefinitions(signal) {
4210
- const source = record$1(await this.request("/v1/trigger-keys/catalog", { signal }));
4223
+ const source = record$2(await this.request("/v1/trigger-keys/catalog", { signal }));
4211
4224
  if (source.version != 2 || !Array.isArray(source.definitions)) return invalidResponse();
4212
4225
  return source.definitions.map(triggerKey);
4213
4226
  }
@@ -4249,12 +4262,12 @@ var ControlClient = class {
4249
4262
  };
4250
4263
  }
4251
4264
  async getTriggerKey(key, signal) {
4252
- const source = record$1(await this.request(`/v1/trigger-keys/${segment$1(key)}`, { signal }));
4265
+ const source = record$2(await this.request(`/v1/trigger-keys/${segment$1(key)}`, { signal }));
4253
4266
  if (source.version != 1) return invalidResponse();
4254
4267
  return triggerKey(source.definition);
4255
4268
  }
4256
4269
  async listFlowTriggerBindings(flowId, signal) {
4257
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/triggers`, { signal }));
4270
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/triggers`, { signal }));
4258
4271
  if (source.version != 1 || string(source.flowId) != flowId || !Array.isArray(source.bindings)) return invalidResponse();
4259
4272
  return source.bindings.map(triggerBinding);
4260
4273
  }
@@ -4275,7 +4288,7 @@ var ControlClient = class {
4275
4288
  }));
4276
4289
  }
4277
4290
  async getEditor(flowId) {
4278
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/editor`));
4291
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/editor`));
4279
4292
  if (source.version != 1) return invalidResponse();
4280
4293
  const result = {
4281
4294
  flow: flow(source.flow),
@@ -4288,7 +4301,7 @@ var ControlClient = class {
4288
4301
  return result;
4289
4302
  }
4290
4303
  async getPublicationPresentation(flowId, publicationId, signal) {
4291
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/publications/${segment$1(publicationId)}/presentation`, { signal }));
4304
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/publications/${segment$1(publicationId)}/presentation`, { signal }));
4292
4305
  if (source.version != 1) return invalidResponse();
4293
4306
  return {
4294
4307
  version: 1,
@@ -4308,11 +4321,11 @@ var ControlClient = class {
4308
4321
  return draft(await this.request(`/v1/flows/${segment$1(flowId)}/revisions/${segment$1(revisionId)}`, { signal }));
4309
4322
  }
4310
4323
  async listTriggerConfigOptions(flowId, nodeId, field, signal) {
4311
- const source = record$1(await this.request(`/v1/flows/${segment$1(flowId)}/triggers/${segment$1(nodeId)}/options/${segment$1(field)}`, { signal }));
4324
+ const source = record$2(await this.request(`/v1/flows/${segment$1(flowId)}/triggers/${segment$1(nodeId)}/options/${segment$1(field)}`, { signal }));
4312
4325
  requiredFields(source, ["options", "version"]);
4313
4326
  if (source.version != 1 || !Array.isArray(source.options) || source.options.length > 1e3) return invalidResponse();
4314
4327
  return source.options.map((value) => {
4315
- const item = record$1(value);
4328
+ const item = record$2(value);
4316
4329
  requiredFields(item, [
4317
4330
  "value",
4318
4331
  "label",
@@ -4331,7 +4344,7 @@ var ControlClient = class {
4331
4344
  });
4332
4345
  }
4333
4346
  async listConnectorTeams(signal) {
4334
- const source = record$1(await this.request("/v1/connector/teams", { signal }));
4347
+ const source = record$2(await this.request("/v1/connector/teams", { signal }));
4335
4348
  requiredFields(source, [
4336
4349
  "enabled",
4337
4350
  "teams",
@@ -4341,7 +4354,7 @@ var ControlClient = class {
4341
4354
  return {
4342
4355
  enabled: source.enabled,
4343
4356
  teams: source.teams.map((value) => {
4344
- const team = record$1(value);
4357
+ const team = record$2(value);
4345
4358
  requiredFields(team, [
4346
4359
  "id",
4347
4360
  "name",
@@ -4451,7 +4464,7 @@ var ControlClient = class {
4451
4464
  const parameters = new URLSearchParams();
4452
4465
  if (flowId != null) parameters.set("flowId", flowId);
4453
4466
  if (teamId != null) parameters.set("teamId", teamId);
4454
- const source = record$1(await this.request(`/v1/connector/connections/${segment$1(serviceId)}/page${parameters.size == 0 ? "" : `?${parameters}`}`, {
4467
+ const source = record$2(await this.request(`/v1/connector/connections/${segment$1(serviceId)}/page${parameters.size == 0 ? "" : `?${parameters}`}`, {
4455
4468
  body: JSON.stringify({ version: 1 }),
4456
4469
  method: "POST"
4457
4470
  }));
@@ -4478,7 +4491,7 @@ var ControlClient = class {
4478
4491
  }));
4479
4492
  }
4480
4493
  async authoringSchema(flowId, query) {
4481
- return record$1(await this.request(`/v1/flows/${segment$1(flowId)}/authoring/schema`, {
4494
+ return record$2(await this.request(`/v1/flows/${segment$1(flowId)}/authoring/schema`, {
4482
4495
  method: "POST",
4483
4496
  body: JSON.stringify(query)
4484
4497
  }));
@@ -4674,7 +4687,7 @@ var ControlClient = class {
4674
4687
  const query = Object.entries(parameters).map(([key, value]) => `${segment$1(key)}=${segment$1(value)}`).join("&");
4675
4688
  const suffix = query == "" ? "" : `?${query}`;
4676
4689
  return this.connectorRequest(`/v1/connector/actions${suffix}`, "actions", signal, (value) => {
4677
- const source = record$1(value);
4690
+ const source = record$2(value);
4678
4691
  requiredFields(source, ["actions", "version"]);
4679
4692
  if (source.version != 1 || !Array.isArray(source.actions)) return invalidResponse();
4680
4693
  return source.actions.map(connectorAction);
@@ -4697,9 +4710,9 @@ var ControlClient = class {
4697
4710
  } catch {
4698
4711
  return invalidResponse();
4699
4712
  }
4700
- const error = record$1(value).error;
4701
- const source = error == null ? void 0 : record$1(error);
4702
- throw new ApiError(response.status, typeof source?.code == "string" ? source.code : "request.failed", typeof source?.message == "string" ? source.message : `Request failed with status ${response.status}.`, source?.details == null ? void 0 : record$1(source.details));
4713
+ const error = record$2(value).error;
4714
+ const source = error == null ? void 0 : record$2(error);
4715
+ throw new ApiError(response.status, typeof source?.code == "string" ? source.code : "request.failed", typeof source?.message == "string" ? source.message : `Request failed with status ${response.status}.`, source?.details == null ? void 0 : record$2(source.details));
4703
4716
  }
4704
4717
  return response;
4705
4718
  }
@@ -7281,26 +7294,20 @@ var resources = {
7281
7294
  },
7282
7295
  flowState: {
7283
7296
  "title": "Persistent data",
7284
- "nodeTitle": "Remove Duplicates",
7285
- "warning": "History is recorded immediately. If a downstream node fails, these items will be skipped in later Runs.",
7286
- "field": "Identity field",
7287
- "mode": "Mode",
7288
- "new": "New identities",
7289
- "increasing": "Increasing watermark",
7290
- "space": "History scope",
7291
- "nodeSpace": "This node",
7292
- "flowSpace": "Shared Flow space",
7297
+ "nodeTitle": "Skip Duplicates",
7298
+ "warning": "History is saved after this Run succeeds. Failed or canceled Runs allow these items to be processed again.",
7299
+ "field": "Identity fields",
7293
7300
  "values": "Saved data",
7294
7301
  "spaces": "Deduplication records",
7295
7302
  "clearAll": "Clear all",
7296
7303
  "delete": "Delete",
7297
7304
  "clear": "Clear",
7298
7305
  "orphaned": "Orphaned in this view",
7299
- "watermark": "Watermark",
7300
- "nearLimit": "Flow deduplication history is at least 80% full. Clear history or use watermark mode.",
7306
+ "nearLimit": "Flow history is at least 80% full. Clear unused history.",
7301
7307
  "history": "History",
7302
7308
  "scope": "Scope",
7303
- "showValues": "Show values",
7309
+ "showValue": "View value",
7310
+ "hideValue": "Hide value",
7304
7311
  "refresh": "Refresh",
7305
7312
  "confirmLive": "This clears production state immediately. Future Live Runs may process these items again. Continue?",
7306
7313
  "cancel": "Cancel",
@@ -7315,8 +7322,16 @@ var resources = {
7315
7322
  "entries": "{{count}} / {{limit}} entries",
7316
7323
  "records": "{{count}} records",
7317
7324
  "valueLimit": "Each JSON value allows up to {{size}} UTF-8 bytes.",
7318
- "sharedLimit": "All spaces share the record limit. Spaces: {{count}} / {{limit}}. Watermarks only use a space.",
7319
- "fieldPlaceholder": "Whole item"
7325
+ "sharedLimit": "All spaces share the identity limit. Spaces: {{count}} / {{limit}}. Pending records reserve capacity.",
7326
+ "fieldPlaceholder": "Whole item (string or number)",
7327
+ "addField": "Add field",
7328
+ "removeField": "Remove field {{index}}",
7329
+ "fieldIndex": "Identity field {{index}}",
7330
+ "invalidFields": "Use distinct, nonempty field paths such as id or record.id.",
7331
+ "pendingRecords": "{{count}} pending",
7332
+ "pathPlaceholder": "id or record.id",
7333
+ "saveFailed": "Unable to save identity fields.",
7334
+ "retry": "Retry"
7320
7335
  }
7321
7336
  },
7322
7337
  "zh-CN": {
@@ -8634,26 +8649,20 @@ var resources = {
8634
8649
  },
8635
8650
  flowState: {
8636
8651
  "title": "持久化数据",
8637
- "nodeTitle": "去除重复项",
8638
- "warning": "历史会立即记录。下游节点失败后,这些条目仍会在后续 Run 中被跳过。",
8652
+ "nodeTitle": "跳过重复",
8653
+ "warning": "记录在本次 Run 成功后保存。失败或取消后,下次仍可处理这些条目。",
8639
8654
  "field": "标识字段",
8640
- "mode": "模式",
8641
- "new": "新标识",
8642
- "increasing": "递增水位",
8643
- "space": "记录范围",
8644
- "nodeSpace": "当前节点",
8645
- "flowSpace": "Flow 共享空间",
8646
8655
  "values": "保存的数据",
8647
8656
  "spaces": "去重记录",
8648
8657
  "clearAll": "清空",
8649
8658
  "delete": "删除",
8650
8659
  "clear": "清空",
8651
8660
  "orphaned": "当前视图中的遗留空间",
8652
- "watermark": "水位",
8653
- "nearLimit": "该流程的去重记录已使用至少 80%。请清理历史记录或使用水位模式。",
8661
+ "nearLimit": "该流程的去重记录已使用至少 80%。请清理不再需要的记录。",
8654
8662
  "history": "历史记录",
8655
8663
  "scope": "作用域",
8656
- "showValues": "显示值",
8664
+ "showValue": "查看值",
8665
+ "hideValue": "收起值",
8657
8666
  "refresh": "刷新",
8658
8667
  "confirmLive": "这将立即清空生产状态,后续 Live Run 可能再次处理这些条目。是否继续?",
8659
8668
  "cancel": "取消",
@@ -8668,8 +8677,16 @@ var resources = {
8668
8677
  "entries": "{{count}} / {{limit}} 条",
8669
8678
  "records": "{{count}} 条记录",
8670
8679
  "valueLimit": "每条 JSON 值最多 {{size}} 个 UTF-8 字节。",
8671
- "sharedLimit": "所有空间共享记录额度。空间:{{count}} / {{limit}} 个。水位模式只占空间名额。",
8672
- "fieldPlaceholder": "整个条目"
8680
+ "sharedLimit": "所有空间共享记录额度。空间:{{count}} / {{limit}} 个。待提交记录会预占额度。",
8681
+ "fieldPlaceholder": "整个条目(字符串或数字)",
8682
+ "addField": "添加字段",
8683
+ "removeField": "删除第 {{index}} 个字段",
8684
+ "fieldIndex": "第 {{index}} 个标识字段",
8685
+ "invalidFields": "请填写不重复的字段路径,例如 id 或 record.id。",
8686
+ "pendingRecords": "{{count}} 条待提交",
8687
+ "pathPlaceholder": "id 或 record.id",
8688
+ "saveFailed": "无法保存标识字段。",
8689
+ "retry": "重试"
8673
8690
  }
8674
8691
  },
8675
8692
  "zh-TW": {
@@ -9987,26 +10004,20 @@ var resources = {
9987
10004
  },
9988
10005
  flowState: {
9989
10006
  "title": "持久化資料",
9990
- "nodeTitle": "移除重複項",
9991
- "warning": "歷史會立即記錄。下游節點失敗後,這些項目仍會在後續 Run 中被略過。",
10007
+ "nodeTitle": "跳過重複",
10008
+ "warning": "記錄在本次 Run 成功後儲存。失敗或取消後,下次仍可處理這些項目。",
9992
10009
  "field": "識別欄位",
9993
- "mode": "模式",
9994
- "new": "新識別值",
9995
- "increasing": "遞增水位",
9996
- "space": "記錄範圍",
9997
- "nodeSpace": "目前節點",
9998
- "flowSpace": "Flow 共用空間",
9999
10010
  "values": "儲存的資料",
10000
10011
  "spaces": "去重記錄",
10001
10012
  "clearAll": "清空",
10002
10013
  "delete": "刪除",
10003
10014
  "clear": "清空",
10004
10015
  "orphaned": "目前檢視中的遺留空間",
10005
- "watermark": "水位",
10006
- "nearLimit": "此流程的去重記錄已使用至少 80%。請清理歷史記錄或使用水位模式。",
10016
+ "nearLimit": "此流程的去重記錄已使用至少 80%。請清理不再需要的記錄。",
10007
10017
  "history": "歷史記錄",
10008
10018
  "scope": "範圍",
10009
- "showValues": "顯示值",
10019
+ "showValue": "檢視值",
10020
+ "hideValue": "收合值",
10010
10021
  "refresh": "重新整理",
10011
10022
  "confirmLive": "這會立即清空正式環境狀態,後續 Live Run 可能再次處理這些項目。是否繼續?",
10012
10023
  "cancel": "取消",
@@ -10021,8 +10032,16 @@ var resources = {
10021
10032
  "entries": "{{count}} / {{limit}} 筆",
10022
10033
  "records": "{{count}} 筆記錄",
10023
10034
  "valueLimit": "每筆 JSON 值最多 {{size}} 個 UTF-8 位元組。",
10024
- "sharedLimit": "所有空間共用記錄額度。空間:{{count}} / {{limit}} 個。水位模式僅占空間名額。",
10025
- "fieldPlaceholder": "整個項目"
10035
+ "sharedLimit": "所有空間共用記錄額度。空間:{{count}} / {{limit}} 個。待提交記錄會預占額度。",
10036
+ "fieldPlaceholder": "整個項目(字串或數字)",
10037
+ "addField": "新增欄位",
10038
+ "removeField": "刪除第 {{index}} 個欄位",
10039
+ "fieldIndex": "第 {{index}} 個識別欄位",
10040
+ "invalidFields": "請填寫不重複的欄位路徑,例如 id 或 record.id。",
10041
+ "pendingRecords": "{{count}} 筆待提交",
10042
+ "pathPlaceholder": "id 或 record.id",
10043
+ "saveFailed": "無法儲存識別欄位。",
10044
+ "retry": "重試"
10026
10045
  }
10027
10046
  },
10028
10047
  "ja": {
@@ -11340,26 +11359,20 @@ var resources = {
11340
11359
  },
11341
11360
  flowState: {
11342
11361
  "title": "永続データ",
11343
- "nodeTitle": "重複を除去",
11344
- "warning": "履歴は直ちに記録されます。後続ノードが失敗しても、以降の Run ではこれらの項目がスキップされます。",
11362
+ "nodeTitle": "重複をスキップ",
11363
+ "warning": "履歴は Run の成功後に保存されます。失敗またはキャンセル時は、次回もこれらの項目を処理できます。",
11345
11364
  "field": "識別フィールド",
11346
- "mode": "モード",
11347
- "new": "新しい識別値",
11348
- "increasing": "増加するウォーターマーク",
11349
- "space": "履歴の範囲",
11350
- "nodeSpace": "このノード",
11351
- "flowSpace": "Flow の共有領域",
11352
11365
  "values": "保存データ",
11353
11366
  "spaces": "重複除去の記録",
11354
11367
  "clearAll": "すべて消去",
11355
11368
  "delete": "削除",
11356
11369
  "clear": "消去",
11357
11370
  "orphaned": "現在のビューに対応ノードなし",
11358
- "watermark": "ウォーターマーク",
11359
- "nearLimit": "フローの重複除去記録が 80% 以上使用されています。履歴を削除するかウォーターマークモードを使用してください。",
11371
+ "nearLimit": "フローの重複履歴が 80% 以上使用されています。不要な履歴を削除してください。",
11360
11372
  "history": "履歴",
11361
11373
  "scope": "スコープ",
11362
- "showValues": "値を表示",
11374
+ "showValue": "値を表示",
11375
+ "hideValue": "値を隠す",
11363
11376
  "refresh": "更新",
11364
11377
  "confirmLive": "本番環境の状態が直ちに消去されます。以降の Live Run で同じ項目が再処理される場合があります。続行しますか?",
11365
11378
  "cancel": "キャンセル",
@@ -11374,8 +11387,16 @@ var resources = {
11374
11387
  "entries": "{{count}} / {{limit}} 件",
11375
11388
  "records": "{{count}} 件",
11376
11389
  "valueLimit": "JSON 値ごとに最大 {{size}} UTF-8 バイトです。",
11377
- "sharedLimit": "記録上限は全スペースで共有します。スペース:{{count}} / {{limit}}。ウォーターマークはスペース枠のみ使用します。",
11378
- "fieldPlaceholder": "項目全体"
11390
+ "sharedLimit": "すべての領域で上限を共有します。領域:{{count}} / {{limit}}。確定待ちの記録も容量を予約します。",
11391
+ "fieldPlaceholder": "項目全体(文字列または数値)",
11392
+ "addField": "フィールドを追加",
11393
+ "removeField": "フィールド {{index}} を削除",
11394
+ "fieldIndex": "識別フィールド {{index}}",
11395
+ "invalidFields": "id や record.id のような空でない異なるパスを指定してください。",
11396
+ "pendingRecords": "{{count}} 件が確定待ち",
11397
+ "pathPlaceholder": "id または record.id",
11398
+ "saveFailed": "識別フィールドを保存できませんでした。",
11399
+ "retry": "再試行"
11379
11400
  }
11380
11401
  },
11381
11402
  "ko": {
@@ -12693,26 +12714,20 @@ var resources = {
12693
12714
  },
12694
12715
  flowState: {
12695
12716
  "title": "영구 데이터",
12696
- "nodeTitle": "중복 제거",
12697
- "warning": "기록은 즉시 저장됩니다. 후속 노드가 실패해도 이후 Run에서 해당 항목을 건너뜁니다.",
12717
+ "nodeTitle": "중복 건너뛰기",
12718
+ "warning": "기록은 Run이 성공한 후 저장됩니다. 실패하거나 취소되면 다음 실행에서 다시 처리할 수 있습니다.",
12698
12719
  "field": "식별 필드",
12699
- "mode": "모드",
12700
- "new": "새 식별값",
12701
- "increasing": "증가 워터마크",
12702
- "space": "기록 범위",
12703
- "nodeSpace": "현재 노드",
12704
- "flowSpace": "Flow 공유 공간",
12705
12720
  "values": "저장된 데이터",
12706
12721
  "spaces": "중복 제거 기록",
12707
12722
  "clearAll": "모두 지우기",
12708
12723
  "delete": "삭제",
12709
12724
  "clear": "지우기",
12710
12725
  "orphaned": "현재 보기에서 연결된 노드 없음",
12711
- "watermark": "워터마크",
12712
- "nearLimit": "Flow 중복 제거 기록이 80% 이상 찼습니다. 기록을 지우거나 워터마크 모드를 사용하세요.",
12726
+ "nearLimit": "Flow 중복 기록이 80% 이상 찼습니다. 필요 없는 기록을 지우세요.",
12713
12727
  "history": "기록",
12714
12728
  "scope": "범위",
12715
- "showValues": "값 표시",
12729
+ "showValue": "값 보기",
12730
+ "hideValue": "값 숨기기",
12716
12731
  "refresh": "새로 고침",
12717
12732
  "confirmLive": "운영 상태가 즉시 지워집니다. 이후 Live Run에서 해당 항목을 다시 처리할 수 있습니다. 계속할까요?",
12718
12733
  "cancel": "취소",
@@ -12727,8 +12742,16 @@ var resources = {
12727
12742
  "entries": "{{count}} / {{limit}}개",
12728
12743
  "records": "기록 {{count}}개",
12729
12744
  "valueLimit": "JSON 값 하나당 최대 {{size}} UTF-8 바이트입니다.",
12730
- "sharedLimit": "모든 공간이 기록 한도를 공유합니다. 공간: {{count}} / {{limit}}. 워터마크는 공간 한도만 사용합니다.",
12731
- "fieldPlaceholder": "전체 항목"
12745
+ "sharedLimit": "모든 공간이 한도를 공유합니다. 공간: {{count}} / {{limit}}. 대기 중인 기록도 용량을 예약합니다.",
12746
+ "fieldPlaceholder": "항목 전체 (문자열 또는 숫자)",
12747
+ "addField": "필드 추가",
12748
+ "removeField": "필드 {{index}} 삭제",
12749
+ "fieldIndex": "식별 필드 {{index}}",
12750
+ "invalidFields": "id 또는 record.id처럼 비어 있지 않은 서로 다른 경로를 입력하세요.",
12751
+ "pendingRecords": "{{count}}개 커밋 대기",
12752
+ "pathPlaceholder": "id 또는 record.id",
12753
+ "saveFailed": "식별 필드를 저장할 수 없습니다.",
12754
+ "retry": "다시 시도"
12732
12755
  }
12733
12756
  },
12734
12757
  "ru": {
@@ -14046,26 +14069,20 @@ var resources = {
14046
14069
  },
14047
14070
  flowState: {
14048
14071
  "title": "Постоянные данные",
14049
- "nodeTitle": "Удаление дубликатов",
14050
- "warning": "История сохраняется немедленно. Даже при сбое следующего узла эти элементы будут пропущены в последующих Run.",
14051
- "field": "Поле идентификатора",
14052
- "mode": "Режим",
14053
- "new": "Новые идентификаторы",
14054
- "increasing": "Возрастающая отметка",
14055
- "space": "Область истории",
14056
- "nodeSpace": "Этот узел",
14057
- "flowSpace": "Общее пространство Flow",
14072
+ "nodeTitle": "Пропуск дубликатов",
14073
+ "warning": "История сохраняется после успешного Run. После ошибки или отмены элементы можно обработать повторно.",
14074
+ "field": "Поля идентификации",
14058
14075
  "values": "Сохранённые данные",
14059
14076
  "spaces": "Записи дедупликации",
14060
14077
  "clearAll": "Очистить всё",
14061
14078
  "delete": "Удалить",
14062
14079
  "clear": "Очистить",
14063
14080
  "orphaned": "Нет узла в текущем представлении",
14064
- "watermark": "Отметка",
14065
- "nearLimit": "История дедупликации Flow заполнена минимум на 80 %. Очистите историю или используйте режим водяной метки.",
14081
+ "nearLimit": "История Flow заполнена минимум на 80 %. Удалите ненужные записи.",
14066
14082
  "history": "История",
14067
14083
  "scope": "Область",
14068
- "showValues": "Показать значения",
14084
+ "showValue": "Показать значение",
14085
+ "hideValue": "Скрыть значение",
14069
14086
  "refresh": "Обновить",
14070
14087
  "confirmLive": "Рабочее состояние будет немедленно очищено. Последующие Live Run могут повторно обработать эти элементы. Продолжить?",
14071
14088
  "cancel": "Отмена",
@@ -14080,8 +14097,16 @@ var resources = {
14080
14097
  "entries": "{{count}} / {{limit}} записей",
14081
14098
  "records": "{{count}} записей",
14082
14099
  "valueLimit": "Каждое значение JSON — не более {{size}} байт UTF-8.",
14083
- "sharedLimit": "Общий лимит записей для всех пространств. Пространства: {{count}} / {{limit}}. Водяная метка занимает только пространство.",
14084
- "fieldPlaceholder": "Весь элемент"
14100
+ "sharedLimit": "Все пространства используют общий лимит. Пространства: {{count}} / {{limit}}. Ожидающие записи резервируют ёмкость.",
14101
+ "fieldPlaceholder": "Весь элемент (строка или число)",
14102
+ "addField": "Добавить поле",
14103
+ "removeField": "Удалить поле {{index}}",
14104
+ "fieldIndex": "Поле идентификации {{index}}",
14105
+ "invalidFields": "Укажите разные непустые пути, например id или record.id.",
14106
+ "pendingRecords": "{{count}} ожидают фиксации",
14107
+ "pathPlaceholder": "id или record.id",
14108
+ "saveFailed": "Не удалось сохранить поля идентификации.",
14109
+ "retry": "Повторить"
14085
14110
  }
14086
14111
  },
14087
14112
  "fr": {
@@ -15399,26 +15424,20 @@ var resources = {
15399
15424
  },
15400
15425
  flowState: {
15401
15426
  "title": "Données persistantes",
15402
- "nodeTitle": "Supprimer les doublons",
15403
- "warning": "L’historique est enregistré immédiatement. Si un nœud en aval échoue, ces éléments seront ignorés lors des prochains Runs.",
15404
- "field": "Champ d’identité",
15405
- "mode": "Mode",
15406
- "new": "Nouveaux identifiants",
15407
- "increasing": "Seuil croissant",
15408
- "space": "Portée de l’historique",
15409
- "nodeSpace": "Ce nœud",
15410
- "flowSpace": "Espace partagé du Flow",
15427
+ "nodeTitle": "Ignorer les doublons",
15428
+ "warning": "L’historique est enregistré après la réussite du Run. En cas d’échec ou d’annulation, ces éléments pourront être traités à nouveau.",
15429
+ "field": "Champs d’identification",
15411
15430
  "values": "Données enregistrées",
15412
15431
  "spaces": "Enregistrements de déduplication",
15413
15432
  "clearAll": "Tout effacer",
15414
15433
  "delete": "Supprimer",
15415
15434
  "clear": "Effacer",
15416
15435
  "orphaned": "Sans nœud dans cette vue",
15417
- "watermark": "Seuil",
15418
- "nearLimit": "L’historique de déduplication du Flow est rempli à au moins 80 %. Effacez-le ou utilisez le mode filigrane.",
15436
+ "nearLimit": "L’historique du Flow est rempli à au moins 80 %. Effacez les entrées inutiles.",
15419
15437
  "history": "Historique",
15420
15438
  "scope": "Portée",
15421
- "showValues": "Afficher les valeurs",
15439
+ "showValue": "Voir la valeur",
15440
+ "hideValue": "Masquer la valeur",
15422
15441
  "refresh": "Actualiser",
15423
15442
  "confirmLive": "L’état de production sera immédiatement effacé. Les prochains Runs Live pourront traiter à nouveau ces éléments. Continuer ?",
15424
15443
  "cancel": "Annuler",
@@ -15433,8 +15452,16 @@ var resources = {
15433
15452
  "entries": "{{count}} / {{limit}} entrées",
15434
15453
  "records": "{{count}} enregistrements",
15435
15454
  "valueLimit": "Chaque valeur JSON peut contenir au plus {{size}} octets UTF-8.",
15436
- "sharedLimit": "Tous les espaces partagent la limite des enregistrements. Espaces : {{count}} / {{limit}}. Un filigrane utilise seulement un espace.",
15437
- "fieldPlaceholder": "Élément entier"
15455
+ "sharedLimit": "Tous les espaces partagent la limite. Espaces : {{count}} / {{limit}}. Les entrées en attente réservent de la capacité.",
15456
+ "fieldPlaceholder": "Élément entier (texte ou nombre)",
15457
+ "addField": "Ajouter un champ",
15458
+ "removeField": "Supprimer le champ {{index}}",
15459
+ "fieldIndex": "Champ d’identification {{index}}",
15460
+ "invalidFields": "Utilisez des chemins distincts et non vides, comme id ou record.id.",
15461
+ "pendingRecords": "{{count}} en attente",
15462
+ "pathPlaceholder": "id ou record.id",
15463
+ "saveFailed": "Impossible d’enregistrer les champs d’identification.",
15464
+ "retry": "Réessayer"
15438
15465
  }
15439
15466
  }
15440
15467
  };
@@ -18785,13 +18812,16 @@ function FlowTagChips({ ids, store, onFilter, container }) {
18785
18812
  container,
18786
18813
  align: "start",
18787
18814
  className: "w-64 max-w-[calc(100vw-2rem)]",
18788
- children: selected.slice(2).map((tag) => /* @__PURE__ */ jsx(DropdownMenuItem, {
18815
+ children: selected.slice(2).map((tag) => /* @__PURE__ */ jsxs(DropdownMenuItem, {
18789
18816
  "aria-label": t("tags.filterBy", { name: tag.name }),
18790
18817
  onClick: () => onFilter(tag.tagId),
18791
- children: /* @__PURE__ */ jsx("span", {
18818
+ children: [/* @__PURE__ */ jsx("i", {
18819
+ "aria-hidden": "true",
18820
+ className: "i-lucide-light:tag size-4 shrink-0"
18821
+ }), /* @__PURE__ */ jsx("span", {
18792
18822
  className: "min-w-0 break-words",
18793
18823
  children: tag.name
18794
- })
18824
+ })]
18795
18825
  }, tag.tagId))
18796
18826
  })] })]
18797
18827
  });
@@ -20255,7 +20285,7 @@ function renameFlowOutputSources(content, nodeIds, previous, next) {
20255
20285
  }
20256
20286
  //#endregion
20257
20287
  //#region src/workbench/browser/runtime/canvasPresentation.ts
20258
- function record(value) {
20288
+ function record$1(value) {
20259
20289
  if (value == null || typeof value != "object" || Array.isArray(value)) return void 0;
20260
20290
  return value;
20261
20291
  }
@@ -20263,15 +20293,28 @@ function finite(value) {
20263
20293
  return typeof value == "number" && Number.isFinite(value) ? value : void 0;
20264
20294
  }
20265
20295
  function flowPresentation(value) {
20266
- const designer = record(value.designer);
20296
+ const designer = record$1(value.designer);
20267
20297
  if (designer?.version != 1) return void 0;
20268
- return record(designer.flow);
20298
+ return record$1(designer.flow);
20299
+ }
20300
+ function savedDirection(value) {
20301
+ return canvasDirection(flowPresentation(value)?.direction);
20302
+ }
20303
+ function setCanvasLayout(value, direction, positions = {}) {
20304
+ const positioned = setNodePositions(value, positions);
20305
+ return {
20306
+ ...positioned,
20307
+ designer: replaceFlowPresentation(designerPresentation(positioned), {
20308
+ ...normalizedFlow(positioned),
20309
+ direction
20310
+ })
20311
+ };
20269
20312
  }
20270
20313
  function savedPositions(value) {
20271
20314
  const current = flowPresentation(value);
20272
20315
  const positions = (source) => {
20273
- return Object.fromEntries(Object.entries(record(source) ?? {}).flatMap(([nodeId, candidate]) => {
20274
- const position = record(candidate);
20316
+ return Object.fromEntries(Object.entries(record$1(source) ?? {}).flatMap(([nodeId, candidate]) => {
20317
+ const position = record$1(candidate);
20275
20318
  const x = finite(position?.x);
20276
20319
  const y = finite(position?.y);
20277
20320
  return x == null || y == null ? [] : [[nodeId, {
@@ -20289,7 +20332,7 @@ function savedOrder(value) {
20289
20332
  return [.../* @__PURE__ */ new Set([...order, ...Object.keys(positions)])];
20290
20333
  }
20291
20334
  function optionalViewport(value) {
20292
- const viewport = record(flowPresentation(value)?.viewport);
20335
+ const viewport = record$1(flowPresentation(value)?.viewport);
20293
20336
  const x = finite(viewport?.x);
20294
20337
  const y = finite(viewport?.y);
20295
20338
  const zoom = finite(viewport?.zoom);
@@ -20307,9 +20350,9 @@ function savedViewport(value) {
20307
20350
  };
20308
20351
  }
20309
20352
  function savedComments(value, positions) {
20310
- const comments = record(flowPresentation(value)?.comments) ?? {};
20353
+ const comments = record$1(flowPresentation(value)?.comments) ?? {};
20311
20354
  return Object.fromEntries(Object.entries(comments).flatMap(([nodeId, candidate]) => {
20312
- const comment = record(candidate);
20355
+ const comment = record$1(candidate);
20313
20356
  const title = typeof comment?.title == "string" ? comment.title : void 0;
20314
20357
  const content = typeof comment?.content == "string" ? comment.content : void 0;
20315
20358
  return title == null || content == null ? [] : [[nodeId, {
@@ -20323,7 +20366,7 @@ function savedComments(value, positions) {
20323
20366
  }));
20324
20367
  }
20325
20368
  function designerPresentation(value) {
20326
- const designer = record(value.designer);
20369
+ const designer = record$1(value.designer);
20327
20370
  return designer?.version == 1 ? designer : { version: 1 };
20328
20371
  }
20329
20372
  function replaceFlowPresentation(designer, value) {
@@ -20346,7 +20389,7 @@ function normalizedFlow(value) {
20346
20389
  function setNodePositions(value, positions) {
20347
20390
  const designer = designerPresentation(value);
20348
20391
  const current = normalizedFlow(value);
20349
- const nodes = record(current.nodes) ?? {};
20392
+ const nodes = record$1(current.nodes) ?? {};
20350
20393
  const order = [...savedOrder(value)];
20351
20394
  for (const nodeId of Object.keys(positions)) if (!order.includes(nodeId)) order.push(nodeId);
20352
20395
  const nextNodes = {
@@ -20366,9 +20409,9 @@ function setNodePositions(value, positions) {
20366
20409
  };
20367
20410
  }
20368
20411
  function setNodeContentHidden(value, nodeId, hidden) {
20369
- if (record(flowPresentation(value)?.hiddenNodeContent)?.[nodeId] === true === hidden) return value;
20412
+ if (record$1(flowPresentation(value)?.hiddenNodeContent)?.[nodeId] === true === hidden) return value;
20370
20413
  const current = normalizedFlow(value);
20371
- const hiddenNodeContent = { ...record(current.hiddenNodeContent) };
20414
+ const hiddenNodeContent = { ...record$1(current.hiddenNodeContent) };
20372
20415
  if (hidden) hiddenNodeContent[nodeId] = true;
20373
20416
  else delete hiddenNodeContent[nodeId];
20374
20417
  return {
@@ -20382,8 +20425,8 @@ function setNodeContentHidden(value, nodeId, hidden) {
20382
20425
  function setComment(value, nodeId, comment) {
20383
20426
  const positioned = setNodePositions(value, { [nodeId]: comment.position });
20384
20427
  const designer = designerPresentation(positioned);
20385
- const current = record(designer.flow) ?? {};
20386
- const comments = record(current.comments) ?? {};
20428
+ const current = record$1(designer.flow) ?? {};
20429
+ const comments = record$1(current.comments) ?? {};
20387
20430
  return {
20388
20431
  ...positioned,
20389
20432
  designer: replaceFlowPresentation(designer, {
@@ -20401,8 +20444,8 @@ function setComment(value, nodeId, comment) {
20401
20444
  function removeComments(value, nodeIds) {
20402
20445
  const designer = designerPresentation(value);
20403
20446
  const current = normalizedFlow(value);
20404
- const comments = { ...record(current.comments) };
20405
- const nodes = { ...record(current.nodes) };
20447
+ const comments = { ...record$1(current.comments) };
20448
+ const nodes = { ...record$1(current.nodes) };
20406
20449
  for (const nodeId of nodeIds) {
20407
20450
  delete comments[nodeId];
20408
20451
  delete nodes[nodeId];
@@ -20419,7 +20462,7 @@ function removeComments(value, nodeIds) {
20419
20462
  };
20420
20463
  }
20421
20464
  function commentIds(value) {
20422
- return new Set(Object.keys(record(flowPresentation(value)?.comments) ?? {}));
20465
+ return new Set(Object.keys(record$1(flowPresentation(value)?.comments) ?? {}));
20423
20466
  }
20424
20467
  function setFlowViewport(value, viewport) {
20425
20468
  const currentViewport = optionalViewport(value);
@@ -20438,46 +20481,50 @@ function setFlowViewport(value, viewport) {
20438
20481
  })
20439
20482
  };
20440
20483
  }
20484
+ var nodePresentationFields = [
20485
+ "nodes",
20486
+ "comments",
20487
+ "hiddenNodeContent",
20488
+ "verticalNodeWidths"
20489
+ ];
20441
20490
  function canvasPresentationChange(before, after) {
20442
20491
  const first = normalizedFlow(before);
20443
20492
  const last = normalizedFlow(after);
20493
+ const directionChanged = !dequal$1(first.direction, last.direction);
20444
20494
  const nodeIds = /* @__PURE__ */ new Set();
20445
- for (const field of [
20446
- "nodes",
20447
- "comments",
20448
- "hiddenNodeContent"
20449
- ]) {
20450
- const previous = record(first[field]) ?? {};
20451
- const next = record(last[field]) ?? {};
20495
+ for (const field of nodePresentationFields) {
20496
+ const previous = record$1(first[field]) ?? {};
20497
+ const next = record$1(last[field]) ?? {};
20452
20498
  for (const id of /* @__PURE__ */ new Set([...Object.keys(previous), ...Object.keys(next)])) if (!dequal$1(previous[id], next[id])) nodeIds.add(id);
20453
20499
  }
20454
- const select = (value) => Object.fromEntries([
20455
- "nodes",
20456
- "comments",
20457
- "hiddenNodeContent"
20458
- ].map((field) => [field, Object.fromEntries(Object.entries(record(value[field]) ?? {}).filter(([id]) => nodeIds.has(id)))]));
20500
+ const select = (value) => Object.fromEntries(nodePresentationFields.map((field) => [field, Object.fromEntries(Object.entries(record$1(value[field]) ?? {}).filter(([id]) => nodeIds.has(id)))]));
20501
+ const snapshot = (value) => ({
20502
+ ...select(value),
20503
+ ...directionChanged && value.direction !== void 0 ? { direction: value.direction } : {}
20504
+ });
20459
20505
  return {
20460
- before: select(first),
20461
- after: select(last),
20506
+ before: snapshot(first),
20507
+ after: snapshot(last),
20462
20508
  nodeIds: [...nodeIds],
20509
+ directionChanged,
20463
20510
  beforeOrder: savedOrder(before),
20464
20511
  afterOrder: savedOrder(after)
20465
20512
  };
20466
20513
  }
20467
20514
  function restoreCanvasPresentation(value, change, redo) {
20468
- if (change.nodeIds.length == 0) return value;
20515
+ if (change.nodeIds.length == 0 && !change.directionChanged) return value;
20469
20516
  const current = normalizedFlow(value);
20470
20517
  const saved = redo ? change.after : change.before;
20471
- for (const field of [
20472
- "nodes",
20473
- "comments",
20474
- "hiddenNodeContent"
20475
- ]) {
20476
- const next = { ...record(current[field]) };
20477
- const source = record(saved[field]) ?? {};
20518
+ for (const field of nodePresentationFields) {
20519
+ const next = { ...record$1(current[field]) };
20520
+ const source = record$1(saved[field]) ?? {};
20478
20521
  for (const id of change.nodeIds) if (source[id] == null) delete next[id];
20479
20522
  else next[id] = source[id];
20480
- current[field] = next;
20523
+ if (Object.keys(next).length > 0 || current[field] !== void 0) current[field] = next;
20524
+ }
20525
+ if (change.directionChanged) {
20526
+ if (saved.direction === void 0) delete current.direction;
20527
+ else current.direction = saved.direction;
20481
20528
  }
20482
20529
  current.order = [...redo ? change.afterOrder : change.beforeOrder];
20483
20530
  return {
@@ -20486,7 +20533,28 @@ function restoreCanvasPresentation(value, change, redo) {
20486
20533
  };
20487
20534
  }
20488
20535
  function savedHiddenNodeContent(value) {
20489
- return record(flowPresentation(value)?.hiddenNodeContent);
20536
+ return record$1(flowPresentation(value)?.hiddenNodeContent);
20537
+ }
20538
+ function savedVerticalNodeWidths(value) {
20539
+ return Object.fromEntries(Object.entries(record$1(flowPresentation(value)?.verticalNodeWidths) ?? {}).flatMap(([nodeId, candidate]) => {
20540
+ const width = finite(candidate);
20541
+ return width == null || width <= 0 ? [] : [[nodeId, width]];
20542
+ }));
20543
+ }
20544
+ function setVerticalNodeWidth(value, nodeId, width) {
20545
+ if (width !== void 0 && (!Number.isFinite(width) || width <= 0)) throw new RangeError("Node width must be a positive finite number.");
20546
+ if (savedVerticalNodeWidths(value)[nodeId] === width) return value;
20547
+ const current = normalizedFlow(value);
20548
+ const verticalNodeWidths = { ...record$1(current.verticalNodeWidths) };
20549
+ if (width === void 0) delete verticalNodeWidths[nodeId];
20550
+ else verticalNodeWidths[nodeId] = width;
20551
+ return {
20552
+ ...value,
20553
+ designer: replaceFlowPresentation(designerPresentation(value), {
20554
+ ...current,
20555
+ verticalNodeWidths
20556
+ })
20557
+ };
20490
20558
  }
20491
20559
  //#endregion
20492
20560
  //#region src/workbench/browser/runtime/connectionCatalog.ts
@@ -20626,7 +20694,7 @@ function deriveInspectorDiagnostics(revision, diagnostics, selection) {
20626
20694
  const nodePath = "/document/graph/nodes/";
20627
20695
  return diagnostics.diagnostics.filter((diagnostic) => within(targetPath, diagnostic.path) && !diagnostic.path.startsWith(nodePath));
20628
20696
  }
20629
- function scope(path) {
20697
+ function scope$1(path) {
20630
20698
  if (path.startsWith("/modules/")) return "code";
20631
20699
  if (/\/graph\/nodes\/[^/]+\/task(?:\/|$)/.test(path)) return "task";
20632
20700
  if (path.includes("/graph/nodes/")) return "node";
@@ -20670,7 +20738,7 @@ function diagnosticItems(revision, check) {
20670
20738
  return check?.diagnostics.map((diagnostic) => ({
20671
20739
  diagnostic,
20672
20740
  location: location(revision, diagnostic),
20673
- scope: scope(diagnostic.path)
20741
+ scope: scope$1(diagnostic.path)
20674
20742
  })) ?? [];
20675
20743
  }
20676
20744
  function diagnosticsForNode(node, diagnostics) {
@@ -20741,8 +20809,8 @@ var schema = lazy$1(() => union([boolean(), strictObject({
20741
20809
  "https://json-schema.org/draft/2019-09/schema",
20742
20810
  "https://json-schema.org/draft/2020-12/schema"
20743
20811
  ]).optional(),
20744
- $defs: record$2(string$1(), schema).optional(),
20745
- definitions: record$2(string$1(), schema).optional(),
20812
+ $defs: record$3(string$1(), schema).optional(),
20813
+ definitions: record$3(string$1(), schema).optional(),
20746
20814
  pattern: string$1().refine((value) => {
20747
20815
  try {
20748
20816
  return new RegExp(value, "u").source.length > 0;
@@ -20759,16 +20827,16 @@ var schema = lazy$1(() => union([boolean(), strictObject({
20759
20827
  minProperties: number().int().nonnegative().optional(),
20760
20828
  maxProperties: number().int().nonnegative().optional(),
20761
20829
  propertyNames: schema.optional(),
20762
- patternProperties: record$2(string$1().refine((value) => {
20830
+ patternProperties: record$3(string$1().refine((value) => {
20763
20831
  try {
20764
20832
  return new RegExp(value, "u").source.length > 0;
20765
20833
  } catch {
20766
20834
  return false;
20767
20835
  }
20768
20836
  }, "Invalid regular expression."), schema).optional(),
20769
- dependentRequired: record$2(string$1(), array(string$1())).optional(),
20770
- dependentSchemas: record$2(string$1(), schema).optional(),
20771
- dependencies: record$2(string$1(), union([schema, array(string$1())])).optional(),
20837
+ dependentRequired: record$3(string$1(), array(string$1())).optional(),
20838
+ dependentSchemas: record$3(string$1(), schema).optional(),
20839
+ dependencies: record$3(string$1(), union([schema, array(string$1())])).optional(),
20772
20840
  prefixItems: array(schema).optional(),
20773
20841
  additionalItems: schema.optional(),
20774
20842
  unevaluatedItems: schema.optional(),
@@ -20782,7 +20850,7 @@ var schema = lazy$1(() => union([boolean(), strictObject({
20782
20850
  deprecated: boolean().optional(),
20783
20851
  $comment: string$1().optional(),
20784
20852
  enum: array(json$3()).min(1).optional(),
20785
- properties: record$2(string$1(), schema).optional(),
20853
+ properties: record$3(string$1(), schema).optional(),
20786
20854
  required: array(string$1()).optional(),
20787
20855
  additionalProperties: schema.optional(),
20788
20856
  items: union([schema, array(schema)]).optional(),
@@ -21696,15 +21764,16 @@ function actionSummary(entries, actions, providers) {
21696
21764
  }
21697
21765
  //#endregion
21698
21766
  //#region src/workbench/browser/runtime/workspace.ts
21699
- function semanticNodeIcon(node, connectorActions) {
21767
+ function semanticNodeIcon(node, connectorActions, providers = {}) {
21700
21768
  if (node.node.icon != null) return node.node.icon;
21701
21769
  if (node.kind != "task" || node.definition == null || !("executor" in node.definition) || node.definition.executor.kind != "connector") return nodeIcon(node);
21702
- const action = connectorActions[node.definition.executor.action];
21703
- return action == null ? nodeIcon(node) : providerIcon(action);
21770
+ const actionId = node.definition.executor.action;
21771
+ const provider = connectorActions[actionId] ?? providers[actionId.split(".")[0]];
21772
+ return provider == null ? nodeIcon(node) : providerIcon(provider);
21704
21773
  }
21705
21774
  function sourceNodePresentation(node, context) {
21706
21775
  if (node.kind != "trigger") return {
21707
- icon: semanticNodeIcon(node, context.connectorActions),
21776
+ icon: semanticNodeIcon(node, context.connectorActions, context.providers),
21708
21777
  title: nodeTitle(node, context.t)
21709
21778
  };
21710
21779
  return {
@@ -21739,7 +21808,7 @@ function nodeIcon(node) {
21739
21808
  if (task.executor.kind == "decision") return ":carbon:ml-model-reference:";
21740
21809
  if (task.executor.kind == "workflow") return ":lucide-light:workflow:";
21741
21810
  if (task.executor.kind == "http-request") return ":lucide-light:globe:";
21742
- if (task.executor.kind == "dedupe") return ":lucide-light:list-filter:";
21811
+ if (task.executor.kind == "skip-duplicates") return ":lucide-light:list-filter:";
21743
21812
  if (task.executor.kind == "openapi") return ":logos:openapi-icon:";
21744
21813
  return task.executor.kind == "connector" ? ":carbon:connection-signal:" : ":carbon:machine-learning-model:";
21745
21814
  }
@@ -22002,7 +22071,7 @@ function executorName(task, providerName, t) {
22002
22071
  if (task.executor.kind == "workflow") return t?.("addNode.workflow") ?? "Call Workflow";
22003
22072
  if (task.executor.kind == "http-request") return `${t?.("httpRequest.title") ?? "HTTP Request"} · ${task.executor.method}`;
22004
22073
  if (task.executor.kind == "openapi") return "OpenAPI";
22005
- if (task.executor.kind == "dedupe") return t?.("flowState.nodeTitle") ?? "Remove Duplicates";
22074
+ if (task.executor.kind == "skip-duplicates") return t?.("flowState.nodeTitle") ?? "Skip Duplicates";
22006
22075
  if (task.executor.kind == "llm") return t?.("designer.executorLlm") ?? "LLM";
22007
22076
  return `${t?.("designer.executorConnector") ?? "Connector"} · ${providerName ?? task.executor.action.split(".")[0]}`;
22008
22077
  }
@@ -22213,6 +22282,7 @@ function semanticDesignerNode(nodeId, resolved, ports, position, context) {
22213
22282
  const task = resolved.kind == "task" ? resolved.definition : void 0;
22214
22283
  const connector = task != null && "executor" in task && task.executor.kind == "connector" ? task.executor : void 0;
22215
22284
  const connectorAction = connector == null ? void 0 : context.connectorActions[connector.action];
22285
+ const connectorProvider = connector == null ? void 0 : context.providers[connector.action.split(".")[0]];
22216
22286
  const connections = connectorAction == null ? void 0 : context.connectionCatalogs[connectorAction.serviceId];
22217
22287
  const connectionId = connector?.connectionId;
22218
22288
  const selectedConnection = connectionId == null ? void 0 : connections?.byId.get(connectionId);
@@ -22222,7 +22292,7 @@ function semanticDesignerNode(nodeId, resolved, ports, position, context) {
22222
22292
  description: node.description,
22223
22293
  diagnostics: nodeDiagnosticCount(resolved, context.diagnostics),
22224
22294
  fallbackIcon: nodeIcon(resolved),
22225
- icon: semanticNodeIcon(resolved, context.connectorActions),
22295
+ icon: semanticNodeIcon(resolved, context.connectorActions, context.providers),
22226
22296
  id: nodeId,
22227
22297
  inputs,
22228
22298
  outputs,
@@ -22253,7 +22323,7 @@ function semanticDesignerNode(nodeId, resolved, ports, position, context) {
22253
22323
  return input == null || "group" in input ? [] : [input];
22254
22324
  }),
22255
22325
  kind: node.kind,
22256
- executorName: executorName(task, connectorAction?.serviceName, context.t),
22326
+ executorName: executorName(task, connectorAction?.serviceName ?? connectorProvider?.serviceName, context.t),
22257
22327
  ...task != null && "moduleId" in task ? { actionSummary: actionSummary((task.capabilities ?? []).flatMap((capability) => capability.kind == "workflow" ? [capability] : "mode" in capability && capability.mode === "independent" ? capability.actions : []), context.connectorActions, Object.values(context.providers)) } : {},
22258
22328
  ...task != null && "executor" in task && task.executor.kind == "agent" ? { actionSummary: actionSummary(task.executor.tools, context.connectorActions, Object.values(context.providers)) } : {},
22259
22329
  connectionRequired,
@@ -22293,8 +22363,10 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
22293
22363
  const ports = new Map([...definitions].map(([nodeId, node]) => [nodeId, nodePorts(node, revision)]));
22294
22364
  const edgeProjection = projectEdges(graph, nodeIds);
22295
22365
  const layout = layoutNodes(nodeIds, edgeProjection.dependencies, edgeProjection.dependents);
22366
+ const direction = savedDirection(presentation);
22296
22367
  const positions = savedPositions(presentation);
22297
22368
  const hiddenNodeContent = savedHiddenNodeContent(presentation);
22369
+ const verticalNodeWidths = savedVerticalNodeWidths(presentation);
22298
22370
  const context = {
22299
22371
  connectionCatalogs,
22300
22372
  connectorActions,
@@ -22306,11 +22378,18 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
22306
22378
  t
22307
22379
  };
22308
22380
  const rows = /* @__PURE__ */ new Map();
22309
- const automaticPositions = wrapLayout(layout.ordered.map((nodeId) => {
22381
+ const defaultNodes = layout.ordered.map((nodeId) => {
22310
22382
  const column = layout.depth.get(nodeId) ?? 0;
22311
22383
  const row = rows.get(column) ?? 0;
22312
22384
  rows.set(column, row + 1);
22313
- return {
22385
+ return direction === "vertical" ? {
22386
+ id: nodeId,
22387
+ column,
22388
+ x: 80 + row * 400,
22389
+ y: 80 + column * 240,
22390
+ width: 320,
22391
+ height: 160
22392
+ } : {
22314
22393
  id: nodeId,
22315
22394
  column,
22316
22395
  x: 80 + column * 500,
@@ -22318,7 +22397,11 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
22318
22397
  width: 420,
22319
22398
  height: 240
22320
22399
  };
22321
- }));
22400
+ });
22401
+ const automaticPositions = direction === "horizontal" ? wrapLayout(defaultNodes) : Object.fromEntries(defaultNodes.map(({ id, x, y }) => [id, {
22402
+ x,
22403
+ y
22404
+ }]));
22322
22405
  const nodes = [];
22323
22406
  for (const nodeId of layout.ordered) {
22324
22407
  const position = positions[nodeId] ?? automaticPositions[nodeId];
@@ -22333,7 +22416,8 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
22333
22416
  const node = semanticDesignerNode(nodeId, resolved, ports.get(nodeId), position, context);
22334
22417
  nodes.push({
22335
22418
  ...node,
22336
- contentHidden: hiddenNodeContent?.[nodeId] === true
22419
+ contentHidden: hiddenNodeContent?.[nodeId] === true,
22420
+ ...node.kind === "condition" ? { verticalWidth: verticalNodeWidths[nodeId] } : {}
22337
22421
  });
22338
22422
  }
22339
22423
  for (const [nodeId, comment] of Object.entries(savedComments(presentation, positions)).toSorted(([left], [right]) => left.localeCompare(right))) nodes.push({
@@ -22345,6 +22429,7 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
22345
22429
  const order = new Map(savedOrder(presentation).map((nodeId, index) => [nodeId, index]));
22346
22430
  nodes.sort((left, right) => (order.get(left.id) ?? -1) - (order.get(right.id) ?? -1));
22347
22431
  return {
22432
+ direction,
22348
22433
  edges: edgeProjection.edges,
22349
22434
  nodes,
22350
22435
  ...projectedRun.status == null ? {} : { runStatus: projectedRun.status },
@@ -22352,6 +22437,695 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
22352
22437
  };
22353
22438
  }
22354
22439
  //#endregion
22440
+ //#region ../../node_modules/.bun/idb-keyval@6.3.0/node_modules/idb-keyval/dist/index.js
22441
+ function promisifyRequest(request) {
22442
+ return new Promise((resolve, reject) => {
22443
+ request.oncomplete = request.onsuccess = () => resolve(request.result);
22444
+ request.onabort = request.onerror = () => reject(request.error);
22445
+ });
22446
+ }
22447
+ function createStore(dbName, storeName) {
22448
+ let dbp;
22449
+ const getDB = () => {
22450
+ if (dbp) return dbp;
22451
+ const request = indexedDB.open(dbName);
22452
+ request.onupgradeneeded = () => request.result.createObjectStore(storeName);
22453
+ dbp = promisifyRequest(request);
22454
+ dbp.then((db) => {
22455
+ db.onclose = () => dbp = void 0;
22456
+ }, () => {
22457
+ dbp = void 0;
22458
+ });
22459
+ return dbp;
22460
+ };
22461
+ return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));
22462
+ }
22463
+ //#endregion
22464
+ //#region ../../node_modules/.bun/@oomol-lab+resource-cache@0.1.6/node_modules/@oomol-lab/resource-cache/dist/src-D2zZfRsq.mjs
22465
+ function abortError() {
22466
+ return new DOMException("Cache operation aborted", "AbortError");
22467
+ }
22468
+ function wait(promise, lifetime, caller) {
22469
+ const signals = caller ? [lifetime, caller] : [lifetime];
22470
+ return new Promise((resolve, reject) => {
22471
+ const cleanup = () => {
22472
+ for (const signal of signals) signal.removeEventListener("abort", abort);
22473
+ };
22474
+ const abort = () => {
22475
+ cleanup();
22476
+ reject(abortError());
22477
+ };
22478
+ for (const signal of signals) signal.addEventListener("abort", abort, { once: true });
22479
+ promise.then((value) => {
22480
+ cleanup();
22481
+ resolve(value);
22482
+ }, (error) => {
22483
+ cleanup();
22484
+ reject(error);
22485
+ });
22486
+ });
22487
+ }
22488
+ /** @internal */
22489
+ function validateOptions(options) {
22490
+ if (typeof options.namespace !== "string" || !options.namespace.trim()) throw new TypeError("namespace must be nonempty");
22491
+ if (!Number.isSafeInteger(options.schemaVersion) || options.schemaVersion <= 0) throw new TypeError("schemaVersion must be a positive safe integer");
22492
+ if (!Number.isFinite(options.maxAge) || options.maxAge < 0) throw new TypeError("maxAge must be finite and nonnegative");
22493
+ for (const name of [
22494
+ "key",
22495
+ "decode",
22496
+ "load"
22497
+ ]) if (typeof options[name] !== "function") throw new TypeError(`${name} must be a function`);
22498
+ }
22499
+ /** @internal */
22500
+ function createCache(options, backend, session) {
22501
+ const states = /* @__PURE__ */ new Map();
22502
+ let disposed = false;
22503
+ let scopeBlocked = false;
22504
+ let disposal;
22505
+ let io = Promise.resolve();
22506
+ function storage(action) {
22507
+ const result = io.then(action);
22508
+ io = result.catch(() => {});
22509
+ return result;
22510
+ }
22511
+ function checkOpen() {
22512
+ if (disposed) throw new Error("Cache is disposed");
22513
+ }
22514
+ function identity(query) {
22515
+ checkOpen();
22516
+ const key = options.key(query);
22517
+ if (typeof key !== "string") throw new TypeError("key must return a string");
22518
+ return key;
22519
+ }
22520
+ function stateFor(key) {
22521
+ let state = states.get(key);
22522
+ if (!state) {
22523
+ state = {
22524
+ controller: new AbortController(),
22525
+ blocked: scopeBlocked
22526
+ };
22527
+ states.set(key, state);
22528
+ }
22529
+ return state;
22530
+ }
22531
+ function checkState(state) {
22532
+ if (state.controller.signal.aborted) throw abortError();
22533
+ }
22534
+ function fresh(entry) {
22535
+ const now = Date.now();
22536
+ return !entry.invalidated && entry.validatedAt <= now && now - entry.validatedAt < options.maxAge;
22537
+ }
22538
+ function restore(value, previous) {
22539
+ return {
22540
+ ...value.meta,
22541
+ data: value.body ? options.decode(value.body.data) : previous.data
22542
+ };
22543
+ }
22544
+ async function read(key, state) {
22545
+ if (state.entry && fresh(state.entry)) return state.entry;
22546
+ const entry = await storage(async () => {
22547
+ checkState(state);
22548
+ if (state.blocked) return state.entry;
22549
+ try {
22550
+ const value = await backend.read(key, state.entry?.version);
22551
+ return value ? restore(value, state.entry) : state.entry;
22552
+ } catch {
22553
+ return state.entry;
22554
+ }
22555
+ });
22556
+ checkState(state);
22557
+ state.entry = entry;
22558
+ return entry;
22559
+ }
22560
+ function schedule(key, query, state, force) {
22561
+ const job = {
22562
+ started: false,
22563
+ force
22564
+ };
22565
+ job.promise = (async () => {
22566
+ const previous = await read(key, state);
22567
+ checkState(state);
22568
+ if (!job.force && previous && fresh(previous)) return previous.data;
22569
+ job.started = true;
22570
+ const result = await options.load(query, {
22571
+ etag: previous?.etag ?? null,
22572
+ signal: state.controller.signal
22573
+ });
22574
+ checkState(state);
22575
+ let entry;
22576
+ if (result.modified) entry = {
22577
+ data: result.data,
22578
+ etag: result.etag,
22579
+ version: crypto.getRandomValues(/* @__PURE__ */ new Uint32Array(4)).join("-"),
22580
+ validatedAt: Date.now(),
22581
+ invalidated: false
22582
+ };
22583
+ else {
22584
+ if (!previous) throw new Error("Load protocol error: unmodified response without cached data");
22585
+ entry = {
22586
+ ...previous,
22587
+ etag: result.etag === void 0 ? previous.etag : result.etag,
22588
+ validatedAt: Date.now(),
22589
+ invalidated: false
22590
+ };
22591
+ }
22592
+ await storage(async () => {
22593
+ checkState(state);
22594
+ try {
22595
+ if (await backend.write(key, entry, result.modified)) state.blocked = false;
22596
+ } catch {
22597
+ state.blocked = true;
22598
+ }
22599
+ checkState(state);
22600
+ state.entry = entry;
22601
+ });
22602
+ checkState(state);
22603
+ return entry.data;
22604
+ })();
22605
+ state.job = job;
22606
+ const release = () => {
22607
+ state.job = void 0;
22608
+ };
22609
+ job.promise.then(release, release);
22610
+ return job;
22611
+ }
22612
+ function refresh(key, query, state, force) {
22613
+ const active = state.job;
22614
+ if (!active) return schedule(key, query, state, force).promise;
22615
+ if (!force) return active.promise;
22616
+ if (!active.started) {
22617
+ active.force = true;
22618
+ return active.promise;
22619
+ }
22620
+ if (!state.queued) {
22621
+ const start = () => {
22622
+ checkState(state);
22623
+ state.queued = void 0;
22624
+ return schedule(key, query, state, true).promise;
22625
+ };
22626
+ state.queued = active.promise.then(start, start);
22627
+ }
22628
+ return state.queued;
22629
+ }
22630
+ function reset(key, keep) {
22631
+ const old = states.get(key);
22632
+ const state = {
22633
+ controller: new AbortController(),
22634
+ blocked: true
22635
+ };
22636
+ if (keep && old?.entry) state.entry = {
22637
+ ...old.entry,
22638
+ invalidated: true
22639
+ };
22640
+ states.set(key, state);
22641
+ return {
22642
+ state,
22643
+ cancel: () => old?.controller.abort()
22644
+ };
22645
+ }
22646
+ function resetAll() {
22647
+ const old = [...states.values()];
22648
+ states.clear();
22649
+ const barrier = {};
22650
+ scopeBlocked = barrier;
22651
+ return {
22652
+ barrier,
22653
+ cancel() {
22654
+ for (const state of old) state.controller.abort();
22655
+ }
22656
+ };
22657
+ }
22658
+ return {
22659
+ async get(query, getOptions = {}) {
22660
+ const key = identity(query);
22661
+ if (getOptions.signal?.aborted) throw abortError();
22662
+ const state = stateFor(key);
22663
+ if (!getOptions.revalidate && state.entry && fresh(state.entry)) return state.entry.data;
22664
+ return wait(refresh(key, query, state, getOptions.revalidate === true), state.controller.signal, getOptions.signal);
22665
+ },
22666
+ async peek(query) {
22667
+ const key = identity(query);
22668
+ const state = stateFor(key);
22669
+ const entry = await wait(read(key, state), state.controller.signal);
22670
+ return entry ? {
22671
+ data: entry.data,
22672
+ etag: entry.etag,
22673
+ validatedAt: entry.validatedAt,
22674
+ fresh: fresh(entry)
22675
+ } : void 0;
22676
+ },
22677
+ async invalidate(query) {
22678
+ const key = identity(query);
22679
+ const canRestore = !(states.get(key)?.blocked ?? scopeBlocked);
22680
+ const { state, cancel } = reset(key, true);
22681
+ const cleanup = storage(async () => {
22682
+ const value = await backend.invalidate(key);
22683
+ if (canRestore) state.blocked = false;
22684
+ if (canRestore && !state.controller.signal.aborted && !state.entry && value) try {
22685
+ state.entry = restore(value);
22686
+ } catch {}
22687
+ });
22688
+ cancel();
22689
+ await cleanup;
22690
+ },
22691
+ async remove(query) {
22692
+ const key = identity(query);
22693
+ const { state, cancel } = reset(key, false);
22694
+ const cleanup = storage(async () => {
22695
+ await backend.remove(key);
22696
+ state.blocked = false;
22697
+ });
22698
+ cancel();
22699
+ await cleanup;
22700
+ },
22701
+ async clear() {
22702
+ checkOpen();
22703
+ const { barrier, cancel } = resetAll();
22704
+ const cleanup = storage(async () => {
22705
+ await backend.clear(false);
22706
+ if (scopeBlocked === barrier) scopeBlocked = false;
22707
+ for (const state of states.values()) if (state.blocked === barrier) state.blocked = false;
22708
+ });
22709
+ cancel();
22710
+ await cleanup;
22711
+ },
22712
+ dispose() {
22713
+ if (!disposal) {
22714
+ disposed = true;
22715
+ const { cancel } = resetAll();
22716
+ disposal = storage(async () => {
22717
+ if (session) await backend.clear(true);
22718
+ });
22719
+ disposal = disposal.catch((error) => {
22720
+ disposal = void 0;
22721
+ throw error;
22722
+ });
22723
+ cancel();
22724
+ }
22725
+ return disposal;
22726
+ }
22727
+ };
22728
+ }
22729
+ function object(value) {
22730
+ return typeof value === "object" && value !== null;
22731
+ }
22732
+ function metadata(value) {
22733
+ if (!object(value) || typeof value.version !== "string" || !value.version || !(value.etag === null || typeof value.etag === "string") || typeof value.invalidated !== "boolean") return void 0;
22734
+ const validTime = typeof value.validatedAt === "number" && Number.isFinite(value.validatedAt) && value.validatedAt >= 0;
22735
+ return {
22736
+ version: value.version,
22737
+ etag: value.etag,
22738
+ validatedAt: validTime ? value.validatedAt : 0,
22739
+ invalidated: !validTime || value.invalidated === true
22740
+ };
22741
+ }
22742
+ function stored(meta, body) {
22743
+ if (!object(body) || body.version !== meta.version || !Object.hasOwn(body, "data")) return void 0;
22744
+ return {
22745
+ meta,
22746
+ body: { data: body.data }
22747
+ };
22748
+ }
22749
+ var storagePrefix = "@oomol-lab/resource-cache:";
22750
+ /** Delimit identity fields without ambiguous string concatenation. @internal */
22751
+ function scope(namespace) {
22752
+ return storagePrefix + JSON.stringify(namespace);
22753
+ }
22754
+ /** @internal */
22755
+ function sessionScope(namespace, sessionId) {
22756
+ return storagePrefix + JSON.stringify([namespace, sessionId]);
22757
+ }
22758
+ /** @internal */
22759
+ function persistentStorage(namespace, schemaVersion) {
22760
+ const useStore = createStore("@oomol-lab/resource-cache", "records");
22761
+ const prefix = `${scope(namespace)}:${schemaVersion}:`;
22762
+ const identity = (key, part) => prefix + JSON.stringify([key, part]);
22763
+ function transaction(mode, work) {
22764
+ return useStore(mode, (store) => new Promise((resolve, reject) => {
22765
+ const tx = store.transaction;
22766
+ let value;
22767
+ let failure;
22768
+ tx.oncomplete = () => resolve(value);
22769
+ tx.onabort = () => reject(failure ?? tx.error);
22770
+ const guard = (fn) => {
22771
+ try {
22772
+ fn();
22773
+ } catch (error) {
22774
+ failure = error;
22775
+ tx.abort();
22776
+ }
22777
+ };
22778
+ const read = (request, fn) => {
22779
+ request.onsuccess = () => guard(() => fn(request.result));
22780
+ };
22781
+ guard(() => work(store, read, (result) => {
22782
+ value = result;
22783
+ }));
22784
+ }));
22785
+ }
22786
+ return {
22787
+ read(key, version) {
22788
+ return transaction("readonly", (store, read, result) => {
22789
+ read(store.get(identity(key, "meta")), (raw) => {
22790
+ const meta = metadata(raw);
22791
+ if (!meta) return;
22792
+ if (meta.version === version) {
22793
+ result({ meta });
22794
+ return;
22795
+ }
22796
+ read(store.get(identity(key, "body")), (body) => result(stored(meta, body)));
22797
+ });
22798
+ });
22799
+ },
22800
+ write(key, entry, modified) {
22801
+ return transaction("readwrite", (store, read, result) => {
22802
+ const { data, ...meta } = entry;
22803
+ if (modified) {
22804
+ store.put(meta, identity(key, "meta"));
22805
+ store.put({
22806
+ version: meta.version,
22807
+ data
22808
+ }, identity(key, "body"));
22809
+ result(true);
22810
+ } else read(store.get(identity(key, "meta")), (raw) => {
22811
+ const matches = metadata(raw)?.version === meta.version;
22812
+ if (matches) store.put(meta, identity(key, "meta"));
22813
+ result(matches);
22814
+ });
22815
+ });
22816
+ },
22817
+ invalidate(key) {
22818
+ return transaction("readwrite", (store, read, result) => {
22819
+ read(store.get(identity(key, "meta")), (raw) => {
22820
+ const meta = metadata(raw);
22821
+ if (!meta) return;
22822
+ meta.invalidated = true;
22823
+ store.put(meta, identity(key, "meta"));
22824
+ read(store.get(identity(key, "body")), (body) => result(stored(meta, body)));
22825
+ });
22826
+ });
22827
+ },
22828
+ remove(key) {
22829
+ return transaction("readwrite", (store) => {
22830
+ store.delete(identity(key, "meta"));
22831
+ store.delete(identity(key, "body"));
22832
+ });
22833
+ },
22834
+ clear() {
22835
+ return transaction("readwrite", (store, read) => {
22836
+ read(store.getAllKeys(), (keys) => {
22837
+ for (const key of keys) if (typeof key === "string" && key.startsWith(prefix)) store.delete(key);
22838
+ });
22839
+ });
22840
+ }
22841
+ };
22842
+ }
22843
+ /** @internal */
22844
+ function sessionStorageBackend(namespace, schemaVersion, sessionId) {
22845
+ const base = `${sessionScope(namespace, sessionId)}:`;
22846
+ const prefix = `${base}${schemaVersion}:`;
22847
+ const identity = (key) => prefix + JSON.stringify(key);
22848
+ const record = (key) => {
22849
+ const text = globalThis.sessionStorage.getItem(identity(key));
22850
+ if (text === null) return void 0;
22851
+ const raw = JSON.parse(text);
22852
+ const meta = metadata(raw);
22853
+ return meta ? stored(meta, raw) : void 0;
22854
+ };
22855
+ return {
22856
+ async read(key, version) {
22857
+ const value = record(key);
22858
+ if (value && value.meta.version === version) return { meta: value.meta };
22859
+ return value;
22860
+ },
22861
+ async write(key, entry, modified) {
22862
+ if (modified) {
22863
+ globalThis.sessionStorage.setItem(identity(key), JSON.stringify(entry));
22864
+ return true;
22865
+ } else {
22866
+ const value = record(key);
22867
+ if (value?.meta.version === entry.version) {
22868
+ const { data: _data, ...meta } = entry;
22869
+ globalThis.sessionStorage.setItem(identity(key), JSON.stringify({
22870
+ ...meta,
22871
+ data: value.body.data
22872
+ }));
22873
+ return true;
22874
+ }
22875
+ return false;
22876
+ }
22877
+ },
22878
+ async invalidate(key) {
22879
+ const value = record(key);
22880
+ if (value) {
22881
+ value.meta.invalidated = true;
22882
+ globalThis.sessionStorage.setItem(identity(key), JSON.stringify({
22883
+ ...value.meta,
22884
+ ...value.body
22885
+ }));
22886
+ }
22887
+ return value;
22888
+ },
22889
+ async remove(key) {
22890
+ globalThis.sessionStorage.removeItem(identity(key));
22891
+ },
22892
+ async clear(allVersions) {
22893
+ const storage = globalThis.sessionStorage;
22894
+ const matches = [];
22895
+ for (let i = 0; i < storage.length; i++) {
22896
+ const key = storage.key(i);
22897
+ if (key.startsWith(allVersions ? base : prefix)) matches.push(key);
22898
+ }
22899
+ for (const key of matches) storage.removeItem(key);
22900
+ }
22901
+ };
22902
+ }
22903
+ /** Conditional JSON GET. The caller owns the endpoint, credentials, timeout and response decoder. */
22904
+ async function loadJson(url, validation, decode, init) {
22905
+ const headers = new Headers(init?.headers);
22906
+ if (validation.etag !== null) headers.set("If-None-Match", validation.etag);
22907
+ else headers.delete("If-None-Match");
22908
+ const response = await fetch(url, {
22909
+ ...init,
22910
+ method: "GET",
22911
+ headers,
22912
+ signal: init?.signal ? AbortSignal.any([validation.signal, init.signal]) : validation.signal
22913
+ });
22914
+ if (response.status === 304) return {
22915
+ modified: false,
22916
+ etag: response.headers.get("ETag") ?? void 0
22917
+ };
22918
+ if (!response.ok) throw new Error(`JSON request failed: ${response.status}`);
22919
+ return {
22920
+ modified: true,
22921
+ data: decode(await response.json()),
22922
+ etag: response.headers.get("ETag")
22923
+ };
22924
+ }
22925
+ /** Create an IndexedDB cache. Storage failures preserve successful network results. */
22926
+ function createPersistentCache(options) {
22927
+ validateOptions(options);
22928
+ return createCache({ ...options }, persistentStorage(options.namespace, options.schemaVersion), false);
22929
+ }
22930
+ /** Create a login-scoped sessionStorage cache. Data must survive JSON serialization and decoding. */
22931
+ function createSessionCache(options) {
22932
+ validateOptions(options);
22933
+ if (typeof options.sessionId !== "string" || !options.sessionId.trim()) throw new TypeError("sessionId must be nonempty");
22934
+ return createCache({ ...options }, sessionStorageBackend(options.namespace, options.schemaVersion, options.sessionId), true);
22935
+ }
22936
+ //#endregion
22937
+ //#region ../../node_modules/.bun/@oomol-lab+resource-cache@0.1.6/node_modules/@oomol-lab/resource-cache/dist/oomol.mjs
22938
+ function record(value) {
22939
+ if (value === null || typeof value !== "object" || Array.isArray(value)) throw new Error("Invalid public app response");
22940
+ return value;
22941
+ }
22942
+ function text(value) {
22943
+ if (typeof value !== "string") throw new Error("Invalid public app text");
22944
+ }
22945
+ function dimension(value) {
22946
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) throw new Error("Invalid sprite dimensions");
22947
+ return value;
22948
+ }
22949
+ function decodeSprite(value) {
22950
+ if (value == null) return null;
22951
+ const sprite = record(value);
22952
+ const dimensions = {
22953
+ width: dimension(sprite.width),
22954
+ height: dimension(sprite.height),
22955
+ iconSize: dimension(sprite.iconSize)
22956
+ };
22957
+ for (const key of ["lightUrl", "darkUrl"]) {
22958
+ text(sprite[key]);
22959
+ if (new URL(sprite[key]).protocol !== "https:") throw new Error("Invalid sprite URL");
22960
+ }
22961
+ return dimensions;
22962
+ }
22963
+ /** Validate public catalog display fields and sprite coordinates, preserving the complete upstream response. */
22964
+ function decodeAppCatalogResponse(value) {
22965
+ const response = record(value);
22966
+ if (response.success !== true || !Array.isArray(response.data)) throw new Error("Invalid app catalog");
22967
+ const sprite = decodeSprite(record(response.meta).iconSprite);
22968
+ for (const item of response.data) {
22969
+ const app = record(item);
22970
+ text(app.service);
22971
+ text(app.displayName);
22972
+ if (!Array.isArray(app.categories)) throw new Error("Invalid app categories");
22973
+ for (const category of app.categories) {
22974
+ const item = record(category);
22975
+ text(item.id);
22976
+ text(item.displayName);
22977
+ }
22978
+ if (!Array.isArray(app.searchAliases) || !app.searchAliases.every((alias) => typeof alias === "string")) throw new Error("Invalid app aliases");
22979
+ if (app.iconSpritePosition != null) {
22980
+ if (!sprite) throw new Error("Sprite position requires sprite metadata");
22981
+ const position = record(app.iconSpritePosition);
22982
+ for (const [coordinate, size] of [[position.x, sprite.width], [position.y, sprite.height]]) if (typeof coordinate !== "number" || !Number.isSafeInteger(coordinate) || coordinate < 0 || coordinate + sprite.iconSize > size) throw new Error("Invalid sprite position");
22983
+ }
22984
+ }
22985
+ return value;
22986
+ }
22987
+ /** Namespaces reserved for the OOMOL response factories. */
22988
+ var oomolNamespaces = {
22989
+ providers: "oomol:providers",
22990
+ actions: "oomol:actions",
22991
+ appCatalog: "oomol:app-catalog",
22992
+ appMarketing: "oomol:app-marketing",
22993
+ connections: "oomol:connections"
22994
+ };
22995
+ /** Join identity fields without nesting JSON in the storage key. */
22996
+ function readableKey(...parts) {
22997
+ return parts.map((part) => encodeURIComponent(String(part)).replaceAll("%3A", ":")).join("/");
22998
+ }
22999
+ var singletonRegistrySymbol = Symbol.for("oomol-lab.resource-cache.oomol-singletons");
23000
+ var singletonCaches = Reflect.get(globalThis, singletonRegistrySymbol) ?? (() => {
23001
+ const registry = /* @__PURE__ */ new Map();
23002
+ Reflect.set(globalThis, singletonRegistrySymbol, registry);
23003
+ return registry;
23004
+ })();
23005
+ function createOomolCache(resource, options, query) {
23006
+ const environment = validateOomolOptions(options);
23007
+ const { load } = options;
23008
+ const key = readableKey(query.locale);
23009
+ return createPersistentCache({
23010
+ namespace: readableKey(resource, environment),
23011
+ schemaVersion: options.schemaVersion,
23012
+ maxAge: options.maxAge,
23013
+ key: () => key,
23014
+ decode: options.decode,
23015
+ load: (_query, validation) => load({ ...query }, validation)
23016
+ });
23017
+ }
23018
+ function createConnectionsCacheInternal(options, validated) {
23019
+ const { environment, ownerId } = validated;
23020
+ const { load } = options;
23021
+ const key = readableKey(ownerId);
23022
+ return createSessionCache({
23023
+ namespace: readableKey(oomolNamespaces.connections, environment),
23024
+ schemaVersion: options.schemaVersion,
23025
+ maxAge: options.maxAge,
23026
+ sessionId: options.sessionId,
23027
+ key: () => key,
23028
+ decode: options.decode,
23029
+ load: (_query, validation) => load({ ownerId }, validation)
23030
+ });
23031
+ }
23032
+ function validateOomolOptions(options) {
23033
+ const environment = normalizeEnvironment(options.environment);
23034
+ if (typeof options.locale !== "string" || !options.locale.trim()) throw new TypeError("locale must be nonempty");
23035
+ if (typeof options.load !== "function") throw new TypeError("load must be a function");
23036
+ return environment;
23037
+ }
23038
+ function normalizeEnvironment(value) {
23039
+ const environment = value === void 0 ? "production" : value;
23040
+ if (typeof environment !== "string" || !environment.trim()) throw new TypeError("environment must be nonempty");
23041
+ return environment;
23042
+ }
23043
+ function normalizeOwnerId(value) {
23044
+ if (typeof value !== "string" || !value.trim()) throw new TypeError("ownerId must be nonempty");
23045
+ return value;
23046
+ }
23047
+ function validateConnectionsOptions(options) {
23048
+ const environment = normalizeEnvironment(options.environment);
23049
+ if (typeof options.sessionId !== "string" || !options.sessionId.trim()) throw new TypeError("sessionId must be nonempty");
23050
+ const ownerId = normalizeOwnerId(options.ownerId);
23051
+ if (typeof options.load !== "function") throw new TypeError("load must be a function");
23052
+ return {
23053
+ environment,
23054
+ ownerId
23055
+ };
23056
+ }
23057
+ /** Create an IndexedDB cache for the account-independent GET /v1/providers response, keyed by environment and locale. */
23058
+ function createProvidersCacheInternal(options) {
23059
+ return createOomolCache(oomolNamespaces.providers, options, { locale: options.locale });
23060
+ }
23061
+ /** Create an account-independent cache keyed by environment, locale and service. */
23062
+ function createServiceCache(resource, options) {
23063
+ const environment = validateOomolOptions(options);
23064
+ const { locale, load } = options;
23065
+ return createPersistentCache({
23066
+ namespace: readableKey(resource, environment),
23067
+ schemaVersion: options.schemaVersion,
23068
+ maxAge: options.maxAge,
23069
+ key: (service) => {
23070
+ if (typeof service !== "string" || !service.trim()) throw new TypeError("service must be nonempty");
23071
+ return readableKey(locale, service);
23072
+ },
23073
+ decode: options.decode,
23074
+ load: (service, validation) => load({
23075
+ locale,
23076
+ service
23077
+ }, validation)
23078
+ });
23079
+ }
23080
+ /** Create an IndexedDB cache for the account-independent GET /public/v1/apps response, keyed by environment and locale. */
23081
+ function createAppCatalogCacheInternal(options) {
23082
+ return createOomolCache(oomolNamespaces.appCatalog, options, { locale: options.locale });
23083
+ }
23084
+ function singletonKey(resource, options, query, sessionId) {
23085
+ const environment = normalizeEnvironment(options.environment);
23086
+ return sessionId === void 0 ? readableKey(resource, environment, options.schemaVersion, ...query) : readableKey(resource, environment, options.schemaVersion, sessionId, ...query);
23087
+ }
23088
+ function getSingleton(key, create) {
23089
+ const existing = singletonCaches.get(key);
23090
+ if (existing) return existing;
23091
+ const cache = create();
23092
+ let disposal;
23093
+ const singleton = {
23094
+ ...cache,
23095
+ dispose() {
23096
+ if (!disposal) disposal = cache.dispose().then(() => {
23097
+ singletonCaches.delete(key);
23098
+ }, (error) => {
23099
+ disposal = void 0;
23100
+ throw error;
23101
+ });
23102
+ return disposal;
23103
+ }
23104
+ };
23105
+ singletonCaches.set(key, singleton);
23106
+ return singleton;
23107
+ }
23108
+ /** Return the shared Providers cache for one environment, locale and schema version. */
23109
+ function getProvidersCache(options) {
23110
+ const query = { locale: options.locale };
23111
+ return getSingleton(singletonKey(oomolNamespaces.providers, options, [query.locale]), () => createProvidersCacheInternal(options));
23112
+ }
23113
+ /** Return the shared GET /v1/actions?service=… cache for one environment, locale and schema version. */
23114
+ function getActionsCache(options) {
23115
+ return getSingleton(singletonKey(oomolNamespaces.actions, options, [options.locale]), () => createServiceCache(oomolNamespaces.actions, options));
23116
+ }
23117
+ /** Return the shared App Catalog cache for one environment, locale and schema version. */
23118
+ function getAppCatalogCache(options) {
23119
+ const query = { locale: options.locale };
23120
+ return getSingleton(singletonKey(oomolNamespaces.appCatalog, options, [query.locale]), () => createAppCatalogCacheInternal(options));
23121
+ }
23122
+ /** Return the shared sessionStorage cache for one login session and owner scope. */
23123
+ function getConnectionsCache(options) {
23124
+ const validated = validateConnectionsOptions(options);
23125
+ const query = { ownerId: validated.ownerId };
23126
+ return getSingleton(singletonKey(oomolNamespaces.connections, options, [query.ownerId], options.sessionId), () => createConnectionsCacheInternal(options, validated));
23127
+ }
23128
+ //#endregion
22355
23129
  //#region src/connector/common/actionSchema.ts
22356
23130
  function connectorActionPorts(inputSchema, outputSchema) {
22357
23131
  const inputs = inputPorts(inputSchema);
@@ -22465,6 +23239,68 @@ function resolveLocalReference(root, reference) {
22465
23239
  return current;
22466
23240
  }
22467
23241
  //#endregion
23242
+ //#region src/workbench/browser/runtime/stores/proxyCatalog.ts
23243
+ /** Validate the fields we consume without discarding upstream representation fields. */
23244
+ function proxyResponse(value, validate) {
23245
+ const source = record$2(value);
23246
+ if (source.success === false) throw new ApiError(502, typeof source.errorCode == "string" ? source.errorCode : "connector.unavailable", typeof source.message == "string" ? source.message : "Connector request failed.");
23247
+ if (source.success !== true || !Array.isArray(source.data)) return invalidResponse();
23248
+ if (validate != null) for (const item of source.data) validate(record$2(item));
23249
+ return source;
23250
+ }
23251
+ function provider(value, metadata) {
23252
+ const source = record$2(value);
23253
+ if (!Array.isArray(source.authTypes) || source.authTypes.some((item) => typeof item != "string")) return invalidResponse();
23254
+ return {
23255
+ ...providerIconAppearance(metadata, source.iconSpritePosition),
23256
+ serviceId: string(source.service),
23257
+ serviceName: string(source.displayName),
23258
+ noSetup: source.authTypes.length == 1 && source.authTypes[0] == "no_auth",
23259
+ ...source.iconUrl == null || source.iconUrl === "" ? {} : { icon: string(source.iconUrl) },
23260
+ ...source.homepageUrl == null || source.homepageUrl === "" ? {} : { homepageUrl: string(source.homepageUrl) }
23261
+ };
23262
+ }
23263
+ function validateAction(source) {
23264
+ string(source.id);
23265
+ string(source.service);
23266
+ string(source.name);
23267
+ if (typeof source.description != "string") return invalidResponse();
23268
+ connectorActionPorts(source.inputSchema, source.outputSchema);
23269
+ }
23270
+ function port(item) {
23271
+ return {
23272
+ nullable: item.nullable,
23273
+ jsonSchema: jsonValue(item.json_schema),
23274
+ ...item.description == null ? {} : { description: item.description },
23275
+ ...item.value === void 0 ? {} : { value: jsonValue(item.value) }
23276
+ };
23277
+ }
23278
+ function action(source, providers) {
23279
+ const owner = providers.data.find((item) => item.service == source.service);
23280
+ if (owner == null) return invalidResponse();
23281
+ const display = provider(owner, providers.meta?.iconSprite);
23282
+ const ports = connectorActionPorts(source.inputSchema, source.outputSchema);
23283
+ return {
23284
+ ...display.iconSprite == null ? {} : {
23285
+ iconSprite: display.iconSprite,
23286
+ iconSpritePosition: display.iconSpritePosition
23287
+ },
23288
+ serviceId: display.serviceId,
23289
+ serviceName: display.serviceName,
23290
+ ...display.icon == null ? {} : { icon: display.icon },
23291
+ ...display.homepageUrl == null ? {} : { homepageUrl: display.homepageUrl },
23292
+ actionId: string(source.id),
23293
+ ...source.operationType == null ? {} : { operationType: string(source.operationType) },
23294
+ name: string(source.name),
23295
+ description: source.description,
23296
+ authenticated: !owner.authTypes.includes("no_auth"),
23297
+ inputSchema: jsonValue(source.inputSchema),
23298
+ outputSchema: jsonValue(source.outputSchema),
23299
+ inputs: Object.fromEntries(ports.inputs.map((item) => [item.handle, port(item)])),
23300
+ outputs: Object.fromEntries(ports.outputs.map((item) => [item.handle, port(item)]))
23301
+ };
23302
+ }
23303
+ //#endregion
22468
23304
  //#region src/workbench/browser/runtime/stores/resource.ts
22469
23305
  var dataSources = /* @__PURE__ */ new WeakMap();
22470
23306
  /** Keep data-only consumers independent from refresh and error notifications. */
@@ -22725,21 +23561,15 @@ function builtinOptions(_draft, t) {
22725
23561
  }]
22726
23562
  },
22727
23563
  {
22728
- description: t("addNode.conditionDescription"),
23564
+ description: t("addNode.valueDescription"),
22729
23565
  group,
22730
- id: "condition",
22731
- icon: ":carbon:child-node:",
22732
- inputs: [{
22733
- handle: "value",
22734
- jsonSchema: {}
22735
- }],
22736
- kind: "condition",
22737
- label: t("addNode.condition"),
23566
+ id: "value",
23567
+ icon: ":oomol:value:",
23568
+ inputs: [],
23569
+ kind: "value",
23570
+ label: t("addNode.value"),
22738
23571
  outputs: [{
22739
- handle: "false",
22740
- jsonSchema: {}
22741
- }, {
22742
- handle: "true",
23572
+ handle: "value",
22743
23573
  jsonSchema: {}
22744
23574
  }]
22745
23575
  },
@@ -22779,16 +23609,6 @@ function builtinOptions(_draft, t) {
22779
23609
  kind: "http-request",
22780
23610
  label: t("httpRequest.title")
22781
23611
  },
22782
- {
22783
- description: t("flowState.warning"),
22784
- group,
22785
- icon: ":lucide-light:list-filter:",
22786
- id: "dedupe",
22787
- inputs: dedupeTask().inputs.filter((port) => "handle" in port),
22788
- outputs: dedupeTask().outputs.filter((port) => "handle" in port),
22789
- kind: "dedupe",
22790
- label: t("flowState.nodeTitle")
22791
- },
22792
23612
  {
22793
23613
  description: t("openapi.description"),
22794
23614
  group,
@@ -22800,18 +23620,34 @@ function builtinOptions(_draft, t) {
22800
23620
  label: "OpenAPI"
22801
23621
  },
22802
23622
  {
22803
- description: t("addNode.valueDescription"),
23623
+ description: t("addNode.conditionDescription"),
22804
23624
  group,
22805
- id: "value",
22806
- icon: ":oomol:value:",
22807
- inputs: [],
22808
- kind: "value",
22809
- label: t("addNode.value"),
22810
- outputs: [{
23625
+ id: "condition",
23626
+ icon: ":carbon:child-node:",
23627
+ inputs: [{
22811
23628
  handle: "value",
22812
23629
  jsonSchema: {}
23630
+ }],
23631
+ kind: "condition",
23632
+ label: t("addNode.condition"),
23633
+ outputs: [{
23634
+ handle: "false",
23635
+ jsonSchema: {}
23636
+ }, {
23637
+ handle: "true",
23638
+ jsonSchema: {}
22813
23639
  }]
22814
23640
  },
23641
+ {
23642
+ description: t("flowState.warning"),
23643
+ group,
23644
+ icon: ":lucide-light:list-filter:",
23645
+ id: "skip-duplicates",
23646
+ inputs: skipDuplicatesTask().inputs.filter((port) => "handle" in port),
23647
+ outputs: skipDuplicatesTask().outputs.filter((port) => "handle" in port),
23648
+ kind: "skip-duplicates",
23649
+ label: t("flowState.nodeTitle")
23650
+ },
22815
23651
  {
22816
23652
  description: t("workflow.description"),
22817
23653
  group,
@@ -22983,8 +23819,8 @@ function addNodeIntent(option, revision, t) {
22983
23819
  kind: "decision",
22984
23820
  name: t("addNode.decision")
22985
23821
  };
22986
- case "dedupe": return {
22987
- kind: "dedupe",
23822
+ case "skip-duplicates": return {
23823
+ kind: "skip-duplicates",
22988
23824
  name: t("flowState.nodeTitle")
22989
23825
  };
22990
23826
  case "http-request": return {
@@ -23829,8 +24665,8 @@ function addNode(revision, nodeId, intent) {
23829
24665
  case "decision":
23830
24666
  changes = createDecisionTask({ nodeId }, intent.name);
23831
24667
  break;
23832
- case "dedupe":
23833
- changes = createManagedTask({ nodeId }, dedupeTask(void 0, intent.name));
24668
+ case "skip-duplicates":
24669
+ changes = createManagedTask({ nodeId }, skipDuplicatesTask(void 0, intent.name));
23834
24670
  break;
23835
24671
  case "http-request":
23836
24672
  changes = createManagedTask({ nodeId }, httpRequestTask(void 0, intent.name));
@@ -24100,7 +24936,7 @@ function updateTask(revision, nodeId, settings) {
24100
24936
  }];
24101
24937
  }
24102
24938
  case "decision":
24103
- case "dedupe":
24939
+ case "skip-duplicates":
24104
24940
  case "http-request":
24105
24941
  case "openapi":
24106
24942
  case "agent":
@@ -24412,4 +25248,4 @@ function updateHttpParameters(revision, nodeId, group, edit, bindingId) {
24412
25248
  return cleanVariableBindings(content, [...operations, ...binding]);
24413
25249
  }
24414
25250
  //#endregion
24415
- export { connectorActionPorts as $, openApiFieldIssues as $n, GroupCollectionProvider as $t, schemaForEditor as A, decodeResultList as An, setConnectorConnection as At, datePickerValue as B, triggerOutputDefinitions as Bn, FlowTagChips as Bt, updateValue as C, FeishuEventPicker as Cn, setComment as Ct, defaultValueEditorSchema as D, normalizeFlowQuery as Dn, repairNodeNames as Dt, supportsFeishuChatFilter as E, WorkbenchClient as En, setNodePositions as Et, calendarChange as F, webhookResponseDiagnostics as Fn, dequal as Ft, indexAddNodeOptions as G, parseWorkflowFile as Gn, ValueEditorFeedback as Gt, isDateFormat as H, connection as Hn, selectionMenuContentClass as Ht, calendarDate as I, sourceOutputLabel as In, WorkflowExportMenuItem as It, scopedValue as J, triggerConfigValue as Jn, ComboboxItem as Jt, combineSources as K, workflowFileName as Kn, valueEditor_module_default as Kt, dateFromTimeZone as L, sourcePort as Ln, IdTooltip as Lt, getDefaultValue as M, executionReachableNodes as Mn, setServiceConnections as Mt, isUnconstrainedSchema as N, inputSourceCandidates as Nn, updateStartInputDefs as Nt, editorComponent as O, randomId as On, resetInputValues as Ot, typeOfSchema as P, resolutionOutputPorts as Pn, updateTriggerSchedule as Pt, resourceValue as Q, object as Qn, ComboboxList as Qt, dateInTimeZone as R, normalizeTriggerOutputs as Rn, FlowSettingsButton as Rt, updateTriggerConfig as S, createI18n as Sn, restoreCanvasPresentation as St, feishuResourceKind as T, errorNotice as Tn, setNodeContentHidden as Tt, addNodeIntent as U, connectorActionMetadata as Un, selectionMenuItemClass as Ut, dateTimeWall as V, isJsonObject as Vn, TagPicker as Vt, deriveAddNodeOptions as W, encodeWorkflowFile as Wn, ValueControl as Wt, observeResource as X, inputValue as Xn, ComboboxPositioner as Xt, CacheResource as Y, triggerConfigValues as Yn, ComboboxPopup as Yt, resourceData as Z, listOperations as Zn, ComboboxPortal as Zt, updateOutputPorts as _, EmptyTitle as _n, eventSourceKind as _r, connectionCatalog as _t, nameCreatedNodes as a, useComboboxInputValueContext as an, sameWorkflowInterface as ar, RunStore as at, updateTaskAdditionalInputs as b, SourceForm as bn, flowPresentation as bt, setInputVariable as c, followWorkbenchLink as cn, workflowCandidateGroup as cr, revisionView as ct, updateCondition as d, InputGroupInput as dn, invalidResponse as dr, deriveInspectorDiagnostics as dt, ComboboxTrigger as en, openApiTask as er, designerGraph as et, updateHttpParameters as f, Empty as fn, jsonValue as fr, diagnosticItems as ft, updateNodeSettings as g, EmptyMedia as gn, controlErrorCode as gr, actionWithConnections as gt, updateNodeName as h, EmptyHeader as hn, ApiError as hr, schemaMismatchMessage as ht, deleteSelection as i, selectors as in, servers as ir, providerIcon as it, valueForEditor as j, decodeTriggerCatalog as jn, setInputSources as jt, editorGroups as k, allConnectorConnectionsQuery as kn, setCodeActions as kt, setTriggerConnection as l, InputGroup as ln, workflowCapability as lr, flowResourceReferences as lt, updateNodeIcon as m, EmptyDescription as mn, string as mr, diagnosticNodeId as mt, agentTool as n, ComboboxInput as nn, selectOperation as nr, triggerNodeIcon as nt, selectWebhookResponse as o, useComboboxRootContext as on, workflowAgentTool as or, canCancelRun as ot, updateNodeDescription as p, EmptyContent as pn, record$1 as pr, diagnosticMessage as pt, mapSource as q, workflowNameFromFile as qn, ComboboxItemIndicator as qt, applyFlowChanges as r, ComboboxRoot as rn, serverAddress as rr, actionSummary as rt, setInputValue as s, useFlowQuery as sn, workflowCandidate as sr, hasRunFilter as st, addNode as t, ComboboxInputGroup as tn, securityOptions as tr, semanticNodeIcon as tt, setTriggerEventSource as u, InputGroupAddon as un, workflowSelectionTask as ur, Latest as ut, updateResolution as v, Badge as vn, canvasPresentationChange as vt, updateWebhook as w, EventSourceSetup as wn, setFlowViewport as wt, updateTaskPorts as x, SourceSelect as xn, removeComments as xt, updateTask as y, EventSourcesPage as yn, commentIds as yt, datePickerChange as z, sampleErrorOutputs as zn, FlowSettingsDialog as zt };
25251
+ export { action as $, triggerOutputDefinitions as $n, FlowTagChips as $t, schemaForEditor as A, EmptyTitle as An, commentIds as At, datePickerValue as B, normalizeFlowQuery as Bn, repairNodeNames as Bt, updateValue as C, InputGroupAddon as Cn, workflowSelectionTask as Cr, diagnosticItems as Ct, defaultValueEditorSchema as D, EmptyDescription as Dn, controlErrorCode as Dr, actionWithConnections as Dt, supportsFeishuChatFilter as E, EmptyContent as En, ApiError as Er, schemaMismatchMessage as Et, calendarChange as F, createI18n as Fn, setComment as Ft, indexAddNodeOptions as G, executionReachableNodes as Gn, setServiceConnections as Gt, isDateFormat as H, allConnectorConnectionsQuery as Hn, setCodeActions as Ht, calendarDate as I, FeishuEventPicker as In, setFlowViewport as It, scopedValue as J, webhookResponseDiagnostics as Jn, dequal as Jt, combineSources as K, inputSourceCandidates as Kn, updateStartInputDefs as Kt, dateFromTimeZone as L, EventSourceSetup as Ln, setNodeContentHidden as Lt, getDefaultValue as M, EventSourcesPage as Mn, removeComments as Mt, isUnconstrainedSchema as N, SourceForm as Nn, restoreCanvasPresentation as Nt, editorComponent as O, EmptyHeader as On, eventSourceKind as Or, connectionCatalog as Ot, typeOfSchema as P, SourceSelect as Pn, setCanvasLayout as Pt, resourceValue as Q, sampleErrorOutputs as Qn, FlowSettingsDialog as Qt, dateInTimeZone as R, errorNotice as Rn, setNodePositions as Rt, updateTriggerConfig as S, InputGroup as Sn, workflowCapability as Sr, deriveInspectorDiagnostics as St, feishuResourceKind as T, Empty as Tn, record$2 as Tr, diagnosticNodeId as Tt, addNodeIntent as U, decodeResultList as Un, setConnectorConnection as Ut, dateTimeWall as V, randomId as Vn, resetInputValues as Vt, deriveAddNodeOptions as W, decodeTriggerCatalog as Wn, setInputSources as Wt, observeResource as X, sourcePort as Xn, IdTooltip as Xt, CacheResource as Y, sourceOutputLabel as Yn, WorkflowExportMenuItem as Yt, resourceData as Z, normalizeTriggerOutputs as Zn, FlowSettingsButton as Zt, updateOutputPorts as _, selectors as _n, servers as _r, canCancelRun as _t, nameCreatedNodes as a, valueEditor_module_default as an, workflowFileName as ar, getAppCatalogCache as at, updateTaskAdditionalInputs as b, useFlowQuery as bn, workflowCandidate as br, flowResourceReferences as bt, setInputVariable as c, ComboboxPopup as cn, triggerConfigValues as cr, createPersistentCache as ct, updateCondition as d, ComboboxList as dn, object$1 as dr, designerGraph as dt, TagPicker as en, isJsonObject as er, provider as et, updateHttpParameters as f, GroupCollectionProvider as fn, openApiFieldIssues as fr, semanticNodeIcon as ft, updateNodeSettings as g, ComboboxRoot as gn, serverAddress as gr, RunStore as gt, updateNodeName as h, ComboboxInput as hn, selectOperation as hr, providerIcon as ht, deleteSelection as i, ValueEditorFeedback as in, parseWorkflowFile as ir, getActionsCache as it, valueForEditor as j, Badge as jn, flowPresentation as jt, editorGroups as k, EmptyMedia as kn, canvasPresentationChange as kt, setTriggerConnection as l, ComboboxPositioner as ln, inputValue as lr, createSessionCache as lt, updateNodeIcon as m, ComboboxInputGroup as mn, securityOptions as mr, actionSummary as mt, agentTool as n, selectionMenuItemClass as nn, connectorActionMetadata as nr, validateAction as nt, selectWebhookResponse as o, ComboboxItemIndicator as on, workflowNameFromFile as or, getConnectionsCache as ot, updateNodeDescription as p, ComboboxTrigger as pn, openApiTask as pr, triggerNodeIcon as pt, mapSource as q, resolutionOutputPorts as qn, updateTriggerSchedule as qt, applyFlowChanges as r, ValueControl as rn, encodeWorkflowFile as rr, decodeAppCatalogResponse as rt, setInputValue as s, ComboboxItem as sn, triggerConfigValue as sr, getProvidersCache as st, addNode as t, selectionMenuContentClass as tn, connection as tr, proxyResponse as tt, setTriggerEventSource as u, ComboboxPortal as un, listOperations as ur, loadJson as ut, updateResolution as v, useComboboxInputValueContext as vn, sameWorkflowInterface as vr, hasRunFilter as vt, updateWebhook as w, InputGroupInput as wn, invalidResponse as wr, diagnosticMessage as wt, updateTaskPorts as x, followWorkbenchLink as xn, workflowCandidateGroup as xr, Latest as xt, updateTask as y, useComboboxRootContext as yn, workflowAgentTool as yr, revisionView as yt, datePickerChange as z, WorkbenchClient as zn, setVerticalNodeWidth as zt };