@burdenoff/fluidgrids-fe-sdk 2026.1031.4 → 2026.1031.5

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 (41) hide show
  1. package/dist/ExecutionDetailPage-RZZJHBK3.js +22 -0
  2. package/dist/{ExecutionsListPage-AYDGFU6W.js → ExecutionsListPage-QXYQ5YEE.js} +8 -8
  3. package/dist/{WorkflowBuilder-N3ZUYFRK.js → WorkflowBuilder-KZKWWJZO.js} +11 -11
  4. package/dist/{WorkflowsList-BZXBTGNL.js → WorkflowsList-EHQTSSJY.js} +8 -8
  5. package/dist/{chunk-IGROOI7E.js → chunk-3B2VD4N4.js} +2 -2
  6. package/dist/{chunk-CIR7WF4W.js → chunk-4OOE56HK.js} +1 -1
  7. package/dist/{chunk-44KAAKFK.js → chunk-4VAPV7YT.js} +5 -5
  8. package/dist/{chunk-P3TGCUXP.js → chunk-6YGBRJNV.js} +5 -37
  9. package/dist/{chunk-R4Q37Q4X.js → chunk-7SUFXFQN.js} +3 -3
  10. package/dist/{chunk-OGYAC7QW.js → chunk-AHDYETEE.js} +1 -1
  11. package/dist/{chunk-475XP5J7.js → chunk-AWQCF6GS.js} +5 -5
  12. package/dist/{chunk-ADTEMSJI.js → chunk-BWQW6YSJ.js} +849 -4
  13. package/dist/{chunk-PKG6BCHB.js → chunk-E3KE67MX.js} +2 -2
  14. package/dist/{chunk-WHPQRYZD.js → chunk-H5HYJUUS.js} +5 -5
  15. package/dist/{chunk-Z3FYBDE3.js → chunk-HQX7JZLY.js} +33 -1
  16. package/dist/{chunk-BHD4CDLL.js → chunk-JQUFGF5P.js} +1 -1
  17. package/dist/{chunk-AW3UXMNI.js → chunk-KEYKB4E7.js} +12 -1
  18. package/dist/{chunk-DHR2YURL.js → chunk-KUSE5B2O.js} +163 -9
  19. package/dist/{chunk-XX6D7IND.js → chunk-NVAXIB4O.js} +2 -2
  20. package/dist/{chunk-6PGLJWIC.js → chunk-OXLYHOSQ.js} +30 -8
  21. package/dist/{chunk-Q3HKE627.js → chunk-QLE7GSOQ.js} +3 -3
  22. package/dist/{chunk-QKQOTEAB.js → chunk-S2I6ABXE.js} +1 -1
  23. package/dist/{chunk-INMYNHJL.js → chunk-TVOXRODW.js} +34 -2
  24. package/dist/{chunk-PTROESUB.js → chunk-UHG27FEH.js} +4 -4
  25. package/dist/{chunk-DJAGZUHW.js → chunk-VILOIOPD.js} +1238 -26
  26. package/dist/{chunk-GV5RJ6BU.js → chunk-X3WUWLRX.js} +4 -4
  27. package/dist/{chunk-JFQGODKK.js → chunk-XLAH4NWJ.js} +1 -1
  28. package/dist/{chunk-VJWJGSRS.js → chunk-YBJOZDR6.js} +1 -1
  29. package/dist/{chunk-P2VAHDGO.js → chunk-YQNL73BB.js} +2 -2
  30. package/dist/executions.js +12 -12
  31. package/dist/history.js +4 -4
  32. package/dist/index.d.ts +741 -4
  33. package/dist/index.js +38 -38
  34. package/dist/nodes.js +2 -2
  35. package/dist/observability.js +6 -6
  36. package/dist/settings.js +6 -6
  37. package/dist/templates.js +10 -10
  38. package/dist/workflow-builder.js +12 -12
  39. package/dist/workflows-list.js +8 -8
  40. package/package.json +1 -1
  41. package/dist/ExecutionDetailPage-WOOORXXU.js +0 -22
@@ -1,13 +1,14 @@
1
- import { useDurableParityRunFields, buildNodeDisplayMap, useRunMetadata, useRunPending, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-P3TGCUXP.js';
2
- import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-XX6D7IND.js';
3
- import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-P2VAHDGO.js';
4
- import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-VJWJGSRS.js';
5
- import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, EntityTagPicker, RunHistoryView, SignalRunDialog, terminateDurableRun, useWorkflowProposal, WorkflowProposalCard } from './chunk-ADTEMSJI.js';
1
+ import { useDurableParityRunFields, useRunMetadata, useRunPending, ExecutionStatusBadge, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-6YGBRJNV.js';
2
+ import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-NVAXIB4O.js';
3
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-YQNL73BB.js';
4
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-YBJOZDR6.js';
5
+ import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, EntityTagPicker, RunHistoryView, SignalRunDialog, terminateDurableRun, canSaveRunAsTestCase, useWorkflowProposal, WorkflowProposalCard, MAX_CASE_NAME, saveRunAsTestCase } from './chunk-BWQW6YSJ.js';
6
+ import { buildNodeDisplayMap, formatRunVersion } from './chunk-TVOXRODW.js';
6
7
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
7
- import { useWorkflowVersions } from './chunk-PKG6BCHB.js';
8
- import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, describeOperationError } from './chunk-6PGLJWIC.js';
8
+ import { useWorkflowVersions } from './chunk-E3KE67MX.js';
9
+ import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, useWorkflowTestsEnabled, SdkPermissionButton, describeOperationError } from './chunk-OXLYHOSQ.js';
9
10
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
10
- import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-AW3UXMNI.js';
11
+ import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-KEYKB4E7.js';
11
12
  import { useTr } from './chunk-UULVIT25.js';
12
13
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
13
14
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
@@ -15,12 +16,13 @@ import { useParams, useNavigate, Link } from 'react-router';
15
16
  import { Icon } from '@iconify/react';
16
17
  import { toast } from 'sonner';
17
18
  import { Button } from '@burdenoff/fe-libs/button';
18
- import { Card, CardHeader, Badge, CardContent, Label, Textarea, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, Input, Button as Button$1 } from '@burdenoff/fe-libs/ui';
19
+ import { Card, CardHeader, Badge, CardContent, Label, Textarea, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, Input, Button as Button$1, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@burdenoff/fe-libs/ui';
19
20
  import { useActorProfiles, buildActorFallback } from '@burdenoff/fe-libs/shared';
20
21
  import { gql } from '@apollo/client';
21
22
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
22
23
  import ReactMarkdown from 'react-markdown';
23
24
  import { cn } from '@burdenoff/fe-libs/utils';
25
+ import { FlaskConical } from 'lucide-react';
24
26
 
25
27
  var POLL_INTERVAL_MS = 2e3;
26
28
  var PAGE_SIZE = 500;
@@ -2148,6 +2150,149 @@ function RunVersioningOverrideDialogHost({
2148
2150
  }
2149
2151
  );
2150
2152
  }
2153
+ function SaveRunAsTestCaseButton(props) {
2154
+ const enabled = useWorkflowTestsEnabled();
2155
+ if (!enabled || !canSaveRunAsTestCase(props)) return null;
2156
+ return /* @__PURE__ */ jsx(SaveRunAsTestCase, { runId: props.runId });
2157
+ }
2158
+ function SaveRunAsTestCase({ runId }) {
2159
+ const tr = useTr();
2160
+ const [open, setOpen] = useState(false);
2161
+ const [name, setName] = useState("");
2162
+ const [description, setDescription] = useState("");
2163
+ const [saving, setSaving] = useState(false);
2164
+ const openDialog = () => {
2165
+ setName(`Run ${runId.slice(0, 8)}`);
2166
+ setDescription("");
2167
+ setOpen(true);
2168
+ };
2169
+ const save = async () => {
2170
+ const trimmed = name.trim();
2171
+ if (!trimmed) return;
2172
+ setSaving(true);
2173
+ try {
2174
+ const created = await saveRunAsTestCase(
2175
+ runId,
2176
+ trimmed,
2177
+ description.trim() || void 0
2178
+ );
2179
+ toast.success(
2180
+ tr(
2181
+ "fluidgrids.executions.saveAsTestCase.saved",
2182
+ "Saved as a test case"
2183
+ ),
2184
+ {
2185
+ description: tr(
2186
+ "fluidgrids.executions.saveAsTestCase.savedDescription",
2187
+ "{{name}} is in the workflow's Tests panel.",
2188
+ { name: created.name }
2189
+ ),
2190
+ dismissible: true
2191
+ }
2192
+ );
2193
+ setOpen(false);
2194
+ } catch (err) {
2195
+ toast.error(
2196
+ tr(
2197
+ "fluidgrids.executions.saveAsTestCase.error",
2198
+ "Could not save the run as a test case"
2199
+ ),
2200
+ { description: err instanceof Error ? err.message : String(err) }
2201
+ );
2202
+ } finally {
2203
+ setSaving(false);
2204
+ }
2205
+ };
2206
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2207
+ /* @__PURE__ */ jsx(
2208
+ SdkPermissionButton,
2209
+ {
2210
+ permission: FLUIDGRIDS_PERMISSIONS.WORKFLOW_UPDATE,
2211
+ deniedTooltip: tr(
2212
+ "fluidgrids.executions.saveAsTestCase.denied",
2213
+ "You need edit access to this workflow to save test cases"
2214
+ ),
2215
+ children: /* @__PURE__ */ jsxs(
2216
+ Button,
2217
+ {
2218
+ variant: "outline",
2219
+ size: "sm",
2220
+ onClick: openDialog,
2221
+ "data-testid": "fluidgrids-save-run-as-test-case",
2222
+ children: [
2223
+ /* @__PURE__ */ jsx(FlaskConical, { className: "mr-1 size-4" }),
2224
+ tr(
2225
+ "fluidgrids.executions.saveAsTestCase.button",
2226
+ "Save as test case"
2227
+ )
2228
+ ]
2229
+ }
2230
+ )
2231
+ }
2232
+ ),
2233
+ /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: (next) => !saving && setOpen(next), children: /* @__PURE__ */ jsxs(DialogContent, { "data-testid": "fluidgrids-save-run-as-test-case-dialog", children: [
2234
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
2235
+ /* @__PURE__ */ jsx(DialogTitle, { children: tr(
2236
+ "fluidgrids.executions.saveAsTestCase.title",
2237
+ "Save this run as a test case"
2238
+ ) }),
2239
+ /* @__PURE__ */ jsx(DialogDescription, { children: tr(
2240
+ "fluidgrids.executions.saveAsTestCase.body",
2241
+ "The test case replays this run's input. Every connection call the run made is mocked with the output it returned; the workflow's own logic runs for real."
2242
+ ) })
2243
+ ] }),
2244
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
2245
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
2246
+ /* @__PURE__ */ jsx(Label, { htmlFor: "fg-run-test-case-name", className: "text-xs", children: tr("fluidgrids.executions.saveAsTestCase.name", "Name") }),
2247
+ /* @__PURE__ */ jsx(
2248
+ Input,
2249
+ {
2250
+ id: "fg-run-test-case-name",
2251
+ value: name,
2252
+ maxLength: MAX_CASE_NAME,
2253
+ onChange: (event) => setName(event.target.value)
2254
+ }
2255
+ )
2256
+ ] }),
2257
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
2258
+ /* @__PURE__ */ jsx(Label, { htmlFor: "fg-run-test-case-description", className: "text-xs", children: tr(
2259
+ "fluidgrids.executions.saveAsTestCase.description",
2260
+ "Description (optional)"
2261
+ ) }),
2262
+ /* @__PURE__ */ jsx(
2263
+ Textarea,
2264
+ {
2265
+ id: "fg-run-test-case-description",
2266
+ value: description,
2267
+ rows: 2,
2268
+ onChange: (event) => setDescription(event.target.value)
2269
+ }
2270
+ )
2271
+ ] })
2272
+ ] }),
2273
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [
2274
+ /* @__PURE__ */ jsx(
2275
+ Button,
2276
+ {
2277
+ variant: "outline",
2278
+ disabled: saving,
2279
+ onClick: () => setOpen(false),
2280
+ children: tr("fluidgrids.executions.saveAsTestCase.cancel", "Cancel")
2281
+ }
2282
+ ),
2283
+ /* @__PURE__ */ jsx(
2284
+ Button,
2285
+ {
2286
+ disabled: saving || name.trim() === "",
2287
+ onClick: () => void save(),
2288
+ "data-testid": "fluidgrids-save-run-as-test-case-confirm",
2289
+ children: tr("fluidgrids.executions.saveAsTestCase.confirm", "Save")
2290
+ }
2291
+ )
2292
+ ] })
2293
+ ] }) })
2294
+ ] });
2295
+ }
2151
2296
  var ALL_DETAIL_TABS = [
2152
2297
  "timeline",
2153
2298
  "history",
@@ -2829,6 +2974,15 @@ function ExecutionDetailPage() {
2829
2974
  ]
2830
2975
  }
2831
2976
  ),
2977
+ /* @__PURE__ */ jsx(
2978
+ SaveRunAsTestCaseButton,
2979
+ {
2980
+ runId: execution.id,
2981
+ status: execution.status,
2982
+ workflowKey: execution.workflowKey,
2983
+ isDurable: isDurableRun || durableEnabled && durableFields.fields?.id !== execution.id
2984
+ }
2985
+ ),
2832
2986
  /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: refetch, children: [
2833
2987
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
2834
2988
  tr(
@@ -1,7 +1,7 @@
1
1
  import { REPLAY_WORKFLOW_RUN, RETRY_WORKFLOW_RUNS } from './chunk-5ERAJC2I.js';
2
- import { useFluidGridsAnalytics, throwIfResultError, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-6PGLJWIC.js';
2
+ import { useFluidGridsAnalytics, throwIfResultError, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-OXLYHOSQ.js';
3
3
  import { useExecutionsStore } from './chunk-6AMNEX2Y.js';
4
- import { ExecutionsListDocument, ExecutionDetailDocument, ExecutionStatsDocument, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TriggerWorkflowDocument, TerminateExecutionDocument } from './chunk-AW3UXMNI.js';
4
+ import { ExecutionsListDocument, ExecutionDetailDocument, ExecutionStatsDocument, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TriggerWorkflowDocument, TerminateExecutionDocument } from './chunk-KEYKB4E7.js';
5
5
  import { useTr } from './chunk-UULVIT25.js';
6
6
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
7
7
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
@@ -2,7 +2,7 @@ import { cn as cn$1 } from './chunk-JL7CASN5.js';
2
2
  import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-PXIFUMLA.js';
3
3
  import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, setFluidGridsConfig, resetFluidGridsConfig } from './chunk-6AMNEX2Y.js';
4
4
  import { GetMyNodeInstallationsDocument } from './chunk-G77IGC3Y.js';
5
- import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-AW3UXMNI.js';
5
+ import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-KEYKB4E7.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
8
  import * as React2 from 'react';
@@ -43,6 +43,9 @@ var RUN_CONTROL_NODE_TYPES = /* @__PURE__ */ new Set([
43
43
  "internal:signal-run",
44
44
  "internal:set-search-attributes"
45
45
  ]);
46
+ var WORKFLOW_TEST_NODE_TYPES = /* @__PURE__ */ new Set([
47
+ "internal:assert"
48
+ ]);
46
49
  function isRunControlNodeType(nodeType) {
47
50
  return !!nodeType && RUN_CONTROL_NODE_TYPES.has(nodeType);
48
51
  }
@@ -51,12 +54,14 @@ function paletteGatesOf(gates) {
51
54
  return {
52
55
  durableFunctions: gates,
53
56
  runControl: false,
54
- searchAttributes: false
57
+ searchAttributes: false,
58
+ workflowTests: false
55
59
  };
56
60
  return {
57
61
  durableFunctions: gates?.durableFunctions === true,
58
62
  runControl: gates?.runControl === true,
59
- searchAttributes: gates?.searchAttributes === true
63
+ searchAttributes: gates?.searchAttributes === true,
64
+ workflowTests: gates?.workflowTests === true
60
65
  };
61
66
  }
62
67
  function hiddenBy(nodeType, gates) {
@@ -64,6 +69,7 @@ function hiddenBy(nodeType, gates) {
64
69
  if (nodeType === "internal:signal-run") return !gates.runControl;
65
70
  if (nodeType === "internal:set-search-attributes")
66
71
  return !gates.searchAttributes;
72
+ if (WORKFLOW_TEST_NODE_TYPES.has(nodeType)) return !gates.workflowTests;
67
73
  return false;
68
74
  }
69
75
  function isDurableFunctionNodeType(nodeType) {
@@ -139,7 +145,14 @@ var FLUIDGRIDS_FLAGS = {
139
145
  * Phase C Python durable functions: editing Python sources in the browser
140
146
  * editor. Needs `codeFirst` and `durableFunctions`. Defaults OFF.
141
147
  */
142
- pythonDurableFunctions: "fluidgrids.python-durable-functions"
148
+ pythonDurableFunctions: "fluidgrids.python-durable-functions",
149
+ /**
150
+ * Workflow test suites (BOFF-9960): the builder's Tests panel, saving a run
151
+ * as a test case and the Assert node in the palette. A rollout gate, so it
152
+ * defaults OFF and fails closed; wspace-workflow-svc answers every test-suite
153
+ * field with FEATURE_DISABLED while it is off for the workspace.
154
+ */
155
+ workflowTests: "fluidgrids.workflow-tests"
143
156
  };
144
157
  var FLUIDGRIDS_FLAG_DEFAULTS = {
145
158
  [FLUIDGRIDS_FLAGS.logStreams]: true,
@@ -151,7 +164,8 @@ var FLUIDGRIDS_FLAG_DEFAULTS = {
151
164
  [FLUIDGRIDS_FLAGS.searchAttributes]: false,
152
165
  [FLUIDGRIDS_FLAGS.runArchival]: false,
153
166
  [FLUIDGRIDS_FLAGS.schedulePolicies]: false,
154
- [FLUIDGRIDS_FLAGS.pythonDurableFunctions]: false
167
+ [FLUIDGRIDS_FLAGS.pythonDurableFunctions]: false,
168
+ [FLUIDGRIDS_FLAGS.workflowTests]: false
155
169
  };
156
170
  var settledEvaluations = /* @__PURE__ */ new WeakMap();
157
171
  function evaluationsUsable(context) {
@@ -229,12 +243,19 @@ function usePhaseCFlags() {
229
243
  function useSelfHostedWorkersEnabled() {
230
244
  return usePhaseCFlags().selfHostedWorkers;
231
245
  }
246
+ function useWorkflowTestsEnabled() {
247
+ return useFluidGridsFlag(FLUIDGRIDS_FLAGS.workflowTests);
248
+ }
232
249
  function resolvePaletteGates(context) {
233
250
  const phaseC = resolvePhaseCFlags(context);
234
251
  return {
235
252
  durableFunctions: resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.codeFirst) && resolveFluidGridsFlag(context, FLUIDGRIDS_FLAGS.durableFunctions),
236
253
  runControl: phaseC.runControl,
237
- searchAttributes: phaseC.searchAttributes
254
+ searchAttributes: phaseC.searchAttributes,
255
+ workflowTests: resolveFluidGridsFlag(
256
+ context,
257
+ FLUIDGRIDS_FLAGS.workflowTests
258
+ )
238
259
  };
239
260
  }
240
261
  function usePaletteGates() {
@@ -3750,6 +3771,7 @@ function SdkPermissionButton({
3750
3771
  permission,
3751
3772
  deniedBehavior = "disable",
3752
3773
  deniedTooltip = DEFAULT_DENIED_TOOLTIP,
3774
+ deniedTooltipClassName,
3753
3775
  children
3754
3776
  }) {
3755
3777
  const { allowed, isLoading } = useFluidGridsPermission(permission);
@@ -3762,7 +3784,7 @@ function SdkPermissionButton({
3762
3784
  if (isLoading) return disabledChild;
3763
3785
  return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { children: [
3764
3786
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "inline-flex cursor-not-allowed", children: disabledChild }) }),
3765
- /* @__PURE__ */ jsx(TooltipContent, { children: deniedTooltip })
3787
+ /* @__PURE__ */ jsx(TooltipContent, { className: deniedTooltipClassName, children: deniedTooltip })
3766
3788
  ] }) });
3767
3789
  }
3768
3790
  function SdkPermissionGate({
@@ -9976,4 +9998,4 @@ function useNodeExecution() {
9976
9998
  };
9977
9999
  }
9978
10000
 
9979
- export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, BuilderReadOnlyProvider, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, 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, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, 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, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, isTriggerOperation, leaseCallQueue, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolvePhaseCFlags, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useBuilderReadOnly, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, workflowFingerprint };
10001
+ export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, BuilderReadOnlyProvider, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, 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, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, 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, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, isTriggerOperation, leaseCallQueue, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolvePhaseCFlags, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useBuilderReadOnly, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, workflowFingerprint };
@@ -1,6 +1,6 @@
1
- import { FailureTriagePanel } from './chunk-P2VAHDGO.js';
2
- import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-CIR7WF4W.js';
3
- import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-6PGLJWIC.js';
1
+ import { FailureTriagePanel } from './chunk-YQNL73BB.js';
2
+ import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-4OOE56HK.js';
3
+ import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-OXLYHOSQ.js';
4
4
  import { useTr } from './chunk-UULVIT25.js';
5
5
  import { useState, useMemo, useEffect } from 'react';
6
6
  import { Icon } from '@iconify/react';
@@ -1,5 +1,5 @@
1
1
  import { historyControls } from './chunk-FNZZ5JJL.js';
2
- import { useWorkflowDefinitions } from './chunk-PKG6BCHB.js';
2
+ import { useWorkflowDefinitions } from './chunk-E3KE67MX.js';
3
3
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
4
4
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
5
5
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
@@ -1,4 +1,4 @@
1
- import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-AW3UXMNI.js';
1
+ import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-KEYKB4E7.js';
2
2
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
 
@@ -176,4 +176,36 @@ function useDataTableTagOverlay(limit = 200) {
176
176
  return { tagsById, refetch: fetchOverlay };
177
177
  }
178
178
 
179
- export { FLUIDGRIDS_ENTITY_TYPES, tagLabel, useAvailableTags, useCreateTag, useDataTableTagOverlay, useDraftEntityTags, useEntityTags, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity };
179
+ // src/modules/executions/utils/run-display.ts
180
+ function formatRunVersion(version) {
181
+ if (!version) return "";
182
+ return version.startsWith("v") ? version : `v${version}`;
183
+ }
184
+ function asString(value) {
185
+ return typeof value === "string" && value.trim() ? value : void 0;
186
+ }
187
+ function buildNodeDisplayMap(definitionJson) {
188
+ const map = {};
189
+ const nodes = definitionJson?.data?.nodes;
190
+ if (!Array.isArray(nodes)) return map;
191
+ for (const node of nodes) {
192
+ const id = asString(node?.id);
193
+ if (!id) continue;
194
+ const label = asString(node?.data?.label) ?? asString(node?.data?.nodeData?.name) ?? asString(node?.type);
195
+ if (!label) continue;
196
+ const operation = asString(node?.data?.operation_name);
197
+ map[id] = {
198
+ label,
199
+ // 'execute' is the internal single-op pseudo-operation — the builder
200
+ // hides it on cards, so the runs screens do too.
201
+ operation: operation === "execute" ? void 0 : operation
202
+ };
203
+ }
204
+ return map;
205
+ }
206
+ function nodeDisplayTitle(display, fallback) {
207
+ if (!display) return fallback;
208
+ return display.operation ? `${display.label} \xB7 ${display.operation}` : display.label;
209
+ }
210
+
211
+ export { FLUIDGRIDS_ENTITY_TYPES, buildNodeDisplayMap, formatRunVersion, nodeDisplayTitle, tagLabel, useAvailableTags, useCreateTag, useDataTableTagOverlay, useDraftEntityTags, useEntityTags, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity };
@@ -1,8 +1,8 @@
1
- import { useRunStatusCounts, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination, runStatusLabels } from './chunk-P3TGCUXP.js';
2
- import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, WORKFLOW_ID_MAX_LENGTH } from './chunk-XX6D7IND.js';
3
- import { useWorkflowDefinitions } from './chunk-PKG6BCHB.js';
1
+ import { useRunStatusCounts, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination, runStatusLabels } from './chunk-6YGBRJNV.js';
2
+ import { useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, WORKFLOW_ID_MAX_LENGTH } from './chunk-NVAXIB4O.js';
3
+ import { useWorkflowDefinitions } from './chunk-E3KE67MX.js';
4
4
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
5
- import { useDurableParityEnabled } from './chunk-6PGLJWIC.js';
5
+ import { useDurableParityEnabled } from './chunk-OXLYHOSQ.js';
6
6
  import { useExecutionsStore } from './chunk-6AMNEX2Y.js';
7
7
  import { useTr } from './chunk-UULVIT25.js';
8
8
  import { useRef, useCallback, useMemo, useState, useEffect } from 'react';