@burdenoff/fluidgrids-fe-sdk 2026.1029.5 → 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-2OYIXGWQ.js → ExecutionsListPage-7NMW6S5A.js} +9 -9
  3. package/dist/{WorkflowBuilder-EVZGOXZZ.js → WorkflowBuilder-RXVUBDZJ.js} +12 -12
  4. package/dist/{ExecutionsListPage-KC3KRBNS.js → WorkflowsList-5U74DYQ3.js} +9 -8
  5. package/dist/{chunk-5ITN7CKS.js → chunk-4MHWFZJV.js} +1 -1
  6. package/dist/{chunk-CY6KX4RG.js → chunk-6AMNEX2Y.js} +6 -1
  7. package/dist/{chunk-XRHZ3IEL.js → chunk-6SZXW2BF.js} +255 -8
  8. package/dist/{chunk-U6KI4AKI.js → chunk-6TMLIQHB.js} +199 -1
  9. package/dist/{chunk-EAJB5BNF.js → chunk-7CTIVBBA.js} +183 -26
  10. package/dist/{chunk-UZMLMPFJ.js → chunk-AXMEATLG.js} +117 -8
  11. package/dist/{chunk-NM5L7MBJ.js → chunk-BZTVAUOQ.js} +3 -3
  12. package/dist/{chunk-X3LQJLV7.js → chunk-DEGCZCHP.js} +2 -2
  13. package/dist/{chunk-WDTO6ATM.js → chunk-E7UAY3JJ.js} +2 -2
  14. package/dist/{chunk-O24MDGZY.js → chunk-EGIEFGOV.js} +677 -43
  15. package/dist/{chunk-LGGHQ7UE.js → chunk-FFOZ5VUJ.js} +1 -1
  16. package/dist/{chunk-6Y6I2ODM.js → chunk-HAFUSBYP.js} +937 -26
  17. package/dist/{chunk-ZDFDC5YW.js → chunk-IDGDMJMJ.js} +118 -96
  18. package/dist/{chunk-2U56452G.js → chunk-K4BF7PAW.js} +125 -89
  19. package/dist/{chunk-MNPZMFLF.js → chunk-KANARCPR.js} +3 -3
  20. package/dist/{chunk-5GD6OXYW.js → chunk-LAVHDFHI.js} +1 -1
  21. package/dist/{chunk-35SQULD5.js → chunk-NL4JQFFA.js} +1 -1
  22. package/dist/{chunk-SRE2JVSJ.js → chunk-OJPJ2QXD.js} +3 -3
  23. package/dist/{chunk-JUA57OVN.js → chunk-RZR3BDDZ.js} +7 -7
  24. package/dist/{chunk-DASEJQ4G.js → chunk-SZTKLZZR.js} +145 -8
  25. package/dist/{chunk-LB62TAF7.js → chunk-TYYSYSAL.js} +1 -1
  26. package/dist/{chunk-VYH65RLH.js → chunk-US4LPOB3.js} +1 -1
  27. package/dist/{chunk-XTXT4NHE.js → chunk-VIZ7W5WJ.js} +5 -5
  28. package/dist/{chunk-7PP6CRXS.js → chunk-YTUIGIVP.js} +15 -1
  29. package/dist/{chunk-TNPK2LZT.js → chunk-Z4YQTXCD.js} +4 -4
  30. package/dist/{chunk-R4SBXQ2K.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 +2529 -24
  35. package/dist/index.js +118 -51
  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-Y4K35GJ7.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-2U56452G.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) {
@@ -92,6 +190,23 @@ function throwIfResultError(result) {
92
190
  }
93
191
  return result;
94
192
  }
193
+ function hasForbiddenCode(errors) {
194
+ return (errors ?? []).some((error) => error.extensions?.code === "FORBIDDEN");
195
+ }
196
+ function isForbiddenError(error) {
197
+ if (CombinedGraphQLErrors.is(error)) {
198
+ return hasForbiddenCode(error.errors);
199
+ }
200
+ if (ServerError.is(error)) {
201
+ if (error.statusCode === 403) return true;
202
+ const first = firstGraphQLErrorInBody(error.bodyText);
203
+ return first ? hasForbiddenCode([first]) : false;
204
+ }
205
+ if (error instanceof Error && error.cause !== void 0) {
206
+ return isForbiddenError(error.cause);
207
+ }
208
+ return false;
209
+ }
95
210
 
96
211
  // src/billing/quota.ts
97
212
  var RUNS_QUOTA_NAME = "fluidgrids.runs.monthly";
@@ -1223,88 +1338,6 @@ if (typeof window !== "undefined" && import.meta.env?.DEV) {
1223
1338
  window.__fgFlowStore = useFlowStore;
1224
1339
  }
1225
1340
 
1226
- // src/feature-flags/durable-nodes.ts
1227
- var DURABLE_FUNCTION_NODE_TYPES = /* @__PURE__ */ new Set([
1228
- "internal:code-workflow",
1229
- "internal:wait-for-signal"
1230
- ]);
1231
- function isDurableFunctionNodeType(nodeType) {
1232
- return !!nodeType && DURABLE_FUNCTION_NODE_TYPES.has(nodeType);
1233
- }
1234
- function isNodeTypeHiddenFromPalette(nodeType, durableFunctionsEnabled = false) {
1235
- return !durableFunctionsEnabled && isDurableFunctionNodeType(nodeType);
1236
- }
1237
- function filterPaletteNodes(nodes, durableFunctionsEnabled = false) {
1238
- if (durableFunctionsEnabled) return nodes;
1239
- if (!nodes.some((node) => isDurableFunctionNodeType(node.type))) return nodes;
1240
- return nodes.filter((node) => !isDurableFunctionNodeType(node.type));
1241
- }
1242
- var FLUIDGRIDS_FLAGS = {
1243
- /**
1244
- * Operational kill switch for log stream destinations (webhook, syslog,
1245
- * Sentry). Defaults on; an admin turning it off hides the Log streaming
1246
- * settings and the backend rejects destination writes with FEATURE_DISABLED.
1247
- */
1248
- logStreams: "fluidgrids.log-streams",
1249
- /**
1250
- * Code-first workflows (BOFF-9902): the builder's Code view, Export as
1251
- * TypeScript / Python and TypeScript import. A rollout gate, not a kill
1252
- * switch, so it defaults OFF: the controls stay hidden until tenant-svc
1253
- * evaluates the flag on for the workspace, including when the shell mounts
1254
- * no FeatureFlagProvider or the evaluation is still loading.
1255
- */
1256
- codeFirst: "fluidgrids.code-first",
1257
- /**
1258
- * Durable functions (BOFF-9905): the Code Workflow and Wait for Signal
1259
- * nodes, run history, signals and the source editor. A rollout gate like
1260
- * `codeFirst`, so it defaults OFF and fails closed. The durable nodes are
1261
- * shown in the palette only while both this flag and `codeFirst` are on.
1262
- */
1263
- durableFunctions: "fluidgrids.durable-functions"
1264
- };
1265
- var FLUIDGRIDS_FLAG_DEFAULTS = {
1266
- [FLUIDGRIDS_FLAGS.logStreams]: true,
1267
- [FLUIDGRIDS_FLAGS.codeFirst]: false,
1268
- [FLUIDGRIDS_FLAGS.durableFunctions]: false
1269
- };
1270
- var settledEvaluations = /* @__PURE__ */ new WeakMap();
1271
- function evaluationsUsable(context) {
1272
- const { evaluations } = context;
1273
- if (!evaluations) return !context.isLoading;
1274
- const workspace = context.workspaceId ?? null;
1275
- const settledFor = settledEvaluations.get(evaluations);
1276
- if (context.isLoading)
1277
- return settledFor !== void 0 && settledFor === workspace;
1278
- if (settledFor === void 0) {
1279
- settledEvaluations.set(evaluations, workspace);
1280
- return true;
1281
- }
1282
- return settledFor === workspace;
1283
- }
1284
- function resolveFluidGridsFlag(context, flag) {
1285
- const fallback = FLUIDGRIDS_FLAG_DEFAULTS[flag];
1286
- if (!context) return fallback;
1287
- if (fallback) {
1288
- if (context.isLoading) return fallback;
1289
- const evaluation2 = context.getEvaluation(flag);
1290
- return evaluation2 ? Boolean(evaluation2.value) : fallback;
1291
- }
1292
- if (context.error || !evaluationsUsable(context)) return false;
1293
- const evaluation = context.getEvaluation(flag);
1294
- return !!evaluation && !evaluation.errorCode && evaluation.value === true;
1295
- }
1296
- function useFluidGridsFlag(flag) {
1297
- const context = useOptionalFeatureFlags();
1298
- return useMemo(() => resolveFluidGridsFlag(context, flag), [context, flag]);
1299
- }
1300
- function useDurableFunctionNodesEnabled() {
1301
- const context = useOptionalFeatureFlags();
1302
- return useMemo(
1303
- () => resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.codeFirst) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableFunctions),
1304
- [context]
1305
- );
1306
- }
1307
-
1308
1341
  // src/modules/executions/utils/signal-targets.ts
1309
1342
  function isRecord3(value) {
1310
1343
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -3712,7 +3745,10 @@ var FLUIDGRIDS_PERMISSIONS = {
3712
3745
  INTEGRATION_CONNECTION_CREATE: "integration-connection:create",
3713
3746
  // Self-hosted runners (wspace-sandbox-svc; @rbac resource "sandbox")
3714
3747
  SANDBOX_READ: "sandbox:read",
3715
- SANDBOX_CREATE: "sandbox:create"
3748
+ SANDBOX_CREATE: "sandbox:create",
3749
+ // AI Agent tool-call approvals (pendingToolApprovals, decideToolApproval)
3750
+ TOOL_APPROVAL_REQUEST_READ: "tool-approval-request:read",
3751
+ TOOL_APPROVAL_REQUEST_EXECUTE: "tool-approval-request:execute"
3716
3752
  };
3717
3753
  var AGENT_FIELDS = `
3718
3754
  id
@@ -9549,4 +9585,4 @@ function useNodeExecution() {
9549
9585
  };
9550
9586
  }
9551
9587
 
9552
- 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, 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-O24MDGZY.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-SRE2JVSJ.js';
5
- import { FluidGridsProvider, useFlowStore } from './chunk-2U56452G.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-2U56452G.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-2U56452G.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-LGGHQ7UE.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-O24MDGZY.js';
4
- import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-SRE2JVSJ.js';
5
- import { useFlowStore, refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, mergeStickyNotes, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes, throwIfResultError } from './chunk-2U56452G.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++) {