@burdenoff/fluidgrids-fe-sdk 2026.925.1 → 2026.929.1

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 (59) hide show
  1. package/README.md +14 -0
  2. package/dist/ExecutionDetailPage-F5XOP3JQ.js +12 -0
  3. package/dist/{ExecutionDetailPage-3ZJMNWBY.js.map → ExecutionDetailPage-F5XOP3JQ.js.map} +1 -1
  4. package/dist/ExecutionsListPage-KQZK2T4O.js +11 -0
  5. package/dist/{ExecutionsListPage-FPNETFQX.js.map → ExecutionsListPage-KQZK2T4O.js.map} +1 -1
  6. package/dist/{WorkflowBuilder-DMOOLJBN.js → WorkflowBuilder-TJFZ2TA3.js} +7 -7
  7. package/dist/{WorkflowBuilder-DMOOLJBN.js.map → WorkflowBuilder-TJFZ2TA3.js.map} +1 -1
  8. package/dist/WorkflowsList-72U6TS4Y.js +13 -0
  9. package/dist/{WorkflowsList-GEPG3OZ6.js.map → WorkflowsList-72U6TS4Y.js.map} +1 -1
  10. package/dist/{chunk-QLWHIBQJ.js → chunk-5FFVT22V.js} +5 -5
  11. package/dist/{chunk-QLWHIBQJ.js.map → chunk-5FFVT22V.js.map} +1 -1
  12. package/dist/{chunk-WVKQZOWG.js → chunk-C44DTSC6.js} +244 -51
  13. package/dist/chunk-C44DTSC6.js.map +1 -0
  14. package/dist/chunk-EXJYUEXA.js +9834 -0
  15. package/dist/chunk-EXJYUEXA.js.map +1 -0
  16. package/dist/{chunk-O4UTOCZJ.js → chunk-EXNXJ7VL.js} +3 -3
  17. package/dist/{chunk-O4UTOCZJ.js.map → chunk-EXNXJ7VL.js.map} +1 -1
  18. package/dist/{chunk-UBKJDGYS.js → chunk-FJC2RJ4Y.js} +27 -3
  19. package/dist/chunk-FJC2RJ4Y.js.map +1 -0
  20. package/dist/{chunk-A6PDDUMN.js → chunk-GZCHKR3C.js} +4 -4
  21. package/dist/{chunk-A6PDDUMN.js.map → chunk-GZCHKR3C.js.map} +1 -1
  22. package/dist/{chunk-VC4L742J.js → chunk-IFQXZBKJ.js} +34 -31
  23. package/dist/chunk-IFQXZBKJ.js.map +1 -0
  24. package/dist/{chunk-ZZ3SFJXV.js → chunk-OCE32VUK.js} +4 -4
  25. package/dist/{chunk-ZZ3SFJXV.js.map → chunk-OCE32VUK.js.map} +1 -1
  26. package/dist/{chunk-IOP2IBDV.js → chunk-PTHYN6HY.js} +4 -4
  27. package/dist/{chunk-IOP2IBDV.js.map → chunk-PTHYN6HY.js.map} +1 -1
  28. package/dist/{chunk-QV6T4R4T.js → chunk-TPDO2EIC.js} +3 -3
  29. package/dist/{chunk-QV6T4R4T.js.map → chunk-TPDO2EIC.js.map} +1 -1
  30. package/dist/{chunk-YMD3T6J2.js → chunk-ULNNTBJO.js} +12 -2
  31. package/dist/chunk-ULNNTBJO.js.map +1 -0
  32. package/dist/{chunk-T7FJ2TBD.js → chunk-XBQBM3SE.js} +4 -4
  33. package/dist/{chunk-T7FJ2TBD.js.map → chunk-XBQBM3SE.js.map} +1 -1
  34. package/dist/{chunk-YQ4GDK4I.js → chunk-YBX7EDDR.js} +3 -3
  35. package/dist/{chunk-YQ4GDK4I.js.map → chunk-YBX7EDDR.js.map} +1 -1
  36. package/dist/{chunk-H5LGKSBM.js → chunk-ZTLWHD2V.js} +3 -3
  37. package/dist/{chunk-H5LGKSBM.js.map → chunk-ZTLWHD2V.js.map} +1 -1
  38. package/dist/executions.js +5 -5
  39. package/dist/history.js +3 -3
  40. package/dist/index.d.ts +81332 -35216
  41. package/dist/index.js +41 -43
  42. package/dist/index.js.map +1 -1
  43. package/dist/nodes.js +2 -2
  44. package/dist/settings.js +3 -3
  45. package/dist/templates.js +5 -5
  46. package/dist/{workflow-builder-Y7PcoT2O.d.ts → workflow-builder-DIjITfNE.d.ts} +17 -0
  47. package/dist/workflow-builder.d.ts +1 -1
  48. package/dist/workflow-builder.js +6 -6
  49. package/dist/workflows-list.js +4 -4
  50. package/package.json +1 -1
  51. package/dist/ExecutionDetailPage-3ZJMNWBY.js +0 -12
  52. package/dist/ExecutionsListPage-FPNETFQX.js +0 -11
  53. package/dist/WorkflowsList-GEPG3OZ6.js +0 -13
  54. package/dist/chunk-RGLDGMAB.js +0 -4940
  55. package/dist/chunk-RGLDGMAB.js.map +0 -1
  56. package/dist/chunk-UBKJDGYS.js.map +0 -1
  57. package/dist/chunk-VC4L742J.js.map +0 -1
  58. package/dist/chunk-WVKQZOWG.js.map +0 -1
  59. package/dist/chunk-YMD3T6J2.js.map +0 -1
@@ -7,10 +7,10 @@ import { GetMyNodeInstallationsDocument, BrowseWorkflowTemplatesDocument, Instal
7
7
  import { QuotaExhaustedDialog } from './chunk-AANIWER2.js';
8
8
  import { SdkPermissionGate, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton } from './chunk-W23ZXNKU.js';
9
9
  import { cn as cn$1 } from './chunk-3ZYUGTIT.js';
10
- import { useWorkflowVersions, useRestoreWorkflowVersion, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-H5LGKSBM.js';
10
+ import { useWorkflowVersions, useRestoreWorkflowVersion, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-ZTLWHD2V.js';
11
11
  import { config, getFluidGridsConfig, validateTrustedOrigin, setFluidGridsConfig, resetFluidGridsConfig } from './chunk-U4AJLVHA.js';
12
- import { useFlowStore } from './chunk-YMD3T6J2.js';
13
- import { NodeEndpointConfigsDocument, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowRunDocument, FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, NodeSchemaIntrospectionDocument, useWorkflowPinnedDataQuery, usePinNodeDataMutation, useUnpinNodeDataMutation, EventRegistrationsDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument } from './chunk-UBKJDGYS.js';
12
+ import { useFlowStore } from './chunk-ULNNTBJO.js';
13
+ import { NodeEndpointConfigsDocument, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowRunDocument, FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, NodeSchemaIntrospectionDocument, useWorkflowPinnedDataQuery, usePinNodeDataMutation, useUnpinNodeDataMutation, EventRegistrationsDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument } from './chunk-FJC2RJ4Y.js';
14
14
  import { throwIfResultError, describeOperationError } from './chunk-LMO5ASOE.js';
15
15
  import { useTr, FluidGridsTranslationProvider, ENGLISH_FALLBACK_TRANSLATOR } from './chunk-7YWBH2A5.js';
16
16
  import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-5BDQNSP3.js';
@@ -3601,6 +3601,7 @@ function ConnectionSelector({
3601
3601
  ] });
3602
3602
  }
3603
3603
  var TRIGGER_WORKFLOW = TriggerWorkflowDocument;
3604
+ var EXECUTE_STEP = ExecuteStepDocument;
3604
3605
  var WORKFLOW_RUN = WorkflowRunDocument;
3605
3606
  var RUN_FROM_NODE = RunFromNodeDocument;
3606
3607
  var EXECUTION_DETAIL = ExecutionDetailDocument;
@@ -3640,6 +3641,7 @@ function useNodeExecution() {
3640
3641
  const startExecution = useFlowStore(
3641
3642
  (s) => s.actions.execution.startExecution
3642
3643
  );
3644
+ const setStepPlan = useFlowStore((s) => s.actions.execution.setStepPlan);
3643
3645
  const addLog = useFlowStore((s) => s.actions.execution.addLog);
3644
3646
  const updateLog = useFlowStore((s) => s.actions.execution.updateLog);
3645
3647
  const setNodeStatus = useFlowStore((s) => s.actions.execution.setNodeStatus);
@@ -3824,58 +3826,51 @@ function useNodeExecution() {
3824
3826
  },
3825
3827
  [processNodeStates, completeExecution, cleanup]
3826
3828
  );
3827
- const executeNode = useCallback(
3828
- async (stopAtNodeId) => {
3829
- const triggerNode = findTriggerNode();
3830
- if (!triggerNode) {
3831
- console.error("[useNodeExecution] No trigger node found in workflow");
3832
- return { success: false, error: "No trigger node found" };
3833
- }
3829
+ const executeStep = useCallback(
3830
+ async (nodeId) => {
3834
3831
  cleanup();
3835
3832
  clearLogs();
3836
3833
  const workflowKey = workflow.workflowKey || workflow.id;
3837
3834
  const version = workflow.version || "1.0.0";
3838
3835
  if (!workflowKey) {
3839
3836
  console.error(
3840
- "[useNodeExecution] Workflow must be saved before execution. No workflowKey found."
3837
+ "[useNodeExecution] Workflow must be saved before step execution. No workflowKey found."
3841
3838
  );
3842
3839
  return {
3843
3840
  success: false,
3844
3841
  error: "Workflow must be saved before execution"
3845
3842
  };
3846
3843
  }
3847
- setNodeStatus(stopAtNodeId, "running");
3844
+ setNodeStatus(nodeId, "running");
3848
3845
  try {
3849
3846
  const client = getFluidGridsClient();
3850
3847
  const result = throwIfResultError(
3851
3848
  await client.mutate({
3852
- mutation: TRIGGER_WORKFLOW,
3849
+ mutation: EXECUTE_STEP,
3853
3850
  variables: {
3854
3851
  input: {
3855
3852
  workflowKey,
3856
3853
  version,
3857
- triggerNodeId: triggerNode.id,
3858
- triggerData: {},
3859
- context: {},
3860
- stopAtNodeId,
3861
- // Step execution from the builder is always a manual/debug
3862
- // run (BOFF-7511) — pinned node data only ever applies here,
3863
- // never on a PRODUCTION trigger (webhook, schedule, API).
3864
- mode: "TEST"
3854
+ nodeId
3865
3855
  }
3866
3856
  }
3867
3857
  })
3868
3858
  );
3869
- const triggerResult = result.data?.triggerWorkflow;
3870
- if (triggerResult) {
3871
- const backendRunId = triggerResult.runId;
3872
- startExecution(stopAtNodeId, backendRunId);
3859
+ const stepResult = result.data?.executeStep;
3860
+ if (stepResult) {
3861
+ const backendRunId = stepResult.runId;
3862
+ startExecution(nodeId, backendRunId);
3863
+ setStepPlan({
3864
+ runId: backendRunId,
3865
+ ...stepResult.plan,
3866
+ sourceRunId: stepResult.plan.sourceRunId ?? null
3867
+ });
3873
3868
  const initialLog = {
3874
- id: `${backendRunId}-${stopAtNodeId}`,
3869
+ id: `${backendRunId}-${nodeId}`,
3875
3870
  runId: backendRunId,
3876
- nodeId: stopAtNodeId,
3877
- nodeType: workflow.nodes.find((n) => n.id === stopAtNodeId)?.type || "unknown",
3878
- nodeName: getNodeName(stopAtNodeId),
3871
+ nodeId,
3872
+ nodeType: workflow.nodes.find((node) => node.id === nodeId)?.type || "unknown",
3873
+ nodeName: getNodeName(nodeId),
3879
3874
  status: "running",
3880
3875
  inputArgs: null,
3881
3876
  output: null,
@@ -3886,21 +3881,21 @@ function useNodeExecution() {
3886
3881
  };
3887
3882
  addLog(initialLog);
3888
3883
  pollRunUpdates(backendRunId);
3889
- return { success: true, runId: backendRunId };
3884
+ return { success: true, runId: backendRunId, plan: stepResult.plan };
3890
3885
  }
3891
- console.error("[useNodeExecution] No result from trigger");
3892
- setNodeStatus(stopAtNodeId, "error");
3893
- return { success: false, error: "No result from trigger" };
3886
+ console.error("[useNodeExecution] No result from executeStep");
3887
+ setNodeStatus(nodeId, "error");
3888
+ return { success: false, error: "No result from executeStep" };
3894
3889
  } catch (error) {
3895
- console.error("[useNodeExecution] Error triggering workflow:", error);
3890
+ console.error("[useNodeExecution] Error executing step:", error);
3896
3891
  const errorMessage = describeOperationError(error);
3897
3892
  const errorRunId = nanoid$1();
3898
3893
  const errorLog = {
3899
- id: `${errorRunId}-${stopAtNodeId}`,
3894
+ id: `${errorRunId}-${nodeId}`,
3900
3895
  runId: errorRunId,
3901
- nodeId: stopAtNodeId,
3902
- nodeType: workflow.nodes.find((n) => n.id === stopAtNodeId)?.type || "unknown",
3903
- nodeName: getNodeName(stopAtNodeId),
3896
+ nodeId,
3897
+ nodeType: workflow.nodes.find((node) => node.id === nodeId)?.type || "unknown",
3898
+ nodeName: getNodeName(nodeId),
3904
3899
  status: "failed",
3905
3900
  inputArgs: null,
3906
3901
  output: null,
@@ -3910,16 +3905,16 @@ function useNodeExecution() {
3910
3905
  endTime: (/* @__PURE__ */ new Date()).toISOString()
3911
3906
  };
3912
3907
  addLog(errorLog);
3913
- setNodeStatus(stopAtNodeId, "error");
3908
+ setNodeStatus(nodeId, "error");
3914
3909
  completeExecution();
3915
3910
  return { success: false, error: errorMessage };
3916
3911
  }
3917
3912
  },
3918
3913
  [
3919
- findTriggerNode,
3920
3914
  cleanup,
3921
3915
  clearLogs,
3922
3916
  startExecution,
3917
+ setStepPlan,
3923
3918
  workflow,
3924
3919
  getNodeName,
3925
3920
  addLog,
@@ -3961,8 +3956,9 @@ function useNodeExecution() {
3961
3956
  triggerNodeId: triggerNode.id,
3962
3957
  triggerData: customTriggerData || {},
3963
3958
  context: {},
3964
- // Builder "Test workflow" is always a manual/debug run
3965
- // (BOFF-7511) — see the note on executeNode above.
3959
+ // Builder "Test workflow" is always a manual/debug run.
3960
+ // Pinned node data only applies to TEST executions, never a
3961
+ // production trigger (webhook, schedule, API).
3966
3962
  mode: "TEST"
3967
3963
  }
3968
3964
  }
@@ -4030,7 +4026,7 @@ function useNodeExecution() {
4030
4026
  sourceRunId,
4031
4027
  nodeId,
4032
4028
  // Run-from-node is a debug affordance — always TEST, same
4033
- // rule as executeNode/executeFullWorkflow above.
4029
+ // rule as the other builder debug execution paths.
4034
4030
  mode: "TEST"
4035
4031
  }
4036
4032
  }
@@ -4117,7 +4113,7 @@ function useNodeExecution() {
4117
4113
  };
4118
4114
  }, [cleanup, completeExecution]);
4119
4115
  return {
4120
- executeNode,
4116
+ executeStep,
4121
4117
  executeFullWorkflow,
4122
4118
  executeFromNode,
4123
4119
  loadExecution,
@@ -6665,7 +6661,7 @@ var getNodeMetadata = (value) => {
6665
6661
  return updated;
6666
6662
  });
6667
6663
  }, [nodeType, id, edges, data, setNodes, zustandSetNodes]);
6668
- const { executeNode } = useNodeExecution();
6664
+ const { executeStep } = useNodeExecution();
6669
6665
  const deleteNode = useDeleteNode();
6670
6666
  const handleDeleteNode = () => {
6671
6667
  deleteNode(id);
@@ -6723,11 +6719,11 @@ var getNodeMetadata = (value) => {
6723
6719
  openNdv({ nodeId: id, type: value?.type });
6724
6720
  }, [id, openNdv]);
6725
6721
  const handleExecuteStep = useCallback(() => {
6726
- executeNode(id).then((_result) => {
6722
+ executeStep(id).then((_result) => {
6727
6723
  }).catch((error) => {
6728
- console.error("[NodeComponent] Execute error:", error);
6724
+ console.error("[NodeComponent] Execute step error:", error);
6729
6725
  });
6730
- }, [executeNode, id]);
6726
+ }, [executeStep, id]);
6731
6727
  const missingCredentials = useMemo(() => {
6732
6728
  const visibleAdapters = getVisibleConnectionAdapters(
6733
6729
  String(value?.type ?? ""),
@@ -8916,6 +8912,53 @@ function buildNodeCheck(requiredNodeTypes, installedAppIds) {
8916
8912
  canImport: missingPaid.length === 0
8917
8913
  };
8918
8914
  }
8915
+ var FLUIDGRIDS_BRAND = "FluidGrids";
8916
+ var FLUIDGRIDS_SITE_URL = "https://www.fluidgrids.ai";
8917
+ var ENGLISH_LABEL = `Powered by ${FLUIDGRIDS_BRAND}`;
8918
+ function resolveFluidGridsMarkLabel(tr) {
8919
+ const translated = tr(
8920
+ "fluidgrids.components.fluidGridsMark.poweredBy",
8921
+ "Powered by {{brand}}",
8922
+ { brand: FLUIDGRIDS_BRAND }
8923
+ );
8924
+ return typeof translated === "string" && translated.includes(FLUIDGRIDS_BRAND) ? translated : ENGLISH_LABEL;
8925
+ }
8926
+ function FluidGridsMark() {
8927
+ const tr = useTr();
8928
+ const label = resolveFluidGridsMarkLabel(tr);
8929
+ return /* @__PURE__ */ jsxs(
8930
+ "a",
8931
+ {
8932
+ href: FLUIDGRIDS_SITE_URL,
8933
+ target: "_blank",
8934
+ rel: "noopener noreferrer",
8935
+ className: "absolute right-3 top-3 z-10 flex items-center gap-1.5 whitespace-nowrap rounded-full border border-card-foreground/10 bg-card/90 px-2.5 py-1 text-[11px] font-medium text-card-foreground shadow-sm backdrop-blur transition-opacity hover:opacity-90",
8936
+ children: [
8937
+ /* @__PURE__ */ jsx(FluidGridsGlyph, {}),
8938
+ label
8939
+ ]
8940
+ }
8941
+ );
8942
+ }
8943
+ function FluidGridsGlyph() {
8944
+ return /* @__PURE__ */ jsx(
8945
+ "svg",
8946
+ {
8947
+ viewBox: "90 92 332 332",
8948
+ "aria-hidden": "true",
8949
+ focusable: "false",
8950
+ className: "size-3.5 shrink-0 text-primary",
8951
+ children: /* @__PURE__ */ jsx(
8952
+ "path",
8953
+ {
8954
+ fill: "currentColor",
8955
+ fillRule: "evenodd",
8956
+ d: "M256 96C256 96 372 232 372 312C372 376 320 420 256 420C192 420 140 376 140 312C140 232 256 96 256 96ZM256 176C238 210 210 244 210 296C210 332 234 356 268 360C236 348 230 322 244 296C258 270 270 230 256 176ZM278 268h40v40h-40ZM330 268h40v40h-40ZM278 320h40v40h-40ZM330 320h40v40h-40Z"
8957
+ }
8958
+ )
8959
+ }
8960
+ );
8961
+ }
8919
8962
  function useNodeList(nodes) {
8920
8963
  return useMemo(() => {
8921
8964
  return nodes.slice().sort((a, b) => {
@@ -23809,11 +23852,13 @@ function NodeDetailView() {
23809
23852
  const [inputView, setInputView] = useState("schema");
23810
23853
  const executionLogs = useFlowStore((s) => s.execution.logs);
23811
23854
  const currentRunId = useFlowStore((s) => s.execution.currentRunId);
23855
+ const stepPlan = useFlowStore((s) => s.execution.stepPlan);
23812
23856
  const nodeLog = useMemo(() => {
23813
23857
  if (!ndv?.nodeId) return null;
23814
23858
  const matches = executionLogs.filter((l) => l.nodeId === ndv.nodeId);
23815
23859
  return matches.length > 0 ? matches[matches.length - 1] : null;
23816
23860
  }, [executionLogs, ndv?.nodeId]);
23861
+ const stepPlanForNode = stepPlan?.runId === currentRunId && stepPlan.targetNodeId === ndv?.nodeId ? stepPlan : null;
23817
23862
  const hasRealOutput = !!nodeLog?.output && Object.keys(nodeLog.output).length > 0;
23818
23863
  const hasRealInput = !!nodeLog?.inputArgs && Object.keys(nodeLog.inputArgs).length > 0;
23819
23864
  const realOutputFields = useMemo(
@@ -23978,6 +24023,7 @@ function NodeDetailView() {
23978
24023
  }
23979
24024
  )
23980
24025
  ] }),
24026
+ stepPlanForNode && /* @__PURE__ */ jsx(StepExecutionPlanSummary, { plan: stepPlanForNode }),
23981
24027
  !threePaneLayout && /* @__PURE__ */ jsxs(
23982
24028
  "div",
23983
24029
  {
@@ -24302,6 +24348,152 @@ function NodeDetailView() {
24302
24348
  }
24303
24349
  ) });
24304
24350
  }
24351
+ function StepExecutionPlanSummary({ plan }) {
24352
+ const tr = useTr();
24353
+ return /* @__PURE__ */ jsxs(
24354
+ "section",
24355
+ {
24356
+ className: "shrink-0 border-b border-border bg-muted/30 px-4 py-2.5",
24357
+ "data-testid": "ndv-step-execution-plan",
24358
+ "aria-live": "polite",
24359
+ children: [
24360
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1", children: [
24361
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-foreground", children: tr(
24362
+ "fluidgrids.builder.nodeDetailView.stepPlanTitle",
24363
+ "TEST execution plan"
24364
+ ) }),
24365
+ /* @__PURE__ */ jsx(
24366
+ PlanMetric,
24367
+ {
24368
+ label: tr(
24369
+ "fluidgrids.builder.nodeDetailView.stepPlanExecute",
24370
+ "Execute"
24371
+ ),
24372
+ count: plan.executeNodeIds.length
24373
+ }
24374
+ ),
24375
+ /* @__PURE__ */ jsx(
24376
+ PlanMetric,
24377
+ {
24378
+ label: tr("fluidgrids.builder.nodeDetailView.stepPlanReuse", "Reuse"),
24379
+ count: plan.reusedNodeIds.length
24380
+ }
24381
+ ),
24382
+ /* @__PURE__ */ jsx(
24383
+ PlanMetric,
24384
+ {
24385
+ label: tr(
24386
+ "fluidgrids.builder.nodeDetailView.stepPlanPinned",
24387
+ "Pinned"
24388
+ ),
24389
+ count: plan.pinnedNodeIds.length
24390
+ }
24391
+ ),
24392
+ /* @__PURE__ */ jsx(
24393
+ PlanMetric,
24394
+ {
24395
+ label: tr(
24396
+ "fluidgrids.builder.nodeDetailView.stepPlanBlockers",
24397
+ "Blockers"
24398
+ ),
24399
+ count: plan.blockers.length
24400
+ }
24401
+ )
24402
+ ] }),
24403
+ plan.sourceRunId && /* @__PURE__ */ jsxs("p", { className: "mt-1 text-[11px] text-muted-foreground", children: [
24404
+ tr(
24405
+ "fluidgrids.builder.nodeDetailView.stepPlanSource",
24406
+ "Using compatible TEST data from run"
24407
+ ),
24408
+ " ",
24409
+ /* @__PURE__ */ jsx("code", { className: "font-mono text-foreground", children: plan.sourceRunId })
24410
+ ] }),
24411
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 grid gap-2 sm:grid-cols-2", children: [
24412
+ /* @__PURE__ */ jsx(
24413
+ PlanNodeList,
24414
+ {
24415
+ label: tr(
24416
+ "fluidgrids.builder.nodeDetailView.stepPlanExecuteNodes",
24417
+ "Nodes to execute"
24418
+ ),
24419
+ nodeIds: plan.executeNodeIds,
24420
+ emptyLabel: tr(
24421
+ "fluidgrids.builder.nodeDetailView.stepPlanExecuteNodesEmpty",
24422
+ "No nodes need execution."
24423
+ )
24424
+ }
24425
+ ),
24426
+ /* @__PURE__ */ jsx(
24427
+ PlanNodeList,
24428
+ {
24429
+ label: tr(
24430
+ "fluidgrids.builder.nodeDetailView.stepPlanReusedNodes",
24431
+ "Reused nodes"
24432
+ ),
24433
+ nodeIds: plan.reusedNodeIds,
24434
+ emptyLabel: tr(
24435
+ "fluidgrids.builder.nodeDetailView.stepPlanReusedNodesEmpty",
24436
+ "No prior node data reused."
24437
+ )
24438
+ }
24439
+ ),
24440
+ /* @__PURE__ */ jsx(
24441
+ PlanNodeList,
24442
+ {
24443
+ label: tr(
24444
+ "fluidgrids.builder.nodeDetailView.stepPlanPinnedNodes",
24445
+ "Pinned nodes"
24446
+ ),
24447
+ nodeIds: plan.pinnedNodeIds,
24448
+ emptyLabel: tr(
24449
+ "fluidgrids.builder.nodeDetailView.stepPlanPinnedNodesEmpty",
24450
+ "No pinned data used."
24451
+ )
24452
+ }
24453
+ ),
24454
+ /* @__PURE__ */ jsx(
24455
+ PlanNodeList,
24456
+ {
24457
+ label: tr(
24458
+ "fluidgrids.builder.nodeDetailView.stepPlanBlockerNodes",
24459
+ "Blockers"
24460
+ ),
24461
+ nodeIds: plan.blockers,
24462
+ emptyLabel: tr(
24463
+ "fluidgrids.builder.nodeDetailView.stepPlanBlockerNodesEmpty",
24464
+ "No blockers."
24465
+ )
24466
+ }
24467
+ )
24468
+ ] })
24469
+ ]
24470
+ }
24471
+ );
24472
+ }
24473
+ function PlanMetric({ label, count: count2 }) {
24474
+ return /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
24475
+ label,
24476
+ ": ",
24477
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: count2 })
24478
+ ] });
24479
+ }
24480
+ function PlanNodeList({
24481
+ label,
24482
+ nodeIds,
24483
+ emptyLabel
24484
+ }) {
24485
+ return /* @__PURE__ */ jsxs("div", { className: "min-w-0 rounded-md border border-border bg-background/60 px-2 py-1.5", children: [
24486
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] font-semibold uppercase tracking-wide text-muted-foreground", children: label }),
24487
+ nodeIds.length > 0 ? /* @__PURE__ */ jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: nodeIds.map((nodeId) => /* @__PURE__ */ jsx(
24488
+ "code",
24489
+ {
24490
+ className: "max-w-full truncate rounded bg-muted px-1 py-0.5 font-mono text-[10px] text-foreground",
24491
+ children: nodeId
24492
+ },
24493
+ `${label}-${nodeId}`
24494
+ )) }) : /* @__PURE__ */ jsx("p", { className: "mt-1 text-[10px] text-muted-foreground", children: emptyLabel })
24495
+ ] });
24496
+ }
24305
24497
  function ResizeHandle({ onStart }) {
24306
24498
  return /* @__PURE__ */ jsx(
24307
24499
  "div",
@@ -25876,6 +26068,7 @@ var FlowBuilder = ({ readOnly = false }) => {
25876
26068
  children: /* @__PURE__ */ jsx(Background, { gap: 24 })
25877
26069
  }
25878
26070
  ),
26071
+ /* @__PURE__ */ jsx(FluidGridsMark, {}),
25879
26072
  nodes.length === 0 && !isReadOnly && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [
25880
26073
  /* @__PURE__ */ jsx("div", { className: "size-16 flex items-center justify-center rounded-full bg-primary/10 border-2 border-dashed border-primary/30", children: /* @__PURE__ */ jsx(
25881
26074
  Icon,
@@ -25991,6 +26184,6 @@ var FlowBuilderPage = ({
25991
26184
  ] });
25992
26185
  };
25993
26186
 
25994
- export { Card2 as Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ConnectionFormDialog, ConnectionSelector, EntityTagPicker, FLUIDGRIDS_ENTITY_TYPES, FlowBuilderPage, FluidGridsProvider, ProviderPicker, SchemaConnectionForm, ScopePicker, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, listCustomBlocks, mergeStickyNotes, refetchStoreNodes, registerCustomBlock, resolveUiSpec, stripSubmitActions, tagLabel, useAvailableTags, useConnection, useConnectionDialog, useConnections, useConnectionsByProvider, useCreateConnection, useCreateTag, useDraftEntityTags, useEntityTags, useFluidGridsContext, useImportWorkflowTemplate, useInitiateOAuth, useInstalledNodes, useNodeExecution, useProviderByKey, useProviderCatalog, useProviders, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTemplates };
25995
- //# sourceMappingURL=chunk-WVKQZOWG.js.map
25996
- //# sourceMappingURL=chunk-WVKQZOWG.js.map
26187
+ export { Card2 as Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ConnectionFormDialog, ConnectionSelector, EntityTagPicker, FLUIDGRIDS_ENTITY_TYPES, FlowBuilderPage, FluidGridsMark, FluidGridsProvider, ProviderPicker, SchemaConnectionForm, ScopePicker, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, listCustomBlocks, mergeStickyNotes, refetchStoreNodes, registerCustomBlock, resolveUiSpec, stripSubmitActions, tagLabel, useAvailableTags, useConnection, useConnectionDialog, useConnections, useConnectionsByProvider, useCreateConnection, useCreateTag, useDraftEntityTags, useEntityTags, useFluidGridsContext, useImportWorkflowTemplate, useInitiateOAuth, useInstalledNodes, useNodeExecution, useProviderByKey, useProviderCatalog, useProviders, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTemplates };
26188
+ //# sourceMappingURL=chunk-C44DTSC6.js.map
26189
+ //# sourceMappingURL=chunk-C44DTSC6.js.map