@burdenoff/fluidgrids-fe-sdk 2026.1029.6 → 2026.1029.7

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 (43) hide show
  1. package/dist/ExecutionDetailPage-L7LZYFOT.js +22 -0
  2. package/dist/{WorkflowsList-VA2HRYFG.js → ExecutionsListPage-7NMW6S5A.js} +9 -9
  3. package/dist/{WorkflowBuilder-PORH3H6P.js → WorkflowBuilder-RXVUBDZJ.js} +12 -12
  4. package/dist/{ExecutionsListPage-SCPWUXUL.js → WorkflowsList-5U74DYQ3.js} +9 -8
  5. package/dist/{chunk-QZM6EDGK.js → chunk-4MHWFZJV.js} +1 -1
  6. package/dist/{chunk-CY6KX4RG.js → chunk-6AMNEX2Y.js} +6 -1
  7. package/dist/{chunk-AVMI3XLM.js → chunk-6SZXW2BF.js} +255 -8
  8. package/dist/{chunk-U6KI4AKI.js → chunk-6TMLIQHB.js} +199 -1
  9. package/dist/{chunk-4XAPSIHY.js → chunk-7CTIVBBA.js} +183 -26
  10. package/dist/{chunk-57RS7DXZ.js → chunk-AXMEATLG.js} +117 -8
  11. package/dist/{chunk-LPGQTSI2.js → chunk-BZTVAUOQ.js} +3 -3
  12. package/dist/{chunk-7SSZUX6E.js → chunk-DEGCZCHP.js} +2 -2
  13. package/dist/{chunk-7LFAWWVF.js → chunk-E7UAY3JJ.js} +2 -2
  14. package/dist/{chunk-Z6EWB5ZG.js → chunk-EGIEFGOV.js} +677 -43
  15. package/dist/{chunk-MNY2UNQH.js → chunk-FFOZ5VUJ.js} +1 -1
  16. package/dist/{chunk-63ZMEHZ4.js → chunk-HAFUSBYP.js} +937 -26
  17. package/dist/{chunk-WTGBHE3J.js → chunk-IDGDMJMJ.js} +118 -96
  18. package/dist/{chunk-4TGUNOQQ.js → chunk-K4BF7PAW.js} +104 -88
  19. package/dist/{chunk-6XZCYLAQ.js → chunk-KANARCPR.js} +3 -3
  20. package/dist/{chunk-5GD6OXYW.js → chunk-LAVHDFHI.js} +1 -1
  21. package/dist/{chunk-H364USFF.js → chunk-NL4JQFFA.js} +1 -1
  22. package/dist/{chunk-LTVAUZ3M.js → chunk-OJPJ2QXD.js} +3 -3
  23. package/dist/{chunk-7B2GRTUL.js → chunk-RZR3BDDZ.js} +7 -7
  24. package/dist/{chunk-MQI7NH4Z.js → chunk-SZTKLZZR.js} +145 -8
  25. package/dist/{chunk-LB62TAF7.js → chunk-TYYSYSAL.js} +1 -1
  26. package/dist/{chunk-YSUSSIWU.js → chunk-US4LPOB3.js} +1 -1
  27. package/dist/{chunk-BWAUFSHC.js → chunk-VIZ7W5WJ.js} +5 -5
  28. package/dist/{chunk-7PP6CRXS.js → chunk-YTUIGIVP.js} +15 -1
  29. package/dist/{chunk-YHTRCQ5M.js → chunk-Z4YQTXCD.js} +4 -4
  30. package/dist/{chunk-MDPBO52Q.js → chunk-ZE5KS2YL.js} +2 -2
  31. package/dist/{config-T7BQ7AO2.js → config-VM7FTHMZ.js} +1 -1
  32. package/dist/executions.js +13 -13
  33. package/dist/history.js +5 -5
  34. package/dist/index.d.ts +2513 -24
  35. package/dist/index.js +36 -36
  36. package/dist/nodes.js +2 -2
  37. package/dist/observability.js +7 -7
  38. package/dist/settings.js +7 -7
  39. package/dist/templates.js +11 -11
  40. package/dist/workflow-builder.js +13 -13
  41. package/dist/workflows-list.js +9 -9
  42. package/package.json +1 -1
  43. package/dist/ExecutionDetailPage-M6JAWY4Q.js +0 -21
@@ -1,8 +1,8 @@
1
- import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-5GD6OXYW.js';
1
+ import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-LAVHDFHI.js';
2
2
  import { notifyFluidGridsAiCreditsUpdated } from './chunk-Y53CVZVV.js';
3
- import { throwIfResultError, describeOperationError, signalPayloadCard, components_default, payloadFromCardValues, parseRawSignalPayload } from './chunk-4TGUNOQQ.js';
4
- import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
5
- import { TerminateWorkflowRunDocument, WorkflowRunHistoryDocument, RunEventAppendedDocument, WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument, DurableRunFieldsDocument, WorkflowRunDeterminismStatusDocument, WorkflowRunStackTraceDocument, SignalWorkflowRunDocument } from './chunk-7PP6CRXS.js';
3
+ import { throwIfResultError, describeOperationError, signalPayloadCard, components_default, payloadFromCardValues, parseRawSignalPayload } from './chunk-K4BF7PAW.js';
4
+ import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
5
+ import { TerminateWorkflowRunDocument, WorkflowRunHistoryDocument, RunEventAppendedDocument, WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument, DurableRunFieldsDocument, WorkflowRunDeterminismStatusDocument, WorkflowRunStackTraceDocument, SignalWorkflowRunDocument } from './chunk-YTUIGIVP.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';
7
7
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
8
8
  import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
@@ -186,7 +186,8 @@ function failureOf(value) {
186
186
  if (!message) return void 0;
187
187
  return {
188
188
  message,
189
- errorType: str(value.errorType) ?? str(value.type)
189
+ errorType: str(value.errorType) ?? str(value.type),
190
+ ...value.category === "BENIGN" ? { benign: true } : {}
190
191
  };
191
192
  }
192
193
  function groupKeyOf(event) {
@@ -456,6 +457,7 @@ var STATUS_CLASS = {
456
457
  cancelled: "bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] border-[var(--color-status-warning-border)]",
457
458
  continued: "bg-[var(--color-status-info-bg-subtle)] text-[var(--color-status-info-text)] border-[var(--color-status-info-border)]"
458
459
  };
460
+ var BENIGN_CLASS = "bg-background-tertiary text-text-secondary border-border-secondary";
459
461
  var STATUS_LABEL = {
460
462
  scheduled: ["fluidgrids.executions.history.status.scheduled", "Scheduled"],
461
463
  running: ["fluidgrids.executions.history.status.running", "Running"],
@@ -502,6 +504,7 @@ function RunHistoryView({
502
504
  onViewChildRun,
503
505
  defaultShowTasks = false,
504
506
  compact = false,
507
+ showBenign = false,
505
508
  "data-testid": testId = "run-history"
506
509
  }) {
507
510
  const tr = useTr();
@@ -584,6 +587,7 @@ function RunHistoryView({
584
587
  onToggle: () => toggle(group.key),
585
588
  onViewChildRun,
586
589
  compact,
590
+ benign: showBenign && group.failure?.benign === true,
587
591
  statusLabel: tr(...STATUS_LABEL[group.status])
588
592
  },
589
593
  group.key
@@ -596,104 +600,122 @@ function HistoryRow({
596
600
  onToggle,
597
601
  onViewChildRun,
598
602
  compact,
603
+ benign,
599
604
  statusLabel
600
605
  }) {
601
606
  const tr = useTr();
602
- return /* @__PURE__ */ jsxs("li", { "data-testid": `history-group-${group.key}`, "data-status": group.status, children: [
603
- /* @__PURE__ */ jsxs(
604
- "button",
605
- {
606
- type: "button",
607
- onClick: onToggle,
608
- "aria-expanded": expanded,
609
- className: cn(
610
- "flex w-full items-center gap-3 text-left hover:bg-background-tertiary",
611
- compact ? "px-2 py-1.5" : "px-3 py-2"
607
+ return /* @__PURE__ */ jsxs(
608
+ "li",
609
+ {
610
+ "data-testid": `history-group-${group.key}`,
611
+ "data-status": group.status,
612
+ "data-benign": benign ? "true" : void 0,
613
+ children: [
614
+ /* @__PURE__ */ jsxs(
615
+ "button",
616
+ {
617
+ type: "button",
618
+ onClick: onToggle,
619
+ "aria-expanded": expanded,
620
+ className: cn(
621
+ "flex w-full items-center gap-3 text-left hover:bg-background-tertiary",
622
+ compact ? "px-2 py-1.5" : "px-3 py-2"
623
+ ),
624
+ children: [
625
+ /* @__PURE__ */ jsx(
626
+ Icon,
627
+ {
628
+ icon: expanded ? "mdi:chevron-down" : "mdi:chevron-right",
629
+ width: 16,
630
+ className: "shrink-0 text-text-secondary"
631
+ }
632
+ ),
633
+ /* @__PURE__ */ jsx(
634
+ Icon,
635
+ {
636
+ icon: KIND_ICONS[group.kind],
637
+ width: 16,
638
+ className: "shrink-0 text-text-secondary"
639
+ }
640
+ ),
641
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
642
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium text-text-primary", children: group.label }),
643
+ group.detail && /* @__PURE__ */ jsx("span", { className: "block truncate font-mono text-xs text-text-secondary", children: group.detail })
644
+ ] }),
645
+ group.attempt !== void 0 && group.attempt > 1 && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs text-text-secondary", children: tr(
646
+ "fluidgrids.executions.history.attempt",
647
+ "attempt {{attempt}}",
648
+ {
649
+ attempt: group.attempt
650
+ }
651
+ ) }),
652
+ /* @__PURE__ */ jsx(
653
+ "span",
654
+ {
655
+ className: cn(
656
+ "shrink-0 rounded border px-1.5 py-0.5 text-xs",
657
+ benign ? BENIGN_CLASS : STATUS_CLASS[group.status]
658
+ ),
659
+ children: benign ? tr("fluidgrids.executions.history.status.benign", "Expected") : statusLabel
660
+ }
661
+ ),
662
+ !compact && /* @__PURE__ */ jsx("span", { className: "w-20 shrink-0 text-right font-mono text-xs text-text-secondary", children: formatTime(group.startedAt) })
663
+ ]
664
+ }
612
665
  ),
613
- children: [
614
- /* @__PURE__ */ jsx(
615
- Icon,
616
- {
617
- icon: expanded ? "mdi:chevron-down" : "mdi:chevron-right",
618
- width: 16,
619
- className: "shrink-0 text-text-secondary"
620
- }
621
- ),
622
- /* @__PURE__ */ jsx(
623
- Icon,
624
- {
625
- icon: KIND_ICONS[group.kind],
626
- width: 16,
627
- className: "shrink-0 text-text-secondary"
628
- }
629
- ),
630
- /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
631
- /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium text-text-primary", children: group.label }),
632
- group.detail && /* @__PURE__ */ jsx("span", { className: "block truncate font-mono text-xs text-text-secondary", children: group.detail })
633
- ] }),
634
- group.attempt !== void 0 && group.attempt > 1 && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs text-text-secondary", children: tr(
635
- "fluidgrids.executions.history.attempt",
636
- "attempt {{attempt}}",
637
- {
638
- attempt: group.attempt
639
- }
640
- ) }),
641
- /* @__PURE__ */ jsx(
642
- "span",
666
+ group.failure && /* @__PURE__ */ jsxs(
667
+ "p",
668
+ {
669
+ className: cn(
670
+ "px-10 pb-2 text-xs",
671
+ benign ? "text-text-secondary" : "text-[var(--color-status-error-text)]"
672
+ ),
673
+ children: [
674
+ group.failure.errorType ? `${group.failure.errorType}: ` : "",
675
+ group.failure.message
676
+ ]
677
+ }
678
+ ),
679
+ expanded && /* @__PURE__ */ jsxs("div", { className: "space-y-2 bg-background-primary px-10 py-2", children: [
680
+ group.childRunId && onViewChildRun && /* @__PURE__ */ jsxs(
681
+ Button,
643
682
  {
644
- className: cn(
645
- "shrink-0 rounded border px-1.5 py-0.5 text-xs",
646
- STATUS_CLASS[group.status]
647
- ),
648
- children: statusLabel
683
+ variant: "outline",
684
+ size: "sm",
685
+ onClick: () => onViewChildRun(group.childRunId),
686
+ children: [
687
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:open-in-new", className: "mr-1", width: 14 }),
688
+ tr("fluidgrids.executions.history.openChild", "Open child run")
689
+ ]
649
690
  }
650
691
  ),
651
- !compact && /* @__PURE__ */ jsx("span", { className: "w-20 shrink-0 text-right font-mono text-xs text-text-secondary", children: formatTime(group.startedAt) })
652
- ]
653
- }
654
- ),
655
- group.failure && /* @__PURE__ */ jsxs("p", { className: "px-10 pb-2 text-xs text-[var(--color-status-error-text)]", children: [
656
- group.failure.errorType ? `${group.failure.errorType}: ` : "",
657
- group.failure.message
658
- ] }),
659
- expanded && /* @__PURE__ */ jsxs("div", { className: "space-y-2 bg-background-primary px-10 py-2", children: [
660
- group.childRunId && onViewChildRun && /* @__PURE__ */ jsxs(
661
- Button,
662
- {
663
- variant: "outline",
664
- size: "sm",
665
- onClick: () => onViewChildRun(group.childRunId),
666
- children: [
667
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:open-in-new", className: "mr-1", width: 14 }),
668
- tr("fluidgrids.executions.history.openChild", "Open child run")
669
- ]
670
- }
671
- ),
672
- group.events.map((event) => /* @__PURE__ */ jsxs("div", { className: "text-xs", children: [
673
- /* @__PURE__ */ jsxs("div", { className: "flex gap-3 font-mono text-text-secondary", children: [
674
- /* @__PURE__ */ jsxs("span", { children: [
675
- "#",
676
- event.seq
677
- ] }),
678
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: event.type }),
679
- /* @__PURE__ */ jsx("span", { className: "ml-auto", children: formatTime(event.createdAt) })
680
- ] }),
681
- isHttpsUrl(event.payloadUrl) ? /* @__PURE__ */ jsx(
682
- "a",
683
- {
684
- href: event.payloadUrl ?? void 0,
685
- target: "_blank",
686
- rel: "noreferrer noopener",
687
- className: "text-action-primary-text hover:underline",
688
- children: tr(
689
- "fluidgrids.executions.history.offloadedPayload",
690
- "Download payload"
691
- )
692
- }
693
- ) : event.payload && Object.keys(event.payload).length > 0 ? /* @__PURE__ */ jsx("pre", { className: "mt-1 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-background-secondary p-2 font-mono text-text-primary", children: JSON.stringify(event.payload, null, 2) }) : null
694
- ] }, event.seq))
695
- ] })
696
- ] });
692
+ group.events.map((event) => /* @__PURE__ */ jsxs("div", { className: "text-xs", children: [
693
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-3 font-mono text-text-secondary", children: [
694
+ /* @__PURE__ */ jsxs("span", { children: [
695
+ "#",
696
+ event.seq
697
+ ] }),
698
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: event.type }),
699
+ /* @__PURE__ */ jsx("span", { className: "ml-auto", children: formatTime(event.createdAt) })
700
+ ] }),
701
+ isHttpsUrl(event.payloadUrl) ? /* @__PURE__ */ jsx(
702
+ "a",
703
+ {
704
+ href: event.payloadUrl ?? void 0,
705
+ target: "_blank",
706
+ rel: "noreferrer noopener",
707
+ className: "text-action-primary-text hover:underline",
708
+ children: tr(
709
+ "fluidgrids.executions.history.offloadedPayload",
710
+ "Download payload"
711
+ )
712
+ }
713
+ ) : event.payload && Object.keys(event.payload).length > 0 ? /* @__PURE__ */ jsx("pre", { className: "mt-1 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-background-secondary p-2 font-mono text-text-primary", children: JSON.stringify(event.payload, null, 2) }) : null
714
+ ] }, event.seq))
715
+ ] })
716
+ ]
717
+ }
718
+ );
697
719
  }
698
720
  async function fetchDurableRunFields(runId) {
699
721
  const result = await getFluidGridsClient().query({
@@ -1,19 +1,19 @@
1
1
  import { cn as cn$1 } from './chunk-JL7CASN5.js';
2
2
  import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-PXIFUMLA.js';
3
- import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, setFluidGridsConfig, resetFluidGridsConfig } from './chunk-CY6KX4RG.js';
3
+ import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, setFluidGridsConfig, resetFluidGridsConfig } from './chunk-6AMNEX2Y.js';
4
4
  import { GetMyNodeInstallationsDocument } from './chunk-JUUYPCFY.js';
5
- import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-7PP6CRXS.js';
5
+ import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-YTUIGIVP.js';
6
6
  import { useTr, ENGLISH_FALLBACK_TRANSLATOR, FluidGridsTranslationProvider } from './chunk-UULVIT25.js';
7
7
  import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-NTWG3CJX.js';
8
+ import * as React2 from 'react';
9
+ import { forwardRef, useState, useImperativeHandle, useRef, useEffect, useMemo, createContext, memo, useCallback, useSyncExternalStore, useContext, cloneElement } from 'react';
10
+ import { useOptionalFeatureFlags } from '@burdenoff/fe-libs/shared/feature-flags';
8
11
  import { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';
9
12
  import { dispatchUpgradePrompt } from '@burdenoff/fe-libs/shared/components';
10
13
  import { nanoid } from 'nanoid/non-secure';
11
14
  import { addEdge, applyEdgeChanges, applyNodeChanges, useReactFlow, NodeResizer, getConnectedEdges, useStore, Handle, Position, useUpdateNodeInternals, useNodeId } from '@xyflow/react';
12
15
  import { create } from 'zustand';
13
16
  import { produce } from 'immer';
14
- import * as React2 from 'react';
15
- import { forwardRef, useState, useImperativeHandle, useRef, useEffect, useMemo, createContext, memo, useCallback, useSyncExternalStore, useContext, cloneElement } from 'react';
16
- import { useOptionalFeatureFlags } from '@burdenoff/fe-libs/shared/feature-flags';
17
17
  import { Textarea, Input, Button, Card, Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuItem, DropdownMenuSeparator } from '@burdenoff/fe-libs/ui';
18
18
  import { cn } from '@burdenoff/fe-libs/utils';
19
19
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -34,6 +34,104 @@ import { useParams, useNavigate } from 'react-router';
34
34
  import { useShallow } from 'zustand/shallow';
35
35
  import { InfoCircledIcon } from '@radix-ui/react-icons';
36
36
 
37
+ // src/feature-flags/durable-nodes.ts
38
+ var DURABLE_FUNCTION_NODE_TYPES = /* @__PURE__ */ new Set([
39
+ "internal:code-workflow",
40
+ "internal:wait-for-signal"
41
+ ]);
42
+ function isDurableFunctionNodeType(nodeType) {
43
+ return !!nodeType && DURABLE_FUNCTION_NODE_TYPES.has(nodeType);
44
+ }
45
+ function isNodeTypeHiddenFromPalette(nodeType, durableFunctionsEnabled = false) {
46
+ return !durableFunctionsEnabled && isDurableFunctionNodeType(nodeType);
47
+ }
48
+ function filterPaletteNodes(nodes, durableFunctionsEnabled = false) {
49
+ if (durableFunctionsEnabled) return nodes;
50
+ if (!nodes.some((node) => isDurableFunctionNodeType(node.type))) return nodes;
51
+ return nodes.filter((node) => !isDurableFunctionNodeType(node.type));
52
+ }
53
+ var FLUIDGRIDS_FLAGS = {
54
+ /**
55
+ * Operational kill switch for log stream destinations (webhook, syslog,
56
+ * Sentry). Defaults on; an admin turning it off hides the Log streaming
57
+ * settings and the backend rejects destination writes with FEATURE_DISABLED.
58
+ */
59
+ logStreams: "fluidgrids.log-streams",
60
+ /**
61
+ * Code-first workflows (BOFF-9902): the builder's Code view, Export as
62
+ * TypeScript / Python and TypeScript import. A rollout gate, not a kill
63
+ * switch, so it defaults OFF: the controls stay hidden until tenant-svc
64
+ * evaluates the flag on for the workspace, including when the shell mounts
65
+ * no FeatureFlagProvider or the evaluation is still loading.
66
+ */
67
+ codeFirst: "fluidgrids.code-first",
68
+ /**
69
+ * Durable functions (BOFF-9905): the Code Workflow and Wait for Signal
70
+ * nodes, run history, signals and the source editor. A rollout gate like
71
+ * `codeFirst`, so it defaults OFF and fails closed. The durable nodes are
72
+ * shown in the palette only while both this flag and `codeFirst` are on.
73
+ */
74
+ durableFunctions: "fluidgrids.durable-functions",
75
+ /**
76
+ * Durable-function parity (BOFF-9905, spec code-first 11): workflow ids and
77
+ * run chains, run metadata, what a run is waiting on, run counts,
78
+ * completion callbacks, versioning (rollouts, drainage, per-run overrides)
79
+ * and the history caps. A rollout gate like `durableFunctions`, so it
80
+ * defaults OFF and fails closed; the parity surfaces show only while this
81
+ * flag, `durableFunctions` and `codeFirst` are all on.
82
+ */
83
+ durableParity: "fluidgrids.durable-parity"
84
+ };
85
+ var FLUIDGRIDS_FLAG_DEFAULTS = {
86
+ [FLUIDGRIDS_FLAGS.logStreams]: true,
87
+ [FLUIDGRIDS_FLAGS.codeFirst]: false,
88
+ [FLUIDGRIDS_FLAGS.durableFunctions]: false,
89
+ [FLUIDGRIDS_FLAGS.durableParity]: false
90
+ };
91
+ var settledEvaluations = /* @__PURE__ */ new WeakMap();
92
+ function evaluationsUsable(context) {
93
+ const { evaluations } = context;
94
+ if (!evaluations) return !context.isLoading;
95
+ const workspace = context.workspaceId ?? null;
96
+ const settledFor = settledEvaluations.get(evaluations);
97
+ if (context.isLoading)
98
+ return settledFor !== void 0 && settledFor === workspace;
99
+ if (settledFor === void 0) {
100
+ settledEvaluations.set(evaluations, workspace);
101
+ return true;
102
+ }
103
+ return settledFor === workspace;
104
+ }
105
+ function resolveFluidGridsFlag(context, flag) {
106
+ const fallback = FLUIDGRIDS_FLAG_DEFAULTS[flag];
107
+ if (!context) return fallback;
108
+ if (fallback) {
109
+ if (context.isLoading) return fallback;
110
+ const evaluation2 = context.getEvaluation(flag);
111
+ return evaluation2 ? Boolean(evaluation2.value) : fallback;
112
+ }
113
+ if (context.error || !evaluationsUsable(context)) return false;
114
+ const evaluation = context.getEvaluation(flag);
115
+ return !!evaluation && !evaluation.errorCode && evaluation.value === true;
116
+ }
117
+ function useFluidGridsFlag(flag) {
118
+ const context = useOptionalFeatureFlags();
119
+ return useMemo(() => resolveFluidGridsFlag(context, flag), [context, flag]);
120
+ }
121
+ function useDurableFunctionNodesEnabled() {
122
+ const context = useOptionalFeatureFlags();
123
+ return useMemo(
124
+ () => resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.codeFirst) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableFunctions),
125
+ [context]
126
+ );
127
+ }
128
+ function resolveDurableParity(context) {
129
+ return resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.codeFirst) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableFunctions) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableParity);
130
+ }
131
+ function useDurableParityEnabled() {
132
+ const context = useOptionalFeatureFlags();
133
+ return useMemo(() => resolveDurableParity(context), [context]);
134
+ }
37
135
  function describeGraphQLError(error) {
38
136
  const code = typeof error.extensions?.code === "string" ? error.extensions.code : void 0;
39
137
  switch (code) {
@@ -1240,88 +1338,6 @@ if (typeof window !== "undefined" && import.meta.env?.DEV) {
1240
1338
  window.__fgFlowStore = useFlowStore;
1241
1339
  }
1242
1340
 
1243
- // src/feature-flags/durable-nodes.ts
1244
- var DURABLE_FUNCTION_NODE_TYPES = /* @__PURE__ */ new Set([
1245
- "internal:code-workflow",
1246
- "internal:wait-for-signal"
1247
- ]);
1248
- function isDurableFunctionNodeType(nodeType) {
1249
- return !!nodeType && DURABLE_FUNCTION_NODE_TYPES.has(nodeType);
1250
- }
1251
- function isNodeTypeHiddenFromPalette(nodeType, durableFunctionsEnabled = false) {
1252
- return !durableFunctionsEnabled && isDurableFunctionNodeType(nodeType);
1253
- }
1254
- function filterPaletteNodes(nodes, durableFunctionsEnabled = false) {
1255
- if (durableFunctionsEnabled) return nodes;
1256
- if (!nodes.some((node) => isDurableFunctionNodeType(node.type))) return nodes;
1257
- return nodes.filter((node) => !isDurableFunctionNodeType(node.type));
1258
- }
1259
- var FLUIDGRIDS_FLAGS = {
1260
- /**
1261
- * Operational kill switch for log stream destinations (webhook, syslog,
1262
- * Sentry). Defaults on; an admin turning it off hides the Log streaming
1263
- * settings and the backend rejects destination writes with FEATURE_DISABLED.
1264
- */
1265
- logStreams: "fluidgrids.log-streams",
1266
- /**
1267
- * Code-first workflows (BOFF-9902): the builder's Code view, Export as
1268
- * TypeScript / Python and TypeScript import. A rollout gate, not a kill
1269
- * switch, so it defaults OFF: the controls stay hidden until tenant-svc
1270
- * evaluates the flag on for the workspace, including when the shell mounts
1271
- * no FeatureFlagProvider or the evaluation is still loading.
1272
- */
1273
- codeFirst: "fluidgrids.code-first",
1274
- /**
1275
- * Durable functions (BOFF-9905): the Code Workflow and Wait for Signal
1276
- * nodes, run history, signals and the source editor. A rollout gate like
1277
- * `codeFirst`, so it defaults OFF and fails closed. The durable nodes are
1278
- * shown in the palette only while both this flag and `codeFirst` are on.
1279
- */
1280
- durableFunctions: "fluidgrids.durable-functions"
1281
- };
1282
- var FLUIDGRIDS_FLAG_DEFAULTS = {
1283
- [FLUIDGRIDS_FLAGS.logStreams]: true,
1284
- [FLUIDGRIDS_FLAGS.codeFirst]: false,
1285
- [FLUIDGRIDS_FLAGS.durableFunctions]: false
1286
- };
1287
- var settledEvaluations = /* @__PURE__ */ new WeakMap();
1288
- function evaluationsUsable(context) {
1289
- const { evaluations } = context;
1290
- if (!evaluations) return !context.isLoading;
1291
- const workspace = context.workspaceId ?? null;
1292
- const settledFor = settledEvaluations.get(evaluations);
1293
- if (context.isLoading)
1294
- return settledFor !== void 0 && settledFor === workspace;
1295
- if (settledFor === void 0) {
1296
- settledEvaluations.set(evaluations, workspace);
1297
- return true;
1298
- }
1299
- return settledFor === workspace;
1300
- }
1301
- function resolveFluidGridsFlag(context, flag) {
1302
- const fallback = FLUIDGRIDS_FLAG_DEFAULTS[flag];
1303
- if (!context) return fallback;
1304
- if (fallback) {
1305
- if (context.isLoading) return fallback;
1306
- const evaluation2 = context.getEvaluation(flag);
1307
- return evaluation2 ? Boolean(evaluation2.value) : fallback;
1308
- }
1309
- if (context.error || !evaluationsUsable(context)) return false;
1310
- const evaluation = context.getEvaluation(flag);
1311
- return !!evaluation && !evaluation.errorCode && evaluation.value === true;
1312
- }
1313
- function useFluidGridsFlag(flag) {
1314
- const context = useOptionalFeatureFlags();
1315
- return useMemo(() => resolveFluidGridsFlag(context, flag), [context, flag]);
1316
- }
1317
- function useDurableFunctionNodesEnabled() {
1318
- const context = useOptionalFeatureFlags();
1319
- return useMemo(
1320
- () => resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.codeFirst) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableFunctions),
1321
- [context]
1322
- );
1323
- }
1324
-
1325
1341
  // src/modules/executions/utils/signal-targets.ts
1326
1342
  function isRecord3(value) {
1327
1343
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -9569,4 +9585,4 @@ function useNodeExecution() {
9569
9585
  };
9570
9586
  }
9571
9587
 
9572
- export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FLUIDGRIDS_PERMISSIONS, FluidGridsContext, FluidGridsPermissionsProvider, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, RUNS_QUOTA_NAME, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath, editStateOf, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, evaluatePermissionCheck, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isTriggerOperation, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, useProviders, useSaveStatusStore, useSaveWorkflow, workflowFingerprint };
9588
+ export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FLUIDGRIDS_PERMISSIONS, FluidGridsContext, FluidGridsPermissionsProvider, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, RUNS_QUOTA_NAME, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath, editStateOf, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, evaluatePermissionCheck, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isTriggerOperation, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, useProviders, useSaveStatusStore, useSaveWorkflow, workflowFingerprint };
@@ -1,8 +1,8 @@
1
- import { Card, FluidGridsMark } from './chunk-Z6EWB5ZG.js';
1
+ import { Card, FluidGridsMark } from './chunk-EGIEFGOV.js';
2
2
  import { Input } from './chunk-IEVSFCFS.js';
3
3
  import { Button } from './chunk-BQXVT32O.js';
4
- import { useWorkflowDefinition } from './chunk-LTVAUZ3M.js';
5
- import { FluidGridsProvider, useFlowStore } from './chunk-4TGUNOQQ.js';
4
+ import { useWorkflowDefinition } from './chunk-OJPJ2QXD.js';
5
+ import { FluidGridsProvider, useFlowStore } from './chunk-K4BF7PAW.js';
6
6
  import { cn } from './chunk-JL7CASN5.js';
7
7
  import { useTr } from './chunk-UULVIT25.js';
8
8
  import { useState, useRef, useEffect, useCallback } from 'react';
@@ -1,4 +1,4 @@
1
- import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-7PP6CRXS.js';
1
+ import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-YTUIGIVP.js';
2
2
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
 
@@ -1,4 +1,4 @@
1
- import { throwIfResultError, describeOperationError } from './chunk-4TGUNOQQ.js';
1
+ import { throwIfResultError, describeOperationError } from './chunk-K4BF7PAW.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
4
4
  import { useState, useCallback, useEffect, useMemo } from 'react';
@@ -1,6 +1,6 @@
1
- import { useFluidGridsAnalytics, throwIfResultError, emitWorkflowCreated, emitRunStarted, runTriggerFromMode, openRunQuotaUpgradePrompt, emitWorkflowPublished } from './chunk-4TGUNOQQ.js';
2
- import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
3
- import { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, CreateWorkflowDefinitionDocument, ImportWorkflowDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-7PP6CRXS.js';
1
+ import { useFluidGridsAnalytics, throwIfResultError, emitWorkflowCreated, emitRunStarted, runTriggerFromMode, openRunQuotaUpgradePrompt, emitWorkflowPublished } from './chunk-K4BF7PAW.js';
2
+ import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
3
+ import { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, CreateWorkflowDefinitionDocument, ImportWorkflowDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-YTUIGIVP.js';
4
4
  import { useTr } from './chunk-UULVIT25.js';
5
5
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
6
6
  import { useState, useCallback, useEffect, useMemo } from 'react';
@@ -1,10 +1,10 @@
1
- import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-MNY2UNQH.js';
1
+ import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-FFOZ5VUJ.js';
2
2
  import { registerLiveCanvasHandler } from './chunk-PIKYQE7P.js';
3
- import { useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-Z6EWB5ZG.js';
4
- import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-LTVAUZ3M.js';
5
- import { useFlowStore, refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, mergeStickyNotes, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes, throwIfResultError } from './chunk-4TGUNOQQ.js';
6
- import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
7
- import { WorkflowDefinitionDocument } from './chunk-7PP6CRXS.js';
3
+ import { useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-EGIEFGOV.js';
4
+ import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-OJPJ2QXD.js';
5
+ import { useFlowStore, refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, mergeStickyNotes, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes, throwIfResultError } from './chunk-K4BF7PAW.js';
6
+ import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
7
+ import { WorkflowDefinitionDocument } from './chunk-YTUIGIVP.js';
8
8
  import { useTr } from './chunk-UULVIT25.js';
9
9
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
10
10
  import { useLocation, useNavigate, useParams } from 'react-router';
@@ -770,7 +770,7 @@ function WorkflowItem({
770
770
  try {
771
771
  const { getGlobalStoreClient } = await import('./global-client-KLOVTVPP.js');
772
772
  const { InstallWorkflowNodeDocument } = await import('./global-operations-D2USVOPM.js');
773
- const { getFluidGridsConfig: getFluidGridsConfig2 } = await import('./config-T7BQ7AO2.js');
773
+ const { getFluidGridsConfig: getFluidGridsConfig2 } = await import('./config-VM7FTHMZ.js');
774
774
  const storeClient = getGlobalStoreClient();
775
775
  const cfg = getFluidGridsConfig2();
776
776
  for (let i = 0; i < nodesToInstall.length; i++) {