@particle-academy/fancy-flow 0.25.0 → 0.27.0

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/nodes/NodeShell.tsx","../src/components/nodes/TriggerNode.tsx","../src/components/nodes/ActionNode.tsx","../src/components/nodes/DecisionNode.tsx","../src/components/nodes/OutputNode.tsx","../src/components/nodes/SubgraphNode.tsx","../src/components/nodes/index.ts","../src/components/FlowEditor/graph-ops.ts","../src/components/canvas/helper-lines.ts","../src/components/canvas/HelperLines.tsx","../src/components/canvas/FlowCanvas.tsx","../src/components/NodePalette/NodePalette.tsx","../src/components/NodeConfigPanel/ConfigFieldRenderer.tsx","../src/components/NodeConfigPanel/NodeConfigPanel.tsx","../src/components/FlowRunControls.tsx","../src/components/FlowRunFeed.tsx","../src/components/FlowEditor/FlowEditor.tsx","../src/components/nodes/api.tsx","../src/index.ts"],"names":["jsx","memo","jsxs","reconnectEdge","useState","useMemo","Fragment","useRef","useEffect","FlowEditor","useCallback","internal","w","h"],"mappings":"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","file":"index.js","sourcesContent":["import { type ReactNode, memo } from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport type { FlowNode, NodeRunStatus, PortDescriptor } from \"../../types\";\n\nexport type NodeShellProps = {\n /** Required: the xyflow node this is rendering. */\n node: NodeProps<FlowNode>;\n /** Accent color for the title bar / status ring. */\n accent: string;\n /** Tag/label shown to the left of the title (e.g. \"TRIGGER\", \"ACTION\"). */\n tag: string;\n /** Optional icon glyph (single-character string is fine). */\n icon?: ReactNode;\n /** Whether to show input handles on the left. Defaults true. */\n showInputs?: boolean;\n /** Whether to show output handles on the right. Defaults true. */\n showOutputs?: boolean;\n /** Body content under the title bar. */\n children?: ReactNode;\n};\n\n/**\n * Shared chrome for every kit node — title bar, accent border, status ring,\n * port handles. Specific node kinds compose this with their body content.\n */\nfunction NodeShellInner({\n node,\n accent,\n tag,\n icon,\n showInputs = true,\n showOutputs = true,\n children,\n}: NodeShellProps) {\n const data = node.data;\n const status: NodeRunStatus = data.status ?? \"idle\";\n const inputs = data.inputs ?? defaultInputs(showInputs);\n const outputs = data.outputs ?? defaultOutputs(showOutputs);\n\n return (\n <div\n className={[\"ff-node\", `ff-node--status-${status}`, node.selected ? \"ff-node--selected\" : \"\"].filter(Boolean).join(\" \")}\n style={{ borderColor: node.selected ? accent : undefined }}\n >\n <header className=\"ff-node__header\" style={{ background: accent }}>\n <span className=\"ff-node__icon\" aria-hidden>{icon ?? null}</span>\n <span className=\"ff-node__tag\">{tag}</span>\n <span className=\"ff-node__label\">{data.label}</span>\n {status !== \"idle\" && <StatusDot status={status} />}\n </header>\n\n {data.description && <p className=\"ff-node__desc\">{data.description}</p>}\n {children && <div className=\"ff-node__body\">{children}</div>}\n {data.statusText && <p className=\"ff-node__status-text\">{data.statusText}</p>}\n\n {inputs.map((p, i) => (\n <Handle\n key={p.id}\n type=\"target\"\n position={Position.Left}\n id={p.id}\n style={portStyle(i, inputs.length)}\n title={p.label ?? p.id}\n />\n ))}\n {outputs.map((p, i) => (\n <Handle\n key={p.id}\n type=\"source\"\n position={Position.Right}\n id={p.id}\n style={portStyle(i, outputs.length)}\n title={p.label ?? p.id}\n />\n ))}\n </div>\n );\n}\n\nexport const NodeShell = memo(NodeShellInner);\n\nfunction defaultInputs(show: boolean): PortDescriptor[] {\n return show ? [{ id: \"in\" }] : [];\n}\nfunction defaultOutputs(show: boolean): PortDescriptor[] {\n return show ? [{ id: \"out\" }] : [];\n}\n\nfunction portStyle(i: number, total: number): React.CSSProperties {\n if (total <= 1) return {};\n const slot = (100 / (total + 1)) * (i + 1);\n return { top: `${slot}%` };\n}\n\nfunction StatusDot({ status }: { status: NodeRunStatus }) {\n return <span className={`ff-node__dot ff-node__dot--${status}`} aria-label={`status ${status}`} />;\n}\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/** Entry-point node — outputs only, no inputs. */\nfunction TriggerNodeInner(props: NodeProps<FlowNode>) {\n return <NodeShell node={props} accent=\"#10b981\" tag=\"TRIGGER\" icon=\"⚡\" showInputs={false} />;\n}\nexport const TriggerNode = memo(TriggerNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/** General-purpose work node — inputs and outputs. */\nfunction ActionNodeInner(props: NodeProps<FlowNode>) {\n return <NodeShell node={props} accent=\"#3b82f6\" tag=\"ACTION\" icon=\"▸\" />;\n}\nexport const ActionNode = memo(ActionNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode, PortDescriptor } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\nconst DEFAULT_BRANCHES: PortDescriptor[] = [\n { id: \"true\", label: \"true\" },\n { id: \"false\", label: \"false\" },\n];\n\n/** Branching node — multiple typed outputs, one input. */\nfunction DecisionNodeInner(props: NodeProps<FlowNode>) {\n // If the host hasn't customised outputs, default to a true/false split.\n if (!props.data.outputs) {\n props = { ...props, data: { ...props.data, outputs: DEFAULT_BRANCHES } };\n }\n return <NodeShell node={props} accent=\"#f59e0b\" tag=\"DECISION\" icon=\"◇\" />;\n}\nexport const DecisionNode = memo(DecisionNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/** Terminal node — receives the workflow's final result; no outputs. */\nfunction OutputNodeInner(props: NodeProps<FlowNode>) {\n return <NodeShell node={props} accent=\"#a855f7\" tag=\"OUTPUT\" icon=\"●\" showOutputs={false} />;\n}\nexport const OutputNode = memo(OutputNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode, SubgraphNodeData } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/**\n * SubgraphNode — collapses a group of nodes behind a single facade with\n * inputs and outputs that map to the inner graph's boundary ports. The\n * runtime treats it like an action node: when running, it dispatches to\n * the registered \"subgraph\" executor (host decides expand vs inline).\n *\n * v0.1 just renders the facade. Expand/collapse interactions and inner-\n * graph editing are deferred — host apps can implement those by toggling\n * `data.collapsed` and rendering a nested <FlowCanvas> when expanded.\n */\nfunction SubgraphNodeInner(props: NodeProps<FlowNode>) {\n const data = props.data as SubgraphNodeData;\n const childCount = data.childIds?.length ?? 0;\n return (\n <NodeShell node={props} accent=\"#0ea5e9\" tag=\"SUBGRAPH\" icon=\"❐\">\n <div className=\"ff-subgraph__meta\">\n <span>{childCount} node{childCount === 1 ? \"\" : \"s\"}</span>\n <span>{data.collapsed === false ? \"expanded\" : \"collapsed\"}</span>\n </div>\n </NodeShell>\n );\n}\nexport const SubgraphNode = memo(SubgraphNodeInner);\n","import type { NodeTypes } from \"@xyflow/react\";\nimport { TriggerNode } from \"./TriggerNode\";\nimport { ActionNode } from \"./ActionNode\";\nimport { DecisionNode } from \"./DecisionNode\";\nimport { OutputNode } from \"./OutputNode\";\nimport { NoteNode } from \"./NoteNode\";\nimport { SubgraphNode } from \"./SubgraphNode\";\n\nexport { TriggerNode, ActionNode, DecisionNode, OutputNode, NoteNode, SubgraphNode };\nexport { LaneNode } from \"./LaneNode\";\nexport { NodeShell, type NodeShellProps } from \"./NodeShell\";\n\n/**\n * Default xyflow `nodeTypes` map covering the kit. Spread into your own:\n *\n * <FlowCanvas nodeTypes={{ ...defaultNodeTypes, custom: MyNode }} ... />\n */\nexport const defaultNodeTypes: NodeTypes = {\n trigger: TriggerNode,\n action: ActionNode,\n decision: DecisionNode,\n output: OutputNode,\n note: NoteNode,\n subgraph: SubgraphNode,\n};\n","import { reconnectEdge as xyReconnectEdge, type Connection, type Edge } from \"@xyflow/react\";\nimport type { FlowGraph, FlowNode } from \"../../types\";\n\n/**\n * Remove nodes AND every edge attached to them.\n *\n * Deleting a node without pruning its edges leaves danglers that point at\n * nothing — they survive a round-trip through the schema and blow up the\n * runner, so the two always move together.\n */\nexport function removeNodes(graph: FlowGraph, ids: string[]): FlowGraph {\n if (ids.length === 0) return graph;\n const doomed = new Set(ids);\n\n return {\n nodes: graph.nodes.filter((n) => !doomed.has(n.id)),\n edges: graph.edges.filter((e) => !doomed.has(e.source) && !doomed.has(e.target)),\n };\n}\n\n/** Remove edges by id, leaving nodes untouched. */\nexport function removeEdges(edges: Edge[], ids: string[]): Edge[] {\n if (ids.length === 0) return edges;\n const doomed = new Set(ids);\n\n return edges.filter((e) => !doomed.has(e.id));\n}\n\n/**\n * Set (or clear) an edge's label.\n *\n * An empty/whitespace label is removed rather than stored as `\"\"` — xyflow\n * renders an empty label as an empty chip on the wire, and a blank key would\n * survive export into the workflow schema.\n */\nexport function setEdgeLabel(edges: Edge[], id: string, label: string | undefined): Edge[] {\n const next = label?.trim();\n return edges.map((e) => {\n if (e.id !== id) return e;\n if (!next) {\n const { label: _drop, ...rest } = e;\n return rest as Edge;\n }\n return { ...e, label: next };\n });\n}\n\n/** Copy a node with a fresh id, offset so it doesn't sit exactly on top. */\nexport function duplicateNode(node: FlowNode, id: string, offset = 40): FlowNode {\n return {\n ...node,\n id,\n position: { x: node.position.x + offset, y: node.position.y + offset },\n // Deep copy so the clone's config edits don't mutate the original.\n data: JSON.parse(JSON.stringify(node.data ?? {})),\n } as FlowNode;\n}\n\n/**\n * Clone a set of nodes AND the edges internal to that set, remapping every id.\n * This is the piece `duplicateNode` lacks: a copy/paste (or duplicate-selection)\n * that preserves the wiring *between* the copied nodes. Edges with an endpoint\n * outside the set are dropped (they'd dangle). A `parentId` pointing inside the\n * set is remapped; one pointing outside is detached.\n */\nexport function cloneSubgraph(\n nodes: FlowNode[],\n edges: Edge[],\n opts: { makeId: () => string; offset?: number },\n): { nodes: FlowNode[]; edges: Edge[]; idMap: Map<string, string> } {\n const offset = opts.offset ?? 40;\n const idMap = new Map<string, string>();\n for (const n of nodes) idMap.set(n.id, opts.makeId());\n\n const clonedNodes = nodes.map((n) => {\n const cloned = duplicateNode(n, idMap.get(n.id)!, offset) as any;\n const parentId = (n as any).parentId;\n if (parentId && idMap.has(parentId)) cloned.parentId = idMap.get(parentId);\n else if (parentId) delete cloned.parentId;\n return cloned as FlowNode;\n });\n\n const clonedEdges = edges\n .filter((e) => idMap.has(e.source) && idMap.has(e.target))\n .map((e) => ({ ...e, id: opts.makeId(), source: idMap.get(e.source)!, target: idMap.get(e.target)! }));\n\n return { nodes: clonedNodes, edges: clonedEdges, idMap };\n}\n\n/**\n * Rewire one edge's endpoint(s) — wraps xyflow's `reconnectEdge`. Keeps the\n * edge's id (`shouldReplaceId: false`) so its label and identity survive the\n * rewire instead of being regenerated from the new endpoints.\n */\nexport function reconnectEdge(edges: Edge[], oldEdge: Edge, newConnection: Connection): Edge[] {\n return xyReconnectEdge(oldEdge, newConnection, edges, { shouldReplaceId: false });\n}\n\nexport type AlignEdge = \"left\" | \"hcenter\" | \"right\" | \"top\" | \"vcenter\" | \"bottom\";\n\nconst nodeW = (n: FlowNode): number => (n as any).width ?? (n as any).measured?.width ?? 0;\nconst nodeH = (n: FlowNode): number => (n as any).height ?? (n as any).measured?.height ?? 0;\n\n/** Align a selection to a shared edge/center of its bounding box. */\nexport function alignNodes(nodes: FlowNode[], edge: AlignEdge): FlowNode[] {\n if (nodes.length < 2) return nodes;\n const minL = Math.min(...nodes.map((n) => n.position.x));\n const maxR = Math.max(...nodes.map((n) => n.position.x + nodeW(n)));\n const minT = Math.min(...nodes.map((n) => n.position.y));\n const maxB = Math.max(...nodes.map((n) => n.position.y + nodeH(n)));\n const cx = (minL + maxR) / 2;\n const cy = (minT + maxB) / 2;\n return nodes.map((n) => {\n let { x, y } = n.position;\n if (edge === \"left\") x = minL;\n else if (edge === \"right\") x = maxR - nodeW(n);\n else if (edge === \"hcenter\") x = cx - nodeW(n) / 2;\n else if (edge === \"top\") y = minT;\n else if (edge === \"bottom\") y = maxB - nodeH(n);\n else if (edge === \"vcenter\") y = cy - nodeH(n) / 2;\n return { ...n, position: { x, y } };\n });\n}\n\n/**\n * Order nodes so every parent precedes its children — xyflow misrenders (and\n * warns) when a child appears before its `parentId` in the array. Stable\n * otherwise. Apply at the render boundary once grouping is in play.\n */\nexport function sortNodesParentFirst<T extends { id: string; parentId?: string }>(nodes: T[]): T[] {\n const byId = new Map(nodes.map((n) => [n.id, n] as const));\n const seen = new Set<string>();\n const out: T[] = [];\n const visit = (n: T) => {\n if (seen.has(n.id)) return;\n const pid = (n as any).parentId as string | undefined;\n if (pid && byId.has(pid) && !seen.has(pid)) visit(byId.get(pid)!);\n seen.add(n.id);\n out.push(n);\n };\n for (const n of nodes) visit(n);\n return out;\n}\n\n/** Absolute position of a node, accounting for one level of parent nesting. */\nfunction absolutePosition(node: FlowNode, nodes: FlowNode[]): { x: number; y: number } {\n const pid = (node as any).parentId as string | undefined;\n if (!pid) return node.position;\n const parent = nodes.find((n) => n.id === pid);\n return parent ? { x: node.position.x + parent.position.x, y: node.position.y + parent.position.y } : node.position;\n}\n\n/**\n * Put a node inside a lane/container: set `parentId` + `extent:'parent'` and\n * convert its position to be relative to the lane. Idempotent-safe; a no-op if\n * either id is missing or they're the same node.\n */\nexport function assignToLane(nodes: FlowNode[], nodeId: string, laneId: string): FlowNode[] {\n if (nodeId === laneId) return nodes;\n const node = nodes.find((n) => n.id === nodeId);\n const lane = nodes.find((n) => n.id === laneId);\n if (!node || !lane) return nodes;\n const abs = absolutePosition(node, nodes);\n const laneAbs = absolutePosition(lane, nodes);\n const rel = { x: abs.x - laneAbs.x, y: abs.y - laneAbs.y };\n return nodes.map((n) => (n.id === nodeId ? ({ ...n, parentId: laneId, extent: \"parent\", position: rel } as FlowNode) : n));\n}\n\n/** Take a node out of its lane: drop `parentId`/`extent`, restore absolute position. */\nexport function removeFromLane(nodes: FlowNode[], nodeId: string): FlowNode[] {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node || !(node as any).parentId) return nodes;\n const abs = absolutePosition(node, nodes);\n return nodes.map((n) => {\n if (n.id !== nodeId) return n;\n const { parentId: _p, extent: _e, ...rest } = n as any;\n return { ...rest, position: abs } as FlowNode;\n });\n}\n\n/**\n * Stack lanes into contiguous rows (horizontal) or columns (vertical) — the\n * \"fixed rows/columns\" behavior. `isLane` picks which nodes are lanes; they're\n * ordered by their current cross-axis position and repacked from the first\n * lane's origin. Each lane keeps its own size (independently resizable).\n */\nexport function stackLanes(\n nodes: FlowNode[],\n isLane: (n: FlowNode) => boolean,\n opts: { orientation?: \"horizontal\" | \"vertical\"; gap?: number } = {},\n): FlowNode[] {\n const orientation = opts.orientation ?? \"horizontal\";\n const gap = opts.gap ?? 12;\n const vertical = orientation === \"vertical\";\n const lanes = nodes.filter(isLane).sort((a, b) => (vertical ? a.position.x - b.position.x : a.position.y - b.position.y));\n if (lanes.length === 0) return nodes;\n const originX = lanes[0].position.x;\n const originY = lanes[0].position.y;\n const moves = new Map<string, { x: number; y: number }>();\n let cursor = vertical ? originX : originY;\n for (const lane of lanes) {\n moves.set(lane.id, vertical ? { x: cursor, y: originY } : { x: originX, y: cursor });\n cursor += (vertical ? ((lane as any).width ?? 320) : ((lane as any).height ?? 160)) + gap;\n }\n return nodes.map((n) => (moves.has(n.id) ? { ...n, position: moves.get(n.id)! } : n));\n}\n\n/** Evenly distribute a selection's gaps along an axis (needs 3+ nodes). */\nexport function distributeNodes(nodes: FlowNode[], axis: \"h\" | \"v\"): FlowNode[] {\n if (nodes.length < 3) return nodes;\n const size = (n: FlowNode) => (axis === \"h\" ? nodeW(n) : nodeH(n));\n const coord = (n: FlowNode) => (axis === \"h\" ? n.position.x : n.position.y);\n const sorted = [...nodes].sort((a, b) => coord(a) - coord(b));\n const start = coord(sorted[0]);\n const last = sorted[sorted.length - 1];\n const end = coord(last) + size(last);\n const totalSize = sorted.reduce((s, n) => s + size(n), 0);\n const gap = (end - start - totalSize) / (sorted.length - 1);\n const posById = new Map<string, number>();\n let cursor = start;\n for (const n of sorted) {\n posById.set(n.id, cursor);\n cursor += size(n) + gap;\n }\n return nodes.map((n) => {\n const p = posById.get(n.id)!;\n return { ...n, position: axis === \"h\" ? { ...n.position, x: p } : { ...n.position, y: p } };\n });\n}\n","import type { FlowNode } from \"../../types\";\n\nexport type HelperLineChange = { id: string; position?: { x: number; y: number } };\n\nexport type HelperLinesResult = {\n /** Y of a horizontal guide line (flow coords), if the drag aligns on Y. */\n horizontal?: number;\n /** X of a vertical guide line (flow coords), if the drag aligns on X. */\n vertical?: number;\n /** The snapped position to apply to the dragged node. */\n snapPosition: { x?: number; y?: number };\n};\n\nconst w = (n: FlowNode): number => (n as any).width ?? (n as any).measured?.width ?? 0;\nconst h = (n: FlowNode): number => (n as any).height ?? (n as any).measured?.height ?? 0;\n\n/**\n * Compute alignment guide lines (and a snapped position) for a node being\n * dragged to `change.position`, against the other nodes. Standard \"helper\n * lines\" algorithm: match the dragged node's left/right/top/bottom edges to any\n * other node's edges within `distance`, snapping to the nearest. Pure + testable.\n */\nexport function getHelperLines(change: HelperLineChange, nodes: FlowNode[], distance = 6): HelperLinesResult {\n const result: HelperLinesResult = { snapPosition: { x: undefined, y: undefined } };\n const a = nodes.find((n) => n.id === change.id);\n if (!a || !change.position) return result;\n\n const A = {\n left: change.position.x,\n right: change.position.x + w(a),\n top: change.position.y,\n bottom: change.position.y + h(a),\n width: w(a),\n height: h(a),\n };\n let vDist = distance;\n let hDist = distance;\n\n for (const b of nodes) {\n if (b.id === a.id) continue;\n const B = { left: b.position.x, right: b.position.x + w(b), top: b.position.y, bottom: b.position.y + h(b) };\n\n // Vertical guides (X alignment).\n const ll = Math.abs(A.left - B.left);\n if (ll < vDist) { result.snapPosition.x = B.left; result.vertical = B.left; vDist = ll; }\n const rr = Math.abs(A.right - B.right);\n if (rr < vDist) { result.snapPosition.x = B.right - A.width; result.vertical = B.right; vDist = rr; }\n const lr = Math.abs(A.left - B.right);\n if (lr < vDist) { result.snapPosition.x = B.right; result.vertical = B.right; vDist = lr; }\n const rl = Math.abs(A.right - B.left);\n if (rl < vDist) { result.snapPosition.x = B.left - A.width; result.vertical = B.left; vDist = rl; }\n\n // Horizontal guides (Y alignment).\n const tt = Math.abs(A.top - B.top);\n if (tt < hDist) { result.snapPosition.y = B.top; result.horizontal = B.top; hDist = tt; }\n const bb = Math.abs(A.bottom - B.bottom);\n if (bb < hDist) { result.snapPosition.y = B.bottom - A.height; result.horizontal = B.bottom; hDist = bb; }\n const tb = Math.abs(A.top - B.bottom);\n if (tb < hDist) { result.snapPosition.y = B.bottom; result.horizontal = B.bottom; hDist = tb; }\n const bt = Math.abs(A.bottom - B.top);\n if (bt < hDist) { result.snapPosition.y = B.top - A.height; result.horizontal = B.top; hDist = bt; }\n }\n\n return result;\n}\n","import { ViewportPortal } from \"@xyflow/react\";\n\n/**\n * HelperLines — alignment guides drawn during a drag. Rendered in flow\n * coordinate space (ViewportPortal), so the lines track pan/zoom. Positions come\n * from `getHelperLines`.\n */\nexport function HelperLines({ horizontal, vertical }: { horizontal?: number; vertical?: number }) {\n if (horizontal === undefined && vertical === undefined) return null;\n return (\n <ViewportPortal>\n {vertical !== undefined && (\n <div\n className=\"ff-helper-line\"\n style={{ position: \"absolute\", transform: `translateX(${vertical}px)`, top: -5000, height: 10000, width: 1, pointerEvents: \"none\" }}\n />\n )}\n {horizontal !== undefined && (\n <div\n className=\"ff-helper-line\"\n style={{ position: \"absolute\", transform: `translateY(${horizontal}px)`, left: -5000, width: 10000, height: 1, pointerEvents: \"none\" }}\n />\n )}\n </ViewportPortal>\n );\n}\n","import { type CSSProperties, type ReactNode, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n Controls,\n MiniMap,\n type DefaultEdgeOptions,\n type Edge,\n type EdgeTypes,\n type FitViewOptions,\n type NodeTypes,\n type ReactFlowProps,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { defaultNodeTypes } from \"../nodes\";\nimport { createConnectionValidator, type ConnectionValidatorOptions } from \"../../registry/connection\";\nimport { sortNodesParentFirst } from \"../FlowEditor/graph-ops\";\nimport { getHelperLines } from \"./helper-lines\";\nimport { HelperLines } from \"./HelperLines\";\nimport type { FlowNode } from \"../../types\";\n\nexport type FlowCanvasProps = Omit<ReactFlowProps<FlowNode, Edge>, \"nodes\" | \"edges\" | \"height\"> & {\n nodes: FlowNode[];\n edges: Edge[];\n /** Background variant. Default: \"dots\". */\n background?: BackgroundVariant | \"none\";\n /** Show pan/zoom/fit controls. Default true. */\n showControls?: boolean;\n /** Show minimap. Default false (turn on for big graphs). */\n showMinimap?: boolean;\n /** Pixel height; FlowCanvas expects a sized container. Default 600. */\n height?: number | string;\n /**\n * Enforce port-type compatibility on new connections. `true` (default) uses\n * the built-in validator: a connection is refused only when both ports\n * declare a concrete, differing `type` (so untyped graphs are unaffected),\n * and self-loops are blocked. Pass options to tune the rule, or `false` to\n * disable. An `isValidConnection` you pass yourself always takes precedence.\n */\n validateConnections?: boolean | ConnectionValidatorOptions;\n /** Show alignment guide lines while dragging, and snap to them. Default off. */\n showHelperLines?: boolean;\n /** Optional toolbar / palette etc. rendered above the canvas. */\n toolbar?: ReactNode;\n className?: string;\n style?: CSSProperties;\n};\n\nconst DEFAULT_FIT_VIEW: FitViewOptions = { padding: 0.2 };\nconst DEFAULT_EDGE_OPTIONS: DefaultEdgeOptions = {\n type: \"smoothstep\",\n animated: false,\n};\n\n/**\n * FlowCanvas — themed React Flow surface with the kit's nodes registered\n * by default. Pass your own `nodeTypes` to extend; the kit's defaults are\n * merged behind yours.\n *\n * Hosts wire `onNodesChange` / `onEdgesChange` / `onConnect` themselves\n * (xyflow's standard pattern). The surrounding `useFlowState` hook in\n * `runtime/use-flow-state.ts` is a convenience that wires those for you.\n */\nexport function FlowCanvas({\n nodes,\n edges,\n background = BackgroundVariant.Dots,\n showControls = true,\n showMinimap = false,\n height = 600,\n validateConnections = true,\n isValidConnection,\n colorMode,\n showHelperLines = false,\n onNodesChange,\n toolbar,\n nodeTypes,\n edgeTypes,\n className,\n style,\n ...rest\n}: FlowCanvasProps) {\n const mergedNodeTypes = useMemo<NodeTypes>(\n () => ({ ...defaultNodeTypes, ...(nodeTypes ?? {}) }),\n [nodeTypes],\n );\n\n // Read nodes live through a ref so the validator (built once) always sees the\n // current graph without being rebuilt on every node change.\n const nodesRef = useRef(nodes);\n nodesRef.current = nodes;\n const builtinValidator = useMemo(\n () =>\n validateConnections === false\n ? undefined\n : createConnectionValidator(\n () => nodesRef.current,\n validateConnections === true ? undefined : validateConnections,\n ),\n [validateConnections],\n );\n // A caller-supplied predicate wins; otherwise fall back to port-type validation.\n const resolvedIsValidConnection = isValidConnection ?? builtinValidator;\n\n const mergedEdgeTypes = useMemo<EdgeTypes | undefined>(\n () => (edgeTypes ? { ...edgeTypes } : undefined),\n [edgeTypes],\n );\n\n // xyflow requires a parent node to precede its children in the array; grouping\n // (swimlanes) can produce any order, so normalize it here at the boundary.\n const orderedNodes = useMemo(() => sortNodesParentFirst(nodes), [nodes]);\n\n // Helper lines: on a single-node drag, snap to aligned edges + show guides.\n const [helperLines, setHelperLines] = useState<{ horizontal?: number; vertical?: number }>({});\n const handleNodesChange = useCallback(\n (changes: any[]) => {\n if (showHelperLines) {\n const pos = changes.filter((c) => c.type === \"position\" && c.position);\n if (pos.length === 1 && pos[0].dragging) {\n const lines = getHelperLines(pos[0], nodesRef.current);\n if (lines.snapPosition.x !== undefined) pos[0].position.x = lines.snapPosition.x;\n if (lines.snapPosition.y !== undefined) pos[0].position.y = lines.snapPosition.y;\n setHelperLines({ horizontal: lines.horizontal, vertical: lines.vertical });\n } else {\n setHelperLines({});\n }\n }\n onNodesChange?.(changes as any);\n },\n [showHelperLines, onNodesChange],\n );\n\n return (\n <div\n className={[\n \"ff-canvas\",\n // colorMode drives BOTH react-flow's chrome (below) and our `ff-` styles\n // via the shared `.dark` class / light opt-out — one theme signal.\n colorMode === \"dark\" ? \"dark\" : \"\",\n colorMode === \"light\" ? \"ff-canvas--light\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ height, ...style }}\n >\n {toolbar && <div className=\"ff-canvas__toolbar\">{toolbar}</div>}\n <div className=\"ff-canvas__surface\">\n <ReactFlow\n nodes={orderedNodes}\n edges={edges}\n onNodesChange={handleNodesChange}\n colorMode={colorMode}\n nodeTypes={mergedNodeTypes}\n edgeTypes={mergedEdgeTypes}\n fitView\n fitViewOptions={DEFAULT_FIT_VIEW}\n defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}\n proOptions={{ hideAttribution: true }}\n // Embedded-in-a-page friendly: a bare wheel scrolls the PAGE (so the\n // canvas never traps the scroll), and Shift+wheel zooms the canvas.\n // Drag still pans. All overridable via props.\n zoomActivationKeyCode=\"Shift\"\n preventScrolling={false}\n isValidConnection={resolvedIsValidConnection}\n {...rest}\n >\n {background !== \"none\" && (\n <Background variant={background as BackgroundVariant} gap={20} size={1} color=\"rgba(0,0,0,0.18)\" />\n )}\n {showControls && <Controls className=\"ff-controls\" position=\"bottom-right\" />}\n {showMinimap && <MiniMap className=\"ff-minimap\" pannable zoomable />}\n {showHelperLines && <HelperLines horizontal={helperLines.horizontal} vertical={helperLines.vertical} />}\n </ReactFlow>\n </div>\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useMemo, useState } from \"react\";\nimport { categoryAccent, listNodeKinds, onNodeKindsChanged } from \"../../registry/registry\";\nimport type { NodeCategory, NodeKindDefinition } from \"../../registry/types\";\n\nexport type NodePaletteProps = {\n /** Filter to only these categories. */\n categories?: NodeCategory[];\n /** Called when the user clicks a kind (in addition to drag). Optional. */\n onPick?: (kind: NodeKindDefinition) => void;\n className?: string;\n style?: CSSProperties;\n};\n\nconst CATEGORY_ORDER: NodeCategory[] = [\"trigger\", \"logic\", \"data\", \"ai\", \"io\", \"human\", \"output\", \"layout\", \"annotation\", \"custom\"];\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n trigger: \"Triggers\",\n logic: \"Logic\",\n data: \"Data\",\n ai: \"AI\",\n io: \"Connectors\",\n human: \"Human\",\n output: \"Output\",\n layout: \"Layout\",\n annotation: \"Notes\",\n custom: \"Custom\",\n};\n\n/**\n * NodePalette — sidebar listing every registered node kind, grouped by\n * category. Drag a kind onto a `<FlowCanvas>` to add a new node — set\n * `onDrop` on the canvas to handle the drop with the kind name from the\n * `application/x-fancy-flow-kind` data type.\n */\nexport function NodePalette({ categories, onPick, className, style }: NodePaletteProps) {\n const [, setRev] = useState(0);\n useEffect(() => onNodeKindsChanged(() => setRev((n) => n + 1)), []);\n\n const [query, setQuery] = useState(\"\");\n const visibleCats = categories ?? CATEGORY_ORDER;\n\n const grouped = useMemo(() => {\n const all = listNodeKinds();\n const q = query.trim().toLowerCase();\n const filtered = q\n ? all.filter((k) => k.name.includes(q) || k.label.toLowerCase().includes(q) || (k.description ?? \"\").toLowerCase().includes(q))\n : all;\n const map = new Map<NodeCategory, NodeKindDefinition[]>();\n for (const cat of visibleCats) map.set(cat, []);\n for (const k of filtered) {\n if (!map.has(k.category)) map.set(k.category, []);\n map.get(k.category)!.push(k);\n }\n return map;\n }, [query, visibleCats]);\n\n return (\n <aside className={[\"ff-palette\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <div className=\"ff-palette__search\">\n <input\n className=\"ff-palette__search-input\"\n placeholder=\"Search nodes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n <div className=\"ff-palette__list\">\n {Array.from(grouped.entries()).map(([cat, kinds]) =>\n kinds.length === 0 ? null : (\n <section key={cat} className=\"ff-palette__group\">\n <header className=\"ff-palette__group-label\">{CATEGORY_LABELS[cat] ?? cat}</header>\n {kinds.map((k) => (\n <KindRow key={k.name} kind={k} onPick={onPick} />\n ))}\n </section>\n ),\n )}\n </div>\n </aside>\n );\n}\n\nfunction KindRow({ kind, onPick }: { kind: NodeKindDefinition; onPick?: (k: NodeKindDefinition) => void }) {\n const accent = kind.accent ?? categoryAccent(kind.category);\n const onDragStart = (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/x-fancy-flow-kind\", kind.name);\n // Setting both lets non-aware drop targets (e.g. text inputs) ignore it cleanly.\n e.dataTransfer.setData(\"text/plain\", kind.name);\n };\n return (\n <button\n type=\"button\"\n className=\"ff-palette__row\"\n draggable\n onDragStart={onDragStart}\n onClick={() => onPick?.(kind)}\n title={kind.description ?? kind.name}\n >\n <span className=\"ff-palette__row-dot\" style={{ background: accent }}>{kind.icon ?? \"\"}</span>\n <span className=\"ff-palette__row-text\">\n <span className=\"ff-palette__row-label\">{kind.label}</span>\n {kind.description && <span className=\"ff-palette__row-desc\">{kind.description}</span>}\n </span>\n </button>\n );\n}\n\n/**\n * useDropFromPalette — wires the canvas drop target. Returns the drop /\n * dragOver handlers; they parse the dragged kind name and call `onDrop`\n * with `(kindName, position)` in viewport coords.\n */\nexport function paletteDropHandlers(onDrop: (kindName: string, evt: React.DragEvent) => void) {\n return {\n onDragOver: (e: React.DragEvent) => {\n if (e.dataTransfer.types.includes(\"application/x-fancy-flow-kind\")) {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n }\n },\n onDrop: (e: React.DragEvent) => {\n const name = e.dataTransfer.getData(\"application/x-fancy-flow-kind\");\n if (!name) return;\n e.preventDefault();\n onDrop(name, e);\n },\n };\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport type {\n ConfigField,\n KeyValueConfigField,\n RepeaterConfigField,\n TextConfigField,\n} from \"../../registry/types\";\n\nexport type ConfigFieldRendererProps = {\n field: ConfigField;\n value: unknown;\n onChange: (value: unknown) => void;\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Editor for `document` fields. fancy-flow stores the document but never\n * interprets it — the host owns the editing surface, exactly as it does for\n * `credential`. This is the seam for rich human-input steps (authored pages,\n * required reading, multi-section forms) without the package depending on\n * any particular document model.\n */\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n};\n\n/**\n * ConfigFieldRenderer — dispatches to the right input element per field\n * type. Plain HTML inputs styled via the package's CSS so the package\n * stays standalone (no react-fancy import required).\n *\n * Hosts that want to use react-fancy form components can supply their\n * own field renderers via the kind's `renderPanel`.\n */\nexport function ConfigFieldRenderer({\n field,\n value,\n onChange,\n renderCredentialField,\n renderDocumentField,\n}: ConfigFieldRendererProps) {\n switch (field.type) {\n case \"text\": {\n // Declaring `choices` turns a text field into a picker without changing\n // its type or the shape of the value it stores.\n if (field.choices?.length) {\n return <ChoiceField field={field} value={value} onChange={onChange} />;\n }\n return (\n <input\n className=\"ff-panel__input\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n case \"textarea\":\n return (\n <textarea\n className=\"ff-panel__input ff-panel__input--textarea\"\n rows={field.rows ?? 4}\n value={(value as string) ?? \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"number\":\n return (\n <input\n className=\"ff-panel__input\"\n type=\"number\"\n value={(value as number) ?? \"\"}\n min={field.min}\n max={field.max}\n step={field.step ?? 1}\n onChange={(e) => onChange(e.target.value === \"\" ? undefined : Number(e.target.value))}\n />\n );\n\n case \"switch\":\n return (\n <label className=\"ff-panel__switch\">\n <input\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span className=\"ff-panel__switch-slider\" />\n </label>\n );\n\n case \"select\":\n return (\n <select\n className=\"ff-panel__input\"\n value={(value as string) ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>—</option>\n {field.options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n );\n\n case \"json\":\n return <JsonField value={value} onChange={onChange} rows={field.rows} />;\n\n case \"expression\":\n return (\n <textarea\n className=\"ff-panel__input ff-panel__input--expression\"\n rows={2}\n value={(value as string) ?? \"\"}\n placeholder={field.example ?? \"{{ $json.field }}\"}\n spellCheck={false}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"credential\":\n if (renderCredentialField) {\n return <>{renderCredentialField({ credentialType: field.credentialType, value, onChange })}</>;\n }\n return (\n <input\n className=\"ff-panel__input ff-panel__input--credential\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={`Credential reference (${field.credentialType})`}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"repeater\":\n return (\n <RepeaterField\n field={field}\n value={value}\n onChange={onChange}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n />\n );\n\n case \"keyvalue\":\n return <KeyValueField field={field} value={value} onChange={onChange} />;\n\n case \"document\":\n if (renderDocumentField) {\n return <>{renderDocumentField({ documentType: field.documentType, value, onChange })}</>;\n }\n return (\n <p className=\"ff-panel__hint ff-panel__hint--missing\">\n No document editor supplied. Pass <code>renderDocumentField</code> to\n NodeConfigPanel to author this field.\n </p>\n );\n\n default:\n return null;\n }\n}\n\n/** Normalize the `choices` shorthand — a bare string means value === label. */\nexport function normalizeChoices(\n choices: NonNullable<TextConfigField[\"choices\"]>,\n): Array<{ value: string; label: string }> {\n return choices.map((c) =>\n typeof c === \"string\" ? { value: c, label: c } : { value: c.value, label: c.label ?? c.value },\n );\n}\n\n/**\n * ChoiceField — a text field rendered as a select because the kind declared\n * `choices`.\n *\n * A stored value that is no longer among the choices is appended as an option\n * instead of being dropped. Choices are authored data and can change after\n * configs are saved; silently resetting the author's value on render would\n * lose work with no indication it happened.\n */\nfunction ChoiceField({\n field,\n value,\n onChange,\n}: {\n field: TextConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const options = normalizeChoices(field.choices ?? []);\n const current = typeof value === \"string\" ? value : \"\";\n const known = options.some((o) => o.value === current);\n\n return (\n <select\n className=\"ff-panel__input\"\n value={current}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>{field.placeholder ?? \"—\"}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n {current !== \"\" && !known && (\n <option value={current}>{current} (not in list)</option>\n )}\n </select>\n );\n}\n\n/**\n * RepeaterField — editable list of objects, each row driven by the field's\n * own sub-schema. Rows carry stable `data-ff-repeater-row` indices so an\n * agent can target a specific row without guessing DOM.\n */\nfunction RepeaterField({\n field,\n value,\n onChange,\n renderCredentialField,\n renderDocumentField,\n}: {\n field: RepeaterConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n renderCredentialField?: ConfigFieldRendererProps[\"renderCredentialField\"];\n renderDocumentField?: ConfigFieldRendererProps[\"renderDocumentField\"];\n}) {\n const rows: Array<Record<string, unknown>> = Array.isArray(value) ? (value as Array<Record<string, unknown>>) : [];\n const max = field.maxItems ?? Infinity;\n const min = field.minItems ?? 0;\n\n const replace = (next: Array<Record<string, unknown>>) => onChange(next);\n\n const addRow = () => {\n const blank: Record<string, unknown> = {};\n for (const f of field.fields) {\n if (\"default\" in f && f.default !== undefined) blank[f.key] = f.default;\n }\n replace([...rows, blank]);\n };\n\n const removeRow = (i: number) => replace(rows.filter((_, idx) => idx !== i));\n\n const moveRow = (i: number, delta: number) => {\n const target = i + delta;\n if (target < 0 || target >= rows.length) return;\n const next = [...rows];\n [next[i], next[target]] = [next[target], next[i]];\n replace(next);\n };\n\n const setCell = (i: number, key: string, cell: unknown) =>\n replace(rows.map((row, idx) => (idx === i ? { ...row, [key]: cell } : row)));\n\n const rowTitle = (row: Record<string, unknown>, i: number): string => {\n const key = field.titleKey ?? field.fields[0]?.key;\n const raw = key ? row[key] : undefined;\n if (typeof raw === \"string\" && raw.trim() !== \"\") return raw;\n if (typeof raw === \"number\" || typeof raw === \"boolean\") return String(raw);\n return `Item ${i + 1}`;\n };\n\n return (\n <div className=\"ff-repeater\" data-ff-repeater={field.key}>\n {rows.length === 0 && <p className=\"ff-repeater__empty\">None yet.</p>}\n\n {rows.map((row, i) => (\n <div className=\"ff-repeater__row\" key={i} data-ff-repeater-row={i}>\n <div className=\"ff-repeater__row-head\">\n <span className=\"ff-repeater__row-title\">{rowTitle(row, i)}</span>\n <div className=\"ff-repeater__row-actions\">\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, -1)}\n disabled={i === 0}\n aria-label={`Move ${rowTitle(row, i)} up`}\n >↑</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, 1)}\n disabled={i === rows.length - 1}\n aria-label={`Move ${rowTitle(row, i)} down`}\n >↓</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => removeRow(i)}\n disabled={rows.length <= min}\n aria-label={`Remove ${rowTitle(row, i)}`}\n >✕</button>\n </div>\n </div>\n\n {field.fields.map((sub) => (\n <div className=\"ff-repeater__cell\" key={sub.key}>\n <label className=\"ff-panel__label ff-panel__label--sub\">\n {sub.label}\n {sub.required && <span className=\"ff-panel__required\" aria-hidden> *</span>}\n </label>\n <ConfigFieldRenderer\n field={sub}\n value={row[sub.key]}\n onChange={(cell) => setCell(i, sub.key, cell)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n />\n </div>\n ))}\n </div>\n ))}\n\n <button\n type=\"button\"\n className=\"ff-repeater__add\"\n onClick={addRow}\n disabled={rows.length >= max}\n >\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\n/**\n * KeyValueField — editable string→string map.\n *\n * Renaming a key preserves insertion order (rebuilding the object rather than\n * delete-then-add), so rows don't jump around while the author is typing.\n */\nfunction KeyValueField({\n field,\n value,\n onChange,\n}: {\n field: KeyValueConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const map = (value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {}) as Record<string, string>;\n const entries = Object.entries(map);\n\n const commit = (next: Array<[string, string]>) => {\n const obj: Record<string, string> = {};\n for (const [k, v] of next) {\n if (k === \"\") continue;\n obj[k] = v;\n }\n onChange(obj);\n };\n\n const setKey = (i: number, key: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [key, v] : [k, v])));\n const setVal = (i: number, val: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [k, val] : [k, v])));\n const remove = (i: number) => commit(entries.filter((_, idx) => idx !== i));\n const add = () => commit([...entries, [\"\", \"\"]]);\n\n return (\n <div className=\"ff-keyvalue\" data-ff-keyvalue={field.key}>\n {entries.length > 0 && (\n <div className=\"ff-keyvalue__head\">\n <span>{field.keyLabel ?? \"Key\"}</span>\n <span>{field.valueLabel ?? \"Value\"}</span>\n <span />\n </div>\n )}\n\n {entries.map(([k, v], i) => (\n <div className=\"ff-keyvalue__row\" key={i} data-ff-keyvalue-row={i}>\n <input\n className=\"ff-panel__input\"\n value={k}\n placeholder={field.keyPlaceholder}\n aria-label={`${field.keyLabel ?? \"Key\"} ${i + 1}`}\n onChange={(e) => setKey(i, e.target.value)}\n />\n {field.valueOptions ? (\n <select\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n >\n <option value=\"\" disabled>—</option>\n {field.valueOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n ) : (\n <input\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n placeholder={field.valuePlaceholder}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n />\n )}\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => remove(i)}\n aria-label={`Remove ${k || `entry ${i + 1}`}`}\n >✕</button>\n </div>\n ))}\n\n <button type=\"button\" className=\"ff-repeater__add\" onClick={add}>\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\nfunction JsonField({ value, onChange, rows }: { value: unknown; onChange: (v: unknown) => void; rows?: number }) {\n // Keep a separate string buffer so partial input doesn't get clobbered\n // by re-serializing on every keystroke.\n const initial = useMemo(() => {\n try {\n return value === undefined ? \"\" : JSON.stringify(value, null, 2);\n } catch {\n return \"\";\n }\n }, [value]);\n return (\n <textarea\n className=\"ff-panel__input ff-panel__input--json\"\n rows={rows ?? 6}\n defaultValue={initial}\n spellCheck={false}\n onBlur={(e) => {\n const text = e.target.value.trim();\n if (text === \"\") {\n onChange(undefined);\n return;\n }\n try {\n onChange(JSON.parse(text));\n } catch {\n // Leave value unchanged; visual stays at last good state on next render\n }\n }}\n />\n );\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport type { FlowNode } from \"../../types\";\nimport { getNodeKind, validateConfig } from \"../../registry/registry\";\nimport { getRichInputAdapter } from \"../../registry/rich-input\";\nimport { ConfigFieldRenderer } from \"./ConfigFieldRenderer\";\n\nexport type NodeConfigPanelProps = {\n /** Currently-selected node — pass null to render the empty state. */\n node: FlowNode | null;\n /** Called when the user edits the node label, description, or config. */\n onChange: (next: FlowNode) => void;\n /**\n * Called when the user deletes the node from the panel. When provided, the\n * panel renders a \"Delete node\" button while a node is selected — so the\n * delete affordance lives WITH the panel (a dev composing their own editor\n * gets it for free), rather than in a host toolbar it has to re-implement.\n */\n onDelete?: (node: FlowNode) => void;\n /** Label for the delete button. Default \"Delete node\". */\n deleteLabel?: string;\n /** Optional header content (e.g. close button). */\n header?: ReactNode;\n /** Optional credential picker hook — host renders the picker. */\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Optional document editor hook — host renders the editor for `document`\n * fields. Lets rich authored content live in node config without fancy-flow\n * taking on a document model.\n */\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n className?: string;\n style?: React.CSSProperties;\n};\n\n/**\n * NodeConfigPanel — schema-driven form for the selected node. Defers to\n * `kind.renderPanel` if the kind opts out of the auto-form.\n */\nexport function NodeConfigPanel({\n node,\n onChange,\n onDelete,\n deleteLabel = \"Delete node\",\n header,\n renderCredentialField,\n renderDocumentField,\n className,\n style,\n}: NodeConfigPanelProps) {\n if (!node) {\n return (\n <aside className={[\"ff-panel\", \"ff-panel--empty\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <p className=\"ff-panel__empty\">Select a node to configure it.</p>\n </aside>\n );\n }\n\n const kindName = (node.data as any).kind ?? node.type;\n const kind = useMemo(() => getNodeKind(kindName), [kindName]);\n const config = useMemo(() => ((node.data as any).config ?? {}) as Record<string, unknown>, [node.data]);\n\n if (!kind) {\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <p className=\"ff-panel__empty\">Unknown kind: {kindName}</p>\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n }\n\n const setLabel = (label: string) =>\n onChange({ ...node, data: { ...node.data, label } });\n\n const setDescription = (description: string) =>\n onChange({ ...node, data: { ...node.data, description } });\n\n const setConfigValue = (key: string, value: unknown) =>\n onChange({ ...node, data: { ...node.data, config: { ...config, [key]: value } } });\n\n const issues = validateConfig(kind, config);\n\n // An explicit prop wins; otherwise fall back to the rich-input adapter, so a\n // single registerRichInputAdapter() call enables BOTH authoring here and the\n // in-node preview without the host wiring the same editor twice.\n const adapter = getRichInputAdapter();\n const documentField = renderDocumentField\n ?? (adapter?.renderEditor\n ? ({ value, onChange: set }: { value: unknown; onChange: (n: unknown) => void }) =>\n adapter.renderEditor!({ value, onChange: set })\n : undefined);\n\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <header className=\"ff-panel__header\">\n <span className=\"ff-panel__kind-tag\">{kind.label}</span>\n {kind.description && <p className=\"ff-panel__kind-desc\">{kind.description}</p>}\n </header>\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\">Label</label>\n <input\n className=\"ff-panel__input\"\n value={node.data.label ?? \"\"}\n onChange={(e) => setLabel(e.target.value)}\n placeholder={kind.label}\n />\n </div>\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\">Description</label>\n <textarea\n className=\"ff-panel__input ff-panel__input--textarea\"\n rows={2}\n value={node.data.description ?? \"\"}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n\n {kind.renderPanel ? (\n kind.renderPanel({\n config: config as any,\n onChange: (next) => onChange({ ...node, data: { ...node.data, config: next } }),\n nodeId: node.id,\n })\n ) : (\n <>\n {(kind.configSchema ?? []).length > 0 && <hr className=\"ff-panel__divider\" />}\n {(kind.configSchema ?? []).map((field) => (\n <div key={field.key} className=\"ff-panel__field\">\n <label className=\"ff-panel__label\">\n {field.label}\n {field.required && <span className=\"ff-panel__required\" aria-hidden> *</span>}\n </label>\n {field.description && <p className=\"ff-panel__hint\">{field.description}</p>}\n <ConfigFieldRenderer\n field={field}\n value={config[field.key]}\n onChange={(v) => setConfigValue(field.key, v)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={documentField}\n />\n </div>\n ))}\n </>\n )}\n\n {issues.length > 0 && (\n <div className=\"ff-panel__issues\">\n {issues.map((iss) => (\n <p key={iss.key} className=\"ff-panel__issue\">⚠ {iss.message}</p>\n ))}\n </div>\n )}\n\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type FlowRunControlsProps = {\n running: boolean;\n onRun: () => void;\n onCancel?: () => void;\n onReset?: () => void;\n className?: string;\n style?: CSSProperties;\n};\n\n/** FlowRunControls — Run / Cancel / Reset buttons. Wire to a `useFlowRun`. */\nexport function FlowRunControls({ running, onRun, onCancel, onReset, className, style }: FlowRunControlsProps) {\n return (\n <div className={[\"ff-run-controls\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {!running ? (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--run\" onClick={onRun}>\n ▶ Run\n </button>\n ) : (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--cancel\" onClick={onCancel}>\n ⏹ Cancel\n </button>\n )}\n {onReset && (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--reset\" onClick={onReset} disabled={running}>\n Reset\n </button>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useRef } from \"react\";\nimport type { FlowRunFeedEntry } from \"../runtime/use-flow-run\";\n\nexport type FlowRunFeedProps = {\n entries: FlowRunFeedEntry[];\n className?: string;\n style?: CSSProperties;\n};\n\n/** FlowRunFeed — scrolling log panel. Auto-scrolls to bottom on new entries. */\nexport function FlowRunFeed({ entries, className, style }: FlowRunFeedProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = scrollRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }, [entries.length]);\n\n return (\n <div className={[\"ff-run-feed\", className ?? \"\"].filter(Boolean).join(\" \")} style={style} ref={scrollRef}>\n {entries.length === 0 ? (\n <p className=\"ff-run-feed__empty\">No run events yet.</p>\n ) : (\n entries.map((e) => (\n <div key={e.id} className={`ff-run-feed__row ff-run-feed__row--${e.level}`}>\n <span className=\"ff-run-feed__time\">{formatTime(e.at)}</span>\n {e.nodeId && <span className=\"ff-run-feed__node\">{e.nodeId}</span>}\n <span className=\"ff-run-feed__text\">{e.text}</span>\n </div>\n ))\n )}\n </div>\n );\n}\n\nfunction formatTime(at: number): string {\n const d = new Date(at);\n return `${d.getMinutes().toString().padStart(2, \"0\")}:${d.getSeconds().toString().padStart(2, \"0\")}.${Math.floor(d.getMilliseconds() / 100)}`;\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n ReactFlowProvider,\n useReactFlow,\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n type Connection,\n type Edge,\n type NodeMouseHandler,\n} from \"@xyflow/react\";\nimport type { UseFlowStateReturn } from \"../../runtime/use-flow-state\";\nimport { FlowCanvas, type FlowCanvasProps } from \"../canvas/FlowCanvas\";\nimport { NodePalette, paletteDropHandlers } from \"../NodePalette\";\nimport { NodeConfigPanel } from \"../NodeConfigPanel\";\nimport { FlowRunControls } from \"../FlowRunControls\";\nimport { FlowRunFeed } from \"../FlowRunFeed\";\nimport { useFlowState } from \"../../runtime/use-flow-state\";\nimport { useFlowHistory } from \"../../runtime/use-flow-history\";\nimport { useFlowRun, applyStatusesToNodes, applyOutputsToNodes } from \"../../runtime/use-flow-run\";\nimport { exportWorkflow, importWorkflow, workflowToBlob, type WorkflowMetadata, type WorkflowSchema } from \"../../schema\";\nimport { buildNodeTypes, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged } from \"../../registry\";\nimport type { ExecutorRegistry, FlowGraph, FlowNode } from \"../../types\";\nimport {\n duplicateNode as cloneNode,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n assignToLane as assignToLaneOp,\n removeFromLane as removeFromLaneOp,\n removeEdges,\n removeNodes,\n setEdgeLabel,\n type AlignEdge,\n} from \"./graph-ops\";\nimport {\n FlowEditorProvider,\n type FlowEditorAction,\n type FlowEditorApi,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n} from \"./api\";\n\nexport type FlowEditorProps = {\n initial?: FlowGraph;\n /** Controlled mode — host owns the graph state. When set, takes precedence\n * over `initial`. Pair with `onChange` to receive edits. */\n value?: FlowGraph;\n /** Executor registry passed to runFlow. Each kind name maps to an executor. */\n executors?: ExecutorRegistry;\n /** Saved metadata for export. */\n metadata?: WorkflowMetadata;\n /** Show the palette sidebar. Default true. */\n showPalette?: boolean;\n /** Show the config panel sidebar. Default true. */\n showPanel?: boolean;\n /** Show run feed below the canvas. Default true. */\n showFeed?: boolean;\n /** Total editor height. Default 720. */\n height?: number;\n /** Extra toolbar content, appended after the built-ins. Prefer `actions`\n * (declarative + agent-emittable); this stays for back-compat. */\n extraToolbar?: ReactNode;\n /** Declarative custom toolbar buttons. */\n actions?: FlowEditorAction[];\n /** Turn built-in toolbar affordances off individually. */\n builtins?: FlowEditorBuiltins;\n /** Replace whole regions of the editor. */\n slots?: FlowEditorSlots;\n /** Forwarded to `<FlowCanvas>` / React Flow — snapToGrid, minimap, context\n * menus, edge types, and anything else xyflow accepts. */\n canvasProps?: Partial<Omit<FlowCanvasProps, \"nodes\" | \"edges\">>;\n /** Called whenever the graph changes — host can persist. */\n onChange?: (graph: FlowGraph) => void;\n /** Called when the selected node changes. */\n onSelectionChange?: (node: FlowNode | null) => void;\n /** Called after nodes are deleted, with the deleted ids. */\n onDelete?: (ids: string[]) => void;\n /** Called after connections are broken, with the deleted edge ids. */\n onEdgeDelete?: (ids: string[]) => void;\n /**\n * Stage destructive edits for human confirmation. When set, every delete path\n * — keyboard, panel, context menu, and `api.deleteNodes`/`deleteEdges` —\n * calls this first; return false to veto. Default: delete immediately. This\n * realizes the component contract's \"agents propose, humans confirm\" on the\n * canvas.\n */\n confirmDelete?: (targets: { nodes: FlowNode[]; edges: Edge[] }) => boolean | Promise<boolean>;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowEditor — batteries-included workflow editor, but not a black box.\n *\n * Defaults compose NodePalette + FlowCanvas + NodeConfigPanel + run controls +\n * feed. Every part is replaceable: pass `actions` for custom toolbar buttons,\n * `slots` to swap a whole region, `canvasProps` to reach React Flow, or grab\n * the {@link FlowEditorApi} from `ref` / `useFlowEditor()` and build your own\n * chrome around the primitives.\n */\nexport const FlowEditor = forwardRef<FlowEditorApi, FlowEditorProps>(function FlowEditor(props, ref) {\n return (\n <ReactFlowProvider>\n <div\n className={[\"ff-editor\", props.className ?? \"\"].filter(Boolean).join(\" \")}\n style={{ height: props.height ?? 720, ...props.style }}\n >\n <FlowEditorInner {...props} apiRef={ref} />\n </div>\n </ReactFlowProvider>\n );\n});\n\nfunction FlowEditorInner({\n initial = { nodes: [], edges: [] },\n value,\n executors = {},\n metadata,\n showPalette = true,\n showPanel = true,\n showFeed = true,\n extraToolbar,\n actions = [],\n builtins = {},\n slots = {},\n canvasProps = {},\n onChange,\n onSelectionChange,\n onDelete,\n onEdgeDelete,\n confirmDelete,\n apiRef,\n}: FlowEditorProps & { apiRef?: React.ForwardedRef<FlowEditorApi> }) {\n const internal = useFlowState(initial);\n const runner = useFlowRun();\n const rf = useReactFlow();\n\n // When `value` is provided we run in controlled mode: host owns nodes/edges,\n // local edits go through onChange. Internal state is unused but the hook\n // still has to run (rules of hooks).\n const controlled = value !== undefined;\n const baseFlow = controlled ? makeControlledFlowAdapter(value!, onChange) : internal;\n // Wrap the sink with the commit/undo pipeline — one interception point for\n // every committing mutation, whichever mode we're in.\n const hist = useFlowHistory(baseFlow);\n const flow = hist.flow;\n\n // Re-render when registry kinds change so the palette + nodeTypes reflect it.\n const [, force] = useState(0);\n useEffect(() => onNodeKindsChanged(() => force((n) => n + 1)), []);\n const nodeTypes = useMemo(() => buildNodeTypes(), [listNodeKinds().length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const renderedNodes = useMemo(\n () =>\n applyOutputsToNodes(\n applyStatusesToNodes(flow.nodes, runner.statuses, runner.statusText),\n runner.outputs,\n ),\n [flow.nodes, runner.statuses, runner.statusText, runner.outputs],\n );\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const selected = useMemo(() => flow.nodes.find((n) => n.id === selectedId) ?? null, [flow.nodes, selectedId]);\n\n useEffect(() => onSelectionChange?.(selected), [selected, onSelectionChange]);\n\n const [selectedEdgeId, setSelectedEdgeId] = useState<string | null>(null);\n const selectedEdge = useMemo(\n () => flow.edges.find((e: Edge) => e.id === selectedEdgeId) ?? null,\n [flow.edges, selectedEdgeId],\n );\n\n const handleNodeClick: NodeMouseHandler = (_e, node) => {\n setSelectedId(node.id);\n // Node and edge selection are mutually exclusive, so Delete is never\n // ambiguous about what it would remove.\n setSelectedEdgeId(null);\n };\n\n // Right-click menu, for a node OR a connection. Anchored in viewport coords\n // (position: fixed), so it is not clipped by the canvas' overflow.\n const [menu, setMenu] = useState<\n { x: number; y: number; target: { type: \"node\" | \"edge\"; id: string } } | null\n >(null);\n // Inline \"label this connection\" editor, anchored like the menu.\n const [labelEdit, setLabelEdit] = useState<{ x: number; y: number; edgeId: string } | null>(null);\n\n const closeMenu = useCallback(() => setMenu(null), []);\n\n const handleNodeContextMenu: NodeMouseHandler = (event, node) => {\n event.preventDefault();\n setSelectedId(node.id);\n setSelectedEdgeId(null);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"node\", id: node.id } });\n };\n\n const handleEdgeClick = (_e: React.MouseEvent, edge: Edge) => {\n setSelectedEdgeId(edge.id);\n };\n\n const handleEdgeContextMenu = (event: React.MouseEvent, edge: Edge) => {\n event.preventDefault();\n setSelectedEdgeId(edge.id);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"edge\", id: edge.id } });\n };\n\n // Dismiss on any outside click, scroll, or Escape.\n useEffect(() => {\n if (menu === null && labelEdit === null) return;\n const close = () => { setMenu(null); setLabelEdit(null); };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && close();\n window.addEventListener(\"click\", close);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n window.removeEventListener(\"click\", close);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [menu, labelEdit]);\n\n // Editor keyboard shortcuts. Ignored while a field is focused, so Ctrl+Z does\n // native text-undo inside inputs/textareas rather than reverting the graph.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n hist.undo();\n } else if ((key === \"z\" && e.shiftKey) || key === \"y\") {\n e.preventDefault();\n hist.redo();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [hist]);\n\n // Uncontrolled: notify host on every graph mutation. Controlled mode\n // already notifies via the adapter on each setNodes/setEdges call.\n useEffect(() => {\n if (!controlled) onChange?.({ nodes: flow.nodes, edges: flow.edges });\n }, [flow.nodes, flow.edges, onChange, controlled]);\n\n const addNode = useCallback(\n (kindName: string, position?: { x: number; y: number }): string | null => {\n const kind = getNodeKind(kindName);\n if (!kind) return null;\n const at = position ?? { x: 80, y: 80 };\n const id = newNodeId();\n flow.setNodes((all: FlowNode[]) => [\n ...all,\n {\n id,\n type: kind.name,\n position: at,\n data: { kind: kind.name, label: kind.label, config: defaultConfigFor(kind) } as any,\n } as FlowNode,\n ]);\n setSelectedId(id);\n return id;\n },\n [flow],\n );\n\n /** Delete nodes AND every edge attached to them — an orphaned edge would\n * otherwise survive the node it connected. */\n const deleteNodes = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.nodes.filter((n) => ids.includes(n.id));\n if (targets.length === 0) return;\n if (confirmDelete) {\n const attached = flow.edges.filter((e: Edge) => ids.includes(e.source) || ids.includes(e.target));\n if (!(await confirmDelete({ nodes: targets, edges: attached }))) return;\n }\n const doomed = new Set(ids);\n // Atomic: prune edges + remove nodes in ONE commit — one undo step, and\n // correct in controlled mode where two sequential writes would clobber.\n flow.setGraph(removeNodes({ nodes: flow.nodes, edges: flow.edges }, ids));\n setSelectedId((cur) => (cur !== null && doomed.has(cur) ? null : cur));\n onDelete?.(ids);\n },\n [flow, onDelete, confirmDelete],\n );\n\n const deleteEdges = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.edges.filter((e: Edge) => ids.includes(e.id));\n if (targets.length === 0) return;\n if (confirmDelete && !(await confirmDelete({ nodes: [], edges: targets }))) return;\n flow.setEdges((all: Edge[]) => removeEdges(all, ids));\n setSelectedEdgeId((cur) => (cur !== null && ids.includes(cur) ? null : cur));\n onEdgeDelete?.(ids);\n },\n [flow, onEdgeDelete, confirmDelete],\n );\n\n // ── Multi-selection + clipboard (Release 2) ──\n // xyflow owns the real multi-selection (box / shift-click) on `node.selected`;\n // we read it rather than tracking a parallel list.\n const selectedNodes = useMemo(() => flow.nodes.filter((n) => n.selected), [flow.nodes]);\n const selectedIds = useMemo(() => selectedNodes.map((n) => n.id), [selectedNodes]);\n\n const clipboard = useRef<FlowGraph | null>(null);\n\n const copySelection = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const edges = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n clipboard.current = { nodes: sel.map((n) => ({ ...n })), edges: edges.map((e) => ({ ...e })) };\n }, [flow]);\n\n const pasteClipboard = useCallback(\n (at?: { x: number; y: number }) => {\n const clip = clipboard.current;\n if (!clip || clip.nodes.length === 0) return;\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(clip.nodes, clip.edges, { makeId: newNodeId, offset: 40 });\n let placed = clones;\n if (at) {\n const minX = Math.min(...clones.map((n) => n.position.x));\n const minY = Math.min(...clones.map((n) => n.position.y));\n placed = clones.map((n) => ({ ...n, position: { x: n.position.x - minX + at.x, y: n.position.y - minY + at.y } }));\n }\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...placed.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n },\n [flow],\n );\n\n const duplicateSelected = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const internal = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(sel, internal, { makeId: newNodeId, offset: 40 });\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...clones.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n }, [flow]);\n\n const alignSelected = useCallback(\n (edge: AlignEdge) => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 2) return;\n const byId = new Map(alignNodes(sel, edge).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const distributeSelected = useCallback(\n (axis: \"h\" | \"v\") => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 3) return;\n const byId = new Map(distributeNodes(sel, axis).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const onReconnect = useCallback(\n (oldEdge: Edge, conn: Connection) => flow.setEdges((eds: Edge[]) => reconnectEdge(eds, oldEdge, conn)),\n [flow],\n );\n\n // ── Swimlanes (Release 4) ──\n const isLaneNode = useCallback(\n (n: FlowNode) => getNodeKind((n.data as any)?.kind ?? n.type)?.category === \"layout\",\n [],\n );\n\n const addLane = useCallback(\n (orientation: \"horizontal\" | \"vertical\" = \"horizontal\", title?: string): string => {\n const vertical = orientation === \"vertical\";\n const lanes = flow.nodes.filter(isLaneNode);\n const w = vertical ? 280 : 680;\n const h = vertical ? 480 : 168;\n const end = lanes.reduce(\n (m, l) =>\n Math.max(m, vertical ? l.position.x + ((l as any).width ?? w) : l.position.y + ((l as any).height ?? h)),\n 0,\n );\n const id = newNodeId();\n const name = title ?? `Lane ${lanes.length + 1}`;\n const node = {\n id,\n type: \"@particle-academy/lane\",\n position: vertical ? { x: lanes.length ? end + 12 : 0, y: 0 } : { x: 0, y: lanes.length ? end + 12 : 0 },\n width: w,\n height: h,\n data: { kind: \"@particle-academy/lane\", label: name, config: { title: name, orientation } } as any,\n } as FlowNode;\n flow.setNodes((all: FlowNode[]) => [...all, node]);\n setSelectedId(id);\n return id;\n },\n [flow, isLaneNode],\n );\n\n // Drop a node onto a lane to file it there; drag it out to unfile it.\n const handleNodeDragStop = useCallback(\n (_e: MouseEvent | TouchEvent, node: FlowNode) => {\n if (isLaneNode(node)) return; // v1: lanes don't nest inside lanes\n const overLane = rf.getIntersectingNodes(node).find((n) => isLaneNode(n as FlowNode));\n const currentParent = (node as any).parentId as string | undefined;\n if (overLane && overLane.id !== currentParent) {\n flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, node.id, overLane.id));\n } else if (!overLane && currentParent) {\n flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, node.id));\n }\n },\n [rf, flow, isLaneNode],\n );\n\n // Clipboard + duplicate shortcuts. (Undo/redo live in the effect above.)\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"c\") copySelection();\n else if (key === \"x\") {\n e.preventDefault();\n copySelection();\n deleteNodes(selectedIds);\n } else if (key === \"v\") {\n e.preventDefault();\n pasteClipboard();\n } else if (key === \"d\") {\n e.preventDefault();\n duplicateSelected();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [copySelection, pasteClipboard, duplicateSelected, deleteNodes, selectedIds]);\n\n const api: FlowEditorApi = useMemo(() => {\n const toWorkflow = () => exportWorkflow({ nodes: flow.nodes, edges: flow.edges }, metadata);\n\n return {\n graph: { nodes: flow.nodes, edges: flow.edges },\n nodes: flow.nodes,\n edges: flow.edges,\n selectedId,\n selected,\n selectedEdgeId,\n selectedEdge,\n selectedIds,\n selectedNodes,\n running: runner.running,\n statuses: runner.statuses,\n\n select: setSelectedId,\n selectEdge: setSelectedEdgeId,\n\n addNode,\n updateNode: (next) => flow.setNodes((all: FlowNode[]) => all.map((x) => (x.id === next.id ? next : x))),\n deleteNodes,\n deleteSelected: () => deleteNodes(selectedId ? [selectedId] : []),\n deleteEdges,\n deleteSelectedEdge: () => deleteEdges(selectedEdgeId ? [selectedEdgeId] : []),\n setEdgeLabel: (id, label) => flow.setEdges((all: Edge[]) => setEdgeLabel(all, id, label)),\n duplicateNode: (id) => {\n const src = flow.nodes.find((n) => n.id === id);\n if (!src) return null;\n const copy = cloneNode(src, newNodeId());\n flow.setNodes((all: FlowNode[]) => [...all, copy]);\n setSelectedId(copy.id);\n return copy.id;\n },\n setGraph: (graph) => flow.setGraph(graph),\n\n duplicateSelected,\n alignSelected,\n distributeSelected,\n copy: copySelection,\n cut: () => {\n copySelection();\n deleteNodes(selectedIds);\n },\n paste: pasteClipboard,\n\n addLane,\n assignToLane: (nodeId, laneId) => flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, nodeId, laneId)),\n removeFromLane: (nodeId) => flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, nodeId)),\n // dagre is loaded lazily so it stays out of the eager bundle — consumers\n // who never tidy pay nothing for it.\n autoLayout: (opts) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, opts), edges: flow.edges }),\n );\n },\n tidyLane: (laneId) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, { scope: laneId }), edges: flow.edges }),\n );\n },\n\n run: () => runner.run({ nodes: flow.nodes, edges: flow.edges }, executors),\n cancel: runner.cancel,\n reset: runner.reset,\n\n toWorkflow,\n exportWorkflow: () => downloadWorkflow(toWorkflow(), metadata),\n importWorkflow: () => pickWorkflow((graph) => flow.setGraph(graph)),\n\n fitView: () => rf.fitView({ padding: 0.2 }),\n\n undo: hist.undo,\n redo: hist.redo,\n canUndo: hist.canUndo,\n canRedo: hist.canRedo,\n };\n }, [flow, selectedId, selected, selectedEdgeId, selectedEdge, selectedIds, selectedNodes, runner, executors, metadata, addNode, deleteNodes, deleteEdges, duplicateSelected, alignSelected, distributeSelected, copySelection, pasteClipboard, addLane, hist, rf]);\n\n useImperativeHandle(apiRef, () => api, [api]);\n\n const dropHandlers = paletteDropHandlers((kindName, evt) => {\n const point = rf.screenToFlowPosition({ x: evt.clientX, y: evt.clientY });\n addNode(kindName, { x: point.x - 100, y: point.y - 30 });\n });\n\n const startActions = actions.filter((a) => a.placement === \"start\");\n const endActions = actions.filter((a) => a.placement !== \"start\");\n\n const toolbar = slots.toolbar ? (\n slots.toolbar(api)\n ) : (\n <>\n {startActions.map((a) => renderAction(a, api))}\n {builtins.run !== false && (\n <FlowRunControls running={api.running} onRun={api.run} onCancel={api.cancel} onReset={api.reset} />\n )}\n {builtins.history !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button\n className=\"ff-editor__btn\"\n data-action=\"undo\"\n title=\"Undo (Ctrl+Z)\"\n disabled={!api.canUndo}\n onClick={api.undo}\n >\n ↶ Undo\n </button>\n <button\n className=\"ff-editor__btn\"\n data-action=\"redo\"\n title=\"Redo (Ctrl+Shift+Z)\"\n disabled={!api.canRedo}\n onClick={api.redo}\n >\n ↷ Redo\n </button>\n </>\n )}\n {builtins.addLane !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button className=\"ff-editor__btn\" data-action=\"add-lane\" title=\"Add a swimlane\" onClick={() => api.addLane()}>\n ▤ Lane\n </button>\n </>\n )}\n {builtins.autoLayout !== false && (\n <button className=\"ff-editor__btn\" data-action=\"auto-layout\" title=\"Tidy — auto-arrange\" onClick={() => api.autoLayout()}>\n ⤢ Tidy\n </button>\n )}\n {(builtins.export !== false || builtins.import !== false) && (\n <span className=\"ff-editor__sep\" />\n )}\n {/* Node deletion is not a toolbar button — it lives in NodeConfigPanel\n (see below), so the affordance is a property of the reusable panel\n rather than duplicated chrome that drifts. Keyboard Del/Backspace and\n the right-click menu still delete. `builtins.delete` gates the panel\n button. */}\n {builtins.export !== false && (\n <button className=\"ff-editor__btn\" data-action=\"export\" onClick={api.exportWorkflow}>↓ Export</button>\n )}\n {builtins.import !== false && (\n <button className=\"ff-editor__btn\" data-action=\"import\" onClick={api.importWorkflow}>↑ Import</button>\n )}\n {endActions.map((a) => renderAction(a, api))}\n {extraToolbar}\n {builtins.count !== false && (\n <span className=\"ff-editor__count\">{api.nodes.length} nodes · {api.edges.length} edges</span>\n )}\n </>\n );\n\n return (\n <FlowEditorProvider value={api}>\n {showPalette && (slots.palette ? slots.palette(api) : <NodePalette className=\"ff-editor__palette\" />)}\n <div className=\"ff-editor__main\" {...dropHandlers}>\n <FlowCanvas\n nodes={renderedNodes}\n edges={flow.edges}\n nodeTypes={nodeTypes}\n onNodesChange={flow.onNodesChange}\n onEdgesChange={flow.onEdgesChange}\n onConnect={flow.onConnect}\n // Drag an edge endpoint to rewire it; the new endpoint is validated by\n // the same isValidConnection rule (G2), so a bad reconnect is refused.\n onReconnect={onReconnect}\n edgesReconnectable\n // Snapshot the pre-drag graph once so a drag is a single undo step.\n onNodeDragStart={hist.onNodeDragStart}\n // Drop a node onto a lane to file it there (or drag it out to unfile).\n onNodeDragStop={handleNodeDragStop}\n onNodeClick={handleNodeClick}\n onNodeContextMenu={builtins.contextMenu === false ? undefined : handleNodeContextMenu}\n onEdgeClick={handleEdgeClick}\n onEdgeContextMenu={builtins.edgeContextMenu === false ? undefined : handleEdgeContextMenu}\n onEdgesDelete={(deleted: Edge[]) => onEdgeDelete?.(deleted.map((e) => e.id))}\n onNodesDelete={(deleted) => onDelete?.(deleted.map((n) => n.id))}\n // Stage the native (keyboard) delete path when a confirm gate is wired.\n onBeforeDelete={\n confirmDelete\n ? async ({ nodes, edges }) => confirmDelete({ nodes: nodes as FlowNode[], edges })\n : undefined\n }\n // Both keys delete, so muscle memory from either platform works.\n deleteKeyCode={[\"Delete\", \"Backspace\"]}\n height=\"100%\"\n toolbar={toolbar}\n {...canvasProps}\n />\n {slots.empty && api.nodes.length === 0 && (\n <div className=\"ff-editor__empty\">{slots.empty(api)}</div>\n )}\n {menu?.target.type === \"node\" && builtins.contextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n // Keep the outside-click listener from closing us before the click lands.\n onClick={(e) => e.stopPropagation()}\n >\n {slots.contextMenu ? (\n slots.contextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-duplicate\"\n onClick={() => { api.duplicateNode(menu.target.id); closeMenu(); }}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-delete\"\n onClick={() => { api.deleteNodes([menu.target.id]); closeMenu(); }}\n >\n Delete\n </button>\n </>\n )}\n </div>\n )}\n\n {menu?.target.type === \"edge\" && builtins.edgeContextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n onClick={(e) => e.stopPropagation()}\n >\n {slots.edgeContextMenu ? (\n slots.edgeContextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-edge-label\"\n onClick={() => {\n setLabelEdit({ x: menu.x, y: menu.y, edgeId: menu.target.id });\n setMenu(null);\n }}\n >\n Label…\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-edge-delete\"\n onClick={() => { api.deleteEdges([menu.target.id]); closeMenu(); }}\n >\n Delete connection\n </button>\n </>\n )}\n </div>\n )}\n\n {labelEdit !== null && (\n <EdgeLabelEditor\n x={labelEdit.x}\n y={labelEdit.y}\n initial={\n (flow.edges.find((e: Edge) => e.id === labelEdit.edgeId)?.label as string | undefined) ?? \"\"\n }\n onCommit={(text) => {\n api.setEdgeLabel(labelEdit.edgeId, text);\n setLabelEdit(null);\n }}\n onCancel={() => setLabelEdit(null)}\n />\n )}\n {showFeed &&\n (slots.feed ? slots.feed(api) : <FlowRunFeed entries={runner.feed} className=\"ff-editor__feed\" />)}\n </div>\n {showPanel &&\n (slots.panel ? (\n slots.panel(api)\n ) : (\n <div className=\"ff-editor__panel-wrap\">\n <NodeConfigPanel\n className=\"ff-editor__panel\"\n node={api.selected}\n onChange={api.updateNode}\n // The delete affordance lives IN the panel (one source of truth),\n // not a private FlowEditor toolbar button — so a dev composing\n // their own editor from NodeConfigPanel gets it for free.\n onDelete={builtins.delete === false ? undefined : (n) => api.deleteNodes([n.id])}\n />\n {slots.panelFooter && <div className=\"ff-editor__panel-footer\">{slots.panelFooter(api)}</div>}\n </div>\n ))}\n </FlowEditorProvider>\n );\n}\n\nfunction renderAction(action: FlowEditorAction, api: FlowEditorApi) {\n if (action.visible && !action.visible(api)) return null;\n const disabled = action.disabled ? action.disabled(api) : action.requiresSelection === true && api.selected === null;\n return (\n <button\n key={action.id}\n className=\"ff-editor__btn\"\n data-action={action.id}\n title={action.title}\n disabled={disabled}\n onClick={() => action.onSelect(api)}\n >\n {action.label}\n </button>\n );\n}\n\nfunction newNodeId(): string {\n return `n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n}\n\nfunction downloadWorkflow(schema: WorkflowSchema, metadata?: WorkflowMetadata) {\n const url = URL.createObjectURL(workflowToBlob(schema));\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${metadata?.id ?? \"workflow\"}.json`;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nfunction pickWorkflow(onLoad: (graph: FlowGraph) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"application/json\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const result = importWorkflow(JSON.parse(await file.text()), { lenient: true });\n onLoad(result.graph);\n } catch (e) {\n console.error(\"import failed\", e);\n }\n };\n input.click();\n}\n\n/**\n * Build a UseFlowStateReturn-shaped adapter that proxies through to the\n * host's onChange. Edits route through onChange; reads come from `value`.\n */\nfunction makeControlledFlowAdapter(\n value: FlowGraph,\n onChange?: (graph: FlowGraph) => void,\n): UseFlowStateReturn {\n const apply = (next: FlowGraph) => onChange?.(next);\n return {\n nodes: value.nodes,\n edges: value.edges,\n setNodes: (next) => {\n const nextNodes = typeof next === \"function\" ? (next as any)(value.nodes) : next;\n apply({ nodes: nextNodes, edges: value.edges });\n },\n setEdges: (next) => {\n const nextEdges = typeof next === \"function\" ? (next as any)(value.edges) : next;\n apply({ nodes: value.nodes, edges: nextEdges });\n },\n // Atomic both-at-once commit — the reason this exists (see UseFlowStateReturn).\n setGraph: (graph) => apply(graph),\n onNodesChange: (changes) => {\n apply({ nodes: applyNodeChanges(changes, value.nodes) as any, edges: value.edges });\n },\n onEdgesChange: (changes) => {\n apply({ nodes: value.nodes, edges: applyEdgeChanges(changes, value.edges) });\n },\n onConnect: (connection: Connection) => {\n apply({ nodes: value.nodes, edges: addEdge(connection, value.edges) as Edge[] });\n },\n toGraph: () => value,\n };\n}\n\n/**\n * EdgeLabelEditor — small popover for naming a connection.\n *\n * Anchored in viewport coords like the context menu it replaces. Enter\n * commits, Escape cancels, blur commits (so clicking away doesn't silently\n * discard the edit).\n */\nfunction EdgeLabelEditor({\n x,\n y,\n initial,\n onCommit,\n onCancel,\n}: {\n x: number;\n y: number;\n initial: string;\n onCommit: (text: string) => void;\n onCancel: () => void;\n}) {\n const [text, setText] = useState(initial);\n const ref = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n return (\n <div\n className=\"ff-editor__ctx ff-editor__edge-label\"\n style={{ top: y, left: x }}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n ref={ref}\n className=\"ff-panel__input\"\n value={text}\n placeholder=\"Label this connection\"\n aria-label=\"Connection label\"\n data-action=\"edge-label-input\"\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n // Stop the canvas seeing these — Backspace would delete the edge\n // out from under the editor.\n e.stopPropagation();\n if (e.key === \"Enter\") onCommit(text);\n if (e.key === \"Escape\") onCancel();\n }}\n onBlur={() => onCommit(text)}\n />\n </div>\n );\n}\n","/**\n * Authoring API for custom node kinds. The point of this file is to keep\n * consumers from importing @xyflow/react directly when they write a node —\n * they get `defineNode` + `<NodePort>` from us, and we hold the seam.\n *\n * Internal node code (NodeShell, RegistryNode, FlowCanvas) still imports\n * from @xyflow/react directly. The hiding is only for the public authoring\n * surface.\n */\nimport { memo, type ComponentType, type CSSProperties, type ReactNode } from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\n\n/**\n * Subset of NodeProps that the typical node author cares about. Strips the\n * react-flow-specific surface (xPos, yPos, dragging, zIndex, isConnectable,\n * targetPosition, sourcePosition, etc.) — if you need any of that you can\n * still import directly, but you usually don't.\n */\nexport interface FlowNodeRenderProps<TData = unknown> {\n id: string;\n data: TData;\n selected: boolean;\n}\n\n/**\n * Wraps a render function as a memoized node component compatible with the\n * underlying flow engine.\n *\n * const MyNode = defineNode<MyData>(({ data, selected }) => (\n * <div>\n * <NodePort side=\"left\" type=\"target\" />\n * <span>{data.label}</span>\n * <NodePort side=\"right\" type=\"source\" />\n * </div>\n * ));\n */\nexport function defineNode<TData = unknown>(\n render: (props: FlowNodeRenderProps<TData>) => ReactNode,\n): ComponentType<NodeProps<FlowNode>> {\n function Wrapped(props: NodeProps<FlowNode>) {\n return render({\n id: props.id,\n data: props.data as TData,\n selected: Boolean(props.selected),\n });\n }\n Wrapped.displayName = \"FancyFlowNode\";\n return memo(Wrapped);\n}\n\nexport type NodePortSide = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport type NodePortType = \"source\" | \"target\";\n\nconst POSITION_MAP: Record<NodePortSide, Position> = {\n left: Position.Left,\n right: Position.Right,\n top: Position.Top,\n bottom: Position.Bottom,\n};\n\nexport interface NodePortProps {\n /** Which edge of the node the port docks on. */\n side: NodePortSide;\n /** Direction of data flow. `source` emits; `target` receives. */\n type: NodePortType;\n /** Stable id — required when a node has multiple ports on the same side. */\n id?: string;\n style?: CSSProperties;\n title?: string;\n className?: string;\n}\n\n/**\n * Connection handle. Render one per port; the flow engine wires edges to\n * matching `id`s on the source and target nodes.\n *\n * <NodePort side=\"left\" type=\"target\" id=\"in\" />\n * <NodePort side=\"right\" type=\"source\" id=\"ok\" title=\"success\" />\n * <NodePort side=\"right\" type=\"source\" id=\"err\" title=\"error\" style={{ top: '70%' }} />\n */\nexport function NodePort({ side, type, id, style, title, className }: NodePortProps) {\n return (\n <Handle\n position={POSITION_MAP[side]}\n type={type}\n id={id}\n style={style}\n title={title}\n className={className}\n />\n );\n}\n","// Public surface for @particle-academy/fancy-flow.\n\n// Auto-register the built-in agentic kit on import. Hosts can replace\n// individual kinds via re-registration after this fires.\nimport { registerBuiltinKinds } from \"./registry/builtin\";\nregisterBuiltinKinds();\n\n// Editor\nexport { FlowCanvas, type FlowCanvasProps } from \"./components/canvas\";\nexport {\n FlowEditor,\n useFlowEditor,\n useFlowEditorOptional,\n type FlowEditorProps,\n type FlowEditorApi,\n type FlowEditorAction,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n type AlignEdge,\n} from \"./components/FlowEditor\";\nexport { NodePalette, paletteDropHandlers, type NodePaletteProps } from \"./components/NodePalette\";\nexport {\n NodeConfigPanel,\n ConfigFieldRenderer,\n type NodeConfigPanelProps,\n type ConfigFieldRendererProps,\n} from \"./components/NodeConfigPanel\";\n\n// Legacy 6-pack (kept for backwards compat with v0.1; new work uses the registry)\nexport {\n TriggerNode,\n ActionNode,\n DecisionNode,\n OutputNode,\n NoteNode,\n SubgraphNode,\n LaneNode,\n NodeShell,\n defaultNodeTypes,\n type NodeShellProps,\n} from \"./components/nodes\";\n\n// Authoring API for custom node kinds — defineNode + NodePort. Consumers\n// who write their own nodes use these instead of importing @xyflow/react,\n// which keeps the underlying engine swappable and avoids react-flow types\n// leaking into application code.\nexport {\n defineNode,\n NodePort,\n type FlowNodeRenderProps,\n type NodePortProps,\n type NodePortSide,\n type NodePortType,\n} from \"./components/nodes/api\";\n\nexport { FlowRunControls, type FlowRunControlsProps } from \"./components/FlowRunControls\";\nexport { FlowRunFeed, type FlowRunFeedProps } from \"./components/FlowRunFeed\";\n\n// Registry (also: fancy-flow/registry)\nexport {\n registerNodeKind,\n getNodeKind,\n listNodeKinds,\n onNodeKindsChanged,\n defaultConfigFor,\n validateConfig,\n categoryAccent,\n buildNodeTypes,\n RegistryNode,\n registerBuiltinKinds,\n BUILTIN_KINDS,\n resolvePortSpec,\n resolveNodePorts,\n createConnectionValidator,\n defaultPortCompatibility,\n ANY_PORT_TYPE,\n type PortCompatibility,\n type ConnectionValidatorOptions,\n registerRichInputAdapter,\n getRichInputAdapter,\n isRichInputEnabled,\n onRichInputAdapterChanged,\n RichInputPreview,\n type RichInputAdapter,\n type NodeKindDefinition,\n type NodeCategory,\n type ConfigField,\n type RepeaterConfigField,\n type RepeaterRowField,\n type KeyValueConfigField,\n type DocumentConfigField,\n type PortSpec,\n type RenderBodyContext,\n pauseForHuman,\n encodePause,\n decodePause,\n isPause,\n PAUSE_PREFIX,\n LEGACY_PAUSE_PREFIXES,\n type PauseAwaiting,\n type PauseSignal,\n} from \"./registry\";\n\n// Schema (also: fancy-flow/schema)\nexport {\n exportWorkflow,\n importWorkflow,\n migrateSchema,\n workflowToBlob,\n WORKFLOW_SCHEMA_VERSION,\n WORKFLOW_SCHEMA_URL,\n type WorkflowSchema,\n type WorkflowSchemaNode,\n type WorkflowSchemaEdge,\n type WorkflowMetadata,\n type ImportIssue,\n type ImportResult,\n type ImportOptions,\n} from \"./schema\";\n\n// Runtime (also: fancy-flow/runtime)\nexport {\n runFlow,\n useFlowRun,\n useFlowState,\n useFlowHistory,\n createHistory,\n applyStatusesToNodes,\n applyOutputsToNodes,\n type RunOptions,\n type RunResult,\n type UseFlowRunReturn,\n type UseFlowRunOptions,\n type UseFlowStateReturn,\n type UseFlowHistoryReturn,\n type HistoryController,\n type FlowRunFeedEntry,\n} from \"./runtime\";\n\n// Auto-layout types (the value `autoLayout` lives on the `fancy-flow/layout`\n// subpath so dagre stays out of the eager bundle; it's also on `api.autoLayout`).\nexport type { AutoLayoutOptions, AutoLayoutDirection } from \"./layout\";\n\n// Domain types\nexport type {\n FlowNode,\n FlowEdge,\n FlowGraph,\n FlowNodeData,\n FlowNodeKind,\n TriggerNodeData,\n ActionNodeData,\n DecisionNodeData,\n OutputNodeData,\n NoteNodeData,\n SubgraphNodeData,\n BaseNodeData,\n PortDescriptor,\n NodeRunStatus,\n NodeExecutor,\n ExecutorRegistry,\n RunEvent,\n} from \"./types\";\n"]}
1
+ {"version":3,"sources":["../src/components/nodes/NodeShell.tsx","../src/components/nodes/TriggerNode.tsx","../src/components/nodes/ActionNode.tsx","../src/components/nodes/DecisionNode.tsx","../src/components/nodes/OutputNode.tsx","../src/components/nodes/SubgraphNode.tsx","../src/components/nodes/index.ts","../src/components/FlowEditor/graph-ops.ts","../src/components/canvas/helper-lines.ts","../src/components/canvas/HelperLines.tsx","../src/components/canvas/FlowCanvas.tsx","../src/components/NodePalette/NodePalette.tsx","../src/components/NodeConfigPanel/ConfigFieldRenderer.tsx","../src/components/NodeConfigPanel/NodeConfigPanel.tsx","../src/components/FlowRunControls.tsx","../src/components/FlowRunFeed.tsx","../src/components/FlowEditor/HumanPrompt.tsx","../src/components/FlowEditor/FlowEditor.tsx","../src/components/nodes/api.tsx","../src/index.ts"],"names":["jsx","memo","jsxs","reconnectEdge","useState","useMemo","Fragment","useRef","useEffect","FlowEditor","useCallback","internal","w","h"],"mappings":"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","file":"index.js","sourcesContent":["import { type ReactNode, memo } from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport type { FlowNode, NodeRunStatus, PortDescriptor } from \"../../types\";\n\nexport type NodeShellProps = {\n /** Required: the xyflow node this is rendering. */\n node: NodeProps<FlowNode>;\n /** Accent color for the title bar / status ring. */\n accent: string;\n /** Tag/label shown to the left of the title (e.g. \"TRIGGER\", \"ACTION\"). */\n tag: string;\n /** Optional icon glyph (single-character string is fine). */\n icon?: ReactNode;\n /** Whether to show input handles on the left. Defaults true. */\n showInputs?: boolean;\n /** Whether to show output handles on the right. Defaults true. */\n showOutputs?: boolean;\n /** Body content under the title bar. */\n children?: ReactNode;\n};\n\n/**\n * Shared chrome for every kit node — title bar, accent border, status ring,\n * port handles. Specific node kinds compose this with their body content.\n */\nfunction NodeShellInner({\n node,\n accent,\n tag,\n icon,\n showInputs = true,\n showOutputs = true,\n children,\n}: NodeShellProps) {\n const data = node.data;\n const status: NodeRunStatus = data.status ?? \"idle\";\n const inputs = data.inputs ?? defaultInputs(showInputs);\n const outputs = data.outputs ?? defaultOutputs(showOutputs);\n\n return (\n <div\n className={[\"ff-node\", `ff-node--status-${status}`, node.selected ? \"ff-node--selected\" : \"\"].filter(Boolean).join(\" \")}\n style={{ borderColor: node.selected ? accent : undefined }}\n >\n <header className=\"ff-node__header\" style={{ background: accent }}>\n <span className=\"ff-node__icon\" aria-hidden>{icon ?? null}</span>\n <span className=\"ff-node__tag\">{tag}</span>\n <span className=\"ff-node__label\">{data.label}</span>\n {status !== \"idle\" && <StatusDot status={status} />}\n </header>\n\n {data.description && <p className=\"ff-node__desc\">{data.description}</p>}\n {children && <div className=\"ff-node__body\">{children}</div>}\n {data.statusText && <p className=\"ff-node__status-text\">{data.statusText}</p>}\n\n {inputs.map((p, i) => (\n <Handle\n key={p.id}\n type=\"target\"\n position={Position.Left}\n id={p.id}\n style={portStyle(i, inputs.length)}\n title={p.label ?? p.id}\n />\n ))}\n {outputs.map((p, i) => (\n <Handle\n key={p.id}\n type=\"source\"\n position={Position.Right}\n id={p.id}\n style={portStyle(i, outputs.length)}\n title={p.label ?? p.id}\n />\n ))}\n </div>\n );\n}\n\nexport const NodeShell = memo(NodeShellInner);\n\nfunction defaultInputs(show: boolean): PortDescriptor[] {\n return show ? [{ id: \"in\" }] : [];\n}\nfunction defaultOutputs(show: boolean): PortDescriptor[] {\n return show ? [{ id: \"out\" }] : [];\n}\n\nfunction portStyle(i: number, total: number): React.CSSProperties {\n if (total <= 1) return {};\n const slot = (100 / (total + 1)) * (i + 1);\n return { top: `${slot}%` };\n}\n\nfunction StatusDot({ status }: { status: NodeRunStatus }) {\n return <span className={`ff-node__dot ff-node__dot--${status}`} aria-label={`status ${status}`} />;\n}\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/** Entry-point node — outputs only, no inputs. */\nfunction TriggerNodeInner(props: NodeProps<FlowNode>) {\n return <NodeShell node={props} accent=\"#10b981\" tag=\"TRIGGER\" icon=\"⚡\" showInputs={false} />;\n}\nexport const TriggerNode = memo(TriggerNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/** General-purpose work node — inputs and outputs. */\nfunction ActionNodeInner(props: NodeProps<FlowNode>) {\n return <NodeShell node={props} accent=\"#3b82f6\" tag=\"ACTION\" icon=\"▸\" />;\n}\nexport const ActionNode = memo(ActionNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode, PortDescriptor } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\nconst DEFAULT_BRANCHES: PortDescriptor[] = [\n { id: \"true\", label: \"true\" },\n { id: \"false\", label: \"false\" },\n];\n\n/** Branching node — multiple typed outputs, one input. */\nfunction DecisionNodeInner(props: NodeProps<FlowNode>) {\n // If the host hasn't customised outputs, default to a true/false split.\n if (!props.data.outputs) {\n props = { ...props, data: { ...props.data, outputs: DEFAULT_BRANCHES } };\n }\n return <NodeShell node={props} accent=\"#f59e0b\" tag=\"DECISION\" icon=\"◇\" />;\n}\nexport const DecisionNode = memo(DecisionNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/** Terminal node — receives the workflow's final result; no outputs. */\nfunction OutputNodeInner(props: NodeProps<FlowNode>) {\n return <NodeShell node={props} accent=\"#a855f7\" tag=\"OUTPUT\" icon=\"●\" showOutputs={false} />;\n}\nexport const OutputNode = memo(OutputNodeInner);\n","import { memo } from \"react\";\nimport type { NodeProps } from \"@xyflow/react\";\nimport type { FlowNode, SubgraphNodeData } from \"../../types\";\nimport { NodeShell } from \"./NodeShell\";\n\n/**\n * SubgraphNode — collapses a group of nodes behind a single facade with\n * inputs and outputs that map to the inner graph's boundary ports. The\n * runtime treats it like an action node: when running, it dispatches to\n * the registered \"subgraph\" executor (host decides expand vs inline).\n *\n * v0.1 just renders the facade. Expand/collapse interactions and inner-\n * graph editing are deferred — host apps can implement those by toggling\n * `data.collapsed` and rendering a nested <FlowCanvas> when expanded.\n */\nfunction SubgraphNodeInner(props: NodeProps<FlowNode>) {\n const data = props.data as SubgraphNodeData;\n const childCount = data.childIds?.length ?? 0;\n return (\n <NodeShell node={props} accent=\"#0ea5e9\" tag=\"SUBGRAPH\" icon=\"❐\">\n <div className=\"ff-subgraph__meta\">\n <span>{childCount} node{childCount === 1 ? \"\" : \"s\"}</span>\n <span>{data.collapsed === false ? \"expanded\" : \"collapsed\"}</span>\n </div>\n </NodeShell>\n );\n}\nexport const SubgraphNode = memo(SubgraphNodeInner);\n","import type { NodeTypes } from \"@xyflow/react\";\nimport { TriggerNode } from \"./TriggerNode\";\nimport { ActionNode } from \"./ActionNode\";\nimport { DecisionNode } from \"./DecisionNode\";\nimport { OutputNode } from \"./OutputNode\";\nimport { NoteNode } from \"./NoteNode\";\nimport { SubgraphNode } from \"./SubgraphNode\";\n\nexport { TriggerNode, ActionNode, DecisionNode, OutputNode, NoteNode, SubgraphNode };\nexport { LaneNode } from \"./LaneNode\";\nexport { NodeShell, type NodeShellProps } from \"./NodeShell\";\n\n/**\n * Default xyflow `nodeTypes` map covering the kit. Spread into your own:\n *\n * <FlowCanvas nodeTypes={{ ...defaultNodeTypes, custom: MyNode }} ... />\n */\nexport const defaultNodeTypes: NodeTypes = {\n trigger: TriggerNode,\n action: ActionNode,\n decision: DecisionNode,\n output: OutputNode,\n note: NoteNode,\n subgraph: SubgraphNode,\n};\n","import { reconnectEdge as xyReconnectEdge, type Connection, type Edge } from \"@xyflow/react\";\nimport type { FlowGraph, FlowNode } from \"../../types\";\n\n/**\n * Remove nodes AND every edge attached to them.\n *\n * Deleting a node without pruning its edges leaves danglers that point at\n * nothing — they survive a round-trip through the schema and blow up the\n * runner, so the two always move together.\n */\nexport function removeNodes(graph: FlowGraph, ids: string[]): FlowGraph {\n if (ids.length === 0) return graph;\n const doomed = new Set(ids);\n\n return {\n nodes: graph.nodes.filter((n) => !doomed.has(n.id)),\n edges: graph.edges.filter((e) => !doomed.has(e.source) && !doomed.has(e.target)),\n };\n}\n\n/** Remove edges by id, leaving nodes untouched. */\nexport function removeEdges(edges: Edge[], ids: string[]): Edge[] {\n if (ids.length === 0) return edges;\n const doomed = new Set(ids);\n\n return edges.filter((e) => !doomed.has(e.id));\n}\n\n/**\n * Set (or clear) an edge's label.\n *\n * An empty/whitespace label is removed rather than stored as `\"\"` — xyflow\n * renders an empty label as an empty chip on the wire, and a blank key would\n * survive export into the workflow schema.\n */\nexport function setEdgeLabel(edges: Edge[], id: string, label: string | undefined): Edge[] {\n const next = label?.trim();\n return edges.map((e) => {\n if (e.id !== id) return e;\n if (!next) {\n const { label: _drop, ...rest } = e;\n return rest as Edge;\n }\n return { ...e, label: next };\n });\n}\n\n/** Copy a node with a fresh id, offset so it doesn't sit exactly on top. */\nexport function duplicateNode(node: FlowNode, id: string, offset = 40): FlowNode {\n return {\n ...node,\n id,\n position: { x: node.position.x + offset, y: node.position.y + offset },\n // Deep copy so the clone's config edits don't mutate the original.\n data: JSON.parse(JSON.stringify(node.data ?? {})),\n } as FlowNode;\n}\n\n/**\n * Clone a set of nodes AND the edges internal to that set, remapping every id.\n * This is the piece `duplicateNode` lacks: a copy/paste (or duplicate-selection)\n * that preserves the wiring *between* the copied nodes. Edges with an endpoint\n * outside the set are dropped (they'd dangle). A `parentId` pointing inside the\n * set is remapped; one pointing outside is detached.\n */\nexport function cloneSubgraph(\n nodes: FlowNode[],\n edges: Edge[],\n opts: { makeId: () => string; offset?: number },\n): { nodes: FlowNode[]; edges: Edge[]; idMap: Map<string, string> } {\n const offset = opts.offset ?? 40;\n const idMap = new Map<string, string>();\n for (const n of nodes) idMap.set(n.id, opts.makeId());\n\n const clonedNodes = nodes.map((n) => {\n const cloned = duplicateNode(n, idMap.get(n.id)!, offset) as any;\n const parentId = (n as any).parentId;\n if (parentId && idMap.has(parentId)) cloned.parentId = idMap.get(parentId);\n else if (parentId) delete cloned.parentId;\n return cloned as FlowNode;\n });\n\n const clonedEdges = edges\n .filter((e) => idMap.has(e.source) && idMap.has(e.target))\n .map((e) => ({ ...e, id: opts.makeId(), source: idMap.get(e.source)!, target: idMap.get(e.target)! }));\n\n return { nodes: clonedNodes, edges: clonedEdges, idMap };\n}\n\n/**\n * Rewire one edge's endpoint(s) — wraps xyflow's `reconnectEdge`. Keeps the\n * edge's id (`shouldReplaceId: false`) so its label and identity survive the\n * rewire instead of being regenerated from the new endpoints.\n */\nexport function reconnectEdge(edges: Edge[], oldEdge: Edge, newConnection: Connection): Edge[] {\n return xyReconnectEdge(oldEdge, newConnection, edges, { shouldReplaceId: false });\n}\n\nexport type AlignEdge = \"left\" | \"hcenter\" | \"right\" | \"top\" | \"vcenter\" | \"bottom\";\n\nconst nodeW = (n: FlowNode): number => (n as any).width ?? (n as any).measured?.width ?? 0;\nconst nodeH = (n: FlowNode): number => (n as any).height ?? (n as any).measured?.height ?? 0;\n\n/** Align a selection to a shared edge/center of its bounding box. */\nexport function alignNodes(nodes: FlowNode[], edge: AlignEdge): FlowNode[] {\n if (nodes.length < 2) return nodes;\n const minL = Math.min(...nodes.map((n) => n.position.x));\n const maxR = Math.max(...nodes.map((n) => n.position.x + nodeW(n)));\n const minT = Math.min(...nodes.map((n) => n.position.y));\n const maxB = Math.max(...nodes.map((n) => n.position.y + nodeH(n)));\n const cx = (minL + maxR) / 2;\n const cy = (minT + maxB) / 2;\n return nodes.map((n) => {\n let { x, y } = n.position;\n if (edge === \"left\") x = minL;\n else if (edge === \"right\") x = maxR - nodeW(n);\n else if (edge === \"hcenter\") x = cx - nodeW(n) / 2;\n else if (edge === \"top\") y = minT;\n else if (edge === \"bottom\") y = maxB - nodeH(n);\n else if (edge === \"vcenter\") y = cy - nodeH(n) / 2;\n return { ...n, position: { x, y } };\n });\n}\n\n/**\n * Order nodes so every parent precedes its children — xyflow misrenders (and\n * warns) when a child appears before its `parentId` in the array. Stable\n * otherwise. Apply at the render boundary once grouping is in play.\n */\nexport function sortNodesParentFirst<T extends { id: string; parentId?: string }>(nodes: T[]): T[] {\n const byId = new Map(nodes.map((n) => [n.id, n] as const));\n const seen = new Set<string>();\n const out: T[] = [];\n const visit = (n: T) => {\n if (seen.has(n.id)) return;\n const pid = (n as any).parentId as string | undefined;\n if (pid && byId.has(pid) && !seen.has(pid)) visit(byId.get(pid)!);\n seen.add(n.id);\n out.push(n);\n };\n for (const n of nodes) visit(n);\n return out;\n}\n\n/** Absolute position of a node, accounting for one level of parent nesting. */\nfunction absolutePosition(node: FlowNode, nodes: FlowNode[]): { x: number; y: number } {\n const pid = (node as any).parentId as string | undefined;\n if (!pid) return node.position;\n const parent = nodes.find((n) => n.id === pid);\n return parent ? { x: node.position.x + parent.position.x, y: node.position.y + parent.position.y } : node.position;\n}\n\n/**\n * Put a node inside a lane/container: set `parentId` + `extent:'parent'` and\n * convert its position to be relative to the lane. Idempotent-safe; a no-op if\n * either id is missing or they're the same node.\n */\nexport function assignToLane(nodes: FlowNode[], nodeId: string, laneId: string): FlowNode[] {\n if (nodeId === laneId) return nodes;\n const node = nodes.find((n) => n.id === nodeId);\n const lane = nodes.find((n) => n.id === laneId);\n if (!node || !lane) return nodes;\n const abs = absolutePosition(node, nodes);\n const laneAbs = absolutePosition(lane, nodes);\n const rel = { x: abs.x - laneAbs.x, y: abs.y - laneAbs.y };\n return nodes.map((n) => (n.id === nodeId ? ({ ...n, parentId: laneId, extent: \"parent\", position: rel } as FlowNode) : n));\n}\n\n/** Take a node out of its lane: drop `parentId`/`extent`, restore absolute position. */\nexport function removeFromLane(nodes: FlowNode[], nodeId: string): FlowNode[] {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node || !(node as any).parentId) return nodes;\n const abs = absolutePosition(node, nodes);\n return nodes.map((n) => {\n if (n.id !== nodeId) return n;\n const { parentId: _p, extent: _e, ...rest } = n as any;\n return { ...rest, position: abs } as FlowNode;\n });\n}\n\n/**\n * Stack lanes into contiguous rows (horizontal) or columns (vertical) — the\n * \"fixed rows/columns\" behavior. `isLane` picks which nodes are lanes; they're\n * ordered by their current cross-axis position and repacked from the first\n * lane's origin. Each lane keeps its own size (independently resizable).\n */\nexport function stackLanes(\n nodes: FlowNode[],\n isLane: (n: FlowNode) => boolean,\n opts: { orientation?: \"horizontal\" | \"vertical\"; gap?: number } = {},\n): FlowNode[] {\n const orientation = opts.orientation ?? \"horizontal\";\n const gap = opts.gap ?? 12;\n const vertical = orientation === \"vertical\";\n const lanes = nodes.filter(isLane).sort((a, b) => (vertical ? a.position.x - b.position.x : a.position.y - b.position.y));\n if (lanes.length === 0) return nodes;\n const originX = lanes[0].position.x;\n const originY = lanes[0].position.y;\n const moves = new Map<string, { x: number; y: number }>();\n let cursor = vertical ? originX : originY;\n for (const lane of lanes) {\n moves.set(lane.id, vertical ? { x: cursor, y: originY } : { x: originX, y: cursor });\n cursor += (vertical ? ((lane as any).width ?? 320) : ((lane as any).height ?? 160)) + gap;\n }\n return nodes.map((n) => (moves.has(n.id) ? { ...n, position: moves.get(n.id)! } : n));\n}\n\n/** Evenly distribute a selection's gaps along an axis (needs 3+ nodes). */\nexport function distributeNodes(nodes: FlowNode[], axis: \"h\" | \"v\"): FlowNode[] {\n if (nodes.length < 3) return nodes;\n const size = (n: FlowNode) => (axis === \"h\" ? nodeW(n) : nodeH(n));\n const coord = (n: FlowNode) => (axis === \"h\" ? n.position.x : n.position.y);\n const sorted = [...nodes].sort((a, b) => coord(a) - coord(b));\n const start = coord(sorted[0]);\n const last = sorted[sorted.length - 1];\n const end = coord(last) + size(last);\n const totalSize = sorted.reduce((s, n) => s + size(n), 0);\n const gap = (end - start - totalSize) / (sorted.length - 1);\n const posById = new Map<string, number>();\n let cursor = start;\n for (const n of sorted) {\n posById.set(n.id, cursor);\n cursor += size(n) + gap;\n }\n return nodes.map((n) => {\n const p = posById.get(n.id)!;\n return { ...n, position: axis === \"h\" ? { ...n.position, x: p } : { ...n.position, y: p } };\n });\n}\n","import type { FlowNode } from \"../../types\";\n\nexport type HelperLineChange = { id: string; position?: { x: number; y: number } };\n\nexport type HelperLinesResult = {\n /** Y of a horizontal guide line (flow coords), if the drag aligns on Y. */\n horizontal?: number;\n /** X of a vertical guide line (flow coords), if the drag aligns on X. */\n vertical?: number;\n /** The snapped position to apply to the dragged node. */\n snapPosition: { x?: number; y?: number };\n};\n\nconst w = (n: FlowNode): number => (n as any).width ?? (n as any).measured?.width ?? 0;\nconst h = (n: FlowNode): number => (n as any).height ?? (n as any).measured?.height ?? 0;\n\n/**\n * Compute alignment guide lines (and a snapped position) for a node being\n * dragged to `change.position`, against the other nodes. Standard \"helper\n * lines\" algorithm: match the dragged node's left/right/top/bottom edges to any\n * other node's edges within `distance`, snapping to the nearest. Pure + testable.\n */\nexport function getHelperLines(change: HelperLineChange, nodes: FlowNode[], distance = 6): HelperLinesResult {\n const result: HelperLinesResult = { snapPosition: { x: undefined, y: undefined } };\n const a = nodes.find((n) => n.id === change.id);\n if (!a || !change.position) return result;\n\n const A = {\n left: change.position.x,\n right: change.position.x + w(a),\n top: change.position.y,\n bottom: change.position.y + h(a),\n width: w(a),\n height: h(a),\n };\n let vDist = distance;\n let hDist = distance;\n\n for (const b of nodes) {\n if (b.id === a.id) continue;\n const B = { left: b.position.x, right: b.position.x + w(b), top: b.position.y, bottom: b.position.y + h(b) };\n\n // Vertical guides (X alignment).\n const ll = Math.abs(A.left - B.left);\n if (ll < vDist) { result.snapPosition.x = B.left; result.vertical = B.left; vDist = ll; }\n const rr = Math.abs(A.right - B.right);\n if (rr < vDist) { result.snapPosition.x = B.right - A.width; result.vertical = B.right; vDist = rr; }\n const lr = Math.abs(A.left - B.right);\n if (lr < vDist) { result.snapPosition.x = B.right; result.vertical = B.right; vDist = lr; }\n const rl = Math.abs(A.right - B.left);\n if (rl < vDist) { result.snapPosition.x = B.left - A.width; result.vertical = B.left; vDist = rl; }\n\n // Horizontal guides (Y alignment).\n const tt = Math.abs(A.top - B.top);\n if (tt < hDist) { result.snapPosition.y = B.top; result.horizontal = B.top; hDist = tt; }\n const bb = Math.abs(A.bottom - B.bottom);\n if (bb < hDist) { result.snapPosition.y = B.bottom - A.height; result.horizontal = B.bottom; hDist = bb; }\n const tb = Math.abs(A.top - B.bottom);\n if (tb < hDist) { result.snapPosition.y = B.bottom; result.horizontal = B.bottom; hDist = tb; }\n const bt = Math.abs(A.bottom - B.top);\n if (bt < hDist) { result.snapPosition.y = B.top - A.height; result.horizontal = B.top; hDist = bt; }\n }\n\n return result;\n}\n","import { ViewportPortal } from \"@xyflow/react\";\n\n/**\n * HelperLines — alignment guides drawn during a drag. Rendered in flow\n * coordinate space (ViewportPortal), so the lines track pan/zoom. Positions come\n * from `getHelperLines`.\n */\nexport function HelperLines({ horizontal, vertical }: { horizontal?: number; vertical?: number }) {\n if (horizontal === undefined && vertical === undefined) return null;\n return (\n <ViewportPortal>\n {vertical !== undefined && (\n <div\n className=\"ff-helper-line\"\n style={{ position: \"absolute\", transform: `translateX(${vertical}px)`, top: -5000, height: 10000, width: 1, pointerEvents: \"none\" }}\n />\n )}\n {horizontal !== undefined && (\n <div\n className=\"ff-helper-line\"\n style={{ position: \"absolute\", transform: `translateY(${horizontal}px)`, left: -5000, width: 10000, height: 1, pointerEvents: \"none\" }}\n />\n )}\n </ViewportPortal>\n );\n}\n","import { type CSSProperties, type ReactNode, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n Controls,\n MiniMap,\n type DefaultEdgeOptions,\n type Edge,\n type EdgeTypes,\n type FitViewOptions,\n type NodeTypes,\n type ReactFlowProps,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { defaultNodeTypes } from \"../nodes\";\nimport { createConnectionValidator, type ConnectionValidatorOptions } from \"../../registry/connection\";\nimport { sortNodesParentFirst } from \"../FlowEditor/graph-ops\";\nimport { getHelperLines } from \"./helper-lines\";\nimport { HelperLines } from \"./HelperLines\";\nimport type { FlowNode } from \"../../types\";\n\nexport type FlowCanvasProps = Omit<ReactFlowProps<FlowNode, Edge>, \"nodes\" | \"edges\" | \"height\"> & {\n nodes: FlowNode[];\n edges: Edge[];\n /** Background variant. Default: \"dots\". */\n background?: BackgroundVariant | \"none\";\n /** Show pan/zoom/fit controls. Default true. */\n showControls?: boolean;\n /** Show minimap. Default false (turn on for big graphs). */\n showMinimap?: boolean;\n /** Pixel height; FlowCanvas expects a sized container. Default 600. */\n height?: number | string;\n /**\n * Enforce port-type compatibility on new connections. `true` (default) uses\n * the built-in validator: a connection is refused only when both ports\n * declare a concrete, differing `type` (so untyped graphs are unaffected),\n * and self-loops are blocked. Pass options to tune the rule, or `false` to\n * disable. An `isValidConnection` you pass yourself always takes precedence.\n */\n validateConnections?: boolean | ConnectionValidatorOptions;\n /** Show alignment guide lines while dragging, and snap to them. Default off. */\n showHelperLines?: boolean;\n /** Optional toolbar / palette etc. rendered above the canvas. */\n toolbar?: ReactNode;\n className?: string;\n style?: CSSProperties;\n};\n\nconst DEFAULT_FIT_VIEW: FitViewOptions = { padding: 0.2 };\nconst DEFAULT_EDGE_OPTIONS: DefaultEdgeOptions = {\n type: \"smoothstep\",\n animated: false,\n};\n\n/**\n * FlowCanvas — themed React Flow surface with the kit's nodes registered\n * by default. Pass your own `nodeTypes` to extend; the kit's defaults are\n * merged behind yours.\n *\n * Hosts wire `onNodesChange` / `onEdgesChange` / `onConnect` themselves\n * (xyflow's standard pattern). The surrounding `useFlowState` hook in\n * `runtime/use-flow-state.ts` is a convenience that wires those for you.\n */\nexport function FlowCanvas({\n nodes,\n edges,\n background = BackgroundVariant.Dots,\n showControls = true,\n showMinimap = false,\n height = 600,\n validateConnections = true,\n isValidConnection,\n colorMode,\n showHelperLines = false,\n onNodesChange,\n toolbar,\n nodeTypes,\n edgeTypes,\n className,\n style,\n ...rest\n}: FlowCanvasProps) {\n const mergedNodeTypes = useMemo<NodeTypes>(\n () => ({ ...defaultNodeTypes, ...(nodeTypes ?? {}) }),\n [nodeTypes],\n );\n\n // Read nodes live through a ref so the validator (built once) always sees the\n // current graph without being rebuilt on every node change.\n const nodesRef = useRef(nodes);\n nodesRef.current = nodes;\n const builtinValidator = useMemo(\n () =>\n validateConnections === false\n ? undefined\n : createConnectionValidator(\n () => nodesRef.current,\n validateConnections === true ? undefined : validateConnections,\n ),\n [validateConnections],\n );\n // A caller-supplied predicate wins; otherwise fall back to port-type validation.\n const resolvedIsValidConnection = isValidConnection ?? builtinValidator;\n\n const mergedEdgeTypes = useMemo<EdgeTypes | undefined>(\n () => (edgeTypes ? { ...edgeTypes } : undefined),\n [edgeTypes],\n );\n\n // xyflow requires a parent node to precede its children in the array; grouping\n // (swimlanes) can produce any order, so normalize it here at the boundary.\n const orderedNodes = useMemo(() => sortNodesParentFirst(nodes), [nodes]);\n\n // Helper lines: on a single-node drag, snap to aligned edges + show guides.\n const [helperLines, setHelperLines] = useState<{ horizontal?: number; vertical?: number }>({});\n const handleNodesChange = useCallback(\n (changes: any[]) => {\n if (showHelperLines) {\n const pos = changes.filter((c) => c.type === \"position\" && c.position);\n if (pos.length === 1 && pos[0].dragging) {\n const lines = getHelperLines(pos[0], nodesRef.current);\n if (lines.snapPosition.x !== undefined) pos[0].position.x = lines.snapPosition.x;\n if (lines.snapPosition.y !== undefined) pos[0].position.y = lines.snapPosition.y;\n setHelperLines({ horizontal: lines.horizontal, vertical: lines.vertical });\n } else {\n setHelperLines({});\n }\n }\n onNodesChange?.(changes as any);\n },\n [showHelperLines, onNodesChange],\n );\n\n return (\n <div\n className={[\n \"ff-canvas\",\n // colorMode drives BOTH react-flow's chrome (below) and our `ff-` styles\n // via the shared `.dark` class / light opt-out — one theme signal.\n colorMode === \"dark\" ? \"dark\" : \"\",\n colorMode === \"light\" ? \"ff-canvas--light\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ height, ...style }}\n >\n {toolbar && <div className=\"ff-canvas__toolbar\">{toolbar}</div>}\n <div className=\"ff-canvas__surface\">\n <ReactFlow\n nodes={orderedNodes}\n edges={edges}\n onNodesChange={handleNodesChange}\n colorMode={colorMode}\n nodeTypes={mergedNodeTypes}\n edgeTypes={mergedEdgeTypes}\n fitView\n fitViewOptions={DEFAULT_FIT_VIEW}\n defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}\n proOptions={{ hideAttribution: true }}\n // Embedded-in-a-page friendly: a bare wheel scrolls the PAGE (so the\n // canvas never traps the scroll), and Shift+wheel zooms the canvas.\n // Drag still pans. All overridable via props.\n zoomActivationKeyCode=\"Shift\"\n preventScrolling={false}\n isValidConnection={resolvedIsValidConnection}\n {...rest}\n >\n {background !== \"none\" && (\n <Background variant={background as BackgroundVariant} gap={20} size={1} color=\"rgba(0,0,0,0.18)\" />\n )}\n {showControls && <Controls className=\"ff-controls\" position=\"bottom-right\" />}\n {showMinimap && <MiniMap className=\"ff-minimap\" pannable zoomable />}\n {showHelperLines && <HelperLines horizontal={helperLines.horizontal} vertical={helperLines.vertical} />}\n </ReactFlow>\n </div>\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useMemo, useState } from \"react\";\nimport { categoryAccent, listNodeKinds, onNodeKindsChanged } from \"../../registry/registry\";\nimport type { NodeCategory, NodeKindDefinition } from \"../../registry/types\";\n\nexport type NodePaletteProps = {\n /** Filter to only these categories. */\n categories?: NodeCategory[];\n /** Called when the user clicks a kind (in addition to drag). Optional. */\n onPick?: (kind: NodeKindDefinition) => void;\n className?: string;\n style?: CSSProperties;\n};\n\nconst CATEGORY_ORDER: NodeCategory[] = [\"trigger\", \"logic\", \"data\", \"ai\", \"io\", \"human\", \"output\", \"layout\", \"annotation\", \"custom\"];\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n trigger: \"Triggers\",\n logic: \"Logic\",\n data: \"Data\",\n ai: \"AI\",\n io: \"Connectors\",\n human: \"Human\",\n output: \"Output\",\n layout: \"Layout\",\n annotation: \"Notes\",\n custom: \"Custom\",\n};\n\n/**\n * NodePalette — sidebar listing every registered node kind, grouped by\n * category. Drag a kind onto a `<FlowCanvas>` to add a new node — set\n * `onDrop` on the canvas to handle the drop with the kind name from the\n * `application/x-fancy-flow-kind` data type.\n */\nexport function NodePalette({ categories, onPick, className, style }: NodePaletteProps) {\n const [, setRev] = useState(0);\n useEffect(() => onNodeKindsChanged(() => setRev((n) => n + 1)), []);\n\n const [query, setQuery] = useState(\"\");\n const visibleCats = categories ?? CATEGORY_ORDER;\n\n const grouped = useMemo(() => {\n const all = listNodeKinds();\n const q = query.trim().toLowerCase();\n const filtered = q\n ? all.filter((k) => k.name.includes(q) || k.label.toLowerCase().includes(q) || (k.description ?? \"\").toLowerCase().includes(q))\n : all;\n const map = new Map<NodeCategory, NodeKindDefinition[]>();\n for (const cat of visibleCats) map.set(cat, []);\n for (const k of filtered) {\n if (!map.has(k.category)) map.set(k.category, []);\n map.get(k.category)!.push(k);\n }\n return map;\n }, [query, visibleCats]);\n\n return (\n <aside className={[\"ff-palette\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <div className=\"ff-palette__search\">\n <input\n className=\"ff-palette__search-input\"\n placeholder=\"Search nodes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n <div className=\"ff-palette__list\">\n {Array.from(grouped.entries()).map(([cat, kinds]) =>\n kinds.length === 0 ? null : (\n <section key={cat} className=\"ff-palette__group\">\n <header className=\"ff-palette__group-label\">{CATEGORY_LABELS[cat] ?? cat}</header>\n {kinds.map((k) => (\n <KindRow key={k.name} kind={k} onPick={onPick} />\n ))}\n </section>\n ),\n )}\n </div>\n </aside>\n );\n}\n\nfunction KindRow({ kind, onPick }: { kind: NodeKindDefinition; onPick?: (k: NodeKindDefinition) => void }) {\n const accent = kind.accent ?? categoryAccent(kind.category);\n const onDragStart = (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/x-fancy-flow-kind\", kind.name);\n // Setting both lets non-aware drop targets (e.g. text inputs) ignore it cleanly.\n e.dataTransfer.setData(\"text/plain\", kind.name);\n };\n return (\n <button\n type=\"button\"\n className=\"ff-palette__row\"\n draggable\n onDragStart={onDragStart}\n onClick={() => onPick?.(kind)}\n title={kind.description ?? kind.name}\n >\n <span className=\"ff-palette__row-dot\" style={{ background: accent }}>{kind.icon ?? \"\"}</span>\n <span className=\"ff-palette__row-text\">\n <span className=\"ff-palette__row-label\">{kind.label}</span>\n {kind.description && <span className=\"ff-palette__row-desc\">{kind.description}</span>}\n </span>\n </button>\n );\n}\n\n/**\n * useDropFromPalette — wires the canvas drop target. Returns the drop /\n * dragOver handlers; they parse the dragged kind name and call `onDrop`\n * with `(kindName, position)` in viewport coords.\n */\nexport function paletteDropHandlers(onDrop: (kindName: string, evt: React.DragEvent) => void) {\n return {\n onDragOver: (e: React.DragEvent) => {\n if (e.dataTransfer.types.includes(\"application/x-fancy-flow-kind\")) {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n }\n },\n onDrop: (e: React.DragEvent) => {\n const name = e.dataTransfer.getData(\"application/x-fancy-flow-kind\");\n if (!name) return;\n e.preventDefault();\n onDrop(name, e);\n },\n };\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport type {\n ConfigField,\n KeyValueConfigField,\n RepeaterConfigField,\n TextConfigField,\n} from \"../../registry/types\";\n\nexport type ConfigFieldRendererProps = {\n field: ConfigField;\n value: unknown;\n onChange: (value: unknown) => void;\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Editor for `document` fields. fancy-flow stores the document but never\n * interprets it — the host owns the editing surface, exactly as it does for\n * `credential`. This is the seam for rich human-input steps (authored pages,\n * required reading, multi-section forms) without the package depending on\n * any particular document model.\n */\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n};\n\n/**\n * ConfigFieldRenderer — dispatches to the right input element per field\n * type. Plain HTML inputs styled via the package's CSS so the package\n * stays standalone (no react-fancy import required).\n *\n * Hosts that want to use react-fancy form components can supply their\n * own field renderers via the kind's `renderPanel`.\n */\nexport function ConfigFieldRenderer({\n field,\n value,\n onChange,\n renderCredentialField,\n renderDocumentField,\n}: ConfigFieldRendererProps) {\n switch (field.type) {\n case \"text\": {\n // Declaring `choices` turns a text field into a picker without changing\n // its type or the shape of the value it stores.\n if (field.choices?.length) {\n return <ChoiceField field={field} value={value} onChange={onChange} />;\n }\n return (\n <input\n className=\"ff-panel__input\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n case \"textarea\":\n return (\n <textarea\n className=\"ff-panel__input ff-panel__input--textarea\"\n rows={field.rows ?? 4}\n value={(value as string) ?? \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"number\":\n return (\n <input\n className=\"ff-panel__input\"\n type=\"number\"\n value={(value as number) ?? \"\"}\n min={field.min}\n max={field.max}\n step={field.step ?? 1}\n onChange={(e) => onChange(e.target.value === \"\" ? undefined : Number(e.target.value))}\n />\n );\n\n case \"switch\":\n return (\n <label className=\"ff-panel__switch\">\n <input\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span className=\"ff-panel__switch-slider\" />\n </label>\n );\n\n case \"select\":\n return (\n <select\n className=\"ff-panel__input\"\n value={(value as string) ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>—</option>\n {field.options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n );\n\n case \"json\":\n return <JsonField value={value} onChange={onChange} rows={field.rows} />;\n\n case \"expression\":\n return (\n <textarea\n className=\"ff-panel__input ff-panel__input--expression\"\n rows={2}\n value={(value as string) ?? \"\"}\n placeholder={field.example ?? \"{{ $json.field }}\"}\n spellCheck={false}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"credential\":\n if (renderCredentialField) {\n return <>{renderCredentialField({ credentialType: field.credentialType, value, onChange })}</>;\n }\n return (\n <input\n className=\"ff-panel__input ff-panel__input--credential\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={`Credential reference (${field.credentialType})`}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"repeater\":\n return (\n <RepeaterField\n field={field}\n value={value}\n onChange={onChange}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n />\n );\n\n case \"keyvalue\":\n return <KeyValueField field={field} value={value} onChange={onChange} />;\n\n case \"document\":\n if (renderDocumentField) {\n return <>{renderDocumentField({ documentType: field.documentType, value, onChange })}</>;\n }\n return (\n <p className=\"ff-panel__hint ff-panel__hint--missing\">\n No document editor supplied. Pass <code>renderDocumentField</code> to\n NodeConfigPanel to author this field.\n </p>\n );\n\n default:\n return null;\n }\n}\n\n/** Normalize the `choices` shorthand — a bare string means value === label. */\nexport function normalizeChoices(\n choices: NonNullable<TextConfigField[\"choices\"]>,\n): Array<{ value: string; label: string }> {\n return choices.map((c) =>\n typeof c === \"string\" ? { value: c, label: c } : { value: c.value, label: c.label ?? c.value },\n );\n}\n\n/**\n * ChoiceField — a text field rendered as a select because the kind declared\n * `choices`.\n *\n * A stored value that is no longer among the choices is appended as an option\n * instead of being dropped. Choices are authored data and can change after\n * configs are saved; silently resetting the author's value on render would\n * lose work with no indication it happened.\n */\nfunction ChoiceField({\n field,\n value,\n onChange,\n}: {\n field: TextConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const options = normalizeChoices(field.choices ?? []);\n const current = typeof value === \"string\" ? value : \"\";\n const known = options.some((o) => o.value === current);\n\n return (\n <select\n className=\"ff-panel__input\"\n value={current}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>{field.placeholder ?? \"—\"}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n {current !== \"\" && !known && (\n <option value={current}>{current} (not in list)</option>\n )}\n </select>\n );\n}\n\n/**\n * RepeaterField — editable list of objects, each row driven by the field's\n * own sub-schema. Rows carry stable `data-ff-repeater-row` indices so an\n * agent can target a specific row without guessing DOM.\n */\nfunction RepeaterField({\n field,\n value,\n onChange,\n renderCredentialField,\n renderDocumentField,\n}: {\n field: RepeaterConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n renderCredentialField?: ConfigFieldRendererProps[\"renderCredentialField\"];\n renderDocumentField?: ConfigFieldRendererProps[\"renderDocumentField\"];\n}) {\n const rows: Array<Record<string, unknown>> = Array.isArray(value) ? (value as Array<Record<string, unknown>>) : [];\n const max = field.maxItems ?? Infinity;\n const min = field.minItems ?? 0;\n\n const replace = (next: Array<Record<string, unknown>>) => onChange(next);\n\n const addRow = () => {\n const blank: Record<string, unknown> = {};\n for (const f of field.fields) {\n if (\"default\" in f && f.default !== undefined) blank[f.key] = f.default;\n }\n replace([...rows, blank]);\n };\n\n const removeRow = (i: number) => replace(rows.filter((_, idx) => idx !== i));\n\n const moveRow = (i: number, delta: number) => {\n const target = i + delta;\n if (target < 0 || target >= rows.length) return;\n const next = [...rows];\n [next[i], next[target]] = [next[target], next[i]];\n replace(next);\n };\n\n const setCell = (i: number, key: string, cell: unknown) =>\n replace(rows.map((row, idx) => (idx === i ? { ...row, [key]: cell } : row)));\n\n const rowTitle = (row: Record<string, unknown>, i: number): string => {\n const key = field.titleKey ?? field.fields[0]?.key;\n const raw = key ? row[key] : undefined;\n if (typeof raw === \"string\" && raw.trim() !== \"\") return raw;\n if (typeof raw === \"number\" || typeof raw === \"boolean\") return String(raw);\n return `Item ${i + 1}`;\n };\n\n return (\n <div className=\"ff-repeater\" data-ff-repeater={field.key}>\n {rows.length === 0 && <p className=\"ff-repeater__empty\">None yet.</p>}\n\n {rows.map((row, i) => (\n <div className=\"ff-repeater__row\" key={i} data-ff-repeater-row={i}>\n <div className=\"ff-repeater__row-head\">\n <span className=\"ff-repeater__row-title\">{rowTitle(row, i)}</span>\n <div className=\"ff-repeater__row-actions\">\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, -1)}\n disabled={i === 0}\n aria-label={`Move ${rowTitle(row, i)} up`}\n >↑</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, 1)}\n disabled={i === rows.length - 1}\n aria-label={`Move ${rowTitle(row, i)} down`}\n >↓</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => removeRow(i)}\n disabled={rows.length <= min}\n aria-label={`Remove ${rowTitle(row, i)}`}\n >✕</button>\n </div>\n </div>\n\n {field.fields.map((sub) => (\n <div className=\"ff-repeater__cell\" key={sub.key}>\n <label className=\"ff-panel__label ff-panel__label--sub\">\n {sub.label}\n {sub.required && <span className=\"ff-panel__required\" aria-hidden> *</span>}\n </label>\n <ConfigFieldRenderer\n field={sub}\n value={row[sub.key]}\n onChange={(cell) => setCell(i, sub.key, cell)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n />\n </div>\n ))}\n </div>\n ))}\n\n <button\n type=\"button\"\n className=\"ff-repeater__add\"\n onClick={addRow}\n disabled={rows.length >= max}\n >\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\n/**\n * KeyValueField — editable string→string map.\n *\n * Renaming a key preserves insertion order (rebuilding the object rather than\n * delete-then-add), so rows don't jump around while the author is typing.\n */\nfunction KeyValueField({\n field,\n value,\n onChange,\n}: {\n field: KeyValueConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const map = (value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {}) as Record<string, string>;\n const entries = Object.entries(map);\n\n const commit = (next: Array<[string, string]>) => {\n const obj: Record<string, string> = {};\n for (const [k, v] of next) {\n if (k === \"\") continue;\n obj[k] = v;\n }\n onChange(obj);\n };\n\n const setKey = (i: number, key: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [key, v] : [k, v])));\n const setVal = (i: number, val: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [k, val] : [k, v])));\n const remove = (i: number) => commit(entries.filter((_, idx) => idx !== i));\n const add = () => commit([...entries, [\"\", \"\"]]);\n\n return (\n <div className=\"ff-keyvalue\" data-ff-keyvalue={field.key}>\n {entries.length > 0 && (\n <div className=\"ff-keyvalue__head\">\n <span>{field.keyLabel ?? \"Key\"}</span>\n <span>{field.valueLabel ?? \"Value\"}</span>\n <span />\n </div>\n )}\n\n {entries.map(([k, v], i) => (\n <div className=\"ff-keyvalue__row\" key={i} data-ff-keyvalue-row={i}>\n <input\n className=\"ff-panel__input\"\n value={k}\n placeholder={field.keyPlaceholder}\n aria-label={`${field.keyLabel ?? \"Key\"} ${i + 1}`}\n onChange={(e) => setKey(i, e.target.value)}\n />\n {field.valueOptions ? (\n <select\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n >\n <option value=\"\" disabled>—</option>\n {field.valueOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n ) : (\n <input\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n placeholder={field.valuePlaceholder}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n />\n )}\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => remove(i)}\n aria-label={`Remove ${k || `entry ${i + 1}`}`}\n >✕</button>\n </div>\n ))}\n\n <button type=\"button\" className=\"ff-repeater__add\" onClick={add}>\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\nfunction JsonField({ value, onChange, rows }: { value: unknown; onChange: (v: unknown) => void; rows?: number }) {\n // Keep a separate string buffer so partial input doesn't get clobbered\n // by re-serializing on every keystroke.\n const initial = useMemo(() => {\n try {\n return value === undefined ? \"\" : JSON.stringify(value, null, 2);\n } catch {\n return \"\";\n }\n }, [value]);\n return (\n <textarea\n className=\"ff-panel__input ff-panel__input--json\"\n rows={rows ?? 6}\n defaultValue={initial}\n spellCheck={false}\n onBlur={(e) => {\n const text = e.target.value.trim();\n if (text === \"\") {\n onChange(undefined);\n return;\n }\n try {\n onChange(JSON.parse(text));\n } catch {\n // Leave value unchanged; visual stays at last good state on next render\n }\n }}\n />\n );\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport type { FlowNode } from \"../../types\";\nimport { categoryAccent, getNodeKind, validateConfig } from \"../../registry/registry\";\nimport { getRichInputAdapter } from \"../../registry/rich-input\";\nimport { ConfigFieldRenderer } from \"./ConfigFieldRenderer\";\n\nexport type NodeConfigPanelProps = {\n /** Currently-selected node — pass null to render the empty state. */\n node: FlowNode | null;\n /** Called when the user edits the node label, description, or config. */\n onChange: (next: FlowNode) => void;\n /**\n * Called when the user deletes the node from the panel. When provided, the\n * panel renders a \"Delete node\" button while a node is selected — so the\n * delete affordance lives WITH the panel (a dev composing their own editor\n * gets it for free), rather than in a host toolbar it has to re-implement.\n */\n onDelete?: (node: FlowNode) => void;\n /** Label for the delete button. Default \"Delete node\". */\n deleteLabel?: string;\n /** Optional header content (e.g. close button). */\n header?: ReactNode;\n /** Optional credential picker hook — host renders the picker. */\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Optional document editor hook — host renders the editor for `document`\n * fields. Lets rich authored content live in node config without fancy-flow\n * taking on a document model.\n */\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n className?: string;\n style?: React.CSSProperties;\n};\n\n/**\n * NodeConfigPanel — schema-driven form for the selected node. Defers to\n * `kind.renderPanel` if the kind opts out of the auto-form.\n */\nexport function NodeConfigPanel({\n node,\n onChange,\n onDelete,\n deleteLabel = \"Delete node\",\n header,\n renderCredentialField,\n renderDocumentField,\n className,\n style,\n}: NodeConfigPanelProps) {\n if (!node) {\n return (\n <aside className={[\"ff-panel\", \"ff-panel--empty\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <p className=\"ff-panel__empty\">Select a node to configure it.</p>\n </aside>\n );\n }\n\n const kindName = (node.data as any).kind ?? node.type;\n const kind = useMemo(() => getNodeKind(kindName), [kindName]);\n const config = useMemo(() => ((node.data as any).config ?? {}) as Record<string, unknown>, [node.data]);\n\n if (!kind) {\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <p className=\"ff-panel__empty\">Unknown kind: {kindName}</p>\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n }\n\n const setLabel = (label: string) =>\n onChange({ ...node, data: { ...node.data, label } });\n\n const setDescription = (description: string) =>\n onChange({ ...node, data: { ...node.data, description } });\n\n const setConfigValue = (key: string, value: unknown) =>\n onChange({ ...node, data: { ...node.data, config: { ...config, [key]: value } } });\n\n const issues = validateConfig(kind, config);\n\n // An explicit prop wins; otherwise fall back to the rich-input adapter, so a\n // single registerRichInputAdapter() call enables BOTH authoring here and the\n // in-node preview without the host wiring the same editor twice.\n const adapter = getRichInputAdapter();\n const documentField = renderDocumentField\n ?? (adapter?.renderEditor\n ? ({ value, onChange: set }: { value: unknown; onChange: (n: unknown) => void }) =>\n adapter.renderEditor!({ value, onChange: set })\n : undefined);\n\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <header className=\"ff-panel__header\">\n <span className=\"ff-panel__head-icon\" style={{ background: kind.accent ?? categoryAccent(kind.category) }} aria-hidden>\n {kind.icon}\n </span>\n <span className=\"ff-panel__head-text\">\n <span className=\"ff-panel__head-kind\">{kind.label}</span>\n <span className=\"ff-panel__head-name\">{node.data.label || kind.label}</span>\n </span>\n </header>\n {kind.description && <p className=\"ff-panel__kind-desc\">{kind.description}</p>}\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\">Label</label>\n <input\n className=\"ff-panel__input\"\n value={node.data.label ?? \"\"}\n onChange={(e) => setLabel(e.target.value)}\n placeholder={kind.label}\n />\n </div>\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\">Description</label>\n <textarea\n className=\"ff-panel__input ff-panel__input--textarea\"\n rows={2}\n value={node.data.description ?? \"\"}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n\n {kind.renderPanel ? (\n kind.renderPanel({\n config: config as any,\n onChange: (next) => onChange({ ...node, data: { ...node.data, config: next } }),\n nodeId: node.id,\n })\n ) : (\n <>\n {(kind.configSchema ?? []).length > 0 && <hr className=\"ff-panel__divider\" />}\n {(kind.configSchema ?? []).map((field) => (\n <div key={field.key} className=\"ff-panel__field\">\n <label className=\"ff-panel__label\">\n {field.label}\n {field.required && <span className=\"ff-panel__required\" aria-hidden> *</span>}\n </label>\n {field.description && <p className=\"ff-panel__hint\">{field.description}</p>}\n <ConfigFieldRenderer\n field={field}\n value={config[field.key]}\n onChange={(v) => setConfigValue(field.key, v)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={documentField}\n />\n </div>\n ))}\n </>\n )}\n\n {issues.length > 0 && (\n <div className=\"ff-panel__issues\">\n {issues.map((iss) => (\n <p key={iss.key} className=\"ff-panel__issue\">⚠ {iss.message}</p>\n ))}\n </div>\n )}\n\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type FlowRunControlsProps = {\n running: boolean;\n onRun: () => void;\n onCancel?: () => void;\n onReset?: () => void;\n className?: string;\n style?: CSSProperties;\n};\n\n/** FlowRunControls — Run / Cancel / Reset buttons. Wire to a `useFlowRun`. */\nexport function FlowRunControls({ running, onRun, onCancel, onReset, className, style }: FlowRunControlsProps) {\n return (\n <div className={[\"ff-run-controls\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {!running ? (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--run\" onClick={onRun}>\n ▶ Run\n </button>\n ) : (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--cancel\" onClick={onCancel}>\n ⏹ Cancel\n </button>\n )}\n {onReset && (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--reset\" onClick={onReset} disabled={running}>\n Reset\n </button>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useRef } from \"react\";\nimport type { FlowRunFeedEntry } from \"../runtime/use-flow-run\";\n\nexport type FlowRunFeedProps = {\n entries: FlowRunFeedEntry[];\n /** Show the header bar (title + running badge + event count). Default true. */\n showHeader?: boolean;\n /** Header title. Default \"Run feed\". */\n title?: string;\n /** When true, a \"running\" badge shows in the header. */\n running?: boolean;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowRunFeed — scrolling run log with a header (title + live event count).\n * Auto-scrolls its body to the bottom on new entries.\n */\nexport function FlowRunFeed({ entries, showHeader = true, title = \"Run feed\", running, className, style }: FlowRunFeedProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = scrollRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }, [entries.length]);\n\n return (\n <div className={[\"ff-run-feed\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {showHeader && (\n <div className=\"ff-run-feed__header\">\n <span className=\"ff-run-feed__title\" aria-hidden>▸</span>\n <span className=\"ff-run-feed__title-text\">{title}</span>\n {running && <span className=\"ff-run-feed__badge\">running</span>}\n <span className=\"ff-run-feed__count\">{entries.length} {entries.length === 1 ? \"event\" : \"events\"}</span>\n </div>\n )}\n <div className=\"ff-run-feed__body\" ref={scrollRef}>\n {entries.length === 0 ? (\n <p className=\"ff-run-feed__empty\">No run events yet.</p>\n ) : (\n entries.map((e) => (\n <div key={e.id} className={`ff-run-feed__row ff-run-feed__row--${e.level}`}>\n <span className=\"ff-run-feed__time\">{formatTime(e.at)}</span>\n {e.nodeId && <span className=\"ff-run-feed__node\">{e.nodeId}</span>}\n <span className=\"ff-run-feed__text\">{e.text}</span>\n </div>\n ))\n )}\n </div>\n </div>\n );\n}\n\nfunction formatTime(at: number): string {\n const d = new Date(at);\n return `${d.getMinutes().toString().padStart(2, \"0\")}:${d.getSeconds().toString().padStart(2, \"0\")}.${Math.floor(d.getMilliseconds() / 100)}`;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * The in-editor human-input modal. When a run reaches a `user_input` or\n * `human_approval` node, FlowEditor's default executor opens this and BLOCKS the\n * run (the executor returns a Promise) until the person submits — the same\n * async-executor pattern the headless engine already supports. A host that\n * passes its own `user_input` / `human_approval` executor overrides this.\n */\n\n/** A field the input modal renders. Mirrors a `user_input` `fields` row. */\nexport type HumanField = {\n key: string;\n label?: string;\n type?: \"text\" | \"textarea\" | \"number\" | \"select\" | \"switch\";\n required?: boolean;\n placeholder?: string;\n options?: Array<{ value: string; label: string }>;\n default?: unknown;\n};\n\nexport type HumanPromptRequest =\n | { kind: \"input\"; title: string; submitLabel?: string; fields: HumanField[]; resolve: (values: Record<string, unknown>) => void }\n | { kind: \"approval\"; title: string; description?: string; resolve: (approved: boolean) => void };\n\n/**\n * Normalize a `user_input` node's `fields` config into renderable fields. Falls\n * back to a single text field so even an unconfigured User Input node still\n * collects something rather than silently returning nothing.\n */\nexport function humanInputFields(config: Record<string, unknown>): HumanField[] {\n const raw = Array.isArray((config as any)?.fields) ? ((config as any).fields as any[]) : [];\n const fields: HumanField[] = raw\n .filter((f) => f && typeof f === \"object\" && typeof (f as any).key === \"string\" && (f as any).key)\n .map((f: any) => ({\n key: f.key,\n label: typeof f.label === \"string\" && f.label ? f.label : f.key,\n type: [\"text\", \"textarea\", \"number\", \"select\", \"switch\"].includes(f.type) ? f.type : \"text\",\n required: !!f.required,\n placeholder: typeof f.placeholder === \"string\" ? f.placeholder : undefined,\n options: Array.isArray(f.options) ? f.options : undefined,\n default: f.default,\n }));\n if (fields.length) return fields;\n const title = typeof (config as any)?.title === \"string\" && (config as any).title ? (config as any).title : \"Your answer\";\n return [{ key: \"value\", label: title, type: \"textarea\", required: true }];\n}\n\nfunction initialValues(fields: HumanField[]): Record<string, unknown> {\n const v: Record<string, unknown> = {};\n for (const f of fields) v[f.key] = f.type === \"switch\" ? !!f.default : (f.default ?? \"\");\n return v;\n}\n\nexport function HumanPrompt({ request, onCancel }: { request: HumanPromptRequest; onCancel: () => void }) {\n const firstRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n useEffect(() => {\n firstRef.current?.focus();\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") onCancel(); };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n return (\n <div className=\"ff-prompt-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label={request.title}>\n <div className=\"ff-prompt\" onClick={(e) => e.stopPropagation()}>\n <div className=\"ff-prompt__title\">{request.title}</div>\n {request.kind === \"approval\" ? (\n <ApprovalBody request={request} onCancel={onCancel} />\n ) : (\n <InputBody request={request} onCancel={onCancel} firstRef={firstRef} />\n )}\n </div>\n </div>\n );\n}\n\nfunction ApprovalBody({ request, onCancel }: { request: Extract<HumanPromptRequest, { kind: \"approval\" }>; onCancel: () => void }) {\n return (\n <>\n {request.description && <p className=\"ff-prompt__desc\">{request.description}</p>}\n <div className=\"ff-prompt__actions\">\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--ghost\" onClick={onCancel}>Cancel</button>\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--danger\" onClick={() => request.resolve(false)}>Deny</button>\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--primary\" onClick={() => request.resolve(true)}>Approve</button>\n </div>\n </>\n );\n}\n\nfunction InputBody({\n request,\n onCancel,\n firstRef,\n}: {\n request: Extract<HumanPromptRequest, { kind: \"input\" }>;\n onCancel: () => void;\n firstRef: React.RefObject<HTMLInputElement | HTMLTextAreaElement | null>;\n}) {\n const [values, setValues] = useState<Record<string, unknown>>(() => initialValues(request.fields));\n const set = (k: string, v: unknown) => setValues((prev) => ({ ...prev, [k]: v }));\n\n const missing = request.fields.filter((f) => f.required && (values[f.key] === undefined || values[f.key] === \"\"));\n const submit = () => { if (missing.length === 0) request.resolve(values); };\n\n return (\n <form\n onSubmit={(e) => { e.preventDefault(); submit(); }}\n onKeyDown={(e) => { if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); submit(); } }}\n >\n <div className=\"ff-prompt__fields\">\n {request.fields.map((f, i) => (\n <label key={f.key} className=\"ff-prompt__field\">\n <span className=\"ff-prompt__label\">{f.label ?? f.key}{f.required && <span className=\"ff-prompt__req\"> *</span>}</span>\n {renderControl(f, values[f.key], (v) => set(f.key, v), i === 0 ? firstRef : undefined)}\n </label>\n ))}\n </div>\n <div className=\"ff-prompt__actions\">\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--ghost\" onClick={onCancel}>Cancel</button>\n <button type=\"submit\" className=\"ff-prompt__btn ff-prompt__btn--primary\" disabled={missing.length > 0}>\n {request.submitLabel || \"Continue\"}\n </button>\n </div>\n </form>\n );\n}\n\nfunction renderControl(\n f: HumanField,\n value: unknown,\n onChange: (v: unknown) => void,\n ref?: React.RefObject<HTMLInputElement | HTMLTextAreaElement | null>,\n) {\n const common = { className: \"ff-prompt__input\", placeholder: f.placeholder };\n if (f.type === \"textarea\") {\n return (\n <textarea\n {...common}\n ref={ref as React.RefObject<HTMLTextAreaElement>}\n rows={3}\n value={String(value ?? \"\")}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n if (f.type === \"switch\") {\n return (\n <input\n type=\"checkbox\"\n className=\"ff-prompt__switch\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n }\n if (f.type === \"select\" && f.options && f.options.length) {\n return (\n <select className=\"ff-prompt__input\" value={String(value ?? \"\")} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\" disabled>Choose…</option>\n {f.options.map((o) => <option key={o.value} value={o.value}>{o.label}</option>)}\n </select>\n );\n }\n return (\n <input\n {...common}\n ref={ref as React.RefObject<HTMLInputElement>}\n type={f.type === \"number\" ? \"number\" : \"text\"}\n value={String(value ?? \"\")}\n onChange={(e) => onChange(f.type === \"number\" ? (e.target.value === \"\" ? \"\" : Number(e.target.value)) : e.target.value)}\n />\n );\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n ReactFlowProvider,\n useReactFlow,\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n type Connection,\n type Edge,\n type NodeMouseHandler,\n} from \"@xyflow/react\";\nimport type { UseFlowStateReturn } from \"../../runtime/use-flow-state\";\nimport { FlowCanvas, type FlowCanvasProps } from \"../canvas/FlowCanvas\";\nimport { NodePalette, paletteDropHandlers } from \"../NodePalette\";\nimport { NodeConfigPanel } from \"../NodeConfigPanel\";\nimport { FlowRunControls } from \"../FlowRunControls\";\nimport { FlowRunFeed } from \"../FlowRunFeed\";\nimport { useFlowState } from \"../../runtime/use-flow-state\";\nimport { useFlowHistory } from \"../../runtime/use-flow-history\";\nimport { useFlowRun, applyStatusesToNodes, applyOutputsToNodes } from \"../../runtime/use-flow-run\";\nimport { exportWorkflow, importWorkflow, workflowToBlob, type WorkflowMetadata, type WorkflowSchema } from \"../../schema\";\nimport { buildNodeTypes, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged } from \"../../registry\";\nimport type { ExecutorRegistry, FlowGraph, FlowNode } from \"../../types\";\nimport {\n duplicateNode as cloneNode,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n assignToLane as assignToLaneOp,\n removeFromLane as removeFromLaneOp,\n removeEdges,\n removeNodes,\n setEdgeLabel,\n type AlignEdge,\n} from \"./graph-ops\";\nimport {\n FlowEditorProvider,\n type FlowEditorAction,\n type FlowEditorApi,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n} from \"./api\";\nimport { HumanPrompt, humanInputFields, type HumanPromptRequest } from \"./HumanPrompt\";\n\nexport type FlowEditorProps = {\n initial?: FlowGraph;\n /** Controlled mode — host owns the graph state. When set, takes precedence\n * over `initial`. Pair with `onChange` to receive edits. */\n value?: FlowGraph;\n /** Executor registry passed to runFlow. Each kind name maps to an executor. */\n executors?: ExecutorRegistry;\n /** Saved metadata for export. */\n metadata?: WorkflowMetadata;\n /** Show the palette sidebar. Default true. */\n showPalette?: boolean;\n /** Show the config panel sidebar. Default true. */\n showPanel?: boolean;\n /** Show run feed below the canvas. Default true. */\n showFeed?: boolean;\n /** Total editor height. Default 720. */\n height?: number;\n /** Extra toolbar content, appended after the built-ins. Prefer `actions`\n * (declarative + agent-emittable); this stays for back-compat. */\n extraToolbar?: ReactNode;\n /** Declarative custom toolbar buttons. */\n actions?: FlowEditorAction[];\n /** Turn built-in toolbar affordances off individually. */\n builtins?: FlowEditorBuiltins;\n /** Replace whole regions of the editor. */\n slots?: FlowEditorSlots;\n /** Forwarded to `<FlowCanvas>` / React Flow — snapToGrid, minimap, context\n * menus, edge types, and anything else xyflow accepts. */\n canvasProps?: Partial<Omit<FlowCanvasProps, \"nodes\" | \"edges\">>;\n /** Called whenever the graph changes — host can persist. */\n onChange?: (graph: FlowGraph) => void;\n /** Called when the selected node changes. */\n onSelectionChange?: (node: FlowNode | null) => void;\n /** Called after nodes are deleted, with the deleted ids. */\n onDelete?: (ids: string[]) => void;\n /** Called after connections are broken, with the deleted edge ids. */\n onEdgeDelete?: (ids: string[]) => void;\n /**\n * Stage destructive edits for human confirmation. When set, every delete path\n * — keyboard, panel, context menu, and `api.deleteNodes`/`deleteEdges` —\n * calls this first; return false to veto. Default: delete immediately. This\n * realizes the component contract's \"agents propose, humans confirm\" on the\n * canvas.\n */\n confirmDelete?: (targets: { nodes: FlowNode[]; edges: Edge[] }) => boolean | Promise<boolean>;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowEditor — batteries-included workflow editor, but not a black box.\n *\n * Defaults compose NodePalette + FlowCanvas + NodeConfigPanel + run controls +\n * feed. Every part is replaceable: pass `actions` for custom toolbar buttons,\n * `slots` to swap a whole region, `canvasProps` to reach React Flow, or grab\n * the {@link FlowEditorApi} from `ref` / `useFlowEditor()` and build your own\n * chrome around the primitives.\n */\nexport const FlowEditor = forwardRef<FlowEditorApi, FlowEditorProps>(function FlowEditor(props, ref) {\n return (\n <ReactFlowProvider>\n <div\n className={[\"ff-editor\", props.className ?? \"\"].filter(Boolean).join(\" \")}\n style={{ height: props.height ?? 720, ...props.style }}\n >\n <FlowEditorInner {...props} apiRef={ref} />\n </div>\n </ReactFlowProvider>\n );\n});\n\nfunction FlowEditorInner({\n initial = { nodes: [], edges: [] },\n value,\n executors = {},\n metadata,\n showPalette = true,\n showPanel = true,\n showFeed = true,\n extraToolbar,\n actions = [],\n builtins = {},\n slots = {},\n canvasProps = {},\n onChange,\n onSelectionChange,\n onDelete,\n onEdgeDelete,\n confirmDelete,\n apiRef,\n}: FlowEditorProps & { apiRef?: React.ForwardedRef<FlowEditorApi> }) {\n const internal = useFlowState(initial);\n const runner = useFlowRun();\n const rf = useReactFlow();\n\n // In-editor human-input: when a run reaches a `user_input` / `human_approval`\n // node, open a modal and BLOCK the run until the person submits. These are\n // DEFAULT executors — a host that passes its own `user_input` / `human_approval`\n // executor overrides them (host executors are spread last below).\n const [prompt, setPrompt] = useState<HumanPromptRequest | null>(null);\n const humanExecutors = useMemo<ExecutorRegistry>(\n () => ({\n user_input: ({ node }) =>\n new Promise((resolve) => {\n const cfg = (((node as any).data?.config ?? {}) as Record<string, unknown>);\n setPrompt({\n kind: \"input\",\n title: (typeof cfg.title === \"string\" && cfg.title) || \"Your input\",\n submitLabel: typeof cfg.submitLabel === \"string\" ? cfg.submitLabel : undefined,\n fields: humanInputFields(cfg),\n resolve: (values) => { setPrompt(null); resolve(values); },\n });\n }),\n human_approval: ({ node }) =>\n new Promise((resolve) => {\n const cfg = (((node as any).data?.config ?? {}) as Record<string, unknown>);\n setPrompt({\n kind: \"approval\",\n title: (typeof cfg.title === \"string\" && cfg.title) || \"Approve action\",\n description: typeof cfg.description === \"string\" ? cfg.description : undefined,\n resolve: (approved) => { setPrompt(null); resolve({ branch: approved ? \"approved\" : \"denied\" }); },\n });\n }),\n }),\n [],\n );\n const runExecutors = useMemo(() => ({ ...humanExecutors, ...executors }), [humanExecutors, executors]);\n // Close the modal if the run ends (finished or cancelled) while it's open.\n useEffect(() => {\n if (!runner.running) setPrompt(null);\n }, [runner.running]);\n\n // When `value` is provided we run in controlled mode: host owns nodes/edges,\n // local edits go through onChange. Internal state is unused but the hook\n // still has to run (rules of hooks).\n const controlled = value !== undefined;\n const baseFlow = controlled ? makeControlledFlowAdapter(value!, onChange) : internal;\n // Wrap the sink with the commit/undo pipeline — one interception point for\n // every committing mutation, whichever mode we're in.\n const hist = useFlowHistory(baseFlow);\n const flow = hist.flow;\n\n // Re-render when registry kinds change so the palette + nodeTypes reflect it.\n const [, force] = useState(0);\n useEffect(() => onNodeKindsChanged(() => force((n) => n + 1)), []);\n const nodeTypes = useMemo(() => buildNodeTypes(), [listNodeKinds().length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const renderedNodes = useMemo(\n () =>\n applyOutputsToNodes(\n applyStatusesToNodes(flow.nodes, runner.statuses, runner.statusText),\n runner.outputs,\n ),\n [flow.nodes, runner.statuses, runner.statusText, runner.outputs],\n );\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const selected = useMemo(() => flow.nodes.find((n) => n.id === selectedId) ?? null, [flow.nodes, selectedId]);\n\n useEffect(() => onSelectionChange?.(selected), [selected, onSelectionChange]);\n\n const [selectedEdgeId, setSelectedEdgeId] = useState<string | null>(null);\n const selectedEdge = useMemo(\n () => flow.edges.find((e: Edge) => e.id === selectedEdgeId) ?? null,\n [flow.edges, selectedEdgeId],\n );\n\n const handleNodeClick: NodeMouseHandler = (_e, node) => {\n setSelectedId(node.id);\n // Node and edge selection are mutually exclusive, so Delete is never\n // ambiguous about what it would remove.\n setSelectedEdgeId(null);\n };\n\n // Right-click menu, for a node OR a connection. Anchored in viewport coords\n // (position: fixed), so it is not clipped by the canvas' overflow.\n const [menu, setMenu] = useState<\n { x: number; y: number; target: { type: \"node\" | \"edge\"; id: string } } | null\n >(null);\n // Inline \"label this connection\" editor, anchored like the menu.\n const [labelEdit, setLabelEdit] = useState<{ x: number; y: number; edgeId: string } | null>(null);\n\n const closeMenu = useCallback(() => setMenu(null), []);\n\n const handleNodeContextMenu: NodeMouseHandler = (event, node) => {\n event.preventDefault();\n setSelectedId(node.id);\n setSelectedEdgeId(null);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"node\", id: node.id } });\n };\n\n const handleEdgeClick = (_e: React.MouseEvent, edge: Edge) => {\n setSelectedEdgeId(edge.id);\n };\n\n const handleEdgeContextMenu = (event: React.MouseEvent, edge: Edge) => {\n event.preventDefault();\n setSelectedEdgeId(edge.id);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"edge\", id: edge.id } });\n };\n\n // Dismiss on any outside click, scroll, or Escape.\n useEffect(() => {\n if (menu === null && labelEdit === null) return;\n const close = () => { setMenu(null); setLabelEdit(null); };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && close();\n window.addEventListener(\"click\", close);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n window.removeEventListener(\"click\", close);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [menu, labelEdit]);\n\n // Editor keyboard shortcuts. Ignored while a field is focused, so Ctrl+Z does\n // native text-undo inside inputs/textareas rather than reverting the graph.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n hist.undo();\n } else if ((key === \"z\" && e.shiftKey) || key === \"y\") {\n e.preventDefault();\n hist.redo();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [hist]);\n\n // Uncontrolled: notify host on every graph mutation. Controlled mode\n // already notifies via the adapter on each setNodes/setEdges call.\n useEffect(() => {\n if (!controlled) onChange?.({ nodes: flow.nodes, edges: flow.edges });\n }, [flow.nodes, flow.edges, onChange, controlled]);\n\n const addNode = useCallback(\n (kindName: string, position?: { x: number; y: number }): string | null => {\n const kind = getNodeKind(kindName);\n if (!kind) return null;\n const at = position ?? { x: 80, y: 80 };\n const id = newNodeId();\n flow.setNodes((all: FlowNode[]) => [\n ...all,\n {\n id,\n type: kind.name,\n position: at,\n data: { kind: kind.name, label: kind.label, config: defaultConfigFor(kind) } as any,\n } as FlowNode,\n ]);\n setSelectedId(id);\n return id;\n },\n [flow],\n );\n\n /** Delete nodes AND every edge attached to them — an orphaned edge would\n * otherwise survive the node it connected. */\n const deleteNodes = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.nodes.filter((n) => ids.includes(n.id));\n if (targets.length === 0) return;\n if (confirmDelete) {\n const attached = flow.edges.filter((e: Edge) => ids.includes(e.source) || ids.includes(e.target));\n if (!(await confirmDelete({ nodes: targets, edges: attached }))) return;\n }\n const doomed = new Set(ids);\n // Atomic: prune edges + remove nodes in ONE commit — one undo step, and\n // correct in controlled mode where two sequential writes would clobber.\n flow.setGraph(removeNodes({ nodes: flow.nodes, edges: flow.edges }, ids));\n setSelectedId((cur) => (cur !== null && doomed.has(cur) ? null : cur));\n onDelete?.(ids);\n },\n [flow, onDelete, confirmDelete],\n );\n\n const deleteEdges = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.edges.filter((e: Edge) => ids.includes(e.id));\n if (targets.length === 0) return;\n if (confirmDelete && !(await confirmDelete({ nodes: [], edges: targets }))) return;\n flow.setEdges((all: Edge[]) => removeEdges(all, ids));\n setSelectedEdgeId((cur) => (cur !== null && ids.includes(cur) ? null : cur));\n onEdgeDelete?.(ids);\n },\n [flow, onEdgeDelete, confirmDelete],\n );\n\n // ── Multi-selection + clipboard (Release 2) ──\n // xyflow owns the real multi-selection (box / shift-click) on `node.selected`;\n // we read it rather than tracking a parallel list.\n const selectedNodes = useMemo(() => flow.nodes.filter((n) => n.selected), [flow.nodes]);\n const selectedIds = useMemo(() => selectedNodes.map((n) => n.id), [selectedNodes]);\n\n const clipboard = useRef<FlowGraph | null>(null);\n\n const copySelection = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const edges = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n clipboard.current = { nodes: sel.map((n) => ({ ...n })), edges: edges.map((e) => ({ ...e })) };\n }, [flow]);\n\n const pasteClipboard = useCallback(\n (at?: { x: number; y: number }) => {\n const clip = clipboard.current;\n if (!clip || clip.nodes.length === 0) return;\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(clip.nodes, clip.edges, { makeId: newNodeId, offset: 40 });\n let placed = clones;\n if (at) {\n const minX = Math.min(...clones.map((n) => n.position.x));\n const minY = Math.min(...clones.map((n) => n.position.y));\n placed = clones.map((n) => ({ ...n, position: { x: n.position.x - minX + at.x, y: n.position.y - minY + at.y } }));\n }\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...placed.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n },\n [flow],\n );\n\n const duplicateSelected = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const internal = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(sel, internal, { makeId: newNodeId, offset: 40 });\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...clones.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n }, [flow]);\n\n const alignSelected = useCallback(\n (edge: AlignEdge) => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 2) return;\n const byId = new Map(alignNodes(sel, edge).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const distributeSelected = useCallback(\n (axis: \"h\" | \"v\") => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 3) return;\n const byId = new Map(distributeNodes(sel, axis).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const onReconnect = useCallback(\n (oldEdge: Edge, conn: Connection) => flow.setEdges((eds: Edge[]) => reconnectEdge(eds, oldEdge, conn)),\n [flow],\n );\n\n // ── Swimlanes (Release 4) ──\n const isLaneNode = useCallback(\n (n: FlowNode) => getNodeKind((n.data as any)?.kind ?? n.type)?.category === \"layout\",\n [],\n );\n\n const addLane = useCallback(\n (orientation: \"horizontal\" | \"vertical\" = \"horizontal\", title?: string): string => {\n const vertical = orientation === \"vertical\";\n const lanes = flow.nodes.filter(isLaneNode);\n const w = vertical ? 280 : 680;\n const h = vertical ? 480 : 168;\n const end = lanes.reduce(\n (m, l) =>\n Math.max(m, vertical ? l.position.x + ((l as any).width ?? w) : l.position.y + ((l as any).height ?? h)),\n 0,\n );\n const id = newNodeId();\n const name = title ?? `Lane ${lanes.length + 1}`;\n const node = {\n id,\n type: \"@particle-academy/lane\",\n position: vertical ? { x: lanes.length ? end + 12 : 0, y: 0 } : { x: 0, y: lanes.length ? end + 12 : 0 },\n width: w,\n height: h,\n data: { kind: \"@particle-academy/lane\", label: name, config: { title: name, orientation } } as any,\n } as FlowNode;\n flow.setNodes((all: FlowNode[]) => [...all, node]);\n setSelectedId(id);\n return id;\n },\n [flow, isLaneNode],\n );\n\n // Drop a node onto a lane to file it there; drag it out to unfile it.\n const handleNodeDragStop = useCallback(\n (_e: MouseEvent | TouchEvent, node: FlowNode) => {\n if (isLaneNode(node)) return; // v1: lanes don't nest inside lanes\n const overLane = rf.getIntersectingNodes(node).find((n) => isLaneNode(n as FlowNode));\n const currentParent = (node as any).parentId as string | undefined;\n if (overLane && overLane.id !== currentParent) {\n flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, node.id, overLane.id));\n } else if (!overLane && currentParent) {\n flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, node.id));\n }\n },\n [rf, flow, isLaneNode],\n );\n\n // Clipboard + duplicate shortcuts. (Undo/redo live in the effect above.)\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"c\") copySelection();\n else if (key === \"x\") {\n e.preventDefault();\n copySelection();\n deleteNodes(selectedIds);\n } else if (key === \"v\") {\n e.preventDefault();\n pasteClipboard();\n } else if (key === \"d\") {\n e.preventDefault();\n duplicateSelected();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [copySelection, pasteClipboard, duplicateSelected, deleteNodes, selectedIds]);\n\n const api: FlowEditorApi = useMemo(() => {\n const toWorkflow = () => exportWorkflow({ nodes: flow.nodes, edges: flow.edges }, metadata);\n\n return {\n graph: { nodes: flow.nodes, edges: flow.edges },\n nodes: flow.nodes,\n edges: flow.edges,\n selectedId,\n selected,\n selectedEdgeId,\n selectedEdge,\n selectedIds,\n selectedNodes,\n running: runner.running,\n statuses: runner.statuses,\n\n select: setSelectedId,\n selectEdge: setSelectedEdgeId,\n\n addNode,\n updateNode: (next) => flow.setNodes((all: FlowNode[]) => all.map((x) => (x.id === next.id ? next : x))),\n deleteNodes,\n deleteSelected: () => deleteNodes(selectedId ? [selectedId] : []),\n deleteEdges,\n deleteSelectedEdge: () => deleteEdges(selectedEdgeId ? [selectedEdgeId] : []),\n setEdgeLabel: (id, label) => flow.setEdges((all: Edge[]) => setEdgeLabel(all, id, label)),\n duplicateNode: (id) => {\n const src = flow.nodes.find((n) => n.id === id);\n if (!src) return null;\n const copy = cloneNode(src, newNodeId());\n flow.setNodes((all: FlowNode[]) => [...all, copy]);\n setSelectedId(copy.id);\n return copy.id;\n },\n setGraph: (graph) => flow.setGraph(graph),\n\n duplicateSelected,\n alignSelected,\n distributeSelected,\n copy: copySelection,\n cut: () => {\n copySelection();\n deleteNodes(selectedIds);\n },\n paste: pasteClipboard,\n\n addLane,\n assignToLane: (nodeId, laneId) => flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, nodeId, laneId)),\n removeFromLane: (nodeId) => flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, nodeId)),\n // dagre is loaded lazily so it stays out of the eager bundle — consumers\n // who never tidy pay nothing for it.\n autoLayout: (opts) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, opts), edges: flow.edges }),\n );\n },\n tidyLane: (laneId) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, { scope: laneId }), edges: flow.edges }),\n );\n },\n\n run: () => runner.run({ nodes: flow.nodes, edges: flow.edges }, runExecutors),\n cancel: runner.cancel,\n reset: runner.reset,\n\n toWorkflow,\n exportWorkflow: () => downloadWorkflow(toWorkflow(), metadata),\n importWorkflow: () => pickWorkflow((graph) => flow.setGraph(graph)),\n\n fitView: () => rf.fitView({ padding: 0.2 }),\n\n undo: hist.undo,\n redo: hist.redo,\n canUndo: hist.canUndo,\n canRedo: hist.canRedo,\n };\n }, [flow, selectedId, selected, selectedEdgeId, selectedEdge, selectedIds, selectedNodes, runner, runExecutors, metadata, addNode, deleteNodes, deleteEdges, duplicateSelected, alignSelected, distributeSelected, copySelection, pasteClipboard, addLane, hist, rf]);\n\n useImperativeHandle(apiRef, () => api, [api]);\n\n const dropHandlers = paletteDropHandlers((kindName, evt) => {\n const point = rf.screenToFlowPosition({ x: evt.clientX, y: evt.clientY });\n addNode(kindName, { x: point.x - 100, y: point.y - 30 });\n });\n\n const startActions = actions.filter((a) => a.placement === \"start\");\n const endActions = actions.filter((a) => a.placement !== \"start\");\n\n const toolbar = slots.toolbar ? (\n slots.toolbar(api)\n ) : (\n <>\n {startActions.map((a) => renderAction(a, api))}\n {builtins.run !== false && (\n <FlowRunControls running={api.running} onRun={api.run} onCancel={api.cancel} onReset={api.reset} />\n )}\n {builtins.history !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button\n className=\"ff-editor__btn\"\n data-action=\"undo\"\n title=\"Undo (Ctrl+Z)\"\n disabled={!api.canUndo}\n onClick={api.undo}\n >\n ↶ Undo\n </button>\n <button\n className=\"ff-editor__btn\"\n data-action=\"redo\"\n title=\"Redo (Ctrl+Shift+Z)\"\n disabled={!api.canRedo}\n onClick={api.redo}\n >\n ↷ Redo\n </button>\n </>\n )}\n {builtins.addLane !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button className=\"ff-editor__btn\" data-action=\"add-lane\" title=\"Add a swimlane\" onClick={() => api.addLane()}>\n ▤ Lane\n </button>\n </>\n )}\n {builtins.autoLayout !== false && (\n <button className=\"ff-editor__btn\" data-action=\"auto-layout\" title=\"Tidy — auto-arrange\" onClick={() => api.autoLayout()}>\n ⤢ Tidy\n </button>\n )}\n {(builtins.export !== false || builtins.import !== false) && (\n <span className=\"ff-editor__sep\" />\n )}\n {/* Node deletion is not a toolbar button — it lives in NodeConfigPanel\n (see below), so the affordance is a property of the reusable panel\n rather than duplicated chrome that drifts. Keyboard Del/Backspace and\n the right-click menu still delete. `builtins.delete` gates the panel\n button. */}\n {builtins.export !== false && (\n <button className=\"ff-editor__btn\" data-action=\"export\" onClick={api.exportWorkflow}>↓ Export</button>\n )}\n {builtins.import !== false && (\n <button className=\"ff-editor__btn\" data-action=\"import\" onClick={api.importWorkflow}>↑ Import</button>\n )}\n {endActions.map((a) => renderAction(a, api))}\n {extraToolbar}\n {builtins.count !== false && (\n <span className=\"ff-editor__count\">{api.nodes.length} nodes · {api.edges.length} edges</span>\n )}\n </>\n );\n\n return (\n <FlowEditorProvider value={api}>\n {showPalette && (slots.palette ? slots.palette(api) : <NodePalette className=\"ff-editor__palette\" />)}\n <div className=\"ff-editor__main\" {...dropHandlers}>\n <FlowCanvas\n nodes={renderedNodes}\n edges={flow.edges}\n nodeTypes={nodeTypes}\n onNodesChange={flow.onNodesChange}\n onEdgesChange={flow.onEdgesChange}\n onConnect={flow.onConnect}\n // Drag an edge endpoint to rewire it; the new endpoint is validated by\n // the same isValidConnection rule (G2), so a bad reconnect is refused.\n onReconnect={onReconnect}\n edgesReconnectable\n // Snapshot the pre-drag graph once so a drag is a single undo step.\n onNodeDragStart={hist.onNodeDragStart}\n // Drop a node onto a lane to file it there (or drag it out to unfile).\n onNodeDragStop={handleNodeDragStop}\n onNodeClick={handleNodeClick}\n onNodeContextMenu={builtins.contextMenu === false ? undefined : handleNodeContextMenu}\n onEdgeClick={handleEdgeClick}\n onEdgeContextMenu={builtins.edgeContextMenu === false ? undefined : handleEdgeContextMenu}\n onEdgesDelete={(deleted: Edge[]) => onEdgeDelete?.(deleted.map((e) => e.id))}\n onNodesDelete={(deleted) => onDelete?.(deleted.map((n) => n.id))}\n // Stage the native (keyboard) delete path when a confirm gate is wired.\n onBeforeDelete={\n confirmDelete\n ? async ({ nodes, edges }) => confirmDelete({ nodes: nodes as FlowNode[], edges })\n : undefined\n }\n // Both keys delete, so muscle memory from either platform works.\n deleteKeyCode={[\"Delete\", \"Backspace\"]}\n height=\"100%\"\n toolbar={toolbar}\n {...canvasProps}\n />\n {slots.empty && api.nodes.length === 0 && (\n <div className=\"ff-editor__empty\">{slots.empty(api)}</div>\n )}\n {menu?.target.type === \"node\" && builtins.contextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n // Keep the outside-click listener from closing us before the click lands.\n onClick={(e) => e.stopPropagation()}\n >\n {slots.contextMenu ? (\n slots.contextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-duplicate\"\n onClick={() => { api.duplicateNode(menu.target.id); closeMenu(); }}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-delete\"\n onClick={() => { api.deleteNodes([menu.target.id]); closeMenu(); }}\n >\n Delete\n </button>\n </>\n )}\n </div>\n )}\n\n {menu?.target.type === \"edge\" && builtins.edgeContextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n onClick={(e) => e.stopPropagation()}\n >\n {slots.edgeContextMenu ? (\n slots.edgeContextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-edge-label\"\n onClick={() => {\n setLabelEdit({ x: menu.x, y: menu.y, edgeId: menu.target.id });\n setMenu(null);\n }}\n >\n Label…\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-edge-delete\"\n onClick={() => { api.deleteEdges([menu.target.id]); closeMenu(); }}\n >\n Delete connection\n </button>\n </>\n )}\n </div>\n )}\n\n {labelEdit !== null && (\n <EdgeLabelEditor\n x={labelEdit.x}\n y={labelEdit.y}\n initial={\n (flow.edges.find((e: Edge) => e.id === labelEdit.edgeId)?.label as string | undefined) ?? \"\"\n }\n onCommit={(text) => {\n api.setEdgeLabel(labelEdit.edgeId, text);\n setLabelEdit(null);\n }}\n onCancel={() => setLabelEdit(null)}\n />\n )}\n {showFeed &&\n (slots.feed ? slots.feed(api) : <FlowRunFeed entries={runner.feed} running={api.running} className=\"ff-editor__feed\" />)}\n {prompt && <HumanPrompt request={prompt} onCancel={() => { setPrompt(null); runner.cancel(); }} />}\n </div>\n {showPanel &&\n (slots.panel ? (\n slots.panel(api)\n ) : (\n <div className=\"ff-editor__panel-wrap\">\n <NodeConfigPanel\n className=\"ff-editor__panel\"\n node={api.selected}\n onChange={api.updateNode}\n // The delete affordance lives IN the panel (one source of truth),\n // not a private FlowEditor toolbar button — so a dev composing\n // their own editor from NodeConfigPanel gets it for free.\n onDelete={builtins.delete === false ? undefined : (n) => api.deleteNodes([n.id])}\n />\n {slots.panelFooter && <div className=\"ff-editor__panel-footer\">{slots.panelFooter(api)}</div>}\n </div>\n ))}\n </FlowEditorProvider>\n );\n}\n\nfunction renderAction(action: FlowEditorAction, api: FlowEditorApi) {\n if (action.visible && !action.visible(api)) return null;\n const disabled = action.disabled ? action.disabled(api) : action.requiresSelection === true && api.selected === null;\n return (\n <button\n key={action.id}\n className=\"ff-editor__btn\"\n data-action={action.id}\n title={action.title}\n disabled={disabled}\n onClick={() => action.onSelect(api)}\n >\n {action.label}\n </button>\n );\n}\n\nfunction newNodeId(): string {\n return `n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n}\n\nfunction downloadWorkflow(schema: WorkflowSchema, metadata?: WorkflowMetadata) {\n const url = URL.createObjectURL(workflowToBlob(schema));\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${metadata?.id ?? \"workflow\"}.json`;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nfunction pickWorkflow(onLoad: (graph: FlowGraph) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"application/json\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const result = importWorkflow(JSON.parse(await file.text()), { lenient: true });\n onLoad(result.graph);\n } catch (e) {\n console.error(\"import failed\", e);\n }\n };\n input.click();\n}\n\n/**\n * Build a UseFlowStateReturn-shaped adapter that proxies through to the\n * host's onChange. Edits route through onChange; reads come from `value`.\n */\nfunction makeControlledFlowAdapter(\n value: FlowGraph,\n onChange?: (graph: FlowGraph) => void,\n): UseFlowStateReturn {\n const apply = (next: FlowGraph) => onChange?.(next);\n return {\n nodes: value.nodes,\n edges: value.edges,\n setNodes: (next) => {\n const nextNodes = typeof next === \"function\" ? (next as any)(value.nodes) : next;\n apply({ nodes: nextNodes, edges: value.edges });\n },\n setEdges: (next) => {\n const nextEdges = typeof next === \"function\" ? (next as any)(value.edges) : next;\n apply({ nodes: value.nodes, edges: nextEdges });\n },\n // Atomic both-at-once commit — the reason this exists (see UseFlowStateReturn).\n setGraph: (graph) => apply(graph),\n onNodesChange: (changes) => {\n apply({ nodes: applyNodeChanges(changes, value.nodes) as any, edges: value.edges });\n },\n onEdgesChange: (changes) => {\n apply({ nodes: value.nodes, edges: applyEdgeChanges(changes, value.edges) });\n },\n onConnect: (connection: Connection) => {\n apply({ nodes: value.nodes, edges: addEdge(connection, value.edges) as Edge[] });\n },\n toGraph: () => value,\n };\n}\n\n/**\n * EdgeLabelEditor — small popover for naming a connection.\n *\n * Anchored in viewport coords like the context menu it replaces. Enter\n * commits, Escape cancels, blur commits (so clicking away doesn't silently\n * discard the edit).\n */\nfunction EdgeLabelEditor({\n x,\n y,\n initial,\n onCommit,\n onCancel,\n}: {\n x: number;\n y: number;\n initial: string;\n onCommit: (text: string) => void;\n onCancel: () => void;\n}) {\n const [text, setText] = useState(initial);\n const ref = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n return (\n <div\n className=\"ff-editor__ctx ff-editor__edge-label\"\n style={{ top: y, left: x }}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n ref={ref}\n className=\"ff-panel__input\"\n value={text}\n placeholder=\"Label this connection\"\n aria-label=\"Connection label\"\n data-action=\"edge-label-input\"\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n // Stop the canvas seeing these — Backspace would delete the edge\n // out from under the editor.\n e.stopPropagation();\n if (e.key === \"Enter\") onCommit(text);\n if (e.key === \"Escape\") onCancel();\n }}\n onBlur={() => onCommit(text)}\n />\n </div>\n );\n}\n","/**\n * Authoring API for custom node kinds. The point of this file is to keep\n * consumers from importing @xyflow/react directly when they write a node —\n * they get `defineNode` + `<NodePort>` from us, and we hold the seam.\n *\n * Internal node code (NodeShell, RegistryNode, FlowCanvas) still imports\n * from @xyflow/react directly. The hiding is only for the public authoring\n * surface.\n */\nimport { memo, type ComponentType, type CSSProperties, type ReactNode } from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\n\n/**\n * Subset of NodeProps that the typical node author cares about. Strips the\n * react-flow-specific surface (xPos, yPos, dragging, zIndex, isConnectable,\n * targetPosition, sourcePosition, etc.) — if you need any of that you can\n * still import directly, but you usually don't.\n */\nexport interface FlowNodeRenderProps<TData = unknown> {\n id: string;\n data: TData;\n selected: boolean;\n}\n\n/**\n * Wraps a render function as a memoized node component compatible with the\n * underlying flow engine.\n *\n * const MyNode = defineNode<MyData>(({ data, selected }) => (\n * <div>\n * <NodePort side=\"left\" type=\"target\" />\n * <span>{data.label}</span>\n * <NodePort side=\"right\" type=\"source\" />\n * </div>\n * ));\n */\nexport function defineNode<TData = unknown>(\n render: (props: FlowNodeRenderProps<TData>) => ReactNode,\n): ComponentType<NodeProps<FlowNode>> {\n function Wrapped(props: NodeProps<FlowNode>) {\n return render({\n id: props.id,\n data: props.data as TData,\n selected: Boolean(props.selected),\n });\n }\n Wrapped.displayName = \"FancyFlowNode\";\n return memo(Wrapped);\n}\n\nexport type NodePortSide = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport type NodePortType = \"source\" | \"target\";\n\nconst POSITION_MAP: Record<NodePortSide, Position> = {\n left: Position.Left,\n right: Position.Right,\n top: Position.Top,\n bottom: Position.Bottom,\n};\n\nexport interface NodePortProps {\n /** Which edge of the node the port docks on. */\n side: NodePortSide;\n /** Direction of data flow. `source` emits; `target` receives. */\n type: NodePortType;\n /** Stable id — required when a node has multiple ports on the same side. */\n id?: string;\n style?: CSSProperties;\n title?: string;\n className?: string;\n}\n\n/**\n * Connection handle. Render one per port; the flow engine wires edges to\n * matching `id`s on the source and target nodes.\n *\n * <NodePort side=\"left\" type=\"target\" id=\"in\" />\n * <NodePort side=\"right\" type=\"source\" id=\"ok\" title=\"success\" />\n * <NodePort side=\"right\" type=\"source\" id=\"err\" title=\"error\" style={{ top: '70%' }} />\n */\nexport function NodePort({ side, type, id, style, title, className }: NodePortProps) {\n return (\n <Handle\n position={POSITION_MAP[side]}\n type={type}\n id={id}\n style={style}\n title={title}\n className={className}\n />\n );\n}\n","// Public surface for @particle-academy/fancy-flow.\n\n// Auto-register the built-in agentic kit on import. Hosts can replace\n// individual kinds via re-registration after this fires.\nimport { registerBuiltinKinds } from \"./registry/builtin\";\nregisterBuiltinKinds();\n\n// Editor\nexport { FlowCanvas, type FlowCanvasProps } from \"./components/canvas\";\nexport {\n FlowEditor,\n useFlowEditor,\n useFlowEditorOptional,\n type FlowEditorProps,\n type FlowEditorApi,\n type FlowEditorAction,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n type AlignEdge,\n} from \"./components/FlowEditor\";\nexport { NodePalette, paletteDropHandlers, type NodePaletteProps } from \"./components/NodePalette\";\nexport {\n NodeConfigPanel,\n ConfigFieldRenderer,\n type NodeConfigPanelProps,\n type ConfigFieldRendererProps,\n} from \"./components/NodeConfigPanel\";\n\n// Legacy 6-pack (kept for backwards compat with v0.1; new work uses the registry)\nexport {\n TriggerNode,\n ActionNode,\n DecisionNode,\n OutputNode,\n NoteNode,\n SubgraphNode,\n LaneNode,\n NodeShell,\n defaultNodeTypes,\n type NodeShellProps,\n} from \"./components/nodes\";\n\n// Authoring API for custom node kinds — defineNode + NodePort. Consumers\n// who write their own nodes use these instead of importing @xyflow/react,\n// which keeps the underlying engine swappable and avoids react-flow types\n// leaking into application code.\nexport {\n defineNode,\n NodePort,\n type FlowNodeRenderProps,\n type NodePortProps,\n type NodePortSide,\n type NodePortType,\n} from \"./components/nodes/api\";\n\nexport { FlowRunControls, type FlowRunControlsProps } from \"./components/FlowRunControls\";\nexport { FlowRunFeed, type FlowRunFeedProps } from \"./components/FlowRunFeed\";\n\n// Registry (also: fancy-flow/registry)\nexport {\n registerNodeKind,\n getNodeKind,\n listNodeKinds,\n onNodeKindsChanged,\n defaultConfigFor,\n validateConfig,\n categoryAccent,\n buildNodeTypes,\n RegistryNode,\n registerBuiltinKinds,\n BUILTIN_KINDS,\n resolvePortSpec,\n resolveNodePorts,\n createConnectionValidator,\n defaultPortCompatibility,\n ANY_PORT_TYPE,\n type PortCompatibility,\n type ConnectionValidatorOptions,\n registerRichInputAdapter,\n getRichInputAdapter,\n isRichInputEnabled,\n onRichInputAdapterChanged,\n RichInputPreview,\n type RichInputAdapter,\n type NodeKindDefinition,\n type NodeCategory,\n type ConfigField,\n type RepeaterConfigField,\n type RepeaterRowField,\n type KeyValueConfigField,\n type DocumentConfigField,\n type PortSpec,\n type RenderBodyContext,\n pauseForHuman,\n encodePause,\n decodePause,\n isPause,\n PAUSE_PREFIX,\n LEGACY_PAUSE_PREFIXES,\n type PauseAwaiting,\n type PauseSignal,\n} from \"./registry\";\n\n// Schema (also: fancy-flow/schema)\nexport {\n exportWorkflow,\n importWorkflow,\n migrateSchema,\n workflowToBlob,\n WORKFLOW_SCHEMA_VERSION,\n WORKFLOW_SCHEMA_URL,\n type WorkflowSchema,\n type WorkflowSchemaNode,\n type WorkflowSchemaEdge,\n type WorkflowMetadata,\n type ImportIssue,\n type ImportResult,\n type ImportOptions,\n} from \"./schema\";\n\n// Runtime (also: fancy-flow/runtime)\nexport {\n runFlow,\n useFlowRun,\n useFlowState,\n useFlowHistory,\n createHistory,\n applyStatusesToNodes,\n applyOutputsToNodes,\n type RunOptions,\n type RunResult,\n type UseFlowRunReturn,\n type UseFlowRunOptions,\n type UseFlowStateReturn,\n type UseFlowHistoryReturn,\n type HistoryController,\n type FlowRunFeedEntry,\n} from \"./runtime\";\n\n// Auto-layout types (the value `autoLayout` lives on the `fancy-flow/layout`\n// subpath so dagre stays out of the eager bundle; it's also on `api.autoLayout`).\nexport type { AutoLayoutOptions, AutoLayoutDirection } from \"./layout\";\n\n// Domain types\nexport type {\n FlowNode,\n FlowEdge,\n FlowGraph,\n FlowNodeData,\n FlowNodeKind,\n TriggerNodeData,\n ActionNodeData,\n DecisionNodeData,\n OutputNodeData,\n NoteNodeData,\n SubgraphNodeData,\n BaseNodeData,\n PortDescriptor,\n NodeRunStatus,\n NodeExecutor,\n ExecutorRegistry,\n RunEvent,\n} from \"./types\";\n"]}