@burdenoff/fluidgrids-fe-sdk 2026.922.6 → 2026.922.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 (57) hide show
  1. package/dist/{ExecutionDetailPage-W7OC3JAA.js → ExecutionDetailPage-WLC63RRK.js} +5 -5
  2. package/dist/{ExecutionDetailPage-W7OC3JAA.js.map → ExecutionDetailPage-WLC63RRK.js.map} +1 -1
  3. package/dist/ExecutionsListPage-P5DRISMN.js +10 -0
  4. package/dist/{ExecutionsListPage-OVBWXB2F.js.map → ExecutionsListPage-P5DRISMN.js.map} +1 -1
  5. package/dist/{WorkflowBuilder-UM2BMGEG.js → WorkflowBuilder-LZ7X2M5Y.js} +8 -7
  6. package/dist/{WorkflowBuilder-UM2BMGEG.js.map → WorkflowBuilder-LZ7X2M5Y.js.map} +1 -1
  7. package/dist/WorkflowsList-QDPC2HVV.js +13 -0
  8. package/dist/{WorkflowsList-ARAFHW6J.js.map → WorkflowsList-QDPC2HVV.js.map} +1 -1
  9. package/dist/{chunk-MGLTXIN5.js → chunk-275FCUOI.js} +3 -39
  10. package/dist/chunk-275FCUOI.js.map +1 -0
  11. package/dist/{chunk-P35U2E2H.js → chunk-4KX6I7PA.js} +5 -5
  12. package/dist/{chunk-P35U2E2H.js.map → chunk-4KX6I7PA.js.map} +1 -1
  13. package/dist/{chunk-2JLRCN25.js → chunk-4LJOUX2R.js} +5 -5
  14. package/dist/{chunk-2JLRCN25.js.map → chunk-4LJOUX2R.js.map} +1 -1
  15. package/dist/{chunk-2OJQPUBC.js → chunk-62OZJC2B.js} +4 -4
  16. package/dist/{chunk-2OJQPUBC.js.map → chunk-62OZJC2B.js.map} +1 -1
  17. package/dist/chunk-AANIWER2.js +41 -0
  18. package/dist/chunk-AANIWER2.js.map +1 -0
  19. package/dist/{chunk-VJDLWE5S.js → chunk-CQOQ6A73.js} +3 -3
  20. package/dist/{chunk-VJDLWE5S.js.map → chunk-CQOQ6A73.js.map} +1 -1
  21. package/dist/{chunk-N4URMBJP.js → chunk-CVNW2EUB.js} +3 -3
  22. package/dist/{chunk-N4URMBJP.js.map → chunk-CVNW2EUB.js.map} +1 -1
  23. package/dist/{chunk-FH5QBQXV.js → chunk-KAMWWBX5.js} +3 -3
  24. package/dist/{chunk-FH5QBQXV.js.map → chunk-KAMWWBX5.js.map} +1 -1
  25. package/dist/{chunk-ELB3LXRJ.js → chunk-OZBZS6DM.js} +3 -3
  26. package/dist/{chunk-ELB3LXRJ.js.map → chunk-OZBZS6DM.js.map} +1 -1
  27. package/dist/{chunk-77S64BTI.js → chunk-REM2BQK5.js} +5 -4
  28. package/dist/chunk-REM2BQK5.js.map +1 -0
  29. package/dist/{chunk-35YDFYV2.js → chunk-VTKT6XDA.js} +801 -24
  30. package/dist/chunk-VTKT6XDA.js.map +1 -0
  31. package/dist/{chunk-5GXAHGJV.js → chunk-WJQSPVU5.js} +11 -6
  32. package/dist/chunk-WJQSPVU5.js.map +1 -0
  33. package/dist/{chunk-ACRXNUU2.js → chunk-XA3IJE2D.js} +196 -49
  34. package/dist/chunk-XA3IJE2D.js.map +1 -0
  35. package/dist/{chunk-NOECWBYH.js → chunk-Z4XRVZZ2.js} +4 -4
  36. package/dist/{chunk-NOECWBYH.js.map → chunk-Z4XRVZZ2.js.map} +1 -1
  37. package/dist/executions.js +5 -5
  38. package/dist/history.js +3 -3
  39. package/dist/index.d.ts +51 -3
  40. package/dist/index.js +21 -20
  41. package/dist/index.js.map +1 -1
  42. package/dist/nodes.js +2 -2
  43. package/dist/settings.d.ts +12 -1
  44. package/dist/settings.js +3 -1
  45. package/dist/templates.js +6 -5
  46. package/dist/{workflow-builder-BNWKK8C7.d.ts → workflow-builder-lgLa__fU.d.ts} +102 -0
  47. package/dist/workflow-builder.d.ts +1 -1
  48. package/dist/workflow-builder.js +7 -6
  49. package/dist/workflows-list.js +5 -4
  50. package/package.json +1 -1
  51. package/dist/ExecutionsListPage-OVBWXB2F.js +0 -10
  52. package/dist/WorkflowsList-ARAFHW6J.js +0 -12
  53. package/dist/chunk-35YDFYV2.js.map +0 -1
  54. package/dist/chunk-5GXAHGJV.js.map +0 -1
  55. package/dist/chunk-77S64BTI.js.map +0 -1
  56. package/dist/chunk-ACRXNUU2.js.map +0 -1
  57. package/dist/chunk-MGLTXIN5.js.map +0 -1
@@ -1,11 +1,11 @@
1
- export { ExecutionDetailPage } from './chunk-NOECWBYH.js';
2
- import './chunk-N4URMBJP.js';
1
+ export { ExecutionDetailPage } from './chunk-Z4XRVZZ2.js';
2
+ import './chunk-CVNW2EUB.js';
3
3
  import './chunk-UIY2HBWA.js';
4
4
  import './chunk-3ZYUGTIT.js';
5
5
  import './chunk-LMO5ASOE.js';
6
6
  import './chunk-WWU2O2SR.js';
7
- import './chunk-WO3AHQVD.js';
8
7
  import './chunk-5BDQNSP3.js';
8
+ import './chunk-WO3AHQVD.js';
9
9
  import './chunk-7YWBH2A5.js';
10
- //# sourceMappingURL=ExecutionDetailPage-W7OC3JAA.js.map
11
- //# sourceMappingURL=ExecutionDetailPage-W7OC3JAA.js.map
10
+ //# sourceMappingURL=ExecutionDetailPage-WLC63RRK.js.map
11
+ //# sourceMappingURL=ExecutionDetailPage-WLC63RRK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionDetailPage-W7OC3JAA.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionDetailPage-WLC63RRK.js"}
@@ -0,0 +1,10 @@
1
+ export { ExecutionsListPage } from './chunk-62OZJC2B.js';
2
+ import './chunk-CVNW2EUB.js';
3
+ import './chunk-OZBZS6DM.js';
4
+ import './chunk-LMO5ASOE.js';
5
+ import './chunk-WWU2O2SR.js';
6
+ import './chunk-5BDQNSP3.js';
7
+ import './chunk-WO3AHQVD.js';
8
+ import './chunk-7YWBH2A5.js';
9
+ //# sourceMappingURL=ExecutionsListPage-P5DRISMN.js.map
10
+ //# sourceMappingURL=ExecutionsListPage-P5DRISMN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionsListPage-OVBWXB2F.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionsListPage-P5DRISMN.js"}
@@ -1,19 +1,20 @@
1
- export { WorkflowBuilder } from './chunk-P35U2E2H.js';
2
- import './chunk-35YDFYV2.js';
1
+ export { WorkflowBuilder } from './chunk-4KX6I7PA.js';
2
+ import './chunk-VTKT6XDA.js';
3
3
  import './chunk-P5PKRQAO.js';
4
4
  import './chunk-NH5YCY37.js';
5
5
  import './chunk-DBOMRIP5.js';
6
6
  import './chunk-BQXHJIER.js';
7
7
  import './chunk-6LXMUIR3.js';
8
8
  import './chunk-XQP33UJR.js';
9
- import './chunk-MGLTXIN5.js';
9
+ import './chunk-AANIWER2.js';
10
10
  import './chunk-UIY2HBWA.js';
11
11
  import './chunk-3ZYUGTIT.js';
12
- import './chunk-ELB3LXRJ.js';
12
+ import './chunk-OZBZS6DM.js';
13
13
  import './chunk-LMO5ASOE.js';
14
14
  import './chunk-WWU2O2SR.js';
15
- import './chunk-WO3AHQVD.js';
16
15
  import './chunk-5BDQNSP3.js';
16
+ import './chunk-275FCUOI.js';
17
+ import './chunk-WO3AHQVD.js';
17
18
  import './chunk-7YWBH2A5.js';
18
- //# sourceMappingURL=WorkflowBuilder-UM2BMGEG.js.map
19
- //# sourceMappingURL=WorkflowBuilder-UM2BMGEG.js.map
19
+ //# sourceMappingURL=WorkflowBuilder-LZ7X2M5Y.js.map
20
+ //# sourceMappingURL=WorkflowBuilder-LZ7X2M5Y.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-UM2BMGEG.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-LZ7X2M5Y.js"}
@@ -0,0 +1,13 @@
1
+ export { WorkflowsList } from './chunk-REM2BQK5.js';
2
+ import './chunk-AANIWER2.js';
3
+ import './chunk-UIY2HBWA.js';
4
+ import './chunk-3ZYUGTIT.js';
5
+ import './chunk-OZBZS6DM.js';
6
+ import './chunk-LMO5ASOE.js';
7
+ import './chunk-WWU2O2SR.js';
8
+ import './chunk-5BDQNSP3.js';
9
+ import './chunk-275FCUOI.js';
10
+ import './chunk-WO3AHQVD.js';
11
+ import './chunk-7YWBH2A5.js';
12
+ //# sourceMappingURL=WorkflowsList-QDPC2HVV.js.map
13
+ //# sourceMappingURL=WorkflowsList-QDPC2HVV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowsList-ARAFHW6J.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowsList-QDPC2HVV.js"}
@@ -1,10 +1,7 @@
1
- import { useTr } from './chunk-7YWBH2A5.js';
2
1
  import { nanoid } from 'nanoid/non-secure';
3
2
  import { addEdge, applyEdgeChanges, applyNodeChanges } from '@xyflow/react';
4
3
  import { create } from 'zustand';
5
4
  import { produce } from 'immer';
6
- import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@burdenoff/fe-libs/ui';
7
- import { jsx, jsxs } from 'react/jsx-runtime';
8
5
 
9
6
  var HISTORY_LIMIT = 100;
10
7
  var CLONE_OFFSET = 48;
@@ -634,40 +631,7 @@ var useFlowStore = create()((set, get) => {
634
631
  if (typeof window !== "undefined" && import.meta.env?.DEV) {
635
632
  window.__fgFlowStore = useFlowStore;
636
633
  }
637
- function QuotaExhaustedDialog({
638
- open,
639
- onOpenChange,
640
- onUpgrade,
641
- title,
642
- description
643
- }) {
644
- const tr = useTr();
645
- const resolvedTitle = title ?? tr(
646
- "fluidgrids.components.quotaExhaustedDialog.title",
647
- "Workflow Limit Reached"
648
- );
649
- const resolvedDescription = description ?? tr(
650
- "fluidgrids.components.quotaExhaustedDialog.description",
651
- "You've reached the workflow limit for your plan. Upgrade your plan to create more workflows."
652
- );
653
- return /* @__PURE__ */ jsx(AlertDialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
654
- /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
655
- /* @__PURE__ */ jsx(AlertDialogTitle, { children: resolvedTitle }),
656
- /* @__PURE__ */ jsx(AlertDialogDescription, { children: resolvedDescription })
657
- ] }),
658
- /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
659
- /* @__PURE__ */ jsx(AlertDialogCancel, { children: tr(
660
- "fluidgrids.components.quotaExhaustedDialog.dismiss",
661
- "Dismiss"
662
- ) }),
663
- /* @__PURE__ */ jsx(AlertDialogAction, { onClick: onUpgrade, children: tr(
664
- "fluidgrids.components.quotaExhaustedDialog.viewBilling",
665
- "View Billing"
666
- ) })
667
- ] })
668
- ] }) });
669
- }
670
634
 
671
- export { QuotaExhaustedDialog, useFlowStore };
672
- //# sourceMappingURL=chunk-MGLTXIN5.js.map
673
- //# sourceMappingURL=chunk-MGLTXIN5.js.map
635
+ export { useFlowStore };
636
+ //# sourceMappingURL=chunk-275FCUOI.js.map
637
+ //# sourceMappingURL=chunk-275FCUOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builder/stores/flow-store.ts"],"names":[],"mappings":"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","file":"chunk-275FCUOI.js","sourcesContent":["import { nanoid } from \"nanoid/non-secure\";\nimport {\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n type Connection,\n type Edge,\n type EdgeChange,\n type Node,\n type NodeChange,\n} from \"@xyflow/react\";\nimport { create } from \"zustand\";\nimport { produce } from \"immer\";\nimport type {\n ExtendedNodeType,\n EdgeCondition,\n EdgeMapping,\n} from \"../../types/node\";\nimport type { Tag } from \"../../types/workflow\";\nimport type { ExecutionLog } from \"../../types/execution\";\n\n// Node execution state for visual display\nexport interface NodeExecutionState {\n status: \"idle\" | \"running\" | \"success\" | \"error\";\n itemCount?: number;\n error?: string;\n}\n\n// Execution state for step execution feature\ninterface ExecutionState {\n isExecuting: boolean;\n executingNodeId: string | null;\n currentRunId: string | null;\n logs: ExecutionLog[];\n selectedLogId: string | null;\n panelExpanded: boolean;\n nodeStatuses: Record<string, \"idle\" | \"running\" | \"success\" | \"error\">;\n nodeItemCounts: Record<string, number>;\n}\n\ninterface CustomEdgeProps extends Edge {\n condition?: EdgeCondition;\n mapping?: EdgeMapping;\n}\n\n/** A point-in-time snapshot of canvas structure for undo/redo. */\nexport interface HistorySnapshot {\n nodes: Node[];\n edges: CustomEdgeProps[];\n}\n\n/** Undo/redo stacks for the currently open workflow. */\nexport interface HistoryState {\n past: HistorySnapshot[];\n future: HistorySnapshot[];\n}\n\n/** Bounds how far back undo can go — generous for an editing session without\n * letting the stacks grow unbounded on a long-lived tab. */\nconst HISTORY_LIMIT = 100;\n\n/** Canvas offset applied to duplicated/pasted nodes so clones never land\n * exactly on top of their source (n8n/Figma-style paste offset). */\nconst CLONE_OFFSET = 48;\n\n/**\n * Deep-clone a value for history snapshots / node-and-edge duplication.\n * `structuredClone` is preferred (fast, handles Dates/Maps/etc.), with a\n * JSON round-trip fallback for the rare manifest blob that carries something\n * structuredClone can't handle (e.g. a stray function reference) — dropping\n * that field is safer than throwing and losing the whole undo/copy action.\n */\nfunction cloneValue<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return JSON.parse(JSON.stringify(value)) as T;\n }\n}\n\ninterface State {\n nodes: Node[];\n edges: CustomEdgeProps[];\n /** Node currently open in the n8n-style 3-pane Node Detail View modal. */\n ndv?: { nodeId: string; type: ExtendedNodeType } | null;\n /** Node currently in inline-rename edit mode (F2 or double-click on its\n * title). Only one node can be renamed at a time. */\n renamingNodeId?: string | null;\n /**\n * Node currently open in the single-click floating quick-config panel\n * (Make-style, attached beside the node). The panel derives its own screen\n * position from the node's live rect, so no anchor is stored here.\n */\n quickConfig?: {\n nodeId: string;\n type: ExtendedNodeType;\n } | null;\n /**\n * Source handle awaiting attachment via the Node Store (the n8n-style \"+\"\n * button on an output handle). While set, clicking an operation in the\n * store panel creates the node and wires it to this handle.\n */\n pendingConnection?: { nodeId: string; handleId: string } | null;\n sidebar: {\n active: \"node-properties\" | \"store-browse\" | \"none\";\n panels: {\n nodeProperties: {\n selectedNode: { id: string; type: ExtendedNodeType } | null | undefined;\n };\n };\n };\n}\n\ninterface Actions {\n actions: {\n saveWorkflow: () => {\n id: string;\n name: string;\n version: string;\n alias?: string;\n dbId?: string;\n status?: string;\n nodes: Node[];\n edges: Edge[];\n };\n setWorkflow: (workflow: Partial<IFlowState[\"workflow\"]>) => void;\n resetWorkflow: () => void;\n history: {\n undo: () => void;\n redo: () => void;\n /** Wipe both stacks — called when a (different) workflow is loaded so\n * undo can never reach back into a previously open workflow. */\n clear: () => void;\n };\n nodes: {\n onNodesChange: (changes: NodeChange[]) => void;\n /** `historyKind` groups rapid same-kind writes (e.g. keystrokes in one\n * field) into a single undo step; `skipHistory` opts a caller out of\n * history entirely (e.g. transient UI-only patches). */\n setNodes: (\n nodes: Node[],\n opts?: { historyKind?: string; skipHistory?: boolean },\n ) => void;\n deleteNode: (node: Node) => void;\n /** Bulk delete (multi-select) — one undo step for the whole selection. */\n deleteNodes: (nodes: Node[]) => void;\n /** Clone the given nodes (+ edges strictly between them) with fresh ids,\n * offset on the canvas, and select only the clones. */\n duplicateNodes: (nodeIds: string[]) => void;\n /** Insert a clipboard payload (possibly from another workflow/tab):\n * fresh ids, offset, selects the pasted nodes. */\n pasteNodes: (payload: { nodes: Node[]; edges: Edge[] }) => void;\n toggleDisabled: (nodeId: string) => void;\n renameNode: (nodeId: string, label: string) => void;\n startRename: (nodeId: string) => void;\n endRename: () => void;\n };\n edges: {\n onEdgesChange: (changes: EdgeChange[]) => void;\n onConnect: (connection: Connection) => void;\n setEdges: (\n edges: Edge[],\n opts?: { historyKind?: string; skipHistory?: boolean },\n ) => void;\n deleteEdge: (edge: Edge) => void;\n };\n ndv: {\n open: (node: { nodeId: string; type: ExtendedNodeType }) => void;\n close: () => void;\n };\n quickConfig: {\n open: (node: { nodeId: string; type: ExtendedNodeType }) => void;\n close: () => void;\n };\n pendingConnection: {\n /** Arm attach mode for a source handle and open the Node Store panel. */\n start: (connection: { nodeId: string; handleId: string }) => void;\n clear: () => void;\n };\n sidebar: {\n setActivePanel: (\n panel: \"node-properties\" | \"store-browse\" | \"none\",\n ) => void;\n showNodePropertiesOf: (node: {\n id: string;\n type: ExtendedNodeType;\n block?: string;\n }) => void;\n panels: {\n nodeProperties: {\n setSelectedNode: (\n node: { id: string; type: ExtendedNodeType } | undefined | null,\n ) => void;\n };\n tags: {\n setTags: (tags: Tag[]) => void;\n createTag: (tag: Tag) => void;\n deleteTag: (tag: Tag) => void;\n updateTag: (tag: Tag, newTag: Tag) => void;\n };\n };\n };\n };\n}\n\nexport interface IFlowState {\n tags: Tag[];\n /** Undo/redo stacks — canvas structure (nodes/edges) AND parameter edits,\n * since both flow through the same `setNodes`/`setEdges` writes. */\n history: HistoryState;\n workflow: {\n id: string;\n workflowKey: string;\n name: string;\n version: string;\n alias?: string;\n /** Database row ID (used for updateWorkflowDefinition) */\n dbId?: string;\n /** Current workflow status: DRAFT | ACTIVE | ARCHIVED | DEPRECATED */\n status?: string;\n } & State;\n execution: ExecutionState;\n actions: Actions[\"actions\"] & {\n execution: {\n startExecution: (nodeId: string, runId: string) => void;\n addLog: (log: ExecutionLog) => void;\n updateLog: (logId: string, updates: Partial<ExecutionLog>) => void;\n setNodeStatus: (\n nodeId: string,\n status: \"idle\" | \"running\" | \"success\" | \"error\",\n ) => void;\n setNodeItemCount: (nodeId: string, count: number) => void;\n selectLog: (logId: string | null) => void;\n togglePanel: () => void;\n clearLogs: () => void;\n completeExecution: () => void;\n };\n };\n}\n\nconst TAGS: Tag[] = [\n { value: \"marketing\", label: \"Marketing\", color: \"#ef4444\" },\n { value: \"support\", label: \"Support\", color: \"#ef4444\" },\n { value: \"lead\", label: \"Lead\", color: \"#eab308\" },\n { value: \"new\", label: \"New\", color: \"#22c55e\" },\n];\n\n/**\n * Pristine execution state. The `execution` slice is global (one run at a\n * time), so it MUST be reset whenever a different workflow is loaded —\n * otherwise the previous workflow's run logs leak into the next workflow's\n * Logs panel. Shared by the store initializer and `resetWorkflow`.\n */\nconst INITIAL_EXECUTION: ExecutionState = {\n isExecuting: false,\n executingNodeId: null,\n currentRunId: null,\n logs: [],\n selectedLogId: null,\n panelExpanded: false,\n nodeStatuses: {},\n nodeItemCounts: {},\n};\n\nconst INITIAL_HISTORY: HistoryState = { past: [], future: [] };\n\nexport const useFlowStore = create<IFlowState>()((set, get) => {\n // Coalescing bookkeeping for history checkpoints. Plain closure vars (not\n // store state) — they're write-tracking metadata, not something a\n // component should ever render off of.\n let lastCheckpointKind: string | null = null;\n let lastCheckpointAt = 0;\n\n /**\n * Record an undo point BEFORE a mutation is applied.\n *\n * `coalesce: true` merges this call into the immediately preceding one when\n * they share the same `kind` and land within the coalescing window — used\n * for bursty writes (keystrokes in one field, a drag in progress) so undo\n * has one step per logical edit, not one per change event. Structural\n * actions (delete, connect, duplicate, disable, rename, …) always pass\n * `coalesce: false` so each is its own undo step even if done quickly in\n * succession.\n */\n function pushCheckpoint(kind: string, coalesce: boolean) {\n const now = Date.now();\n const isCoalesced =\n coalesce && kind === lastCheckpointKind && now - lastCheckpointAt < 800;\n\n if (!isCoalesced) {\n const state = get();\n const snapshot: HistorySnapshot = {\n nodes: cloneValue(state.workflow.nodes),\n edges: cloneValue(state.workflow.edges),\n };\n set((s) => ({\n history: {\n past: [...s.history.past, snapshot].slice(-HISTORY_LIMIT),\n future: [],\n },\n }));\n } else if (get().history.future.length > 0) {\n // Still invalidate redo on a coalesced edit — the user has diverged\n // from whatever redo state existed.\n set((s) => ({ history: { ...s.history, future: [] } }));\n }\n\n lastCheckpointKind = kind;\n lastCheckpointAt = now;\n }\n\n /** Reset coalescing so the next edit always starts a fresh checkpoint. */\n function resetCoalescing() {\n lastCheckpointKind = null;\n lastCheckpointAt = 0;\n }\n\n return {\n tags: TAGS,\n history: { ...INITIAL_HISTORY },\n workflow: {\n id: nanoid(),\n workflowKey: \"\",\n name: \"\",\n version: \"\",\n alias: \"\",\n edges: [],\n nodes: [],\n ndv: null,\n quickConfig: null,\n pendingConnection: null,\n renamingNodeId: null,\n sidebar: {\n active: \"none\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n },\n execution: { ...INITIAL_EXECUTION },\n actions: {\n saveWorkflow: () => {\n const { workflow } = get();\n const { id, name, version, alias, dbId, status, nodes, edges } =\n workflow;\n set({ workflow });\n return { id, name, version, alias, dbId, status, nodes, edges };\n },\n setWorkflow: (workflow: Partial<IFlowState[\"workflow\"]>) => {\n set((state) => ({\n workflow: {\n ...state.workflow,\n ...workflow,\n },\n }));\n },\n resetWorkflow: () => {\n resetCoalescing();\n set(() => ({\n workflow: {\n id: nanoid(),\n workflowKey: \"\",\n name: \"\",\n version: \"\",\n alias: \"\",\n dbId: undefined,\n status: undefined,\n edges: [],\n nodes: [],\n ndv: null,\n quickConfig: null,\n pendingConnection: null,\n renamingNodeId: null,\n sidebar: {\n active: \"none\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n },\n // Wipe run state too — resetWorkflow fires when the builder loads a\n // (different) workflow, so the previous workflow's logs must not carry\n // over into this one's Logs panel.\n execution: { ...INITIAL_EXECUTION },\n // A freshly loaded workflow must not be undo-able back to empty —\n // undo/redo only ever applies within the currently open workflow.\n history: { ...INITIAL_HISTORY },\n }));\n },\n history: {\n undo: () => {\n const { past, future } = get().history;\n const previous = past[past.length - 1];\n if (!previous) return;\n const { nodes, edges } = get().workflow;\n const current: HistorySnapshot = {\n nodes: cloneValue(nodes),\n edges: cloneValue(edges),\n };\n resetCoalescing();\n set((s) => ({\n workflow: {\n ...s.workflow,\n nodes: previous.nodes,\n edges: previous.edges,\n },\n history: {\n past: past.slice(0, -1),\n future: [current, ...future].slice(0, HISTORY_LIMIT),\n },\n }));\n },\n redo: () => {\n const { past, future } = get().history;\n const next = future[0];\n if (!next) return;\n const { nodes, edges } = get().workflow;\n const current: HistorySnapshot = {\n nodes: cloneValue(nodes),\n edges: cloneValue(edges),\n };\n resetCoalescing();\n set((s) => ({\n workflow: {\n ...s.workflow,\n nodes: next.nodes,\n edges: next.edges,\n },\n history: {\n past: [...past, current].slice(-HISTORY_LIMIT),\n future: future.slice(1),\n },\n }));\n },\n clear: () => {\n resetCoalescing();\n set({ history: { ...INITIAL_HISTORY } });\n },\n },\n ndv: {\n // Opening the full NDV supersedes the floating quick-config panel — the\n // two edit the same node data, so only one should be visible at a time.\n open: (node: { nodeId: string; type: ExtendedNodeType }) =>\n set((state) => ({\n workflow: { ...state.workflow, ndv: node, quickConfig: null },\n })),\n close: () =>\n set((state) => ({\n workflow: { ...state.workflow, ndv: null },\n })),\n },\n quickConfig: {\n open: (node: { nodeId: string; type: ExtendedNodeType }) =>\n set((state) => ({\n workflow: { ...state.workflow, quickConfig: node },\n })),\n close: () =>\n set((state) => ({\n workflow: { ...state.workflow, quickConfig: null },\n })),\n },\n pendingConnection: {\n start: (connection: { nodeId: string; handleId: string }) =>\n set((state) => ({\n workflow: {\n ...state.workflow,\n pendingConnection: connection,\n sidebar: { ...state.workflow.sidebar, active: \"store-browse\" },\n },\n })),\n clear: () =>\n set((state) => ({\n workflow: { ...state.workflow, pendingConnection: null },\n })),\n },\n sidebar: {\n // Leaving the store panel abandons any armed \"+\" attach mode — the\n // pending handle would otherwise silently capture a later insert.\n setActivePanel: (panel: \"node-properties\" | \"store-browse\" | \"none\") =>\n set((state) => ({\n workflow: {\n ...state.workflow,\n sidebar: { ...state.workflow.sidebar, active: panel },\n ...(panel !== \"store-browse\" ? { pendingConnection: null } : {}),\n },\n })),\n showNodePropertiesOf: (node: {\n id: string;\n type: ExtendedNodeType;\n }) => {\n set((state) => ({\n workflow: {\n ...state.workflow,\n pendingConnection: null,\n sidebar: {\n ...state.workflow.sidebar,\n active: \"node-properties\",\n panels: {\n ...state.workflow.sidebar.panels,\n nodeProperties: {\n ...state.workflow.sidebar.panels.nodeProperties,\n selectedNode: node,\n },\n },\n },\n },\n }));\n },\n panels: {\n nodeProperties: {\n setSelectedNode: (\n node: { id: string; type: ExtendedNodeType } | undefined | null,\n ) =>\n set((state) => ({\n workflow: {\n ...state.workflow,\n sidebar: {\n ...state.workflow.sidebar,\n panels: {\n ...state.workflow.sidebar.panels,\n nodeProperties: {\n ...state.workflow.sidebar.panels.nodeProperties,\n selectedNode: node,\n },\n },\n },\n },\n })),\n },\n tags: {\n setTags: (tags: Tag[]) => set({ tags }),\n createTag: (tag: Tag) =>\n set((state) => ({\n tags: [...state.tags, tag],\n })),\n updateTag: (tag: Tag, newTag: Tag) =>\n set((state) => ({\n tags: state.tags.map((f) =>\n f.value === tag.value ? newTag : f,\n ),\n })),\n deleteTag: (tag: Tag) =>\n set((state) => ({\n tags: state.tags.filter((f) => f.value !== tag.value),\n })),\n },\n },\n },\n nodes: {\n onNodesChange: (changes) => {\n const removedIds = new Set(\n changes\n .filter(\n (c): c is Extract<NodeChange, { type: \"remove\" }> =>\n c.type === \"remove\",\n )\n .map((c) => c.id),\n );\n const addedCount = changes.filter((c) => c.type === \"add\").length;\n\n if (removedIds.size > 0) {\n const stillPresent = get().workflow.nodes.some((n) =>\n removedIds.has(n.id),\n );\n if (stillPresent) pushCheckpoint(\"nodes:remove\", false);\n } else if (addedCount > 0) {\n // A node landed on the canvas via React Flow's own imperative\n // `addNodes()` (drag-from-palette drop, Node Store click-insert,\n // sticky note insert — see useInsertNode / useInsertStickyNote)\n // rather than through our `setNodes` action, so it would\n // otherwise never reach the history stack and Undo would stay\n // disabled after adding a node.\n pushCheckpoint(\"nodes:add\", false);\n } else {\n const finishedDragIds = changes.filter(\n (c): c is Extract<NodeChange, { type: \"position\" }> =>\n c.type === \"position\" && c.dragging === false,\n );\n const actuallyMoved = finishedDragIds.some((c) => {\n const current = get().workflow.nodes.find((n) => n.id === c.id);\n return (\n current &&\n c.position &&\n (current.position.x !== c.position.x ||\n current.position.y !== c.position.y)\n );\n });\n if (actuallyMoved) pushCheckpoint(\"nodes:move\", false);\n }\n\n set((state) =>\n produce(state, (draft) => {\n const updatedNodes = applyNodeChanges(\n changes,\n draft.workflow.nodes,\n );\n draft.workflow.nodes = updatedNodes;\n }),\n );\n },\n setNodes: (nodes, opts) => {\n if (!opts?.skipHistory) {\n pushCheckpoint(\n opts?.historyKind ?? \"nodes:set\",\n !!opts?.historyKind,\n );\n }\n set({ workflow: { ...get().workflow, nodes } });\n },\n deleteNode: (node: Node) => {\n const exists = get().workflow.nodes.some((n) => n.id === node.id);\n if (exists) pushCheckpoint(\"nodes:delete\", false);\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: state.workflow.nodes.filter((n) => n.id !== node.id),\n // Drop any UI state pointing at the removed node.\n ...(state.workflow.quickConfig?.nodeId === node.id\n ? { quickConfig: null }\n : {}),\n ...(state.workflow.pendingConnection?.nodeId === node.id\n ? { pendingConnection: null }\n : {}),\n },\n }));\n },\n deleteNodes: (nodes: Node[]) => {\n const ids = new Set(nodes.map((n) => n.id));\n if (ids.size === 0) return;\n const anyExist = get().workflow.nodes.some((n) => ids.has(n.id));\n if (anyExist) pushCheckpoint(\"nodes:delete\", false);\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: state.workflow.nodes.filter((n) => !ids.has(n.id)),\n edges: state.workflow.edges.filter(\n (e) => !ids.has(e.source) && !ids.has(e.target),\n ),\n ...(state.workflow.quickConfig &&\n ids.has(state.workflow.quickConfig.nodeId)\n ? { quickConfig: null }\n : {}),\n ...(state.workflow.pendingConnection &&\n ids.has(state.workflow.pendingConnection.nodeId)\n ? { pendingConnection: null }\n : {}),\n },\n }));\n },\n duplicateNodes: (nodeIds: string[]) => {\n const { nodes, edges } = get().workflow;\n const idSet = new Set(nodeIds);\n const selected = nodes.filter((n) => idSet.has(n.id));\n if (selected.length === 0) return;\n pushCheckpoint(\"nodes:duplicate\", false);\n\n const idMap = new Map<string, string>();\n const clones = selected.map((n) => {\n const newId = nanoid();\n idMap.set(n.id, newId);\n const cloned = cloneValue(n);\n return {\n ...cloned,\n id: newId,\n position: {\n x: cloned.position.x + CLONE_OFFSET,\n y: cloned.position.y + CLONE_OFFSET,\n },\n selected: true,\n };\n });\n // Only edges strictly BETWEEN two duplicated nodes come along —\n // an edge to a non-duplicated neighbor would otherwise silently\n // rewire the original graph.\n const clonedEdges = edges\n .filter((e) => idMap.has(e.source) && idMap.has(e.target))\n .map((e) => {\n const cloned = cloneValue(e);\n return {\n ...cloned,\n id: nanoid(),\n source: idMap.get(e.source) as string,\n target: idMap.get(e.target) as string,\n selected: false,\n };\n });\n\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: [\n ...state.workflow.nodes.map((n) =>\n idSet.has(n.id) ? { ...n, selected: false } : n,\n ),\n ...clones,\n ],\n edges: [...state.workflow.edges, ...clonedEdges],\n },\n }));\n },\n pasteNodes: (payload: { nodes: Node[]; edges: Edge[] }) => {\n const pasteNodesIn = payload.nodes ?? [];\n if (pasteNodesIn.length === 0) return;\n pushCheckpoint(\"nodes:paste\", false);\n\n const idMap = new Map<string, string>();\n const clones = pasteNodesIn.map((n) => {\n const newId = nanoid();\n idMap.set(n.id, newId);\n const cloned = cloneValue(n);\n return {\n ...cloned,\n id: newId,\n position: {\n x: (cloned.position?.x ?? 0) + CLONE_OFFSET,\n y: (cloned.position?.y ?? 0) + CLONE_OFFSET,\n },\n selected: true,\n };\n });\n const clonedEdges = (payload.edges ?? [])\n .filter((e) => idMap.has(e.source) && idMap.has(e.target))\n .map((e) => {\n const cloned = cloneValue(e);\n return {\n ...cloned,\n id: nanoid(),\n source: idMap.get(e.source) as string,\n target: idMap.get(e.target) as string,\n selected: false,\n };\n });\n\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: [\n ...state.workflow.nodes.map((n) => ({ ...n, selected: false })),\n ...clones,\n ],\n edges: [...state.workflow.edges, ...clonedEdges],\n },\n }));\n },\n toggleDisabled: (nodeId: string) => {\n pushCheckpoint(\"nodes:disable\", false);\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: state.workflow.nodes.map((n) => {\n if (n.id !== nodeId) return n;\n const data = (n.data ?? {}) as Record<string, unknown>;\n return {\n ...n,\n data: { ...data, disabled: !(data.disabled === true) },\n };\n }),\n },\n }));\n },\n renameNode: (nodeId: string, label: string) => {\n pushCheckpoint(\"nodes:rename\", false);\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: state.workflow.nodes.map((n) =>\n n.id === nodeId\n ? { ...n, data: { ...(n.data ?? {}), label } }\n : n,\n ),\n renamingNodeId: null,\n },\n }));\n },\n startRename: (nodeId: string) => {\n set((state) => ({\n workflow: { ...state.workflow, renamingNodeId: nodeId },\n }));\n },\n endRename: () => {\n set((state) => ({\n workflow: { ...state.workflow, renamingNodeId: null },\n }));\n },\n },\n edges: {\n onEdgesChange: (changes) => {\n const removedIds = new Set(\n changes\n .filter(\n (c): c is Extract<EdgeChange, { type: \"remove\" }> =>\n c.type === \"remove\",\n )\n .map((c) => c.id),\n );\n if (removedIds.size > 0) {\n const stillPresent = get().workflow.edges.some((e) =>\n removedIds.has(e.id),\n );\n if (stillPresent) pushCheckpoint(\"edges:remove\", false);\n } else if (changes.some((c) => c.type === \"add\")) {\n // Same gap as onNodesChange's \"add\" case: an edge created via\n // React Flow's imperative `addEdges()` (e.g. drag a connection\n // off a handle onto empty canvas, then pick a node from the\n // floating menu — useAddNodeOnEdgeDrop) must still be undoable.\n pushCheckpoint(\"edges:add\", false);\n }\n\n set((state) =>\n produce(state, (draft) => {\n const updatedEdges = applyEdgeChanges(\n changes,\n draft.workflow.edges,\n );\n draft.workflow.edges = updatedEdges;\n }),\n );\n },\n onConnect: (connection) => {\n pushCheckpoint(\"edges:connect\", false);\n const edge = {\n ...connection,\n id: nanoid(),\n type: \"deletable\",\n } as Edge;\n set({\n workflow: {\n ...get().workflow,\n edges: addEdge(edge, get().workflow.edges),\n },\n });\n },\n setEdges: (edges, opts) => {\n if (!opts?.skipHistory) {\n pushCheckpoint(\n opts?.historyKind ?? \"edges:set\",\n !!opts?.historyKind,\n );\n }\n set({ workflow: { ...get().workflow, edges } });\n },\n deleteEdge: (edge: Edge) => {\n const exists = get().workflow.edges.some((e) => e.id === edge.id);\n if (exists) pushCheckpoint(\"edges:delete\", false);\n set((state) => ({\n workflow: {\n ...state.workflow,\n edges: state.workflow.edges.filter((e) => e.id !== edge.id),\n },\n }));\n },\n },\n execution: {\n startExecution: (nodeId: string, runId: string) => {\n set((state) => ({\n execution: {\n ...state.execution,\n isExecuting: true,\n executingNodeId: nodeId,\n currentRunId: runId,\n panelExpanded: true,\n nodeStatuses: {\n ...state.execution.nodeStatuses,\n [nodeId]: \"running\",\n },\n },\n }));\n },\n addLog: (log: ExecutionLog) => {\n set((state) => ({\n execution: {\n ...state.execution,\n logs: [...state.execution.logs, log],\n selectedLogId: log.id,\n },\n }));\n },\n updateLog: (logId: string, updates: Partial<ExecutionLog>) => {\n set((state) => ({\n execution: {\n ...state.execution,\n logs: state.execution.logs.map((log) =>\n log.id === logId ? { ...log, ...updates } : log,\n ),\n },\n }));\n },\n setNodeStatus: (\n nodeId: string,\n status: \"idle\" | \"running\" | \"success\" | \"error\",\n ) => {\n set((state) => ({\n execution: {\n ...state.execution,\n nodeStatuses: {\n ...state.execution.nodeStatuses,\n [nodeId]: status,\n },\n },\n }));\n },\n setNodeItemCount: (nodeId: string, count: number) => {\n set((state) => ({\n execution: {\n ...state.execution,\n nodeItemCounts: {\n ...state.execution.nodeItemCounts,\n [nodeId]: count,\n },\n },\n }));\n },\n selectLog: (logId: string | null) => {\n set((state) => ({\n execution: {\n ...state.execution,\n selectedLogId: logId,\n },\n }));\n },\n togglePanel: () => {\n set((state) => ({\n execution: {\n ...state.execution,\n panelExpanded: !state.execution.panelExpanded,\n },\n }));\n },\n clearLogs: () => {\n set((state) => ({\n execution: {\n ...state.execution,\n logs: [],\n selectedLogId: null,\n nodeStatuses: {},\n nodeItemCounts: {},\n },\n }));\n },\n completeExecution: () => {\n set((state) => ({\n execution: {\n ...state.execution,\n isExecuting: false,\n executingNodeId: null,\n },\n }));\n },\n },\n },\n };\n});\n\n// Dev-only debug handle so the store can be inspected/driven from the browser\n// console or automated tests. No-op in production builds.\nif (typeof window !== \"undefined\" && import.meta.env?.DEV) {\n (window as unknown as Record<string, unknown>).__fgFlowStore = useFlowStore;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-35YDFYV2.js';
2
- import { useFlowStore } from './chunk-MGLTXIN5.js';
3
- import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-ELB3LXRJ.js';
1
+ import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-VTKT6XDA.js';
2
+ import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-OZBZS6DM.js';
3
+ import { useFlowStore } from './chunk-275FCUOI.js';
4
4
  import { useNavigate, useParams } from 'react-router';
5
5
  import { toast } from 'sonner';
6
6
  import { Icon } from '@iconify/react';
@@ -401,5 +401,5 @@ function WorkflowBuilder() {
401
401
  }
402
402
 
403
403
  export { WorkflowBuilder };
404
- //# sourceMappingURL=chunk-P35U2E2H.js.map
405
- //# sourceMappingURL=chunk-P35U2E2H.js.map
404
+ //# sourceMappingURL=chunk-4KX6I7PA.js.map
405
+ //# sourceMappingURL=chunk-4KX6I7PA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/builder/app/workflow/work/page.tsx","../src/pages/WorkflowBuilder.tsx"],"names":["useNavigate","jsx","jsxs"],"mappings":"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","file":"chunk-P35U2E2H.js","sourcesContent":["import { useNavigate, useParams } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Icon } from \"@iconify/react\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport {\n useEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n} from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\nimport { useInstalledNodes } from \"../../../../hooks/store/useInstalledNodes\";\nimport { mergeStickyNotes } from \"../../../lib/sticky-notes\";\nimport type {\n TemplateNodeCheckResult,\n WorkflowTemplateContent,\n} from \"../../../../types/workflow-template-content\";\nimport {\n buildRequiredNodeTypes,\n buildNodeCheck,\n} from \"../../../../utils/workflow-node-check\";\nimport { refetchStoreNodes } from \"../../../components/flow-builder/components/blocks\";\n\n// Lazy-load the modal to avoid bundle-size impact on routes that never hit it.\nconst LazyMissingNodesInstallModal = lazy(() =>\n import(\"../../../components/flow-builder/components/templates/MissingNodesInstallModal\").then(\n (m) => ({ default: m.MissingNodesInstallModal }),\n ),\n);\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n /** Canvas annotations persisted separately from executable nodes. */\n stickyNotes?: IFlowState[\"workflow\"][\"nodes\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const navigate = useNavigate();\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false);\n const fromSharedLoadedRef = useRef(false);\n const fetchedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\n\n // ── Missing-nodes modal state ────────────────────────────────────────────\n const { installedAppIds } = useInstalledNodes();\n const [pendingWorkflow, setPendingWorkflow] = useState<\n IFlowState[\"workflow\"] | null\n >(null);\n const [nodeCheck, setNodeCheck] = useState<TemplateNodeCheckResult | null>(\n null,\n );\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n const [installErrors, setInstallErrors] = useState<string[]>([]);\n\n // Classify requiredNodeTypes into installed / missing / missingPaid.\n const doNodeCheck = useCallback(\n (requiredNodeTypes: Parameters<typeof buildNodeCheck>[0]) =>\n buildNodeCheck(requiredNodeTypes, installedAppIds),\n [installedAppIds],\n );\n\n // Keep a ref so the loadWorkflow effect can call doNodeCheck without\n // taking it as a reactive dependency (which would re-trigger the effect\n // on every render and cause infinite CreateWorkflowDefinition mutations).\n const doNodeCheckRef = useRef(doNodeCheck);\n useEffect(() => {\n doNodeCheckRef.current = doNodeCheck;\n });\n\n // Install missing free nodes then open the pending workflow in the builder.\n const handleInstallConfirm = useCallback(async () => {\n if (!pendingWorkflow) return;\n // `missing` now holds only nodes the store can actually install;\n // store-unavailable ones are reported separately (BOFF-7267).\n const nodesToInstall = (nodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n const failed: string[] = [];\n\n if (nodesToInstall.length > 0) {\n setInstalling(true);\n setInstallErrors([]);\n try {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../generated/global-operations\");\n const { getFluidGridsConfig } = await import(\"../../../../config\");\n\n const storeClient = getGlobalStoreClient();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n try {\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n });\n }\n } catch {\n // Keep installing the rest, but remember what failed so the user\n // is told instead of the dialog silently closing (BOFF-7267).\n failed.push(node.displayName || node.nodeType);\n }\n }\n\n // Refresh the in-memory node registry so the builder renders the\n // newly-installed nodes with their real manifests and operations.\n await refetchStoreNodes();\n } finally {\n setInstalling(false);\n setInstallProgress(null);\n }\n }\n\n if (failed.length > 0) {\n // Hold the dialog open so the failure is visible and retryable; the user\n // can still choose \"Open Without Installing\".\n setInstallErrors(failed);\n return;\n }\n\n setInstallErrors([]);\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow, nodeCheck]);\n\n const handleSkipInstall = useCallback(() => {\n if (!pendingWorkflow) return;\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow]);\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"store-browse\" as const,\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n }),\n [id, version],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadWorkflow = async () => {\n try {\n // Always reset the store first\n resetWorkflow();\n\n // For versioned workflows, set loading so FlowBuilderPage unmounts\n // before Zustand is cleared. This prevents the flash of an empty\n // canvas when the component is reused across route navigations.\n if (version && mounted) {\n setIsLoading(true);\n }\n\n if (!version) {\n // Check for a manifest copied from a public shared workflow\n const fromSharedId =\n typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(\"fromShared\")\n : null;\n const pendingManifestJson =\n fromSharedId && typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pendingSharedWorkflow\")\n : null;\n\n if (fromSharedId && pendingManifestJson) {\n try {\n // Do NOT remove from localStorage here — React StrictMode double-fires\n // effects (mount → cleanup → mount). If we remove on the first run,\n // the second run finds null and falls through to an empty workflow.\n // We remove it inside `if (mounted)` so only the \"winning\" run\n // (the one whose mounted flag is still true) clears the entry.\n const manifest = JSON.parse(pendingManifestJson) as {\n nodes?: IFlowState[\"workflow\"][\"nodes\"];\n edges?: IFlowState[\"workflow\"][\"edges\"];\n name?: string;\n };\n\n const sharedWorkflow: IFlowState[\"workflow\"] = {\n ...newWorkflow,\n name: manifest.name ?? \"Copied Workflow\",\n nodes: manifest.nodes ?? [],\n edges: manifest.edges ?? [],\n };\n\n // Detect node types not installed in this workspace and resolve\n // each to its storeProductId so the modal can offer one-click installation.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n sharedWorkflow.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted) {\n // Safe to clear now — this is the winning effect run.\n localStorage.removeItem(\"pendingSharedWorkflow\");\n\n if (requiredNodeTypes.length > 0) {\n // Use the ref so this effect doesn't re-run every time\n // installedAppIds changes (which would cause infinite mutations).\n const check = doNodeCheckRef.current(requiredNodeTypes);\n const needsConfig =\n check.missing.length > 0 || check.missingPaid.length > 0;\n\n if (needsConfig) {\n // Surface the install modal before creating the workflow\n // so the user can install missing nodes first.\n setPendingWorkflow(sharedWorkflow);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n return;\n }\n }\n\n setWorkflow(sharedWorkflow);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n }\n return;\n } catch (e) {\n console.error(\"[WorkflowItem] parse error:\", e);\n // Corrupted localStorage entry — only clear if we're the winning run.\n if (mounted) localStorage.removeItem(\"pendingSharedWorkflow\");\n }\n }\n\n // If a previous effect run already loaded the shared workflow, don't overwrite it\n if (fromSharedId && fromSharedLoadedRef.current) {\n if (mounted) setIsLoading(false);\n return;\n }\n\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (defData) {\n // Build the workflow state — store in ref regardless of mounted status so\n // a subsequent effect run can use it if its own getWorkflow call fails.\n const workflowState: IFlowState[\"workflow\"] = {\n ...defData,\n // Sticky notes are stored under a separate definition key — merge\n // them back onto the canvas alongside the executable nodes.\n nodes: mergeStickyNotes(defData) as IFlowState[\"workflow\"][\"nodes\"],\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n };\n fetchedWorkflowRef.current = workflowState;\n\n // AI-assistant (and shared) workflows may reference nodes that are not\n // installed in this workspace. Offer one-click install before opening.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n workflowState.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted && requiredNodeTypes.length > 0) {\n const check = doNodeCheckRef.current(requiredNodeTypes);\n if (check.missing.length > 0 || check.missingPaid.length > 0) {\n setPendingWorkflow(workflowState);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n return;\n }\n }\n\n if (mounted) {\n setWorkflow(workflowState);\n }\n return;\n }\n\n if (mounted) {\n // If a previous effect run already fetched the workflow (but was cancelled),\n // use its result rather than trying to create a new workflow.\n if (fetchedWorkflowRef.current) {\n setWorkflow(fetchedWorkflowRef.current);\n return;\n }\n\n // Version-not-found guard: only mint a brand-new workflow when the\n // KEY has no versions at all (the Create Workflow path). If other\n // versions exist, a mistyped/removed version in the URL must NOT\n // silently create a real row — redirect to the newest version.\n const anyVersion = await getWorkflow(id, undefined, undefined);\n if (anyVersion?.workflowKey) {\n toast.info(`Version ${version} not found`, {\n description: `Opening ${anyVersion.version} instead.`,\n dismissible: true,\n });\n navigate(`../workflow/${id}/${anyVersion.version}`, {\n replace: true,\n });\n return;\n }\n\n // Workflow not found - CREATE it in the database\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\n \"[WorkflowItem] Error creating workflow:\",\n createError,\n );\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[WorkflowItem] Error loading workflow:\", error);\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [\n id,\n version,\n createWorkflow,\n getWorkflow,\n newWorkflow,\n resetWorkflow,\n navigate,\n // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)\n // and including doNodeCheck here caused infinite re-runs because installedAppIds\n // produces a new Set reference on every render.\n ]);\n\n if (isLoading)\n return (\n // Same loading treatment as the Available Nodes panel, centered on the\n // full canvas area while the workflow definition is fetched.\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n\n return (\n <>\n {/* Missing-nodes modal shown before a workflow with uninstalled nodes is\n opened in the builder. Covers shared workflows and AI-assistant-created\n workflows that reference nodes not yet installed in the workspace. */}\n {configModalOpen && pendingWorkflow && (\n <Suspense fallback={null}>\n <LazyMissingNodesInstallModal\n open={configModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Dismissed without confirming — open anyway (user can install later)\n handleSkipInstall();\n }\n }}\n workflowName={pendingWorkflow.name}\n nodeCheckResult={nodeCheck}\n onConfirm={handleInstallConfirm}\n onSkip={handleSkipInstall}\n installing={installing}\n installProgress={installProgress}\n installErrors={installErrors}\n />\n </Suspense>\n )}\n\n {workflow && !isLoading && <FlowBuilderPage workflow={workflow} />}\n </>\n );\n}\n","import WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <WorkflowItem />\n </ErrorBoundary>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/builder/app/workflow/work/page.tsx","../src/pages/WorkflowBuilder.tsx"],"names":["useNavigate","jsx","jsxs"],"mappings":"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","file":"chunk-4KX6I7PA.js","sourcesContent":["import { useNavigate, useParams } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Icon } from \"@iconify/react\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport {\n useEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n} from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\nimport { useInstalledNodes } from \"../../../../hooks/store/useInstalledNodes\";\nimport { mergeStickyNotes } from \"../../../lib/sticky-notes\";\nimport type {\n TemplateNodeCheckResult,\n WorkflowTemplateContent,\n} from \"../../../../types/workflow-template-content\";\nimport {\n buildRequiredNodeTypes,\n buildNodeCheck,\n} from \"../../../../utils/workflow-node-check\";\nimport { refetchStoreNodes } from \"../../../components/flow-builder/components/blocks\";\n\n// Lazy-load the modal to avoid bundle-size impact on routes that never hit it.\nconst LazyMissingNodesInstallModal = lazy(() =>\n import(\"../../../components/flow-builder/components/templates/MissingNodesInstallModal\").then(\n (m) => ({ default: m.MissingNodesInstallModal }),\n ),\n);\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n /** Canvas annotations persisted separately from executable nodes. */\n stickyNotes?: IFlowState[\"workflow\"][\"nodes\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const navigate = useNavigate();\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false);\n const fromSharedLoadedRef = useRef(false);\n const fetchedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\n\n // ── Missing-nodes modal state ────────────────────────────────────────────\n const { installedAppIds } = useInstalledNodes();\n const [pendingWorkflow, setPendingWorkflow] = useState<\n IFlowState[\"workflow\"] | null\n >(null);\n const [nodeCheck, setNodeCheck] = useState<TemplateNodeCheckResult | null>(\n null,\n );\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n const [installErrors, setInstallErrors] = useState<string[]>([]);\n\n // Classify requiredNodeTypes into installed / missing / missingPaid.\n const doNodeCheck = useCallback(\n (requiredNodeTypes: Parameters<typeof buildNodeCheck>[0]) =>\n buildNodeCheck(requiredNodeTypes, installedAppIds),\n [installedAppIds],\n );\n\n // Keep a ref so the loadWorkflow effect can call doNodeCheck without\n // taking it as a reactive dependency (which would re-trigger the effect\n // on every render and cause infinite CreateWorkflowDefinition mutations).\n const doNodeCheckRef = useRef(doNodeCheck);\n useEffect(() => {\n doNodeCheckRef.current = doNodeCheck;\n });\n\n // Install missing free nodes then open the pending workflow in the builder.\n const handleInstallConfirm = useCallback(async () => {\n if (!pendingWorkflow) return;\n // `missing` now holds only nodes the store can actually install;\n // store-unavailable ones are reported separately (BOFF-7267).\n const nodesToInstall = (nodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n const failed: string[] = [];\n\n if (nodesToInstall.length > 0) {\n setInstalling(true);\n setInstallErrors([]);\n try {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../generated/global-operations\");\n const { getFluidGridsConfig } = await import(\"../../../../config\");\n\n const storeClient = getGlobalStoreClient();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n try {\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n });\n }\n } catch {\n // Keep installing the rest, but remember what failed so the user\n // is told instead of the dialog silently closing (BOFF-7267).\n failed.push(node.displayName || node.nodeType);\n }\n }\n\n // Refresh the in-memory node registry so the builder renders the\n // newly-installed nodes with their real manifests and operations.\n await refetchStoreNodes();\n } finally {\n setInstalling(false);\n setInstallProgress(null);\n }\n }\n\n if (failed.length > 0) {\n // Hold the dialog open so the failure is visible and retryable; the user\n // can still choose \"Open Without Installing\".\n setInstallErrors(failed);\n return;\n }\n\n setInstallErrors([]);\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow, nodeCheck]);\n\n const handleSkipInstall = useCallback(() => {\n if (!pendingWorkflow) return;\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow]);\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"store-browse\" as const,\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n }),\n [id, version],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadWorkflow = async () => {\n try {\n // Always reset the store first\n resetWorkflow();\n\n // For versioned workflows, set loading so FlowBuilderPage unmounts\n // before Zustand is cleared. This prevents the flash of an empty\n // canvas when the component is reused across route navigations.\n if (version && mounted) {\n setIsLoading(true);\n }\n\n if (!version) {\n // Check for a manifest copied from a public shared workflow\n const fromSharedId =\n typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(\"fromShared\")\n : null;\n const pendingManifestJson =\n fromSharedId && typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pendingSharedWorkflow\")\n : null;\n\n if (fromSharedId && pendingManifestJson) {\n try {\n // Do NOT remove from localStorage here — React StrictMode double-fires\n // effects (mount → cleanup → mount). If we remove on the first run,\n // the second run finds null and falls through to an empty workflow.\n // We remove it inside `if (mounted)` so only the \"winning\" run\n // (the one whose mounted flag is still true) clears the entry.\n const manifest = JSON.parse(pendingManifestJson) as {\n nodes?: IFlowState[\"workflow\"][\"nodes\"];\n edges?: IFlowState[\"workflow\"][\"edges\"];\n name?: string;\n };\n\n const sharedWorkflow: IFlowState[\"workflow\"] = {\n ...newWorkflow,\n name: manifest.name ?? \"Copied Workflow\",\n nodes: manifest.nodes ?? [],\n edges: manifest.edges ?? [],\n };\n\n // Detect node types not installed in this workspace and resolve\n // each to its storeProductId so the modal can offer one-click installation.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n sharedWorkflow.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted) {\n // Safe to clear now — this is the winning effect run.\n localStorage.removeItem(\"pendingSharedWorkflow\");\n\n if (requiredNodeTypes.length > 0) {\n // Use the ref so this effect doesn't re-run every time\n // installedAppIds changes (which would cause infinite mutations).\n const check = doNodeCheckRef.current(requiredNodeTypes);\n const needsConfig =\n check.missing.length > 0 || check.missingPaid.length > 0;\n\n if (needsConfig) {\n // Surface the install modal before creating the workflow\n // so the user can install missing nodes first.\n setPendingWorkflow(sharedWorkflow);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n return;\n }\n }\n\n setWorkflow(sharedWorkflow);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n }\n return;\n } catch (e) {\n console.error(\"[WorkflowItem] parse error:\", e);\n // Corrupted localStorage entry — only clear if we're the winning run.\n if (mounted) localStorage.removeItem(\"pendingSharedWorkflow\");\n }\n }\n\n // If a previous effect run already loaded the shared workflow, don't overwrite it\n if (fromSharedId && fromSharedLoadedRef.current) {\n if (mounted) setIsLoading(false);\n return;\n }\n\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (defData) {\n // Build the workflow state — store in ref regardless of mounted status so\n // a subsequent effect run can use it if its own getWorkflow call fails.\n const workflowState: IFlowState[\"workflow\"] = {\n ...defData,\n // Sticky notes are stored under a separate definition key — merge\n // them back onto the canvas alongside the executable nodes.\n nodes: mergeStickyNotes(defData) as IFlowState[\"workflow\"][\"nodes\"],\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n };\n fetchedWorkflowRef.current = workflowState;\n\n // AI-assistant (and shared) workflows may reference nodes that are not\n // installed in this workspace. Offer one-click install before opening.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n workflowState.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted && requiredNodeTypes.length > 0) {\n const check = doNodeCheckRef.current(requiredNodeTypes);\n if (check.missing.length > 0 || check.missingPaid.length > 0) {\n setPendingWorkflow(workflowState);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n return;\n }\n }\n\n if (mounted) {\n setWorkflow(workflowState);\n }\n return;\n }\n\n if (mounted) {\n // If a previous effect run already fetched the workflow (but was cancelled),\n // use its result rather than trying to create a new workflow.\n if (fetchedWorkflowRef.current) {\n setWorkflow(fetchedWorkflowRef.current);\n return;\n }\n\n // Version-not-found guard: only mint a brand-new workflow when the\n // KEY has no versions at all (the Create Workflow path). If other\n // versions exist, a mistyped/removed version in the URL must NOT\n // silently create a real row — redirect to the newest version.\n const anyVersion = await getWorkflow(id, undefined, undefined);\n if (anyVersion?.workflowKey) {\n toast.info(`Version ${version} not found`, {\n description: `Opening ${anyVersion.version} instead.`,\n dismissible: true,\n });\n navigate(`../workflow/${id}/${anyVersion.version}`, {\n replace: true,\n });\n return;\n }\n\n // Workflow not found - CREATE it in the database\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\n \"[WorkflowItem] Error creating workflow:\",\n createError,\n );\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[WorkflowItem] Error loading workflow:\", error);\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [\n id,\n version,\n createWorkflow,\n getWorkflow,\n newWorkflow,\n resetWorkflow,\n navigate,\n // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)\n // and including doNodeCheck here caused infinite re-runs because installedAppIds\n // produces a new Set reference on every render.\n ]);\n\n if (isLoading)\n return (\n // Same loading treatment as the Available Nodes panel, centered on the\n // full canvas area while the workflow definition is fetched.\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n\n return (\n <>\n {/* Missing-nodes modal shown before a workflow with uninstalled nodes is\n opened in the builder. Covers shared workflows and AI-assistant-created\n workflows that reference nodes not yet installed in the workspace. */}\n {configModalOpen && pendingWorkflow && (\n <Suspense fallback={null}>\n <LazyMissingNodesInstallModal\n open={configModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Dismissed without confirming — open anyway (user can install later)\n handleSkipInstall();\n }\n }}\n workflowName={pendingWorkflow.name}\n nodeCheckResult={nodeCheck}\n onConfirm={handleInstallConfirm}\n onSkip={handleSkipInstall}\n installing={installing}\n installProgress={installProgress}\n installErrors={installErrors}\n />\n </Suspense>\n )}\n\n {workflow && !isLoading && <FlowBuilderPage workflow={workflow} />}\n </>\n );\n}\n","import WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <WorkflowItem />\n </ErrorBoundary>\n );\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { FluidGridsProvider, Card } from './chunk-35YDFYV2.js';
1
+ import { FluidGridsProvider, Card } from './chunk-VTKT6XDA.js';
2
2
  import { Input } from './chunk-P5PKRQAO.js';
3
3
  import { Button } from './chunk-DBOMRIP5.js';
4
- import { useFlowStore } from './chunk-MGLTXIN5.js';
5
4
  import { cn } from './chunk-3ZYUGTIT.js';
6
- import { useWorkflowDefinition } from './chunk-ELB3LXRJ.js';
5
+ import { useWorkflowDefinition } from './chunk-OZBZS6DM.js';
6
+ import { useFlowStore } from './chunk-275FCUOI.js';
7
7
  import { useTr } from './chunk-7YWBH2A5.js';
8
8
  import { useState, useRef, useEffect, useCallback } from 'react';
9
9
  import { MarkerType, ReactFlowProvider, useReactFlow, ReactFlow, Background, Controls, MiniMap, Handle, Position } from '@xyflow/react';
@@ -537,5 +537,5 @@ function WorkflowSearchRedirect() {
537
537
  }
538
538
 
539
539
  export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect };
540
- //# sourceMappingURL=chunk-2JLRCN25.js.map
541
- //# sourceMappingURL=chunk-2JLRCN25.js.map
540
+ //# sourceMappingURL=chunk-4LJOUX2R.js.map
541
+ //# sourceMappingURL=chunk-4LJOUX2R.js.map