@burdenoff/fluidgrids-fe-sdk 2026.1108.1 → 2026.1108.3

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 (56) hide show
  1. package/dist/{ExecutionDetailPage-STW6RPK6.js → ExecutionDetailPage-PY5OE2RJ.js} +15 -14
  2. package/dist/{ExecutionsListPage-753XDOTM.js → ExecutionsListPage-LKNYPXNZ.js} +11 -10
  3. package/dist/{TemplateDetailPanel-ZTYXKWRI.js → TemplateDetailPanel-5WY75DVB.js} +1 -1
  4. package/dist/{WorkflowBuilder-HY3PZZVD.js → WorkflowBuilder-FDSHLSC4.js} +16 -16
  5. package/dist/{WorkflowsList-YFDT7ZPX.js → WorkflowsList-TETNEMYP.js} +10 -10
  6. package/dist/{agentTools-3UQNOO7V.js → agentTools-BW2XMHRV.js} +6 -6
  7. package/dist/{chunk-KE677WYY.js → chunk-2CXUTQUH.js} +1 -1
  8. package/dist/{chunk-H4ERTSMX.js → chunk-2VSYOGNI.js} +1948 -35
  9. package/dist/{chunk-NZMUKAXG.js → chunk-54NXUOHI.js} +1 -1
  10. package/dist/{chunk-I23KAUR6.js → chunk-7XW6BC4B.js} +1 -1
  11. package/dist/{chunk-5375NUIO.js → chunk-AR22A74Y.js} +11 -0
  12. package/dist/{chunk-TKHW2G7O.js → chunk-CRTZL55P.js} +7 -7
  13. package/dist/{chunk-QHRRYTOL.js → chunk-D5Y3DHGJ.js} +1 -1
  14. package/dist/{chunk-JXJ2DESW.js → chunk-DG4UO5OY.js} +5 -5
  15. package/dist/{chunk-NMYENCP2.js → chunk-E7KIH3CF.js} +1 -1
  16. package/dist/{chunk-47OW3OM5.js → chunk-F32UAOHF.js} +402 -6
  17. package/dist/{chunk-5OVWMFPL.js → chunk-GI6BQIQA.js} +124 -42
  18. package/dist/{chunk-Z3ABLERJ.js → chunk-GOZR72NK.js} +64 -1
  19. package/dist/{chunk-KHS2DZHH.js → chunk-HICQ4J4W.js} +1 -1
  20. package/dist/chunk-HPNZ3PYU.js +1448 -0
  21. package/dist/{chunk-F522K3P5.js → chunk-HQSSW7K3.js} +8 -8
  22. package/dist/{chunk-63X5ORDO.js → chunk-HSOSMPRC.js} +1 -1
  23. package/dist/{chunk-JRSCUUBT.js → chunk-IPJV2IOH.js} +1 -1
  24. package/dist/{chunk-3QV3L3YY.js → chunk-IZOPKR64.js} +3 -3
  25. package/dist/{chunk-2CM26W2I.js → chunk-JRR4VKYD.js} +95 -6
  26. package/dist/{chunk-4OZISYDF.js → chunk-JSJSBB76.js} +2 -2
  27. package/dist/{chunk-PF7XQA2S.js → chunk-KJB3WZVD.js} +2 -2
  28. package/dist/{chunk-OHKSDHNC.js → chunk-L7PHZ7RY.js} +2 -2
  29. package/dist/{chunk-HRZMKJEC.js → chunk-LOMLLWHD.js} +705 -12
  30. package/dist/{chunk-26GYGAC5.js → chunk-MJ5EI5OT.js} +15 -15
  31. package/dist/{chunk-XAXZ4T6H.js → chunk-MYPB2KTJ.js} +13 -6
  32. package/dist/{chunk-EXJW7EKR.js → chunk-OJHBCOBA.js} +164 -1
  33. package/dist/{chunk-ZKRDO4IG.js → chunk-POYMF7L6.js} +1 -1
  34. package/dist/{chunk-YQOXXM5V.js → chunk-PXFGXC7J.js} +4 -4
  35. package/dist/{chunk-WX5BNZVX.js → chunk-RNYFPG7R.js} +4 -4
  36. package/dist/{chunk-HPYXHIRI.js → chunk-SOZUAJYS.js} +5 -5
  37. package/dist/{chunk-PASKZCII.js → chunk-TN3NGTF7.js} +3 -3
  38. package/dist/{chunk-TYE252O5.js → chunk-VH3EET6H.js} +2 -2
  39. package/dist/{chunk-UZJKX5FN.js → chunk-X3F5IQBP.js} +5 -3
  40. package/dist/chunk-YASVILWQ.js +398 -0
  41. package/dist/{chunk-36TEHKVN.js → chunk-ZHXJYOOG.js} +2115 -25
  42. package/dist/executions.js +16 -15
  43. package/dist/history.js +8 -8
  44. package/dist/index.d.ts +15456 -235
  45. package/dist/index.js +1057 -55
  46. package/dist/{node-detail-view-GFC3UDYD.js → node-detail-view-PLCZIWJS.js} +489 -21
  47. package/dist/nodes.js +2 -2
  48. package/dist/observability.js +8 -8
  49. package/dist/{quick-config-panel-6XUUXIHX.js → quick-config-panel-FMDKFGSY.js} +8 -8
  50. package/dist/settings.js +10 -8
  51. package/dist/templates.js +15 -15
  52. package/dist/workflow-builder.js +17 -17
  53. package/dist/workflow-preview.js +2 -2
  54. package/dist/workflows-list.js +10 -10
  55. package/package.json +2 -2
  56. package/dist/chunk-ODWKSYMZ.js +0 -529
@@ -1,9 +1,9 @@
1
- import { SdkPermissionGate, FLUIDGRIDS_PERMISSIONS } from './chunk-5375NUIO.js';
1
+ import { SdkPermissionGate, FLUIDGRIDS_PERMISSIONS } from './chunk-AR22A74Y.js';
2
2
  import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
3
- import { STICKY_NOTE_TYPE, useFlowStore, resolveOperationName, synchronizeOperationUpdate, isNodeTrigger, resolveOutputHandles, resolveInputHandles, outputHandlesSpacerHeight, WAIT_FOR_SIGNAL_NODE_TYPE, CODE_WORKFLOW_NODE_TYPE, readSignalName, LogicNodeCard, NodeCard, NodeCardHeader, NodeCardBody, InputHandles, OutputHandles, NodeTypeIcon, nodeAccent, readCodeWorkflowState, partitionStickyNotes, interfaceFields, interfaceHandlers } from './chunk-UZJKX5FN.js';
3
+ import { STICKY_NOTE_TYPE, useFlowStore, resolveOperationName, synchronizeOperationUpdate, isNodeTrigger, resolveOutputHandles, resolveInputHandles, outputHandlesSpacerHeight, WAIT_FOR_SIGNAL_NODE_TYPE, CODE_WORKFLOW_NODE_TYPE, readSignalName, LogicNodeCard, NodeCard, NodeCardHeader, NodeCardBody, InputHandles, OutputHandles, NodeTypeIcon, nodeAccent, readCodeWorkflowState, partitionStickyNotes, interfaceFields, interfaceHandlers } from './chunk-X3F5IQBP.js';
4
4
  import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-TYI2XOSI.js';
5
5
  import { GetMyNodeInstallationsDocument } from './chunk-G77IGC3Y.js';
6
- import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-Z3ABLERJ.js';
6
+ import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-GOZR72NK.js';
7
7
  import { useTr, ENGLISH_FALLBACK_TRANSLATOR, FluidGridsTranslationProvider } from './chunk-UULVIT25.js';
8
8
  import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-PDODDDHY.js';
9
9
  import { throwIfResultError, emitFluidGridsEvent, emitOperationErrorEvent, describeOperationError, emitRunCompletedOnce } from './chunk-JKLZ6YZ3.js';
@@ -249,6 +249,15 @@ function usePhaseCFlags() {
249
249
  const context = useOptionalFeatureFlags();
250
250
  return useMemo(() => resolvePhaseCFlags(context), [context]);
251
251
  }
252
+ function resolveFluidGridsFlagsSettled(context) {
253
+ if (!context) return true;
254
+ if (context.error) return true;
255
+ return evaluationsUsable(context);
256
+ }
257
+ function useFluidGridsFlagsSettled() {
258
+ const context = useOptionalFeatureFlags();
259
+ return useMemo(() => resolveFluidGridsFlagsSettled(context), [context]);
260
+ }
252
261
  function useSelfHostedWorkersEnabled() {
253
262
  return usePhaseCFlags().selfHostedWorkers;
254
263
  }
@@ -1290,6 +1299,74 @@ function CodeWorkflowCardSection({
1290
1299
  );
1291
1300
  }
1292
1301
 
1302
+ // src/builder/components/run-control/node-summary.ts
1303
+ var SIGNAL_RUN_NODE_TYPE = "internal:signal-run";
1304
+ var SET_SEARCH_ATTRIBUTES_NODE_TYPE = "internal:set-search-attributes";
1305
+ function isRecord2(value) {
1306
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1307
+ }
1308
+ function objectOf(value) {
1309
+ if (isRecord2(value)) return value;
1310
+ if (typeof value !== "string" || !value.trim()) return void 0;
1311
+ try {
1312
+ const parsed = JSON.parse(value);
1313
+ return isRecord2(parsed) ? parsed : void 0;
1314
+ } catch {
1315
+ return void 0;
1316
+ }
1317
+ }
1318
+ function short(value) {
1319
+ if (typeof value !== "string" || !value.trim()) return void 0;
1320
+ const text = value.trim();
1321
+ return text.length > 24 ? `${text.slice(0, 23)}\u2026` : text;
1322
+ }
1323
+ function describeSignalRunTarget(target) {
1324
+ const value = objectOf(target);
1325
+ if (!value) return void 0;
1326
+ if (value.parent === true) return { kind: "parent" };
1327
+ const runId = short(value.runId);
1328
+ if (runId) return { kind: "run", runId };
1329
+ const workflowId = short(value.workflowId);
1330
+ const workflowKey = short(value.workflowKey);
1331
+ if (workflowId)
1332
+ return workflowKey ? { kind: "workflow", workflowId, workflowKey } : { kind: "workflow", workflowId };
1333
+ return void 0;
1334
+ }
1335
+ function formatSignalRunTarget(tr, target) {
1336
+ switch (target.kind) {
1337
+ case "parent":
1338
+ return tr("fluidgrids.runControl.node.signalRun.parent", "parent run");
1339
+ case "run":
1340
+ return tr("fluidgrids.runControl.node.signalRun.run", "run {{runId}}", {
1341
+ runId: target.runId
1342
+ });
1343
+ case "workflow":
1344
+ return target.workflowKey ? `${target.workflowKey}/${target.workflowId}` : target.workflowId;
1345
+ }
1346
+ }
1347
+ function readSignalRunSummary(tr, state) {
1348
+ if (!state) return void 0;
1349
+ const signal = short(state.signalName);
1350
+ const described = describeSignalRunTarget(state.target);
1351
+ const target = described ? formatSignalRunTarget(tr, described) : void 0;
1352
+ if (signal && target) return `${signal} \u2192 ${target}`;
1353
+ return signal ?? target;
1354
+ }
1355
+ function readSearchAttributesSummary(state) {
1356
+ const attributes = objectOf(state?.attributes);
1357
+ if (!attributes) return void 0;
1358
+ const names = Object.keys(attributes).sort();
1359
+ if (names.length === 0) return void 0;
1360
+ const shown = names.slice(0, 3).join(", ");
1361
+ return names.length > 3 ? `${shown} +${names.length - 3}` : shown;
1362
+ }
1363
+ function runControlNodeSubtitle(tr, nodeType, state) {
1364
+ if (nodeType === SIGNAL_RUN_NODE_TYPE) return readSignalRunSummary(tr, state);
1365
+ if (nodeType === SET_SEARCH_ATTRIBUTES_NODE_TYPE)
1366
+ return readSearchAttributesSummary(state);
1367
+ return void 0;
1368
+ }
1369
+
1293
1370
  // src/modules/ui-blocks/registry.ts
1294
1371
  var registry = /* @__PURE__ */ new Map();
1295
1372
  function registerCustomBlock(name, component) {
@@ -2535,7 +2612,7 @@ var AdaptiveCardRenderer = forwardRef(function AdaptiveCardRenderer2({ cardData,
2535
2612
  var components_default = AdaptiveCardRenderer;
2536
2613
 
2537
2614
  // src/modules/ui-blocks/parse.ts
2538
- function isRecord2(value) {
2615
+ function isRecord3(value) {
2539
2616
  return typeof value === "object" && value !== null && !Array.isArray(value);
2540
2617
  }
2541
2618
  function humanizeFieldName(name) {
@@ -2546,7 +2623,7 @@ function synthesizeCardFromInputFields(inputFields) {
2546
2623
  if (names.length === 0) return null;
2547
2624
  const body = [];
2548
2625
  for (const name of names) {
2549
- const field = isRecord2(inputFields[name]) ? inputFields[name] : {};
2626
+ const field = isRecord3(inputFields[name]) ? inputFields[name] : {};
2550
2627
  const description = typeof field.description === "string" ? field.description : void 0;
2551
2628
  const required = field.required === true;
2552
2629
  const secret = field.secret === true;
@@ -2577,9 +2654,9 @@ function synthesizeCardFromInputFields(inputFields) {
2577
2654
  }
2578
2655
  function secretFieldNames(inputFields) {
2579
2656
  const names = /* @__PURE__ */ new Set();
2580
- if (!isRecord2(inputFields)) return names;
2657
+ if (!isRecord3(inputFields)) return names;
2581
2658
  for (const [name, field] of Object.entries(inputFields)) {
2582
- if (isRecord2(field) && field.secret === true) names.add(name);
2659
+ if (isRecord3(field) && field.secret === true) names.add(name);
2583
2660
  }
2584
2661
  return names;
2585
2662
  }
@@ -2592,7 +2669,7 @@ function maskSecretInputs(card, secrets) {
2592
2669
  if (secrets.size === 0) return card;
2593
2670
  const visit = (value) => {
2594
2671
  if (Array.isArray(value)) return value.map(visit);
2595
- if (!isRecord2(value)) return value;
2672
+ if (!isRecord3(value)) return value;
2596
2673
  const copy = {};
2597
2674
  for (const [key, nested] of Object.entries(value))
2598
2675
  copy[key] = visit(nested);
@@ -2606,7 +2683,7 @@ function maskSecretInputs(card, secrets) {
2606
2683
  return visit(card);
2607
2684
  }
2608
2685
  function validateUiSpec(raw) {
2609
- if (!isRecord2(raw)) return "ui is not an object";
2686
+ if (!isRecord3(raw)) return "ui is not an object";
2610
2687
  if (raw.version !== 1)
2611
2688
  return `unsupported ui.version: ${String(raw.version)}`;
2612
2689
  if (!Array.isArray(raw.blocks) || raw.blocks.length === 0) {
@@ -2615,7 +2692,7 @@ function validateUiSpec(raw) {
2615
2692
  const seenIds = /* @__PURE__ */ new Set();
2616
2693
  const blocks = [];
2617
2694
  for (const [index, rawBlock] of raw.blocks.entries()) {
2618
- if (!isRecord2(rawBlock)) return `ui.blocks[${index}] is not an object`;
2695
+ if (!isRecord3(rawBlock)) return `ui.blocks[${index}] is not an object`;
2619
2696
  const id = rawBlock.id;
2620
2697
  if (typeof id !== "string" || id.length === 0) {
2621
2698
  return `ui.blocks[${index}] is missing a non-empty string id`;
@@ -2623,7 +2700,7 @@ function validateUiSpec(raw) {
2623
2700
  if (seenIds.has(id)) return `ui.blocks has duplicate id "${id}"`;
2624
2701
  seenIds.add(id);
2625
2702
  if (rawBlock.type === "adaptive_card") {
2626
- if (!isRecord2(rawBlock.card)) {
2703
+ if (!isRecord3(rawBlock.card)) {
2627
2704
  return `ui.blocks[${index}] ("${id}") has no card object`;
2628
2705
  }
2629
2706
  blocks.push({ id, type: "adaptive_card", card: rawBlock.card });
@@ -2635,7 +2712,7 @@ function validateUiSpec(raw) {
2635
2712
  id,
2636
2713
  type: "custom",
2637
2714
  component: rawBlock.component,
2638
- props: isRecord2(rawBlock.props) ? rawBlock.props : void 0
2715
+ props: isRecord3(rawBlock.props) ? rawBlock.props : void 0
2639
2716
  });
2640
2717
  } else {
2641
2718
  return `ui.blocks[${index}] ("${id}") has unknown type "${String(rawBlock.type)}"`;
@@ -2662,7 +2739,7 @@ function resolveUiSpec(operation) {
2662
2739
  `ui-blocks: invalid ui declaration on operation "${operation.name ?? "?"}" (${result}); falling back to adaptive_card`
2663
2740
  );
2664
2741
  }
2665
- if (isRecord2(operation.adaptive_card)) {
2742
+ if (isRecord3(operation.adaptive_card)) {
2666
2743
  return {
2667
2744
  spec: {
2668
2745
  version: 1,
@@ -2677,7 +2754,7 @@ function resolveUiSpec(operation) {
2677
2754
  synthesized: true
2678
2755
  };
2679
2756
  }
2680
- if (isRecord2(operation.input_fields)) {
2757
+ if (isRecord3(operation.input_fields)) {
2681
2758
  const card = synthesizeCardFromInputFields(operation.input_fields);
2682
2759
  if (card) {
2683
2760
  return {
@@ -2692,17 +2769,17 @@ function resolveUiSpec(operation) {
2692
2769
  return null;
2693
2770
  }
2694
2771
  function isSubmitAction(action) {
2695
- return isRecord2(action) && action.type === "Action.Submit";
2772
+ return isRecord3(action) && action.type === "Action.Submit";
2696
2773
  }
2697
2774
  function stripFromActions(actions) {
2698
2775
  return actions.filter((action) => !isSubmitAction(action)).map(
2699
- (action) => isRecord2(action) && isRecord2(action.card) ? { ...action, card: stripSubmitActions(action.card) } : action
2776
+ (action) => isRecord3(action) && isRecord3(action.card) ? { ...action, card: stripSubmitActions(action.card) } : action
2700
2777
  );
2701
2778
  }
2702
2779
  function stripFromElements(elements) {
2703
2780
  const result = [];
2704
2781
  for (const element of elements) {
2705
- if (!isRecord2(element)) {
2782
+ if (!isRecord3(element)) {
2706
2783
  result.push(element);
2707
2784
  continue;
2708
2785
  }
@@ -2717,7 +2794,7 @@ function stripFromElements(elements) {
2717
2794
  }
2718
2795
  if (Array.isArray(el.columns)) {
2719
2796
  el.columns = el.columns.map(
2720
- (column) => isRecord2(column) && Array.isArray(column.items) ? { ...column, items: stripFromElements(column.items) } : column
2797
+ (column) => isRecord3(column) && Array.isArray(column.items) ? { ...column, items: stripFromElements(column.items) } : column
2721
2798
  );
2722
2799
  }
2723
2800
  result.push(el);
@@ -4044,11 +4121,11 @@ function notifyWorkflowSaved(workflowKey) {
4044
4121
  }
4045
4122
 
4046
4123
  // src/builder/lib/display-options.ts
4047
- function isRecord3(value) {
4124
+ function isRecord4(value) {
4048
4125
  return typeof value === "object" && value !== null && !Array.isArray(value);
4049
4126
  }
4050
4127
  function readRuleSet(value) {
4051
- if (!isRecord3(value)) return void 0;
4128
+ if (!isRecord4(value)) return void 0;
4052
4129
  const rules = {};
4053
4130
  for (const [key, allowed] of Object.entries(value)) {
4054
4131
  if (Array.isArray(allowed)) rules[key] = allowed;
@@ -4057,8 +4134,8 @@ function readRuleSet(value) {
4057
4134
  return Object.keys(rules).length > 0 ? rules : void 0;
4058
4135
  }
4059
4136
  function readDisplayOptions(spec) {
4060
- const raw = isRecord3(spec) ? spec.displayOptions : void 0;
4061
- if (!isRecord3(raw)) return void 0;
4137
+ const raw = isRecord4(spec) ? spec.displayOptions : void 0;
4138
+ if (!isRecord4(raw)) return void 0;
4062
4139
  const show = readRuleSet(raw.show);
4063
4140
  const hide = readRuleSet(raw.hide);
4064
4141
  if (!show && !hide) return void 0;
@@ -4071,7 +4148,7 @@ function matches(current, allowed) {
4071
4148
  );
4072
4149
  }
4073
4150
  function isParamVisible(spec, values, defaults = {}) {
4074
- const options = isRecord3(spec) ? readDisplayOptions(spec) ?? (isRecord3(spec.show) || isRecord3(spec.hide) ? readDisplayOptions({ displayOptions: spec }) : void 0) : void 0;
4151
+ const options = isRecord4(spec) ? readDisplayOptions(spec) ?? (isRecord4(spec.show) || isRecord4(spec.hide) ? readDisplayOptions({ displayOptions: spec }) : void 0) : void 0;
4075
4152
  if (!options) return true;
4076
4153
  const valueOf = (key) => values[key] === void 0 ? defaults[key] : values[key];
4077
4154
  if (options.show) {
@@ -4091,7 +4168,7 @@ function isParamVisible(spec, values, defaults = {}) {
4091
4168
  function defaultsOf(fields) {
4092
4169
  const defaults = {};
4093
4170
  for (const [name, spec] of Object.entries(fields)) {
4094
- if (isRecord3(spec) && spec.default !== void 0)
4171
+ if (isRecord4(spec) && spec.default !== void 0)
4095
4172
  defaults[name] = spec.default;
4096
4173
  }
4097
4174
  return defaults;
@@ -4102,17 +4179,17 @@ function dropHiddenParameters(state, fields, mappedFields = /* @__PURE__ */ new
4102
4179
  let next;
4103
4180
  const ensure = () => next ??= { ...state };
4104
4181
  for (const [name, spec] of Object.entries(fields)) {
4105
- if (!isRecord3(spec)) continue;
4182
+ if (!isRecord4(spec)) continue;
4106
4183
  if (!mappedFields.has(name) && Object.hasOwn(state, name) && !isParamVisible(spec, state, defaults)) {
4107
4184
  delete ensure()[name];
4108
4185
  continue;
4109
4186
  }
4110
- const rowFields = isRecord3(spec.fields) ? spec.fields : void 0;
4187
+ const rowFields = isRecord4(spec.fields) ? spec.fields : void 0;
4111
4188
  const rows = state[name];
4112
4189
  if (rowFields && Array.isArray(rows)) {
4113
4190
  let changed = false;
4114
4191
  const cleaned = rows.map((row) => {
4115
- if (!isRecord3(row)) return row;
4192
+ if (!isRecord4(row)) return row;
4116
4193
  const cleanedRow = dropHiddenParameters(row, rowFields);
4117
4194
  if (cleanedRow !== row) changed = true;
4118
4195
  return cleanedRow;
@@ -4124,7 +4201,7 @@ function dropHiddenParameters(state, fields, mappedFields = /* @__PURE__ */ new
4124
4201
  }
4125
4202
 
4126
4203
  // src/builder/lib/field-schema.ts
4127
- function isRecord4(value) {
4204
+ function isRecord5(value) {
4128
4205
  return typeof value === "object" && value !== null && !Array.isArray(value);
4129
4206
  }
4130
4207
  function isIdentifier(key) {
@@ -4143,11 +4220,11 @@ function pathToExpression(path) {
4143
4220
  function mergeFieldSpecs(common, variant) {
4144
4221
  const base = typeof common === "string" ? { type: common } : common;
4145
4222
  const branch = typeof variant === "string" ? { type: variant } : variant;
4146
- if (!isRecord4(base) || !isRecord4(branch)) return branch;
4223
+ if (!isRecord5(base) || !isRecord5(branch)) return branch;
4147
4224
  const merged = { ...base, ...branch };
4148
4225
  const commonProperties = base.properties;
4149
4226
  const branchProperties = branch.properties;
4150
- if (isRecord4(commonProperties) && isRecord4(branchProperties)) {
4227
+ if (isRecord5(commonProperties) && isRecord5(branchProperties)) {
4151
4228
  merged.properties = Object.fromEntries(
4152
4229
  Object.entries({ ...commonProperties, ...branchProperties }).map(
4153
4230
  ([key, value]) => [
@@ -4166,14 +4243,14 @@ function fieldFromSpec(key, path, spec) {
4166
4243
  if (typeof spec === "string") {
4167
4244
  return { key, path, type: spec };
4168
4245
  }
4169
- if (isRecord4(spec)) {
4246
+ if (isRecord5(spec)) {
4170
4247
  const declaredType2 = typeof spec.type === "string" ? spec.type : void 0;
4171
4248
  const description = typeof spec.description === "string" ? spec.description : void 0;
4172
4249
  const required = spec.required === true;
4173
4250
  const alternatives = ["oneOf", "anyOf"].flatMap((keyword) => {
4174
4251
  const variants = spec[keyword];
4175
4252
  return Array.isArray(variants) ? variants.flatMap(
4176
- (variant, index) => isRecord4(variant) || typeof variant === "string" ? [{ keyword, index, variant }] : []
4253
+ (variant, index) => isRecord5(variant) || typeof variant === "string" ? [{ keyword, index, variant }] : []
4177
4254
  ) : [];
4178
4255
  });
4179
4256
  if (alternatives.length > 0) {
@@ -4202,7 +4279,7 @@ function fieldFromSpec(key, path, spec) {
4202
4279
  type: declaredType2 ?? [...new Set(children.map((field) => field.type))].join(" | ")
4203
4280
  };
4204
4281
  }
4205
- if (isRecord4(spec.properties) && (!declaredType2 || declaredType2 === "object")) {
4282
+ if (isRecord5(spec.properties) && (!declaredType2 || declaredType2 === "object")) {
4206
4283
  const children = Object.entries(spec.properties).map(
4207
4284
  ([childKey, childSpec]) => fieldFromSpec(childKey, joinPath(path, childKey), childSpec)
4208
4285
  );
@@ -4224,7 +4301,7 @@ function fieldFromSpec(key, path, spec) {
4224
4301
  return { key, path, type: "any" };
4225
4302
  }
4226
4303
  function fieldsFromIO(io, root = "") {
4227
- if (!isRecord4(io)) return [];
4304
+ if (!isRecord5(io)) return [];
4228
4305
  return Object.entries(io).map(
4229
4306
  ([key, spec]) => fieldFromSpec(key, joinPath(root, key), spec)
4230
4307
  );
@@ -4243,7 +4320,7 @@ function fieldFromValue(key, path, value) {
4243
4320
  const children = value.length > 0 ? [fieldFromValue("0", `${path}[0]`, value[0])] : void 0;
4244
4321
  return { key, path, type: "array", children };
4245
4322
  }
4246
- if (isRecord4(value)) {
4323
+ if (isRecord5(value)) {
4247
4324
  const children = Object.entries(value).map(
4248
4325
  ([k, v]) => fieldFromValue(k, joinPath(path, k), v)
4249
4326
  );
@@ -4252,7 +4329,7 @@ function fieldFromValue(key, path, value) {
4252
4329
  return { key, path, type: typeOfValue(value) };
4253
4330
  }
4254
4331
  function fieldsFromValue(value, root = "") {
4255
- if (!isRecord4(value)) return [];
4332
+ if (!isRecord5(value)) return [];
4256
4333
  return Object.entries(value).map(
4257
4334
  ([key, v]) => fieldFromValue(key, joinPath(root, key), v)
4258
4335
  );
@@ -4268,13 +4345,13 @@ function declaredOutputFields(nodeType, op) {
4268
4345
  }
4269
4346
  function normalizeOperations(raw) {
4270
4347
  if (Array.isArray(raw)) return raw;
4271
- if (isRecord4(raw) && Array.isArray(raw.operations)) {
4348
+ if (isRecord5(raw) && Array.isArray(raw.operations)) {
4272
4349
  return raw.operations;
4273
4350
  }
4274
4351
  return [];
4275
4352
  }
4276
4353
  function resolveNodeOperation(data, fallbackOperations) {
4277
- const nodeData = isRecord4(data?.nodeData) ? data?.nodeData : void 0;
4354
+ const nodeData = isRecord5(data?.nodeData) ? data?.nodeData : void 0;
4278
4355
  let operations = normalizeOperations(nodeData?.operations);
4279
4356
  if (operations.length === 0) {
4280
4357
  operations = normalizeOperations(data?.operations);
@@ -4288,11 +4365,11 @@ function resolveNodeOperation(data, fallbackOperations) {
4288
4365
  }
4289
4366
 
4290
4367
  // src/builder/lib/parameter-values.ts
4291
- function isRecord5(value) {
4368
+ function isRecord6(value) {
4292
4369
  return typeof value === "object" && value !== null && !Array.isArray(value);
4293
4370
  }
4294
4371
  function record(value) {
4295
- return isRecord5(value) ? value : void 0;
4372
+ return isRecord6(value) ? value : void 0;
4296
4373
  }
4297
4374
  function declaredType(schema) {
4298
4375
  const type = typeof schema === "string" ? schema : record(schema)?.type;
@@ -7778,7 +7855,12 @@ var getNodeMetadata = (value) => {
7778
7855
  const argsState = data?.args?.state;
7779
7856
  const rules = argsState?.rules;
7780
7857
  const mode = argsState?.mode;
7781
- const logicSubtitle = isWaitForSignal ? readSignalName(argsState) : Array.isArray(rules) ? `${rules.length} rule${rules.length === 1 ? "" : "s"}` : typeof mode === "string" ? mode : void 0;
7858
+ const runControlSubtitle = runControlNodeSubtitle(
7859
+ tr,
7860
+ value?.type,
7861
+ argsState
7862
+ );
7863
+ const logicSubtitle = isWaitForSignal ? readSignalName(argsState) : runControlSubtitle !== void 0 ? runControlSubtitle : Array.isArray(rules) ? `${rules.length} rule${rules.length === 1 ? "" : "s"}` : typeof mode === "string" ? mode : void 0;
7782
7864
  return /* @__PURE__ */ jsxs("div", { children: [
7783
7865
  /* @__PURE__ */ jsx(
7784
7866
  LogicNodeCard,
@@ -8240,4 +8322,4 @@ function createNodeWithDefaultData(type, data) {
8240
8322
  return Object.assign(createNodeData(type, defaultData), data);
8241
8323
  }
8242
8324
 
8243
- export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_TYPES, NodePropertyPanel, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canSignalRun, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, departingSave, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatElapsedMs, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, isDurableFunctionNodeType, isFlowComplete, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, nodeStateDurationMs, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveNodeOperation, resolvePhaseCFlags, resolveUiSpec, runDurationMs, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useGuardedNavigate, useInitiateOAuth, useInsertNode, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };
8325
+ export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_TYPES, NodePropertyPanel, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canSignalRun, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, departingSave, durableInterfaceOf, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatElapsedMs, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, isDurableFunctionNodeType, isFlowComplete, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, nodeStateDurationMs, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveFluidGridsFlagsSettled, resolveNodeOperation, resolvePhaseCFlags, resolveUiSpec, runDurationMs, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsFlagsSettled, useGuardedNavigate, useInitiateOAuth, useInsertNode, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };