@particle-academy/fancy-flow 0.2.2 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode, CSSProperties } from 'react';
3
+ import { ReactNode, CSSProperties, ComponentType } from 'react';
4
4
  import { ReactFlowProps, Edge, BackgroundVariant, NodeProps, NodeTypes } from '@xyflow/react';
5
- import { F as FlowNode, a as FlowGraph, E as ExecutorRegistry } from './types-TemTtb04.cjs';
6
- export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, b as FlowEdge, c as FlowNodeData, d as FlowNodeKind, N as NodeExecutor, e as NodeRunStatus, f as NoteNodeData, O as OutputNodeData, P as PortDescriptor, R as RunEvent, S as SubgraphNodeData, T as TriggerNodeData } from './types-TemTtb04.cjs';
5
+ import { b as FlowNode, a as FlowGraph, E as ExecutorRegistry } from './types-Ch4sAvum.cjs';
6
+ export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, F as FlowEdge, c as FlowNodeData, d as FlowNodeKind, N as NodeExecutor, e as NodeRunStatus, f as NoteNodeData, O as OutputNodeData, P as PortDescriptor, R as RunEvent, S as SubgraphNodeData, T as TriggerNodeData } from './types-Ch4sAvum.cjs';
7
7
  import { WorkflowMetadata } from './schema/index.cjs';
8
8
  export { ImportIssue, ImportOptions, ImportResult, WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, WorkflowSchema, WorkflowSchemaEdge, WorkflowSchemaNode, exportWorkflow, importWorkflow, workflowToBlob } from './schema/index.cjs';
9
9
  import { NodeCategory, NodeKindDefinition, ConfigField } from './registry/index.cjs';
@@ -204,6 +204,53 @@ declare const NodeShell: react.MemoExoticComponent<typeof NodeShellInner>;
204
204
  */
205
205
  declare const defaultNodeTypes: NodeTypes;
206
206
 
207
+ /**
208
+ * Subset of NodeProps that the typical node author cares about. Strips the
209
+ * react-flow-specific surface (xPos, yPos, dragging, zIndex, isConnectable,
210
+ * targetPosition, sourcePosition, etc.) — if you need any of that you can
211
+ * still import directly, but you usually don't.
212
+ */
213
+ interface FlowNodeRenderProps<TData = unknown> {
214
+ id: string;
215
+ data: TData;
216
+ selected: boolean;
217
+ }
218
+ /**
219
+ * Wraps a render function as a memoized node component compatible with the
220
+ * underlying flow engine.
221
+ *
222
+ * const MyNode = defineNode<MyData>(({ data, selected }) => (
223
+ * <div>
224
+ * <NodePort side="left" type="target" />
225
+ * <span>{data.label}</span>
226
+ * <NodePort side="right" type="source" />
227
+ * </div>
228
+ * ));
229
+ */
230
+ declare function defineNode<TData = unknown>(render: (props: FlowNodeRenderProps<TData>) => ReactNode): ComponentType<NodeProps<FlowNode>>;
231
+ type NodePortSide = "left" | "right" | "top" | "bottom";
232
+ type NodePortType = "source" | "target";
233
+ interface NodePortProps {
234
+ /** Which edge of the node the port docks on. */
235
+ side: NodePortSide;
236
+ /** Direction of data flow. `source` emits; `target` receives. */
237
+ type: NodePortType;
238
+ /** Stable id — required when a node has multiple ports on the same side. */
239
+ id?: string;
240
+ style?: CSSProperties;
241
+ title?: string;
242
+ className?: string;
243
+ }
244
+ /**
245
+ * Connection handle. Render one per port; the flow engine wires edges to
246
+ * matching `id`s on the source and target nodes.
247
+ *
248
+ * <NodePort side="left" type="target" id="in" />
249
+ * <NodePort side="right" type="source" id="ok" title="success" />
250
+ * <NodePort side="right" type="source" id="err" title="error" style={{ top: '70%' }} />
251
+ */
252
+ declare function NodePort({ side, type, id, style, title, className }: NodePortProps): react_jsx_runtime.JSX.Element;
253
+
207
254
  type FlowRunControlsProps = {
208
255
  running: boolean;
209
256
  onRun: () => void;
@@ -223,4 +270,4 @@ type FlowRunFeedProps = {
223
270
  /** FlowRunFeed — scrolling log panel. Auto-scrolls to bottom on new entries. */
224
271
  declare function FlowRunFeed({ entries, className, style }: FlowRunFeedProps): react_jsx_runtime.JSX.Element;
225
272
 
226
- export { ActionNode, ConfigField, ConfigFieldRenderer, type ConfigFieldRendererProps, DecisionNode, ExecutorRegistry, FlowCanvas, type FlowCanvasProps, FlowEditor, type FlowEditorProps, FlowGraph, FlowNode, FlowRunControls, type FlowRunControlsProps, FlowRunFeed, FlowRunFeedEntry, type FlowRunFeedProps, NodeCategory, NodeConfigPanel, type NodeConfigPanelProps, NodeKindDefinition, NodePalette, type NodePaletteProps, NodeShell, type NodeShellProps, NoteNode, OutputNode, SubgraphNode, TriggerNode, WorkflowMetadata, defaultNodeTypes, paletteDropHandlers };
273
+ export { ActionNode, ConfigField, ConfigFieldRenderer, type ConfigFieldRendererProps, DecisionNode, ExecutorRegistry, FlowCanvas, type FlowCanvasProps, FlowEditor, type FlowEditorProps, FlowGraph, FlowNode, type FlowNodeRenderProps, FlowRunControls, type FlowRunControlsProps, FlowRunFeed, FlowRunFeedEntry, type FlowRunFeedProps, NodeCategory, NodeConfigPanel, type NodeConfigPanelProps, NodeKindDefinition, NodePalette, type NodePaletteProps, NodePort, type NodePortProps, type NodePortSide, type NodePortType, NodeShell, type NodeShellProps, NoteNode, OutputNode, SubgraphNode, TriggerNode, WorkflowMetadata, defaultNodeTypes, defineNode, paletteDropHandlers };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode, CSSProperties } from 'react';
3
+ import { ReactNode, CSSProperties, ComponentType } from 'react';
4
4
  import { ReactFlowProps, Edge, BackgroundVariant, NodeProps, NodeTypes } from '@xyflow/react';
5
- import { F as FlowNode, a as FlowGraph, E as ExecutorRegistry } from './types-TemTtb04.js';
6
- export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, b as FlowEdge, c as FlowNodeData, d as FlowNodeKind, N as NodeExecutor, e as NodeRunStatus, f as NoteNodeData, O as OutputNodeData, P as PortDescriptor, R as RunEvent, S as SubgraphNodeData, T as TriggerNodeData } from './types-TemTtb04.js';
5
+ import { b as FlowNode, a as FlowGraph, E as ExecutorRegistry } from './types-Ch4sAvum.js';
6
+ export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, F as FlowEdge, c as FlowNodeData, d as FlowNodeKind, N as NodeExecutor, e as NodeRunStatus, f as NoteNodeData, O as OutputNodeData, P as PortDescriptor, R as RunEvent, S as SubgraphNodeData, T as TriggerNodeData } from './types-Ch4sAvum.js';
7
7
  import { WorkflowMetadata } from './schema/index.js';
8
8
  export { ImportIssue, ImportOptions, ImportResult, WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, WorkflowSchema, WorkflowSchemaEdge, WorkflowSchemaNode, exportWorkflow, importWorkflow, workflowToBlob } from './schema/index.js';
9
9
  import { NodeCategory, NodeKindDefinition, ConfigField } from './registry/index.js';
@@ -204,6 +204,53 @@ declare const NodeShell: react.MemoExoticComponent<typeof NodeShellInner>;
204
204
  */
205
205
  declare const defaultNodeTypes: NodeTypes;
206
206
 
207
+ /**
208
+ * Subset of NodeProps that the typical node author cares about. Strips the
209
+ * react-flow-specific surface (xPos, yPos, dragging, zIndex, isConnectable,
210
+ * targetPosition, sourcePosition, etc.) — if you need any of that you can
211
+ * still import directly, but you usually don't.
212
+ */
213
+ interface FlowNodeRenderProps<TData = unknown> {
214
+ id: string;
215
+ data: TData;
216
+ selected: boolean;
217
+ }
218
+ /**
219
+ * Wraps a render function as a memoized node component compatible with the
220
+ * underlying flow engine.
221
+ *
222
+ * const MyNode = defineNode<MyData>(({ data, selected }) => (
223
+ * <div>
224
+ * <NodePort side="left" type="target" />
225
+ * <span>{data.label}</span>
226
+ * <NodePort side="right" type="source" />
227
+ * </div>
228
+ * ));
229
+ */
230
+ declare function defineNode<TData = unknown>(render: (props: FlowNodeRenderProps<TData>) => ReactNode): ComponentType<NodeProps<FlowNode>>;
231
+ type NodePortSide = "left" | "right" | "top" | "bottom";
232
+ type NodePortType = "source" | "target";
233
+ interface NodePortProps {
234
+ /** Which edge of the node the port docks on. */
235
+ side: NodePortSide;
236
+ /** Direction of data flow. `source` emits; `target` receives. */
237
+ type: NodePortType;
238
+ /** Stable id — required when a node has multiple ports on the same side. */
239
+ id?: string;
240
+ style?: CSSProperties;
241
+ title?: string;
242
+ className?: string;
243
+ }
244
+ /**
245
+ * Connection handle. Render one per port; the flow engine wires edges to
246
+ * matching `id`s on the source and target nodes.
247
+ *
248
+ * <NodePort side="left" type="target" id="in" />
249
+ * <NodePort side="right" type="source" id="ok" title="success" />
250
+ * <NodePort side="right" type="source" id="err" title="error" style={{ top: '70%' }} />
251
+ */
252
+ declare function NodePort({ side, type, id, style, title, className }: NodePortProps): react_jsx_runtime.JSX.Element;
253
+
207
254
  type FlowRunControlsProps = {
208
255
  running: boolean;
209
256
  onRun: () => void;
@@ -223,4 +270,4 @@ type FlowRunFeedProps = {
223
270
  /** FlowRunFeed — scrolling log panel. Auto-scrolls to bottom on new entries. */
224
271
  declare function FlowRunFeed({ entries, className, style }: FlowRunFeedProps): react_jsx_runtime.JSX.Element;
225
272
 
226
- export { ActionNode, ConfigField, ConfigFieldRenderer, type ConfigFieldRendererProps, DecisionNode, ExecutorRegistry, FlowCanvas, type FlowCanvasProps, FlowEditor, type FlowEditorProps, FlowGraph, FlowNode, FlowRunControls, type FlowRunControlsProps, FlowRunFeed, FlowRunFeedEntry, type FlowRunFeedProps, NodeCategory, NodeConfigPanel, type NodeConfigPanelProps, NodeKindDefinition, NodePalette, type NodePaletteProps, NodeShell, type NodeShellProps, NoteNode, OutputNode, SubgraphNode, TriggerNode, WorkflowMetadata, defaultNodeTypes, paletteDropHandlers };
273
+ export { ActionNode, ConfigField, ConfigFieldRenderer, type ConfigFieldRendererProps, DecisionNode, ExecutorRegistry, FlowCanvas, type FlowCanvasProps, FlowEditor, type FlowEditorProps, FlowGraph, FlowNode, type FlowNodeRenderProps, FlowRunControls, type FlowRunControlsProps, FlowRunFeed, FlowRunFeedEntry, type FlowRunFeedProps, NodeCategory, NodeConfigPanel, type NodeConfigPanelProps, NodeKindDefinition, NodePalette, type NodePaletteProps, NodePort, type NodePortProps, type NodePortSide, type NodePortType, NodeShell, type NodeShellProps, NoteNode, OutputNode, SubgraphNode, TriggerNode, WorkflowMetadata, defaultNodeTypes, defineNode, paletteDropHandlers };
package/dist/index.js CHANGED
@@ -1,14 +1,13 @@
1
- import { useFlowState, useFlowRun, applyStatusesToNodes } from './chunk-JNYYJHNJ.js';
2
- export { applyStatusesToNodes, runFlow, useFlowRun, useFlowState } from './chunk-JNYYJHNJ.js';
3
- import { registerBuiltinKinds, buildNodeTypes } from './chunk-XZEUFVJ2.js';
4
- export { BUILTIN_KINDS, RegistryNode, buildNodeTypes, registerBuiltinKinds } from './chunk-XZEUFVJ2.js';
1
+ import { useFlowState, useFlowRun, applyStatusesToNodes } from './chunk-OZPQAUZD.js';
2
+ export { applyStatusesToNodes, runFlow, useFlowRun, useFlowState } from './chunk-OZPQAUZD.js';
3
+ import { registerBuiltinKinds, buildNodeTypes } from './chunk-4YBSEMF2.js';
4
+ export { BUILTIN_KINDS, RegistryNode, buildNodeTypes, registerBuiltinKinds } from './chunk-4YBSEMF2.js';
5
+ import { Position, Handle, index, BackgroundVariant, Background, Controls, MiniMap, ReactFlowProvider, addEdge, applyEdgeChanges, applyNodeChanges, useReactFlow } from './chunk-GJSFZR6J.js';
5
6
  import { exportWorkflow, workflowToBlob, importWorkflow } from './chunk-BCXECQUC.js';
6
7
  export { WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, exportWorkflow, importWorkflow, workflowToBlob } from './chunk-BCXECQUC.js';
7
8
  import { onNodeKindsChanged, listNodeKinds, categoryAccent, getNodeKind, validateConfig, defaultConfigFor } from './chunk-WNVBXXOL.js';
8
9
  export { categoryAccent, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged, registerNodeKind, validateConfig } from './chunk-WNVBXXOL.js';
9
10
  import { memo, useMemo, useState, useEffect, useRef } from 'react';
10
- import { Handle, Position, ReactFlow, BackgroundVariant, Background, Controls, MiniMap, ReactFlowProvider, addEdge, applyEdgeChanges, applyNodeChanges, useReactFlow } from '@xyflow/react';
11
- import '@xyflow/react/dist/style.css';
12
11
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
12
 
14
13
  function NodeShellInner({
@@ -164,7 +163,7 @@ function FlowCanvas({
164
163
  return /* @__PURE__ */ jsxs("div", { className: ["ff-canvas", className ?? ""].filter(Boolean).join(" "), style: { height, ...style }, children: [
165
164
  toolbar && /* @__PURE__ */ jsx("div", { className: "ff-canvas__toolbar", children: toolbar }),
166
165
  /* @__PURE__ */ jsx("div", { className: "ff-canvas__surface", children: /* @__PURE__ */ jsxs(
167
- ReactFlow,
166
+ index,
168
167
  {
169
168
  nodes,
170
169
  edges,
@@ -696,10 +695,40 @@ function FlowEditorBody({
696
695
  )
697
696
  ] });
698
697
  }
698
+ function defineNode(render) {
699
+ function Wrapped(props) {
700
+ return render({
701
+ id: props.id,
702
+ data: props.data,
703
+ selected: Boolean(props.selected)
704
+ });
705
+ }
706
+ Wrapped.displayName = "FancyFlowNode";
707
+ return memo(Wrapped);
708
+ }
709
+ var POSITION_MAP = {
710
+ left: Position.Left,
711
+ right: Position.Right,
712
+ top: Position.Top,
713
+ bottom: Position.Bottom
714
+ };
715
+ function NodePort({ side, type, id, style, title, className }) {
716
+ return /* @__PURE__ */ jsx(
717
+ Handle,
718
+ {
719
+ position: POSITION_MAP[side],
720
+ type,
721
+ id,
722
+ style,
723
+ title,
724
+ className
725
+ }
726
+ );
727
+ }
699
728
 
700
729
  // src/index.ts
701
730
  registerBuiltinKinds();
702
731
 
703
- export { ActionNode, ConfigFieldRenderer, DecisionNode, FlowCanvas, FlowEditor, FlowRunControls, FlowRunFeed, NodeConfigPanel, NodePalette, NodeShell, NoteNode, OutputNode, SubgraphNode, TriggerNode, defaultNodeTypes, paletteDropHandlers };
732
+ export { ActionNode, ConfigFieldRenderer, DecisionNode, FlowCanvas, FlowEditor, FlowRunControls, FlowRunFeed, NodeConfigPanel, NodePalette, NodePort, NodeShell, NoteNode, OutputNode, SubgraphNode, TriggerNode, defaultNodeTypes, defineNode, paletteDropHandlers };
704
733
  //# sourceMappingURL=index.js.map
705
734
  //# sourceMappingURL=index.js.map
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/NoteNode.tsx","../src/components/nodes/SubgraphNode.tsx","../src/components/nodes/index.ts","../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/index.ts"],"names":["jsx","memo","jsxs","useMemo","Fragment","useEffect","useState"],"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, NoteNodeData } from \"../../types\";\n\n/**\n * NoteNode — annotation card with no ports. Useful for documenting graphs.\n * Body is plain text; hosts can wire onChange via the editor's onNodesChange\n * if they want it editable.\n */\nfunction NoteNodeInner({ data, selected }: NodeProps<FlowNode>) {\n const noteData = data as NoteNodeData;\n return (\n <div className={`ff-note ${selected ? \"ff-note--selected\" : \"\"}`}>\n {noteData.label && <div className=\"ff-note__title\">{noteData.label}</div>}\n {noteData.body && <p className=\"ff-note__body\">{noteData.body}</p>}\n </div>\n );\n}\nexport const NoteNode = memo(NoteNodeInner);\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 { 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 { type CSSProperties, type ReactNode, useMemo } 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 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 /** 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 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 const mergedEdgeTypes = useMemo<EdgeTypes | undefined>(\n () => (edgeTypes ? { ...edgeTypes } : undefined),\n [edgeTypes],\n );\n\n return (\n <div className={[\"ff-canvas\", className ?? \"\"].filter(Boolean).join(\" \")} style={{ height, ...style }}>\n {toolbar && <div className=\"ff-canvas__toolbar\">{toolbar}</div>}\n <div className=\"ff-canvas__surface\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={mergedNodeTypes}\n edgeTypes={mergedEdgeTypes}\n fitView\n fitViewOptions={DEFAULT_FIT_VIEW}\n defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}\n proOptions={{ hideAttribution: true }}\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 </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\", \"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 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 { ConfigField } 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\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({ field, value, onChange, renderCredentialField }: ConfigFieldRendererProps) {\n switch (field.type) {\n case \"text\":\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 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 default:\n return null;\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 { 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 /** 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 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 header,\n renderCredentialField,\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 </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 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 />\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 </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 { type CSSProperties, type ReactNode, useEffect, useMemo, useState } 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 } 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 { useFlowRun, applyStatusesToNodes } 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\";\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 /** Optional toolbar content rendered next to the run controls. */\n extraToolbar?: ReactNode;\n /** Called whenever the graph changes — host can persist. */\n onChange?: (graph: FlowGraph) => void;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowEditor — opinionated, batteries-included workflow editor. Composes\n * NodePalette + FlowCanvas + NodeConfigPanel + run controls + run feed\n * with sensible defaults. Hosts that want à la carte can use the\n * primitives directly.\n */\nexport function FlowEditor(props: FlowEditorProps) {\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} />\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 onChange,\n}: FlowEditorProps) {\n const internal = useFlowState(initial);\n const runner = useFlowRun();\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 flow = controlled\n ? makeControlledFlowAdapter(value!, onChange)\n : internal;\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 () => applyStatusesToNodes(flow.nodes, runner.statuses, runner.statusText),\n [flow.nodes, runner.statuses, runner.statusText],\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 const handleNodeClick: NodeMouseHandler = (_e, node) => setSelectedId(node.id);\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 return (\n <FlowEditorBody\n showPalette={showPalette}\n showPanel={showPanel}\n showFeed={showFeed}\n flow={flow}\n runner={runner}\n executors={executors}\n metadata={metadata}\n nodeTypes={nodeTypes}\n renderedNodes={renderedNodes}\n selected={selected}\n setSelectedId={setSelectedId}\n handleNodeClick={handleNodeClick}\n extraToolbar={extraToolbar}\n />\n );\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 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\nfunction FlowEditorBody({\n showPalette, showPanel, showFeed,\n flow, runner, executors, metadata,\n nodeTypes, renderedNodes, selected, setSelectedId, handleNodeClick, extraToolbar,\n}: any) {\n const rf = useReactFlow();\n\n const dropHandlers = paletteDropHandlers((kindName, evt) => {\n const kind = getNodeKind(kindName);\n if (!kind) return;\n const point = rf.screenToFlowPosition({ x: evt.clientX, y: evt.clientY });\n const id = `n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n flow.setNodes((all: FlowNode[]) => [\n ...all,\n {\n id, type: kind.name,\n position: { x: point.x - 100, y: point.y - 30 },\n data: { kind: kind.name, label: kind.label, config: defaultConfigFor(kind) } as any,\n } as FlowNode,\n ]);\n setSelectedId(id);\n });\n\n const doExport = () => {\n const schema: WorkflowSchema = exportWorkflow({ nodes: flow.nodes, edges: flow.edges }, metadata);\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\n const doImport = () => {\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 const text = await file.text();\n try {\n const result = importWorkflow(JSON.parse(text), { lenient: true });\n flow.setNodes(result.graph.nodes);\n flow.setEdges(result.graph.edges);\n } catch (e) {\n console.error(\"import failed\", e);\n }\n };\n input.click();\n };\n\n return (\n <>\n {showPalette && <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 onNodeClick={handleNodeClick}\n height=\"100%\"\n toolbar={\n <>\n <FlowRunControls\n running={runner.running}\n onRun={() => runner.run({ nodes: flow.nodes, edges: flow.edges }, executors)}\n onCancel={runner.cancel}\n onReset={runner.reset}\n />\n <span className=\"ff-editor__sep\" />\n <button className=\"ff-editor__btn\" onClick={doExport}>↓ Export</button>\n <button className=\"ff-editor__btn\" onClick={doImport}>↑ Import</button>\n {extraToolbar}\n <span className=\"ff-editor__count\">{flow.nodes.length} nodes · {flow.edges.length} edges</span>\n </>\n }\n />\n {showFeed && <FlowRunFeed entries={runner.feed} className=\"ff-editor__feed\" />}\n </div>\n {showPanel && (\n <NodeConfigPanel\n className=\"ff-editor__panel\"\n node={selected}\n onChange={(next: FlowNode) => flow.setNodes((all: FlowNode[]) => all.map((x) => (x.id === next.id ? next : x)))}\n />\n )}\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 { FlowEditor, type FlowEditorProps } 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 NodeShell,\n defaultNodeTypes,\n type NodeShellProps,\n} from \"./components/nodes\";\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 type NodeKindDefinition,\n type NodeCategory,\n type ConfigField,\n type RenderBodyContext,\n} from \"./registry\";\n\n// Schema (also: fancy-flow/schema)\nexport {\n exportWorkflow,\n importWorkflow,\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 applyStatusesToNodes,\n type RunOptions,\n type RunResult,\n type UseFlowRunReturn,\n type UseFlowRunOptions,\n type UseFlowStateReturn,\n type FlowRunFeedEntry,\n} from \"./runtime\";\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/NoteNode.tsx","../src/components/nodes/SubgraphNode.tsx","../src/components/nodes/index.ts","../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","useMemo","Fragment","useEffect","useState"],"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, NoteNodeData } from \"../../types\";\n\n/**\n * NoteNode — annotation card with no ports. Useful for documenting graphs.\n * Body is plain text; hosts can wire onChange via the editor's onNodesChange\n * if they want it editable.\n */\nfunction NoteNodeInner({ data, selected }: NodeProps<FlowNode>) {\n const noteData = data as NoteNodeData;\n return (\n <div className={`ff-note ${selected ? \"ff-note--selected\" : \"\"}`}>\n {noteData.label && <div className=\"ff-note__title\">{noteData.label}</div>}\n {noteData.body && <p className=\"ff-note__body\">{noteData.body}</p>}\n </div>\n );\n}\nexport const NoteNode = memo(NoteNodeInner);\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 { 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 { type CSSProperties, type ReactNode, useMemo } 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 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 /** 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 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 const mergedEdgeTypes = useMemo<EdgeTypes | undefined>(\n () => (edgeTypes ? { ...edgeTypes } : undefined),\n [edgeTypes],\n );\n\n return (\n <div className={[\"ff-canvas\", className ?? \"\"].filter(Boolean).join(\" \")} style={{ height, ...style }}>\n {toolbar && <div className=\"ff-canvas__toolbar\">{toolbar}</div>}\n <div className=\"ff-canvas__surface\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={mergedNodeTypes}\n edgeTypes={mergedEdgeTypes}\n fitView\n fitViewOptions={DEFAULT_FIT_VIEW}\n defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}\n proOptions={{ hideAttribution: true }}\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 </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\", \"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 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 { ConfigField } 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\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({ field, value, onChange, renderCredentialField }: ConfigFieldRendererProps) {\n switch (field.type) {\n case \"text\":\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 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 default:\n return null;\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 { 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 /** 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 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 header,\n renderCredentialField,\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 </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 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 />\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 </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 { type CSSProperties, type ReactNode, useEffect, useMemo, useState } 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 } 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 { useFlowRun, applyStatusesToNodes } 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\";\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 /** Optional toolbar content rendered next to the run controls. */\n extraToolbar?: ReactNode;\n /** Called whenever the graph changes — host can persist. */\n onChange?: (graph: FlowGraph) => void;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowEditor — opinionated, batteries-included workflow editor. Composes\n * NodePalette + FlowCanvas + NodeConfigPanel + run controls + run feed\n * with sensible defaults. Hosts that want à la carte can use the\n * primitives directly.\n */\nexport function FlowEditor(props: FlowEditorProps) {\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} />\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 onChange,\n}: FlowEditorProps) {\n const internal = useFlowState(initial);\n const runner = useFlowRun();\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 flow = controlled\n ? makeControlledFlowAdapter(value!, onChange)\n : internal;\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 () => applyStatusesToNodes(flow.nodes, runner.statuses, runner.statusText),\n [flow.nodes, runner.statuses, runner.statusText],\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 const handleNodeClick: NodeMouseHandler = (_e, node) => setSelectedId(node.id);\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 return (\n <FlowEditorBody\n showPalette={showPalette}\n showPanel={showPanel}\n showFeed={showFeed}\n flow={flow}\n runner={runner}\n executors={executors}\n metadata={metadata}\n nodeTypes={nodeTypes}\n renderedNodes={renderedNodes}\n selected={selected}\n setSelectedId={setSelectedId}\n handleNodeClick={handleNodeClick}\n extraToolbar={extraToolbar}\n />\n );\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 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\nfunction FlowEditorBody({\n showPalette, showPanel, showFeed,\n flow, runner, executors, metadata,\n nodeTypes, renderedNodes, selected, setSelectedId, handleNodeClick, extraToolbar,\n}: any) {\n const rf = useReactFlow();\n\n const dropHandlers = paletteDropHandlers((kindName, evt) => {\n const kind = getNodeKind(kindName);\n if (!kind) return;\n const point = rf.screenToFlowPosition({ x: evt.clientX, y: evt.clientY });\n const id = `n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n flow.setNodes((all: FlowNode[]) => [\n ...all,\n {\n id, type: kind.name,\n position: { x: point.x - 100, y: point.y - 30 },\n data: { kind: kind.name, label: kind.label, config: defaultConfigFor(kind) } as any,\n } as FlowNode,\n ]);\n setSelectedId(id);\n });\n\n const doExport = () => {\n const schema: WorkflowSchema = exportWorkflow({ nodes: flow.nodes, edges: flow.edges }, metadata);\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\n const doImport = () => {\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 const text = await file.text();\n try {\n const result = importWorkflow(JSON.parse(text), { lenient: true });\n flow.setNodes(result.graph.nodes);\n flow.setEdges(result.graph.edges);\n } catch (e) {\n console.error(\"import failed\", e);\n }\n };\n input.click();\n };\n\n return (\n <>\n {showPalette && <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 onNodeClick={handleNodeClick}\n height=\"100%\"\n toolbar={\n <>\n <FlowRunControls\n running={runner.running}\n onRun={() => runner.run({ nodes: flow.nodes, edges: flow.edges }, executors)}\n onCancel={runner.cancel}\n onReset={runner.reset}\n />\n <span className=\"ff-editor__sep\" />\n <button className=\"ff-editor__btn\" onClick={doExport}>↓ Export</button>\n <button className=\"ff-editor__btn\" onClick={doImport}>↑ Import</button>\n {extraToolbar}\n <span className=\"ff-editor__count\">{flow.nodes.length} nodes · {flow.edges.length} edges</span>\n </>\n }\n />\n {showFeed && <FlowRunFeed entries={runner.feed} className=\"ff-editor__feed\" />}\n </div>\n {showPanel && (\n <NodeConfigPanel\n className=\"ff-editor__panel\"\n node={selected}\n onChange={(next: FlowNode) => flow.setNodes((all: FlowNode[]) => all.map((x) => (x.id === next.id ? next : x)))}\n />\n )}\n </>\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 { FlowEditor, type FlowEditorProps } 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 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 type NodeKindDefinition,\n type NodeCategory,\n type ConfigField,\n type RenderBodyContext,\n} from \"./registry\";\n\n// Schema (also: fancy-flow/schema)\nexport {\n exportWorkflow,\n importWorkflow,\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 applyStatusesToNodes,\n type RunOptions,\n type RunResult,\n type UseFlowRunReturn,\n type UseFlowRunOptions,\n type UseFlowStateReturn,\n type FlowRunFeedEntry,\n} from \"./runtime\";\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,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { P as PortDescriptor, N as NodeExecutor, F as FlowNode } from '../types-TemTtb04.cjs';
3
+ import { P as PortDescriptor, N as NodeExecutor, b as FlowNode } from '../types-Ch4sAvum.cjs';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import { NodeProps, NodeTypes } from '@xyflow/react';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { P as PortDescriptor, N as NodeExecutor, F as FlowNode } from '../types-TemTtb04.js';
3
+ import { P as PortDescriptor, N as NodeExecutor, b as FlowNode } from '../types-Ch4sAvum.js';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import { NodeProps, NodeTypes } from '@xyflow/react';
6
6