@particle-academy/fancy-flow 0.64.0 → 0.65.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/README.md +16 -0
- package/dist/index.cjs +10 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -4
- package/dist/index.d.ts +16 -4
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/NodePalette/NodePalette.tsx","../src/expressions/variables.ts","../src/components/NodeConfigPanel/ExpressionField.tsx","../src/components/NodeConfigPanel/ConfigFieldRenderer.tsx","../src/components/NodeConfigPanel/NodeConfigPanel.tsx","../src/components/FlowRunControls.tsx","../src/components/FlowRunFeed.tsx","../src/components/FlowEditor/HumanPrompt.tsx","../src/components/FlowEditor/FlowEditor.tsx","../src/components/nodes/api.tsx","../src/live.ts","../src/index.ts"],"names":["text","useState","useMemo","jsxs","jsx","useRef","Fragment","useEffect","useId","FlowEditor","internal"],"mappings":"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","file":"index.js","sourcesContent":["import { type CSSProperties, useEffect, useMemo, useState } from \"react\";\nimport { categoryAccent, listNodeKinds, onNodeKindsChanged } from \"../../registry/registry\";\nimport type { NodeCategory, NodeKindDefinition } from \"../../registry/types\";\n\nexport type NodePaletteProps = {\n /** Filter to only these categories. */\n categories?: NodeCategory[];\n /** Called when the user clicks a kind (in addition to drag). Optional. */\n onPick?: (kind: NodeKindDefinition) => void;\n className?: string;\n style?: CSSProperties;\n};\n\nconst CATEGORY_ORDER: NodeCategory[] = [\"trigger\", \"logic\", \"data\", \"ai\", \"io\", \"human\", \"output\", \"layout\", \"annotation\", \"custom\"];\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n trigger: \"Triggers\",\n logic: \"Logic\",\n data: \"Data\",\n ai: \"AI\",\n io: \"Connectors\",\n human: \"Human\",\n output: \"Output\",\n layout: \"Layout\",\n annotation: \"Notes\",\n custom: \"Custom\",\n};\n\n/**\n * NodePalette — sidebar listing every registered node kind, grouped by\n * category. Drag a kind onto a `<FlowCanvas>` to add a new node — set\n * `onDrop` on the canvas to handle the drop with the kind name from the\n * `application/x-fancy-flow-kind` data type.\n */\nexport function NodePalette({ categories, onPick, className, style }: NodePaletteProps) {\n const [, setRev] = useState(0);\n useEffect(() => onNodeKindsChanged(() => setRev((n) => n + 1)), []);\n\n const [query, setQuery] = useState(\"\");\n const visibleCats = categories ?? CATEGORY_ORDER;\n\n const grouped = useMemo(() => {\n const all = listNodeKinds();\n const q = query.trim().toLowerCase();\n const filtered = q\n ? all.filter((k) => k.name.includes(q) || k.label.toLowerCase().includes(q) || (k.description ?? \"\").toLowerCase().includes(q))\n : all;\n const map = new Map<NodeCategory, NodeKindDefinition[]>();\n for (const cat of visibleCats) map.set(cat, []);\n for (const k of filtered) {\n if (!map.has(k.category)) map.set(k.category, []);\n map.get(k.category)!.push(k);\n }\n return map;\n }, [query, visibleCats]);\n\n return (\n <aside className={[\"ff-palette\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <div className=\"ff-palette__search\">\n <input\n className=\"ff-palette__search-input\"\n placeholder=\"Search nodes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n <div className=\"ff-palette__list\">\n {Array.from(grouped.entries()).map(([cat, kinds]) =>\n kinds.length === 0 ? null : (\n <section key={cat} className=\"ff-palette__group\">\n <header className=\"ff-palette__group-label\">{CATEGORY_LABELS[cat] ?? cat}</header>\n {kinds.map((k) => (\n <KindRow key={k.name} kind={k} onPick={onPick} />\n ))}\n </section>\n ),\n )}\n </div>\n </aside>\n );\n}\n\nfunction KindRow({ kind, onPick }: { kind: NodeKindDefinition; onPick?: (k: NodeKindDefinition) => void }) {\n const accent = kind.accent ?? categoryAccent(kind.category);\n const onDragStart = (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/x-fancy-flow-kind\", kind.name);\n // Setting both lets non-aware drop targets (e.g. text inputs) ignore it cleanly.\n e.dataTransfer.setData(\"text/plain\", kind.name);\n };\n return (\n <button\n type=\"button\"\n className=\"ff-palette__row\"\n draggable\n onDragStart={onDragStart}\n onClick={() => onPick?.(kind)}\n title={kind.description ?? kind.name}\n >\n <span className=\"ff-palette__row-dot\" style={{ background: accent }}>{kind.icon ?? \"\"}</span>\n <span className=\"ff-palette__row-text\">\n <span className=\"ff-palette__row-label\">{kind.label}</span>\n {kind.description && <span className=\"ff-palette__row-desc\">{kind.description}</span>}\n </span>\n </button>\n );\n}\n\n/**\n * useDropFromPalette — wires the canvas drop target. Returns the drop /\n * dragOver handlers; they parse the dragged kind name and call `onDrop`\n * with `(kindName, position)` in viewport coords.\n */\nexport function paletteDropHandlers(onDrop: (kindName: string, evt: React.DragEvent) => void) {\n return {\n onDragOver: (e: React.DragEvent) => {\n if (e.dataTransfer.types.includes(\"application/x-fancy-flow-kind\")) {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n }\n },\n onDrop: (e: React.DragEvent) => {\n const name = e.dataTransfer.getData(\"application/x-fancy-flow-kind\");\n if (!name) return;\n e.preventDefault();\n onDrop(name, e);\n },\n };\n}\n","import { getNodeKind } from \"../registry/registry\";\nimport type { FlowGraph, FlowNode } from \"../types\";\n\n/**\n * What a node emits, described well enough for an author to reference it.\n *\n * This is deliberately NOT `outputs` — that is a `PortSpec`, which describes\n * WIRES (port ids and labels). Nothing in the registry described the DATA on\n * those wires, so \"what can I write in this field\" had no answer to derive\n * from. Hence a second, small declaration.\n */\nexport type OutputField = {\n /** Dot-path relative to the emitted value: `text`, `user.email`. */\n path: string;\n type?: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"unknown\";\n description?: string;\n};\n\n/**\n * A kind's output shape — static, or computed from the node's config.\n *\n * The function form is the important one. A `user_input` step emits exactly the\n * field keys its author defined, and a `transform` emits the keys it was told\n * to build; no static list can know either. A static list would have forced\n * every dynamic kind to declare nothing, which is the case an author most needs\n * help with.\n */\nexport type OutputShape<TConfig = Record<string, unknown>> =\n | OutputField[]\n | ((config: TConfig) => OutputField[]);\n\n/** One entry in the variable picker. */\nexport type AvailableVariable = {\n /** Exactly what gets inserted, including the braces. */\n expression: string;\n /** The bare path, for display: `$json.text`. */\n path: string;\n type?: OutputField[\"type\"];\n description?: string;\n /** Label of the upstream node this came from, for disambiguation. */\n source?: string;\n};\n\n/**\n * `$json` and `$input` both alias the `in` port value in the PHP resolver\n * (`Expr::resolvePath`). We suggest ONE of them so the picker does not present\n * the same variable twice under two names; `$json` is the spelling every\n * builtin kind's `example` already uses.\n */\nconst ROOT = \"$json\";\n\nfunction expr(path: string): string {\n return `{{ ${path} }}`;\n}\n\n/** Resolve a kind's output shape for a specific node. */\nexport function outputFieldsFor(node: FlowNode): OutputField[] {\n const kindName = (node.data as { kind?: string } | undefined)?.kind ?? node.type;\n if (!kindName) return [];\n\n const kind = getNodeKind(kindName) as { outputShape?: OutputShape } | undefined;\n const shape = kind?.outputShape;\n if (!shape) return [];\n\n if (typeof shape === \"function\") {\n // A kind computes this from author-supplied config, which is exactly where\n // a throw would be easiest to write and worst to ship — a malformed config\n // would take the whole panel down rather than showing one short list.\n try {\n const config = (node.data as { config?: Record<string, unknown> } | undefined)?.config ?? {};\n return shape(config) ?? [];\n } catch {\n return [];\n }\n }\n return shape;\n}\n\n/**\n * The variables an author can reference from `nodeId`, in this graph.\n *\n * Only the DIRECT predecessors are consulted, because `in` is the value on the\n * incoming wire. Walking further would offer a grandparent's fields, which\n * resolve to `null` at runtime — a suggestion that silently produces nothing is\n * worse than no suggestion, since the author has no reason to doubt it.\n *\n * Always includes the whole input. That one exists no matter what upstream\n * declared, and it is the escape hatch when a kind has no `outputShape` yet.\n */\nexport function baseVariables(): AvailableVariable[] {\n return [\n { expression: expr(ROOT), path: ROOT, type: \"unknown\", description: \"The whole incoming value.\" },\n ];\n}\n\nexport function availableVariables(graph: FlowGraph, nodeId: string): AvailableVariable[] {\n const out: AvailableVariable[] = baseVariables();\n const seen = new Set<string>([ROOT]);\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const upstreamIds = graph.edges.filter((e) => e.target === nodeId).map((e) => e.source);\n\n for (const id of upstreamIds) {\n if (id === nodeId) continue; // a self-edge is not an input shape\n const upstream = byId.get(id);\n if (!upstream) continue;\n\n const kindName = (upstream.data as { kind?: string } | undefined)?.kind ?? upstream.type;\n const label =\n (upstream.data as { label?: string } | undefined)?.label ??\n (kindName ? getNodeKind(kindName)?.label : undefined);\n\n for (const field of outputFieldsFor(upstream)) {\n const path = `${ROOT}.${field.path}`;\n if (seen.has(path)) continue;\n seen.add(path);\n out.push({\n expression: expr(path),\n path,\n type: field.type,\n description: field.description,\n source: label,\n });\n }\n }\n\n return out;\n}\n\n/** One documented form of the expression grammar. */\nexport type ExpressionForm = { syntax: string; meaning: string };\n\nexport type ExpressionGrammarHelp = {\n forms: ExpressionForm[];\n note: string;\n};\n\n/**\n * The reference help shown beside an expression field.\n *\n * Every form here is one `Expr::resolvePath` implements — a dot-path and\n * nothing else. It is tempting to document `{{ a && b }}` or `{{ a + b }}`\n * because they look like expressions; the resolver would return `null` for\n * both, and an author following the help would have no way to tell why.\n */\nexport function describeExpressionGrammar(): ExpressionGrammarHelp {\n return {\n forms: [\n { syntax: \"{{ $json }}\", meaning: \"The whole value arriving on this node's input.\" },\n { syntax: \"{{ $json.field }}\", meaning: \"One key of that value. Dot-paths nest: $json.user.email.\" },\n { syntax: \"{{ $input.field }}\", meaning: \"An alias for $json — the same value, either spelling.\" },\n { syntax: \"{{ in }}\", meaning: \"The input by its context key, rather than through the alias.\" },\n ],\n note:\n \"Dot-paths only — no arithmetic, comparisons or function calls; anything else resolves to nothing. \" +\n \"A field that is exactly one expression keeps the resolved value's type; mixed text interpolates as a string. \" +\n \"fancy-flow's own runFlow does not interpolate: it hands config to your executor verbatim, and the \" +\n \"fancy-flow-php runtime is what resolves these.\",\n };\n}\n","import { useMemo, useRef, useState, type KeyboardEvent } from \"react\";\nimport {\n availableVariables,\n baseVariables,\n describeExpressionGrammar,\n type AvailableVariable,\n} from \"../../expressions/variables\";\nimport type { FlowGraph } from \"../../types\";\n\nexport type ExpressionFieldProps = {\n value: string;\n onChange: (next: string) => void;\n placeholder?: string;\n rows?: number;\n /** The panel's field id + agent handle. */\n handle: { id?: string; \"data-ff-field\": string };\n /**\n * The graph and the node being edited. Both are needed to answer \"what can I\n * write here\" — without them the picker can still offer `{{ $json }}` but\n * nothing node-specific, which is the static list issue #5 asked us not to\n * ship.\n */\n graph?: FlowGraph;\n nodeId?: string;\n};\n\n/** Where the caret sits relative to an unclosed `{{`. */\ntype Trigger = { open: number; query: string } | null;\n\n/**\n * Find the `{{` the caret is currently inside, if any.\n *\n * Scans back from the caret and stops at the first `}}`, so a completed\n * expression earlier in the field does not re-open the picker while the author\n * types ordinary text after it.\n */\nexport function findTrigger(text: string, caret: number): Trigger {\n const before = text.slice(0, caret);\n const open = before.lastIndexOf(\"{{\");\n if (open === -1) return null;\n if (before.indexOf(\"}}\", open) !== -1) return null;\n return { open, query: before.slice(open + 2).trim() };\n}\n\n/** Case-insensitive substring match on the path, which is what an author types. */\nexport function filterVariables(vars: AvailableVariable[], query: string): AvailableVariable[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") return vars;\n return vars.filter((v) => v.path.toLowerCase().includes(q));\n}\n\n/**\n * Replace the open `{{ …` run with a chosen variable.\n *\n * Returns the caret position too: leaving it before the closing braces is the\n * difference between \"insert-on-select\" and \"insert, then hunt for where to\n * carry on typing\".\n */\nexport function applyCompletion(\n text: string,\n caret: number,\n trigger: NonNullable<Trigger>,\n variable: AvailableVariable,\n): { value: string; caret: number } {\n const head = text.slice(0, trigger.open);\n const tail = text.slice(caret);\n return { value: `${head}${variable.expression}${tail}`, caret: head.length + variable.expression.length };\n}\n\n/**\n * ExpressionField — a `{{ }}` field that tells the author what it accepts.\n *\n * Issue #5: the panel rendered a bare textarea with a placeholder and nothing\n * else, so writing an expression required already knowing both the grammar and\n * the exact shape of the upstream node's output. Two affordances close that:\n * typing `{{ ` opens a picker of the variables actually reachable at THIS node,\n * and a reference toggle explains the grammar.\n *\n * The picker deliberately lists only what the resolver can reach — see\n * `availableVariables`. A suggestion that resolves to `null` at runtime is\n * worse than no suggestion, because the author has no reason to doubt it.\n */\nexport function ExpressionField({\n value,\n onChange,\n placeholder,\n rows = 2,\n handle,\n graph,\n nodeId,\n}: ExpressionFieldProps) {\n const ref = useRef<HTMLTextAreaElement>(null);\n const [trigger, setTrigger] = useState<Trigger>(null);\n const [active, setActive] = useState(0);\n const [showHelp, setShowHelp] = useState(false);\n\n // With no graph the picker still opens — `$json` is valid at every node, and\n // an empty menu would read as \"this field takes no variables\".\n const variables = useMemo(\n () => (graph && nodeId ? availableVariables(graph, nodeId) : baseVariables()),\n [graph, nodeId],\n );\n const matches = useMemo(\n () => (trigger ? filterVariables(variables, trigger.query) : []),\n [trigger, variables],\n );\n const help = useMemo(() => describeExpressionGrammar(), []);\n const open = trigger !== null && matches.length > 0;\n\n const sync = (el: HTMLTextAreaElement) => {\n const next = findTrigger(el.value, el.selectionStart ?? el.value.length);\n setTrigger(next);\n setActive(0);\n };\n\n const choose = (variable: AvailableVariable) => {\n const el = ref.current;\n if (!el || !trigger) return;\n const { value: next, caret } = applyCompletion(\n el.value,\n el.selectionStart ?? el.value.length,\n trigger,\n variable,\n );\n onChange(next);\n setTrigger(null);\n // The value round-trips through the parent, so move the caret after React\n // has written it back — otherwise it lands wherever the re-render put it.\n requestAnimationFrame(() => {\n el.focus();\n el.setSelectionRange(caret, caret);\n });\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (!open) return;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive((i) => (i + 1) % matches.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((i) => (i - 1 + matches.length) % matches.length);\n } else if (e.key === \"Enter\" || e.key === \"Tab\") {\n // Enter in a picker means \"take this one\", not \"newline\".\n e.preventDefault();\n choose(matches[active] ?? matches[0]!);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setTrigger(null);\n }\n };\n\n return (\n <div className=\"ff-expression\" data-ff-expression={handle[\"data-ff-field\"]}>\n <textarea\n {...handle}\n ref={ref}\n className=\"ff-panel__input ff-panel__input--expression\"\n rows={rows}\n value={value ?? \"\"}\n placeholder={placeholder ?? \"{{ $json.field }}\"}\n spellCheck={false}\n role=\"combobox\"\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? `${handle.id ?? handle[\"data-ff-field\"]}-vars` : undefined}\n onChange={(e) => {\n onChange(e.target.value);\n sync(e.target);\n }}\n onKeyDown={onKeyDown}\n onClick={(e) => sync(e.currentTarget)}\n onBlur={() => {\n // A click on an option fires blur first; let it land.\n window.setTimeout(() => setTrigger(null), 120);\n }}\n />\n\n <div className=\"ff-expression__bar\">\n <button\n type=\"button\"\n className=\"ff-expression__helpbtn\"\n aria-expanded={showHelp}\n onClick={() => setShowHelp((s) => !s)}\n >\n {\"{{ }}\"} reference\n </button>\n {variables.length > 1 && (\n <span className=\"ff-expression__hint\">\n type <code>{\"{{\"}</code> for {variables.length} variables\n </span>\n )}\n </div>\n\n {open && (\n <ul\n className=\"ff-expression__menu\"\n id={`${handle.id ?? handle[\"data-ff-field\"]}-vars`}\n role=\"listbox\"\n data-ff-expression-menu={handle[\"data-ff-field\"]}\n >\n {matches.map((v, i) => (\n <li key={v.expression} role=\"option\" aria-selected={i === active}>\n <button\n type=\"button\"\n className={`ff-expression__option${i === active ? \" is-active\" : \"\"}`}\n data-ff-expression-option={v.path}\n // `onMouseDown` rather than `onClick`: the textarea's blur would\n // otherwise close the menu before the click resolved.\n onMouseDown={(e) => {\n e.preventDefault();\n choose(v);\n }}\n >\n <code className=\"ff-expression__path\">{v.path}</code>\n {v.source && <span className=\"ff-expression__source\">{v.source}</span>}\n {v.description && <span className=\"ff-expression__desc\">{v.description}</span>}\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {showHelp && (\n <div className=\"ff-expression__help\" role=\"note\" data-ff-expression-help>\n <dl>\n {help.forms.map((f) => (\n <div key={f.syntax}>\n <dt><code>{f.syntax}</code></dt>\n <dd>{f.meaning}</dd>\n </div>\n ))}\n </dl>\n <p className=\"ff-expression__note\">{help.note}</p>\n </div>\n )}\n </div>\n );\n}\n","import { type ReactNode, useMemo, useRef, useState } from \"react\";\nimport { ExpressionField } from \"./ExpressionField\";\nimport type { FlowGraph } from \"../../types\";\nimport type {\n ConfigField,\n KeyValueConfigField,\n RepeaterConfigField,\n TextConfigField,\n} from \"../../registry/types\";\n\n/** What a host renderer is handed. */\nexport type ConfigFieldRenderContext = {\n field: ConfigField;\n value: unknown;\n onChange: (next: unknown) => void;\n /** The id the panel's `<label>` points at. Put it on your control. */\n id?: string;\n};\n\n/**\n * Render one field. Return `null` to fall back to the package's own rendering,\n * so a host can claim a type conditionally instead of reimplementing every case.\n *\n * Named `...Fn` because `ConfigFieldRenderer` is already the component this\n * module exports; two things with one name in a public API is a paper cut a\n * consumer pays for, not us.\n */\nexport type ConfigFieldRenderFn = (ctx: ConfigFieldRenderContext) => ReactNode;\n\nexport type ConfigFieldRendererProps = {\n field: ConfigField;\n value: unknown;\n onChange: (value: unknown) => void;\n /**\n * DOM id for the control this renders.\n *\n * Supplied by the caller rather than generated here so the panel's `<label>`\n * can point at it — a label beside a control is not a label attached to one.\n * Also the agent-facing handle: the Human+ contract asks that every\n * interactive element have a stable identity so an agent targets it instead\n * of guessing at the DOM, and until this existed nothing in the editor had\n * one.\n */\n id?: string;\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Editor for `document` fields. fancy-flow stores the document but never\n * interprets it — the host owns the editing surface, exactly as it does for\n * `credential`. This is the seam for rich human-input steps (authored pages,\n * required reading, multi-section forms) without the package depending on\n * any particular document model.\n */\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Host renderers keyed by field `type`.\n *\n * The generic form of `renderDocumentField` / `renderCredentialField`: those\n * cover two types the package deliberately does not interpret, this covers\n * any type at all — including one the package has never heard of.\n *\n * Without it, a richer field had to be rendered OUTSIDE the panel, so that\n * node's config stopped living where every other field does. An unknown type\n * also fell through to `default:` and rendered nothing, so the schema said the\n * field existed and the panel showed empty space.\n *\n * Consulted BEFORE the built-in switch, so a host can also replace a built-in\n * (react-fancy inputs, say) through the same seam rather than a second one.\n */\n fieldRenderers?: Record<string, ConfigFieldRenderFn>;\n /**\n * The graph and the node being edited — what makes the `{{ }}` picker\n * CONTEXT-aware rather than a static list. Optional: a panel composed without\n * them still renders, it just cannot offer node-specific variables.\n */\n graph?: FlowGraph;\n nodeId?: string;\n};\n\n/**\n * ConfigFieldRenderer — dispatches to the right input element per field type.\n *\n * Plain HTML inputs styled via the package's CSS so the package stays\n * standalone (no react-fancy import required) and every surface stays themeable\n * through the `--ff-*` token layer. Hosts that want react-fancy form components\n * can supply their own field renderers via the kind's `renderPanel`.\n *\n * Each control carries the caller's `id` and a `data-ff-field` handle keyed by\n * the field, so a label can point at it and an agent can find it by name.\n */\nexport function ConfigFieldRenderer({\n field,\n value,\n onChange,\n id,\n renderCredentialField,\n renderDocumentField,\n fieldRenderers,\n graph,\n nodeId,\n}: ConfigFieldRendererProps) {\n /** Applied to whichever control this field renders. */\n const handle = { id, \"data-ff-field\": field.key } as const;\n\n // Host renderers win, and `null` means \"you take it\" — so claiming a type\n // conditionally does not mean reimplementing the rest.\n const custom = fieldRenderers?.[field.type];\n if (custom) {\n const rendered = custom({ field, value, onChange, id });\n if (rendered !== null && rendered !== undefined) return <>{rendered}</>;\n }\n\n switch (field.type) {\n case \"text\": {\n // Declaring `choices` turns a text field into a picker without changing\n // its type or the shape of the value it stores.\n if (field.choices?.length) {\n return <ChoiceField field={field} value={value} onChange={onChange} />;\n }\n return (\n <input\n {...handle}\n className=\"ff-panel__input\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n case \"textarea\":\n return (\n <textarea\n {...handle}\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 {...handle}\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 {...handle}\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 {...handle}\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} handle={handle} />;\n\n case \"expression\":\n return (\n <ExpressionField\n handle={handle}\n value={(value as string) ?? \"\"}\n onChange={onChange}\n placeholder={field.example ?? \"{{ $json.field }}\"}\n graph={graph}\n nodeId={nodeId}\n />\n );\n\n case \"credential\":\n if (renderCredentialField) {\n return <>{renderCredentialField({ credentialType: field.credentialType, value, onChange })}</>;\n }\n return (\n <input\n className=\"ff-panel__input ff-panel__input--credential\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={`Credential reference (${field.credentialType})`}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"repeater\":\n return (\n <RepeaterField\n id={id}\n field={field}\n value={value}\n onChange={onChange}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n fieldRenderers={fieldRenderers}\n graph={graph}\n nodeId={nodeId}\n />\n );\n\n case \"keyvalue\":\n return <KeyValueField id={id} field={field} value={value} onChange={onChange} />;\n\n case \"document\":\n if (renderDocumentField) {\n return <>{renderDocumentField({ documentType: field.documentType, value, onChange })}</>;\n }\n return (\n <p className=\"ff-panel__hint ff-panel__hint--missing\">\n No document editor supplied. Pass <code>renderDocumentField</code> to\n NodeConfigPanel to author this field.\n </p>\n );\n\n default:\n return null;\n }\n}\n\n/** Normalize the `choices` shorthand — a bare string means value === label. */\nexport function normalizeChoices(\n choices: NonNullable<TextConfigField[\"choices\"]>,\n): Array<{ value: string; label: string }> {\n return choices.map((c) =>\n typeof c === \"string\" ? { value: c, label: c } : { value: c.value, label: c.label ?? c.value },\n );\n}\n\n/**\n * ChoiceField — a text field rendered as a select because the kind declared\n * `choices`.\n *\n * A stored value that is no longer among the choices is appended as an option\n * instead of being dropped. Choices are authored data and can change after\n * configs are saved; silently resetting the author's value on render would\n * lose work with no indication it happened.\n */\nfunction ChoiceField({\n field,\n value,\n onChange,\n}: {\n field: TextConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const options = normalizeChoices(field.choices ?? []);\n const current = typeof value === \"string\" ? value : \"\";\n const known = options.some((o) => o.value === current);\n\n return (\n <select\n className=\"ff-panel__input\"\n value={current}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>{field.placeholder ?? \"—\"}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n {current !== \"\" && !known && (\n <option value={current}>{current} (not in list)</option>\n )}\n </select>\n );\n}\n\n/**\n * RepeaterField — editable list of objects, each row driven by the field's\n * own sub-schema. Rows carry stable `data-ff-repeater-row` indices so an\n * agent can target a specific row without guessing DOM.\n */\nfunction RepeaterField({\n id,\n field,\n value,\n onChange,\n graph,\n nodeId,\n renderCredentialField,\n renderDocumentField,\n fieldRenderers,\n}: {\n id?: string;\n field: RepeaterConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n renderCredentialField?: ConfigFieldRendererProps[\"renderCredentialField\"];\n renderDocumentField?: ConfigFieldRendererProps[\"renderDocumentField\"];\n fieldRenderers?: ConfigFieldRendererProps[\"fieldRenderers\"];\n graph?: FlowGraph;\n nodeId?: string;\n}) {\n const rows: Array<Record<string, unknown>> = Array.isArray(value) ? (value as Array<Record<string, unknown>>) : [];\n const max = field.maxItems ?? Infinity;\n const min = field.minItems ?? 0;\n\n const replace = (next: Array<Record<string, unknown>>) => onChange(next);\n\n const addRow = () => {\n const blank: Record<string, unknown> = {};\n for (const f of field.fields) {\n if (\"default\" in f && f.default !== undefined) blank[f.key] = f.default;\n }\n replace([...rows, blank]);\n };\n\n const removeRow = (i: number) => replace(rows.filter((_, idx) => idx !== i));\n\n const moveRow = (i: number, delta: number) => {\n const target = i + delta;\n if (target < 0 || target >= rows.length) return;\n const next = [...rows];\n [next[i], next[target]] = [next[target], next[i]];\n replace(next);\n };\n\n const setCell = (i: number, key: string, cell: unknown) =>\n replace(rows.map((row, idx) => (idx === i ? { ...row, [key]: cell } : row)));\n\n const rowTitle = (row: Record<string, unknown>, i: number): string => {\n const key = field.titleKey ?? field.fields[0]?.key;\n const raw = key ? row[key] : undefined;\n if (typeof raw === \"string\" && raw.trim() !== \"\") return raw;\n if (typeof raw === \"number\" || typeof raw === \"boolean\") return String(raw);\n return `Item ${i + 1}`;\n };\n\n return (\n <div id={id} role=\"group\" className=\"ff-repeater\" data-ff-repeater={field.key} data-ff-field={field.key}>\n {rows.length === 0 && <p className=\"ff-repeater__empty\">None yet.</p>}\n\n {rows.map((row, i) => (\n <div className=\"ff-repeater__row\" key={i} data-ff-repeater-row={i}>\n <div className=\"ff-repeater__row-head\">\n <span className=\"ff-repeater__row-title\">{rowTitle(row, i)}</span>\n <div className=\"ff-repeater__row-actions\">\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, -1)}\n disabled={i === 0}\n aria-label={`Move ${rowTitle(row, i)} up`}\n >↑</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, 1)}\n disabled={i === rows.length - 1}\n aria-label={`Move ${rowTitle(row, i)} down`}\n >↓</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => removeRow(i)}\n disabled={rows.length <= min}\n aria-label={`Remove ${rowTitle(row, i)}`}\n >✕</button>\n </div>\n </div>\n\n {field.fields.map((sub) => (\n <div className=\"ff-repeater__cell\" key={sub.key}>\n <label className=\"ff-panel__label ff-panel__label--sub\">\n {sub.label}\n {sub.required && <span className=\"ff-panel__required\" aria-hidden> *</span>}\n </label>\n <ConfigFieldRenderer\n graph={graph}\n nodeId={nodeId}\n field={sub}\n value={row[sub.key]}\n onChange={(cell) => setCell(i, sub.key, cell)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n fieldRenderers={fieldRenderers}\n />\n </div>\n ))}\n </div>\n ))}\n\n <button\n type=\"button\"\n className=\"ff-repeater__add\"\n onClick={addRow}\n disabled={rows.length >= max}\n >\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\n/**\n * KeyValueField — editable string→string map.\n *\n * Renaming a key preserves insertion order (rebuilding the object rather than\n * delete-then-add), so rows don't jump around while the author is typing.\n */\nfunction KeyValueField({\n id,\n field,\n value,\n onChange,\n}: {\n id?: string;\n field: KeyValueConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const map = (value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {}) as Record<string, string>;\n const entries = Object.entries(map);\n\n const commit = (next: Array<[string, string]>) => {\n const obj: Record<string, string> = {};\n for (const [k, v] of next) {\n if (k === \"\") continue;\n obj[k] = v;\n }\n onChange(obj);\n };\n\n const setKey = (i: number, key: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [key, v] : [k, v])));\n const setVal = (i: number, val: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [k, val] : [k, v])));\n const remove = (i: number) => commit(entries.filter((_, idx) => idx !== i));\n const add = () => commit([...entries, [\"\", \"\"]]);\n\n return (\n <div id={id} role=\"group\" className=\"ff-keyvalue\" data-ff-keyvalue={field.key} data-ff-field={field.key}>\n {entries.length > 0 && (\n <div className=\"ff-keyvalue__head\">\n <span>{field.keyLabel ?? \"Key\"}</span>\n <span>{field.valueLabel ?? \"Value\"}</span>\n <span />\n </div>\n )}\n\n {entries.map(([k, v], i) => (\n <div className=\"ff-keyvalue__row\" key={i} data-ff-keyvalue-row={i}>\n <input\n className=\"ff-panel__input\"\n value={k}\n placeholder={field.keyPlaceholder}\n aria-label={`${field.keyLabel ?? \"Key\"} ${i + 1}`}\n onChange={(e) => setKey(i, e.target.value)}\n />\n {field.valueOptions ? (\n <select\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n >\n <option value=\"\" disabled>—</option>\n {field.valueOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n ) : (\n <input\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n placeholder={field.valuePlaceholder}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n />\n )}\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => remove(i)}\n aria-label={`Remove ${k || `entry ${i + 1}`}`}\n >✕</button>\n </div>\n ))}\n\n <button type=\"button\" className=\"ff-repeater__add\" onClick={add}>\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\n/**\n * JsonField — the built-in fallback for `type: \"json\"`.\n *\n * **It used to eat invalid input.** Parsing happened on blur and the `catch`\n * block was empty save for a comment claiming the visual would revert. It could\n * not: the textarea was uncontrolled, so the broken text stayed on screen while\n * the config silently kept its previous value. The panel showed one document\n * and the node ran another, with nothing anywhere saying so — and a missing\n * comma is not a rare event in an `api_request` body.\n *\n * Now the text is a real buffer, the parse error is reported, and the config is\n * still never written from unparseable text. Refusing to store garbage was\n * right; doing it silently was not.\n *\n * The error appears on blur rather than per keystroke — every partially-typed\n * object is invalid on the way to being valid, and flagging that is noise.\n *\n * Hosts on react-fancy can swap this for a real typed editor by passing\n * `fieldRenderers` from `@particle-academy/fancy-flow/fields/react-fancy`.\n */\nfunction JsonField({\n value,\n onChange,\n rows,\n handle,\n}: {\n value: unknown;\n onChange: (v: unknown) => void;\n rows?: number;\n handle: { id?: string; \"data-ff-field\": string };\n}) {\n const serialized = useMemo(() => {\n try {\n return value === undefined ? \"\" : JSON.stringify(value, null, 2);\n } catch {\n return \"\";\n }\n }, [value]);\n\n const [text, setText] = useState(serialized);\n const [error, setError] = useState<string | null>(null);\n const [touched, setTouched] = useState(false);\n\n // Two refs, because \"the props changed\" and \"our own edit came back\" are\n // different events and only the first should touch the buffer.\n const lastProps = useRef(serialized);\n const committed = useRef<string | null>(null);\n\n // Re-sync on a genuinely EXTERNAL change — an undo, an agent write, another\n // node selected into the same panel.\n //\n // Comparing props against previous props (not against our own last commit) is\n // what keeps this from fighting a host that doesn't apply changes\n // immediately: a debounced or read-only host leaves `value` alone, which used\n // to read as \"reverted externally\" and wiped whatever had just been typed.\n // And skipping when the incoming value is our own commit is what stops the\n // author's `{\"a\":1}` being reformatted onto four lines mid-edit.\n if (serialized !== lastProps.current) {\n lastProps.current = serialized;\n if (serialized !== committed.current) {\n setText(serialized);\n setError(null);\n setTouched(false);\n }\n }\n\n /** Parse and commit; returns the message when it cannot. */\n const commit = (next: string): string | null => {\n const trimmed = next.trim();\n if (trimmed === \"\") {\n committed.current = \"\";\n onChange(undefined);\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed);\n // Record what this commit will serialize to, so recognising it on the way\n // back is an exact string comparison rather than a guess.\n committed.current = JSON.stringify(parsed, null, 2);\n onChange(parsed);\n return null;\n } catch (e) {\n return e instanceof Error ? e.message : \"Invalid JSON\";\n }\n };\n\n const errorId = handle.id ? `${handle.id}-error` : undefined;\n const showError = touched && error !== null;\n\n return (\n <>\n <textarea\n {...handle}\n className=\"ff-panel__input ff-panel__input--json\"\n rows={rows ?? 6}\n value={text}\n spellCheck={false}\n aria-invalid={showError || undefined}\n aria-describedby={showError ? errorId : undefined}\n onChange={(e) => {\n setText(e.target.value);\n setError(commit(e.target.value));\n }}\n onBlur={(e) => {\n setTouched(true);\n setError(commit(e.target.value));\n }}\n />\n {showError && (\n <p className=\"ff-panel__issue ff-panel__issue--field\" id={errorId} role=\"alert\">\n ⚠ {error}\n </p>\n )}\n </>\n );\n}\n","import { type ReactNode, useId, useMemo } from \"react\";\nimport type { FlowNode, FlowGraph} from \"../../types\";\nimport { categoryAccent, getNodeKind, validateConfig } from \"../../registry/registry\";\nimport { getRichInputAdapter } from \"../../registry/rich-input\";\nimport { ConfigFieldRenderer, type ConfigFieldRenderFn } from \"./ConfigFieldRenderer\";\n\nexport type NodeConfigPanelProps = {\n /** Currently-selected node — pass null to render the empty state. */\n node: FlowNode | null;\n /** Called when the user edits the node label, description, or config. */\n onChange: (next: FlowNode) => void;\n /**\n * Called when the user deletes the node from the panel. When provided, the\n * panel renders a \"Delete node\" button while a node is selected — so the\n * delete affordance lives WITH the panel (a dev composing their own editor\n * gets it for free), rather than in a host toolbar it has to re-implement.\n */\n onDelete?: (node: FlowNode) => void;\n /** Label for the delete button. Default \"Delete node\". */\n deleteLabel?: string;\n /** Optional header content (e.g. close button). */\n header?: ReactNode;\n /** Optional credential picker hook — host renders the picker. */\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Optional document editor hook — host renders the editor for `document`\n * fields. Lets rich authored content live in node config without fancy-flow\n * taking on a document model.\n */\n /** Host renderers keyed by field `type`. See {@link ConfigFieldRenderer}. */\n fieldRenderers?: Record<string, ConfigFieldRenderFn>;\n /**\n * The graph the node lives in. Supplying it is what makes the `{{ }}` variable\n * picker context-aware — it reads the UPSTREAM node's declared `outputShape`\n * to list what is actually reachable here (issue #5). Without it the picker\n * still opens, but can only offer the whole input.\n */\n graph?: FlowGraph;\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n className?: string;\n style?: React.CSSProperties;\n};\n\n/**\n * NodeConfigPanel — schema-driven form for the selected node. Defers to\n * `kind.renderPanel` if the kind opts out of the auto-form.\n */\nexport function NodeConfigPanel({\n node,\n onChange,\n onDelete,\n deleteLabel = \"Delete node\",\n header,\n renderCredentialField,\n renderDocumentField,\n fieldRenderers,\n graph,\n className,\n style,\n}: NodeConfigPanelProps) {\n // EVERY hook runs before EVERY early return.\n //\n // The two `useMemo`s below used to sit after the `if (!node)` return, so the\n // panel called no hooks with nothing selected and two with a node — a\n // rules-of-hooks violation that React reports as #310, \"rendered more hooks\n // than during the previous render\". It survived because nothing in this repo\n // could render a component: the vitest config collected only `.test.ts`.\n // Adding a third hook is what finally made it crash on selecting a node.\n //\n // `uid` gives one prefix per mounted panel, so two panels on a page (a split\n // view, a comparison) cannot mint the same id and steal each other's label\n // clicks.\n const uid = useId();\n const kindName = node ? ((node.data as any).kind ?? node.type) : null;\n const kind = useMemo(() => (kindName ? getNodeKind(kindName) : undefined), [kindName]);\n const config = useMemo(\n () => ((node?.data as any)?.config ?? {}) as Record<string, unknown>,\n [node?.data],\n );\n\n /**\n * A stable DOM id for one field's control.\n *\n * The field KEY is in the id rather than an index, so the handle survives\n * reordering the schema, and an agent reading `data-ff-field` finds the same\n * element the label points at.\n */\n const fieldId = (key: string) => `${uid}-${key}`;\n\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 if (!kind) {\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <p className=\"ff-panel__empty\">Unknown kind: {kindName}</p>\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n }\n\n const setLabel = (label: string) =>\n onChange({ ...node, data: { ...node.data, label } });\n\n const setDescription = (description: string) =>\n onChange({ ...node, data: { ...node.data, description } });\n\n const setStatusMsg = (key: \"startingMsg\" | \"stoppingMsg\", value: string) =>\n onChange({ ...node, data: { ...node.data, [key]: value } });\n\n const setConfigValue = (key: string, value: unknown) =>\n onChange({ ...node, data: { ...node.data, config: { ...config, [key]: value } } });\n\n const issues = validateConfig(kind, config);\n\n // An explicit prop wins; otherwise fall back to the rich-input adapter, so a\n // single registerRichInputAdapter() call enables BOTH authoring here and the\n // in-node preview without the host wiring the same editor twice.\n const adapter = getRichInputAdapter();\n const documentField = renderDocumentField\n ?? (adapter?.renderEditor\n ? ({ value, onChange: set }: { value: unknown; onChange: (n: unknown) => void }) =>\n adapter.renderEditor!({ value, onChange: set })\n : undefined);\n\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <header className=\"ff-panel__header\">\n <span className=\"ff-panel__head-icon\" style={{ background: kind.accent ?? categoryAccent(kind.category) }} aria-hidden>\n {kind.icon}\n </span>\n <span className=\"ff-panel__head-text\">\n <span className=\"ff-panel__head-kind\">{kind.label}</span>\n <span className=\"ff-panel__head-name\">{node.data.label || kind.label}</span>\n </span>\n </header>\n {kind.description && <p className=\"ff-panel__kind-desc\">{kind.description}</p>}\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(\"label\")}>Label</label>\n <input\n id={fieldId(\"label\")}\n data-ff-field=\"label\"\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\" htmlFor={fieldId(\"description\")}>Description</label>\n <textarea\n id={fieldId(\"description\")}\n data-ff-field=\"description\"\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 {/* Run narration. Node-level and kind-agnostic, so it sits with label and\n description rather than in the kind's configSchema — any node can\n announce itself, and no kind should have to opt in to be allowed to.\n Left blank on most nodes by design: narrating every step buries the\n two or three a person actually follows. */}\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(\"startingMsg\")}>Message when it starts</label>\n <input\n id={fieldId(\"startingMsg\")}\n data-ff-field=\"startingMsg\"\n className=\"ff-panel__input\"\n value={(node.data.startingMsg as string) ?? \"\"}\n onChange={(e) => setStatusMsg(\"startingMsg\", e.target.value)}\n placeholder=\"e.g. Starting the deep analysis\"\n />\n <p className=\"ff-panel__hint\">Announced just before this node runs. Leave blank to say nothing.</p>\n </div>\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(\"stoppingMsg\")}>Message when it finishes</label>\n <input\n id={fieldId(\"stoppingMsg\")}\n data-ff-field=\"stoppingMsg\"\n className=\"ff-panel__input\"\n value={(node.data.stoppingMsg as string) ?? \"\"}\n onChange={(e) => setStatusMsg(\"stoppingMsg\", e.target.value)}\n placeholder=\"e.g. Analysis complete\"\n />\n <p className=\"ff-panel__hint\">Announced only if the node succeeds — never after a failure.</p>\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\" htmlFor={fieldId(field.key)}>\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 id={fieldId(field.key)}\n field={field}\n value={config[field.key]}\n onChange={(v) => setConfigValue(field.key, v)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={documentField}\n fieldRenderers={fieldRenderers}\n graph={graph}\n nodeId={node.id}\n />\n </div>\n ))}\n </>\n )}\n\n {issues.length > 0 && (\n <div className=\"ff-panel__issues\">\n {issues.map((iss) => (\n <p key={iss.key} className=\"ff-panel__issue\">⚠ {iss.message}</p>\n ))}\n </div>\n )}\n\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type FlowRunControlsProps = {\n running: boolean;\n onRun: () => void;\n onCancel?: () => void;\n onReset?: () => void;\n className?: string;\n style?: CSSProperties;\n};\n\n/** FlowRunControls — Run / Cancel / Reset buttons. Wire to a `useFlowRun`. */\nexport function FlowRunControls({ running, onRun, onCancel, onReset, className, style }: FlowRunControlsProps) {\n return (\n <div className={[\"ff-run-controls\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {!running ? (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--run\" onClick={onRun}>\n ▶ Run\n </button>\n ) : (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--cancel\" onClick={onCancel}>\n ⏹ Cancel\n </button>\n )}\n {onReset && (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--reset\" onClick={onReset} disabled={running}>\n Reset\n </button>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useRef } from \"react\";\nimport type { FlowRunFeedEntry } from \"../runtime/use-flow-run\";\n\nexport type FlowRunFeedProps = {\n entries: FlowRunFeedEntry[];\n /** Show the header bar (title + running badge + event count). Default true. */\n showHeader?: boolean;\n /** Header title. Default \"Run feed\". */\n title?: string;\n /** When true, a \"running\" badge shows in the header. */\n running?: boolean;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowRunFeed — scrolling run log with a header (title + live event count).\n * Auto-scrolls its body to the bottom on new entries.\n */\nexport function FlowRunFeed({ entries, showHeader = true, title = \"Run feed\", running, className, style }: FlowRunFeedProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = scrollRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }, [entries.length]);\n\n return (\n <div className={[\"ff-run-feed\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {showHeader && (\n <div className=\"ff-run-feed__header\">\n <span className=\"ff-run-feed__title\" aria-hidden>▸</span>\n <span className=\"ff-run-feed__title-text\">{title}</span>\n {running && <span className=\"ff-run-feed__badge\">running</span>}\n <span className=\"ff-run-feed__count\">{entries.length} {entries.length === 1 ? \"event\" : \"events\"}</span>\n </div>\n )}\n <div className=\"ff-run-feed__body\" ref={scrollRef}>\n {entries.length === 0 ? (\n <p className=\"ff-run-feed__empty\">No run events yet.</p>\n ) : (\n entries.map((e) => (\n <div key={e.id} className={`ff-run-feed__row ff-run-feed__row--${e.level}`}>\n <span className=\"ff-run-feed__time\">{formatTime(e.at)}</span>\n {e.nodeId && <span className=\"ff-run-feed__node\">{e.nodeId}</span>}\n <span className=\"ff-run-feed__text\">{e.text}</span>\n </div>\n ))\n )}\n </div>\n </div>\n );\n}\n\nfunction formatTime(at: number): string {\n const d = new Date(at);\n return `${d.getMinutes().toString().padStart(2, \"0\")}:${d.getSeconds().toString().padStart(2, \"0\")}.${Math.floor(d.getMilliseconds() / 100)}`;\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { HumanField, HumanFieldType } from \"./human-fields\";\n\n/** What a host renderer is handed for one field. */\nexport type HumanFieldRenderContext = {\n field: HumanField;\n /** The id the field's `<label>` points at — put it on your control. */\n id: string;\n value: unknown;\n onChange: (v: unknown) => void;\n /** Present only on the first field; attach it so the modal autofocuses. */\n autoFocusRef?: React.RefObject<HTMLElement | null>;\n};\n\n/**\n * Render one field, or return `null` to decline it.\n *\n * `null` means \"not mine\" and falls through to the built-in control. That is\n * what makes a PARTIAL map safe to spread: a host handing over someone else's\n * renderers does not silently lose every type that map does not cover.\n */\nexport type HumanFieldRenderFn = (ctx: HumanFieldRenderContext) => ReactNode | null;\n\n/**\n * Host overrides for pause-form controls, keyed by CANONICAL field type\n * (`\"switch\"`, not `\"boolean\"` — aliases are normalised before the lookup, so\n * one entry covers every spelling of that type).\n *\n * The built-ins are deliberately native `--ff-*`-themed elements rather than\n * react-fancy primitives: react-fancy is an OPTIONAL peer and this modal ships\n * in the main entry, so importing it here would break a standalone install and\n * bypass the token layer a host themes `.ff-editor` with. This seam is how a\n * host that HAS react-fancy gets Fancy controls anyway —\n * `@particle-academy/fancy-flow/fields/react-fancy` exports a ready map.\n */\nexport type HumanFieldRenderers = Partial<Record<HumanFieldType, HumanFieldRenderFn>>;\n\n/** What the modal was asked to collect — a form, or a yes/no decision. */\nexport type HumanPromptRequest =\n | { kind: \"input\"; title: string; submitLabel?: string; fields: HumanField[]; resolve: (values: Record<string, unknown>) => void }\n | { kind: \"approval\"; title: string; description?: string; resolve: (approved: boolean) => void };\n\nexport {\n humanInputFields,\n humanFieldType,\n humanFieldOptions,\n HUMAN_FIELD_TYPE_ALIASES,\n type HumanField,\n type HumanFieldType,\n type HumanFieldOption,\n} from \"./human-fields\";\n\n/** The `<input type>` each canonical field renders with. */\nconst INPUT_TYPE: Partial<Record<HumanFieldType, string>> = {\n text: \"text\",\n number: \"number\",\n date: \"date\",\n datetime: \"datetime-local\",\n time: \"time\",\n email: \"email\",\n url: \"url\",\n tel: \"tel\",\n password: \"password\",\n};\n\n/**\n * The value a field starts on, in the type the field will resolve in.\n *\n * A switch starts `false` rather than `\"\"` so the submitted value is a boolean\n * whether or not the person touched it — a form that returns `\"\"` for an\n * untouched checkbox and `true` for a touched one hands the next node two\n * different types for the same field.\n */\nfunction initialValues(fields: HumanField[]): Record<string, unknown> {\n const v: Record<string, unknown> = {};\n for (const f of fields) {\n if (f.type === \"switch\") {\n v[f.key] = !!f.default;\n } else if (f.type === \"number\") {\n v[f.key] = typeof f.default === \"number\" ? f.default : f.default === undefined || f.default === \"\" ? \"\" : Number(f.default);\n } else {\n v[f.key] = f.default ?? \"\";\n }\n }\n return v;\n}\n\n/**\n * The in-editor human-input modal. When a run reaches a `user_input` or\n * `human_approval` node, FlowEditor's default executor opens this and BLOCKS the\n * run (the executor returns a Promise) until the person submits — the same\n * async-executor pattern the headless engine already supports. A host that\n * passes its own `user_input` / `human_approval` executor overrides this.\n *\n * ## Why the controls are native elements and not react-fancy primitives\n *\n * Same reason the config panel's are, and it is a hard constraint rather than a\n * preference: `@particle-academy/react-fancy` is an OPTIONAL peer of this\n * package (`peerDependenciesMeta`) and is listed `external` in `tsup.config.ts`.\n * This file ships in the main `.` entry, so importing react-fancy here would\n * make a standalone `npm install @particle-academy/fancy-flow` fail to resolve\n * at import time — and it would break the `--ff-*` token layer a host overrides\n * on `.ff-editor`, because react-fancy's primitives are hardcoded Tailwind\n * palette classes that read no custom properties. See the docblock on\n * `src/fields/react-fancy.tsx` and the one on `tests/panel-labels.test.tsx`.\n *\n * A host that wants react-fancy controls here already has the seam: pass its\n * own `user_input` executor to `<FlowEditor executors={…}>` and render whatever\n * it likes. Host executors are spread last, so they win.\n */\n\nexport function HumanPrompt({\n request,\n onCancel,\n fieldRenderers,\n}: {\n request: HumanPromptRequest;\n onCancel: () => void;\n fieldRenderers?: HumanFieldRenderers;\n}) {\n const firstRef = useRef<HTMLElement | null>(null);\n useEffect(() => {\n firstRef.current?.focus();\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") onCancel(); };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n return (\n <div className=\"ff-prompt-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label={request.title}>\n <div className=\"ff-prompt\" onClick={(e) => e.stopPropagation()}>\n <div className=\"ff-prompt__title\">{request.title}</div>\n {request.kind === \"approval\" ? (\n <ApprovalBody request={request} onCancel={onCancel} />\n ) : (\n <InputBody request={request} onCancel={onCancel} firstRef={firstRef} fieldRenderers={fieldRenderers} />\n )}\n </div>\n </div>\n );\n}\n\nfunction ApprovalBody({ request, onCancel }: { request: Extract<HumanPromptRequest, { kind: \"approval\" }>; onCancel: () => void }) {\n return (\n <>\n {request.description && <p className=\"ff-prompt__desc\">{request.description}</p>}\n <div className=\"ff-prompt__actions\">\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--ghost\" onClick={onCancel}>Cancel</button>\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--danger\" onClick={() => request.resolve(false)}>Deny</button>\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--primary\" onClick={() => request.resolve(true)}>Approve</button>\n </div>\n </>\n );\n}\n\nfunction InputBody({\n request,\n onCancel,\n firstRef,\n fieldRenderers,\n}: {\n request: Extract<HumanPromptRequest, { kind: \"input\" }>;\n onCancel: () => void;\n firstRef: React.RefObject<HTMLElement | null>;\n fieldRenderers?: HumanFieldRenderers;\n}) {\n const [values, setValues] = useState<Record<string, unknown>>(() => initialValues(request.fields));\n const set = (k: string, v: unknown) => setValues((prev) => ({ ...prev, [k]: v }));\n\n // Ids are scoped to this modal instance so two prompts on one page — a split\n // view, a comparison — never share an id and make one label focus the other's\n // control. Keyed by the FIELD, not its position, so an agent that stored\n // `data-ff-field=\"email\"` still finds it after the schema is reordered.\n const uid = useId();\n const fieldId = (key: string) => `${uid}-${key}`;\n\n const missing = request.fields.filter((f) => f.required && (values[f.key] === undefined || values[f.key] === \"\"));\n const submit = () => { if (missing.length === 0) request.resolve(values); };\n\n return (\n <form\n onSubmit={(e) => { e.preventDefault(); submit(); }}\n onKeyDown={(e) => { if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); submit(); } }}\n >\n <div className=\"ff-prompt__fields\">\n {request.fields.map((f, i) => (\n <div key={f.key} className=\"ff-prompt__field\">\n <label className=\"ff-prompt__label\" htmlFor={fieldId(f.key)}>\n {f.label ?? f.key}\n {/* aria-hidden so the field is announced \"Email\", not \"Email star\". */}\n {f.required && <span className=\"ff-prompt__req\" aria-hidden=\"true\"> *</span>}\n </label>\n <FieldControl\n field={f}\n id={fieldId(f.key)}\n value={values[f.key]}\n onChange={(v) => set(f.key, v)}\n autoFocusRef={i === 0 ? firstRef : undefined}\n renderers={fieldRenderers}\n />\n </div>\n ))}\n </div>\n <div className=\"ff-prompt__actions\">\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--ghost\" onClick={onCancel}>Cancel</button>\n <button type=\"submit\" className=\"ff-prompt__btn ff-prompt__btn--primary\" disabled={missing.length > 0}>\n {request.submitLabel || \"Continue\"}\n </button>\n </div>\n </form>\n );\n}\n\n/**\n * One control, chosen by the field's canonical type.\n *\n * Every branch is controlled (`value` + `onChange`) and carries the same two\n * handles — the `id` its label points at, and `data-ff-field` keyed by the\n * field — because this modal is a Human+ surface an agent drives through an\n * MCP bridge rather than by guessing at the DOM.\n */\nfunction FieldControl({\n field,\n id,\n value,\n onChange,\n autoFocusRef,\n renderers,\n}: {\n field: HumanField;\n id: string;\n value: unknown;\n onChange: (v: unknown) => void;\n autoFocusRef?: React.RefObject<HTMLElement | null>;\n renderers?: HumanFieldRenderers;\n}) {\n // A host override wins, but only if it actually renders something. `null`\n // is the documented way to decline a field, so a partial map falls through\n // to the built-in below instead of leaving an empty row where a control\n // belongs -- which would read as a rendering bug rather than a seam working.\n const override = renderers?.[field.type ?? \"text\"];\n if (override) {\n const rendered = override({ field, id, value, onChange, autoFocusRef });\n if (rendered !== null && rendered !== undefined) return <>{rendered}</>;\n }\n\n const handle = { id, \"data-ff-field\": field.key } as const;\n\n if (field.type === \"textarea\") {\n return (\n <textarea\n {...handle}\n className=\"ff-prompt__input\"\n placeholder={field.placeholder}\n ref={autoFocusRef as React.RefObject<HTMLTextAreaElement> | undefined}\n rows={3}\n value={String(value ?? \"\")}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n if (field.type === \"switch\") {\n return (\n <input\n {...handle}\n type=\"checkbox\"\n className=\"ff-prompt__switch\"\n ref={autoFocusRef as React.RefObject<HTMLInputElement> | undefined}\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n }\n\n if (field.type === \"select\") {\n // A select stays a select even with nothing to choose. Falling through to a\n // text box — which is what used to happen — hid the authoring mistake AND\n // collected an unconstrained string for a field whose whole point is that\n // the downstream node gets one of a fixed set.\n const options = field.options ?? [];\n return (\n <select\n {...handle}\n className=\"ff-prompt__input\"\n ref={autoFocusRef as React.RefObject<HTMLSelectElement> | undefined}\n value={String(value ?? \"\")}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>{options.length ? \"Choose…\" : \"No choices configured\"}</option>\n {options.map((o) => <option key={o.value} value={o.value}>{o.label}</option>)}\n </select>\n );\n }\n\n return (\n <input\n {...handle}\n className=\"ff-prompt__input\"\n placeholder={field.placeholder}\n ref={autoFocusRef as React.RefObject<HTMLInputElement> | undefined}\n type={INPUT_TYPE[field.type ?? \"text\"] ?? \"text\"}\n value={String(value ?? \"\")}\n onChange={(e) =>\n onChange(field.type === \"number\" ? (e.target.value === \"\" ? \"\" : Number(e.target.value)) : e.target.value)\n }\n />\n );\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type ComponentProps,\n} from \"react\";\nimport {\n ReactFlowProvider,\n useReactFlow,\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n type Connection,\n type Edge,\n type NodeMouseHandler,\n} from \"@xyflow/react\";\nimport type { UseFlowStateReturn } from \"../../runtime/use-flow-state\";\nimport { FlowCanvas, type FlowCanvasProps } from \"../canvas/FlowCanvas\";\nimport { NodePalette, paletteDropHandlers } from \"../NodePalette\";\nimport { NodeConfigPanel } from \"../NodeConfigPanel\";\nimport { FlowRunControls } from \"../FlowRunControls\";\nimport { FlowRunFeed } from \"../FlowRunFeed\";\nimport { useFlowState } from \"../../runtime/use-flow-state\";\nimport { useFlowHistory } from \"../../runtime/use-flow-history\";\nimport { useFlowRun, applyStatusesToNodes, applyOutputsToNodes } from \"../../runtime/use-flow-run\";\nimport { exportWorkflow, importWorkflow, workflowToBlob, type WorkflowMetadata, type WorkflowSchema } from \"../../schema\";\nimport { buildNodeTypes, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged } from \"../../registry\";\nimport type { ExecutorRegistry, FlowGraph, FlowNode } from \"../../types\";\nimport {\n duplicateNode as cloneNode,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n assignToLane as assignToLaneOp,\n removeFromLane as removeFromLaneOp,\n removeEdges,\n removeNodes,\n setEdgeLabel,\n type AlignEdge,\n} from \"./graph-ops\";\nimport {\n FlowEditorProvider,\n type FlowEditorAction,\n type FlowEditorApi,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n} from \"./api\";\nimport {\n HumanPrompt,\n humanInputFields,\n type HumanFieldRenderers,\n type HumanPromptRequest,\n} from \"./HumanPrompt\";\n\nexport type FlowEditorProps = {\n initial?: FlowGraph;\n /** Controlled mode — host owns the graph state. When set, takes precedence\n * over `initial`. Pair with `onChange` to receive edits. */\n value?: FlowGraph;\n /** Executor registry passed to runFlow. Each kind name maps to an executor. */\n executors?: ExecutorRegistry;\n /**\n * Host controls for the `user_input` / `human_approval` pause form, keyed by\n * canonical field type. A renderer returning `null` declines that field and\n * falls through to the built-in, so a PARTIAL map is safe to spread.\n *\n * The built-ins are native `--ff-*`-themed elements because react-fancy is an\n * OPTIONAL peer and this component ships in the main entry. A host that has\n * react-fancy opts into its primitives with\n * `humanFieldRenderers` from `@particle-academy/fancy-flow/fields/react-fancy`.\n */\n humanFieldRenderers?: HumanFieldRenderers;\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 /**\n * Host renderers for config-field types, keyed by `type`, handed straight to\n * `NodeConfigPanel`.\n *\n * Use it to claim a type the package renders plainly — the built-in `json`\n * field is a bare textarea, and\n * `@particle-academy/fancy-flow/fields/react-fancy` swaps it for a real typed\n * editor — or to supply one the package has never heard of.\n *\n * This forwarding is the whole point: the seam existed on `NodeConfigPanel`\n * and had no route through `FlowEditor`, so reaching it meant abandoning the\n * editor and composing one by hand.\n */\n fieldRenderers?: ComponentProps<typeof NodeConfigPanel>[\"fieldRenderers\"];\n /** Show run feed below the canvas. Default true. */\n showFeed?: boolean;\n /** Total editor height. Default 720. */\n height?: number;\n /** Extra toolbar content, appended after the built-ins. Prefer `actions`\n * (declarative + agent-emittable); this stays for back-compat. */\n extraToolbar?: ReactNode;\n /** Declarative custom toolbar buttons. */\n actions?: FlowEditorAction[];\n /** Turn built-in toolbar affordances off individually. */\n builtins?: FlowEditorBuiltins;\n /** Replace whole regions of the editor. */\n slots?: FlowEditorSlots;\n /** Forwarded to `<FlowCanvas>` / React Flow — snapToGrid, minimap, context\n * menus, edge types, and anything else xyflow accepts. */\n canvasProps?: Partial<Omit<FlowCanvasProps, \"nodes\" | \"edges\">>;\n /** Called whenever the graph changes — host can persist. */\n onChange?: (graph: FlowGraph) => void;\n /** Called when the selected node changes. */\n onSelectionChange?: (node: FlowNode | null) => void;\n /** Called after nodes are deleted, with the deleted ids. */\n onDelete?: (ids: string[]) => void;\n /** Called after connections are broken, with the deleted edge ids. */\n onEdgeDelete?: (ids: string[]) => void;\n /**\n * Stage destructive edits for human confirmation. When set, every delete path\n * — keyboard, panel, context menu, and `api.deleteNodes`/`deleteEdges` —\n * calls this first; return false to veto. Default: delete immediately. This\n * realizes the component contract's \"agents propose, humans confirm\" on the\n * canvas.\n */\n confirmDelete?: (targets: { nodes: FlowNode[]; edges: Edge[] }) => boolean | Promise<boolean>;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowEditor — batteries-included workflow editor, but not a black box.\n *\n * Defaults compose NodePalette + FlowCanvas + NodeConfigPanel + run controls +\n * feed. Every part is replaceable: pass `actions` for custom toolbar buttons,\n * `slots` to swap a whole region, `canvasProps` to reach React Flow, or grab\n * the {@link FlowEditorApi} from `ref` / `useFlowEditor()` and build your own\n * chrome around the primitives.\n */\nexport const FlowEditor = forwardRef<FlowEditorApi, FlowEditorProps>(function FlowEditor(props, ref) {\n return (\n <ReactFlowProvider>\n <div\n className={[\"ff-editor\", props.className ?? \"\"].filter(Boolean).join(\" \")}\n style={{ height: props.height ?? 720, ...props.style }}\n >\n <FlowEditorInner {...props} apiRef={ref} />\n </div>\n </ReactFlowProvider>\n );\n});\n\nfunction FlowEditorInner({\n initial = { nodes: [], edges: [] },\n value,\n executors = {},\n metadata,\n showPalette = true,\n showPanel = true,\n fieldRenderers,\n showFeed = true,\n extraToolbar,\n actions = [],\n builtins = {},\n slots = {},\n canvasProps = {},\n onChange,\n onSelectionChange,\n onDelete,\n onEdgeDelete,\n confirmDelete,\n humanFieldRenderers,\n apiRef,\n}: FlowEditorProps & { apiRef?: React.ForwardedRef<FlowEditorApi> }) {\n const internal = useFlowState(initial);\n const runner = useFlowRun();\n const rf = useReactFlow();\n\n // In-editor human-input: when a run reaches a `user_input` / `human_approval`\n // node, open a modal and BLOCK the run until the person submits. These are\n // DEFAULT executors — a host that passes its own `user_input` / `human_approval`\n // executor overrides them (host executors are spread last below).\n const [prompt, setPrompt] = useState<HumanPromptRequest | null>(null);\n const humanExecutors = useMemo<ExecutorRegistry>(\n () => ({\n user_input: ({ node }) =>\n new Promise((resolve) => {\n const cfg = (((node as any).data?.config ?? {}) as Record<string, unknown>);\n setPrompt({\n kind: \"input\",\n title: (typeof cfg.title === \"string\" && cfg.title) || \"Your input\",\n submitLabel: typeof cfg.submitLabel === \"string\" ? cfg.submitLabel : undefined,\n fields: humanInputFields(cfg),\n resolve: (values) => { setPrompt(null); resolve(values); },\n });\n }),\n human_approval: ({ node }) =>\n new Promise((resolve) => {\n const cfg = (((node as any).data?.config ?? {}) as Record<string, unknown>);\n setPrompt({\n kind: \"approval\",\n title: (typeof cfg.title === \"string\" && cfg.title) || \"Approve action\",\n description: typeof cfg.description === \"string\" ? cfg.description : undefined,\n resolve: (approved) => { setPrompt(null); resolve({ branch: approved ? \"approved\" : \"denied\" }); },\n });\n }),\n }),\n [],\n );\n const runExecutors = useMemo(() => ({ ...humanExecutors, ...executors }), [humanExecutors, executors]);\n // Close the modal if the run ends (finished or cancelled) while it's open.\n useEffect(() => {\n if (!runner.running) setPrompt(null);\n }, [runner.running]);\n\n // When `value` is provided we run in controlled mode: host owns nodes/edges,\n // local edits go through onChange. Internal state is unused but the hook\n // still has to run (rules of hooks).\n const controlled = value !== undefined;\n const baseFlow = controlled ? makeControlledFlowAdapter(value!, onChange) : internal;\n // Wrap the sink with the commit/undo pipeline — one interception point for\n // every committing mutation, whichever mode we're in.\n const hist = useFlowHistory(baseFlow);\n const flow = hist.flow;\n\n // Re-render when registry kinds change so the palette + nodeTypes reflect it.\n const [, force] = useState(0);\n useEffect(() => onNodeKindsChanged(() => force((n) => n + 1)), []);\n const nodeTypes = useMemo(() => buildNodeTypes(), [listNodeKinds().length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const renderedNodes = useMemo(\n () =>\n applyOutputsToNodes(\n applyStatusesToNodes(flow.nodes, runner.statuses, runner.statusText),\n runner.outputs,\n ),\n [flow.nodes, runner.statuses, runner.statusText, runner.outputs],\n );\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const selected = useMemo(() => flow.nodes.find((n) => n.id === selectedId) ?? null, [flow.nodes, selectedId]);\n\n useEffect(() => onSelectionChange?.(selected), [selected, onSelectionChange]);\n\n const [selectedEdgeId, setSelectedEdgeId] = useState<string | null>(null);\n const selectedEdge = useMemo(\n () => flow.edges.find((e: Edge) => e.id === selectedEdgeId) ?? null,\n [flow.edges, selectedEdgeId],\n );\n\n const handleNodeClick: NodeMouseHandler = (_e, node) => {\n setSelectedId(node.id);\n // Node and edge selection are mutually exclusive, so Delete is never\n // ambiguous about what it would remove.\n setSelectedEdgeId(null);\n };\n\n // Right-click menu, for a node OR a connection. Anchored in viewport coords\n // (position: fixed), so it is not clipped by the canvas' overflow.\n const [menu, setMenu] = useState<\n { x: number; y: number; target: { type: \"node\" | \"edge\"; id: string } } | null\n >(null);\n // Inline \"label this connection\" editor, anchored like the menu.\n const [labelEdit, setLabelEdit] = useState<{ x: number; y: number; edgeId: string } | null>(null);\n\n const closeMenu = useCallback(() => setMenu(null), []);\n\n const handleNodeContextMenu: NodeMouseHandler = (event, node) => {\n event.preventDefault();\n setSelectedId(node.id);\n setSelectedEdgeId(null);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"node\", id: node.id } });\n };\n\n const handleEdgeClick = (_e: React.MouseEvent, edge: Edge) => {\n setSelectedEdgeId(edge.id);\n };\n\n const handleEdgeContextMenu = (event: React.MouseEvent, edge: Edge) => {\n event.preventDefault();\n setSelectedEdgeId(edge.id);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"edge\", id: edge.id } });\n };\n\n // Dismiss on any outside click, scroll, or Escape.\n useEffect(() => {\n if (menu === null && labelEdit === null) return;\n const close = () => { setMenu(null); setLabelEdit(null); };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && close();\n window.addEventListener(\"click\", close);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n window.removeEventListener(\"click\", close);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [menu, labelEdit]);\n\n // Editor keyboard shortcuts. Ignored while a field is focused, so Ctrl+Z does\n // native text-undo inside inputs/textareas rather than reverting the graph.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n hist.undo();\n } else if ((key === \"z\" && e.shiftKey) || key === \"y\") {\n e.preventDefault();\n hist.redo();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [hist]);\n\n // Uncontrolled: notify host on every graph mutation. Controlled mode\n // already notifies via the adapter on each setNodes/setEdges call.\n useEffect(() => {\n if (!controlled) onChange?.({ nodes: flow.nodes, edges: flow.edges });\n }, [flow.nodes, flow.edges, onChange, controlled]);\n\n const addNode = useCallback(\n (kindName: string, position?: { x: number; y: number }): string | null => {\n const kind = getNodeKind(kindName);\n if (!kind) return null;\n const at = position ?? { x: 80, y: 80 };\n const id = newNodeId();\n flow.setNodes((all: FlowNode[]) => [\n ...all,\n {\n id,\n type: kind.name,\n position: at,\n data: { kind: kind.name, label: kind.label, config: defaultConfigFor(kind) } as any,\n } as FlowNode,\n ]);\n setSelectedId(id);\n return id;\n },\n [flow],\n );\n\n /** Delete nodes AND every edge attached to them — an orphaned edge would\n * otherwise survive the node it connected. */\n const deleteNodes = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.nodes.filter((n) => ids.includes(n.id));\n if (targets.length === 0) return;\n if (confirmDelete) {\n const attached = flow.edges.filter((e: Edge) => ids.includes(e.source) || ids.includes(e.target));\n if (!(await confirmDelete({ nodes: targets, edges: attached }))) return;\n }\n const doomed = new Set(ids);\n // Atomic: prune edges + remove nodes in ONE commit — one undo step, and\n // correct in controlled mode where two sequential writes would clobber.\n flow.setGraph(removeNodes({ nodes: flow.nodes, edges: flow.edges }, ids));\n setSelectedId((cur) => (cur !== null && doomed.has(cur) ? null : cur));\n onDelete?.(ids);\n },\n [flow, onDelete, confirmDelete],\n );\n\n const deleteEdges = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.edges.filter((e: Edge) => ids.includes(e.id));\n if (targets.length === 0) return;\n if (confirmDelete && !(await confirmDelete({ nodes: [], edges: targets }))) return;\n flow.setEdges((all: Edge[]) => removeEdges(all, ids));\n setSelectedEdgeId((cur) => (cur !== null && ids.includes(cur) ? null : cur));\n onEdgeDelete?.(ids);\n },\n [flow, onEdgeDelete, confirmDelete],\n );\n\n // ── Multi-selection + clipboard (Release 2) ──\n // xyflow owns the real multi-selection (box / shift-click) on `node.selected`;\n // we read it rather than tracking a parallel list.\n const selectedNodes = useMemo(() => flow.nodes.filter((n) => n.selected), [flow.nodes]);\n const selectedIds = useMemo(() => selectedNodes.map((n) => n.id), [selectedNodes]);\n\n const clipboard = useRef<FlowGraph | null>(null);\n\n const copySelection = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const edges = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n clipboard.current = { nodes: sel.map((n) => ({ ...n })), edges: edges.map((e) => ({ ...e })) };\n }, [flow]);\n\n const pasteClipboard = useCallback(\n (at?: { x: number; y: number }) => {\n const clip = clipboard.current;\n if (!clip || clip.nodes.length === 0) return;\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(clip.nodes, clip.edges, { makeId: newNodeId, offset: 40 });\n let placed = clones;\n if (at) {\n const minX = Math.min(...clones.map((n) => n.position.x));\n const minY = Math.min(...clones.map((n) => n.position.y));\n placed = clones.map((n) => ({ ...n, position: { x: n.position.x - minX + at.x, y: n.position.y - minY + at.y } }));\n }\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...placed.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n },\n [flow],\n );\n\n const duplicateSelected = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const internal = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(sel, internal, { makeId: newNodeId, offset: 40 });\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...clones.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n }, [flow]);\n\n const alignSelected = useCallback(\n (edge: AlignEdge) => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 2) return;\n const byId = new Map(alignNodes(sel, edge).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const distributeSelected = useCallback(\n (axis: \"h\" | \"v\") => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 3) return;\n const byId = new Map(distributeNodes(sel, axis).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const onReconnect = useCallback(\n (oldEdge: Edge, conn: Connection) => flow.setEdges((eds: Edge[]) => reconnectEdge(eds, oldEdge, conn)),\n [flow],\n );\n\n // ── Swimlanes (Release 4) ──\n const isLaneNode = useCallback(\n (n: FlowNode) => getNodeKind((n.data as any)?.kind ?? n.type)?.category === \"layout\",\n [],\n );\n\n const addLane = useCallback(\n (orientation: \"horizontal\" | \"vertical\" = \"horizontal\", title?: string): string => {\n const vertical = orientation === \"vertical\";\n const lanes = flow.nodes.filter(isLaneNode);\n const w = vertical ? 280 : 680;\n const h = vertical ? 480 : 168;\n const end = lanes.reduce(\n (m, l) =>\n Math.max(m, vertical ? l.position.x + ((l as any).width ?? w) : l.position.y + ((l as any).height ?? h)),\n 0,\n );\n const id = newNodeId();\n const name = title ?? `Lane ${lanes.length + 1}`;\n const node = {\n id,\n type: \"@particle-academy/lane\",\n position: vertical ? { x: lanes.length ? end + 12 : 0, y: 0 } : { x: 0, y: lanes.length ? end + 12 : 0 },\n width: w,\n height: h,\n data: { kind: \"@particle-academy/lane\", label: name, config: { title: name, orientation } } as any,\n } as FlowNode;\n flow.setNodes((all: FlowNode[]) => [...all, node]);\n setSelectedId(id);\n return id;\n },\n [flow, isLaneNode],\n );\n\n // Drop a node onto a lane to file it there; drag it out to unfile it.\n const handleNodeDragStop = useCallback(\n (_e: MouseEvent | TouchEvent, node: FlowNode) => {\n if (isLaneNode(node)) return; // v1: lanes don't nest inside lanes\n const overLane = rf.getIntersectingNodes(node).find((n) => isLaneNode(n as FlowNode));\n const currentParent = (node as any).parentId as string | undefined;\n if (overLane && overLane.id !== currentParent) {\n flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, node.id, overLane.id));\n } else if (!overLane && currentParent) {\n flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, node.id));\n }\n },\n [rf, flow, isLaneNode],\n );\n\n // Clipboard + duplicate shortcuts. (Undo/redo live in the effect above.)\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"c\") copySelection();\n else if (key === \"x\") {\n e.preventDefault();\n copySelection();\n deleteNodes(selectedIds);\n } else if (key === \"v\") {\n e.preventDefault();\n pasteClipboard();\n } else if (key === \"d\") {\n e.preventDefault();\n duplicateSelected();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [copySelection, pasteClipboard, duplicateSelected, deleteNodes, selectedIds]);\n\n const api: FlowEditorApi = useMemo(() => {\n const toWorkflow = () => exportWorkflow({ nodes: flow.nodes, edges: flow.edges }, metadata);\n\n return {\n graph: { nodes: flow.nodes, edges: flow.edges },\n nodes: flow.nodes,\n edges: flow.edges,\n selectedId,\n selected,\n selectedEdgeId,\n selectedEdge,\n selectedIds,\n selectedNodes,\n running: runner.running,\n statuses: runner.statuses,\n\n select: setSelectedId,\n selectEdge: setSelectedEdgeId,\n\n addNode,\n updateNode: (next) => flow.setNodes((all: FlowNode[]) => all.map((x) => (x.id === next.id ? next : x))),\n deleteNodes,\n deleteSelected: () => deleteNodes(selectedId ? [selectedId] : []),\n deleteEdges,\n deleteSelectedEdge: () => deleteEdges(selectedEdgeId ? [selectedEdgeId] : []),\n setEdgeLabel: (id, label) => flow.setEdges((all: Edge[]) => setEdgeLabel(all, id, label)),\n duplicateNode: (id) => {\n const src = flow.nodes.find((n) => n.id === id);\n if (!src) return null;\n const copy = cloneNode(src, newNodeId());\n flow.setNodes((all: FlowNode[]) => [...all, copy]);\n setSelectedId(copy.id);\n return copy.id;\n },\n setGraph: (graph) => flow.setGraph(graph),\n\n duplicateSelected,\n alignSelected,\n distributeSelected,\n copy: copySelection,\n cut: () => {\n copySelection();\n deleteNodes(selectedIds);\n },\n paste: pasteClipboard,\n\n addLane,\n assignToLane: (nodeId, laneId) => flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, nodeId, laneId)),\n removeFromLane: (nodeId) => flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, nodeId)),\n // dagre is loaded lazily so it stays out of the eager bundle — consumers\n // who never tidy pay nothing for it.\n autoLayout: (opts) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, opts), edges: flow.edges }),\n );\n },\n tidyLane: (laneId) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, { scope: laneId }), edges: flow.edges }),\n );\n },\n\n run: () => runner.run({ nodes: flow.nodes, edges: flow.edges }, runExecutors),\n cancel: runner.cancel,\n reset: runner.reset,\n\n toWorkflow,\n exportWorkflow: () => downloadWorkflow(toWorkflow(), metadata),\n importWorkflow: () => pickWorkflow((graph) => flow.setGraph(graph)),\n\n fitView: () => rf.fitView({ padding: 0.2 }),\n\n undo: hist.undo,\n redo: hist.redo,\n canUndo: hist.canUndo,\n canRedo: hist.canRedo,\n };\n }, [flow, selectedId, selected, selectedEdgeId, selectedEdge, selectedIds, selectedNodes, runner, runExecutors, metadata, addNode, deleteNodes, deleteEdges, duplicateSelected, alignSelected, distributeSelected, copySelection, pasteClipboard, addLane, hist, rf]);\n\n useImperativeHandle(apiRef, () => api, [api]);\n\n const dropHandlers = paletteDropHandlers((kindName, evt) => {\n const point = rf.screenToFlowPosition({ x: evt.clientX, y: evt.clientY });\n addNode(kindName, { x: point.x - 100, y: point.y - 30 });\n });\n\n const startActions = actions.filter((a) => a.placement === \"start\");\n const endActions = actions.filter((a) => a.placement !== \"start\");\n\n const toolbar = slots.toolbar ? (\n slots.toolbar(api)\n ) : (\n <>\n {startActions.map((a) => renderAction(a, api))}\n {builtins.run !== false && (\n <FlowRunControls running={api.running} onRun={api.run} onCancel={api.cancel} onReset={api.reset} />\n )}\n {builtins.history !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button\n className=\"ff-editor__btn\"\n data-action=\"undo\"\n title=\"Undo (Ctrl+Z)\"\n disabled={!api.canUndo}\n onClick={api.undo}\n >\n ↶ Undo\n </button>\n <button\n className=\"ff-editor__btn\"\n data-action=\"redo\"\n title=\"Redo (Ctrl+Shift+Z)\"\n disabled={!api.canRedo}\n onClick={api.redo}\n >\n ↷ Redo\n </button>\n </>\n )}\n {builtins.addLane !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button className=\"ff-editor__btn\" data-action=\"add-lane\" title=\"Add a swimlane\" onClick={() => api.addLane()}>\n ▤ Lane\n </button>\n </>\n )}\n {builtins.autoLayout !== false && (\n <button className=\"ff-editor__btn\" data-action=\"auto-layout\" title=\"Tidy — auto-arrange\" onClick={() => api.autoLayout()}>\n ⤢ Tidy\n </button>\n )}\n {(builtins.export !== false || builtins.import !== false) && (\n <span className=\"ff-editor__sep\" />\n )}\n {/* Node deletion is not a toolbar button — it lives in NodeConfigPanel\n (see below), so the affordance is a property of the reusable panel\n rather than duplicated chrome that drifts. Keyboard Del/Backspace and\n the right-click menu still delete. `builtins.delete` gates the panel\n button. */}\n {builtins.export !== false && (\n <button className=\"ff-editor__btn\" data-action=\"export\" onClick={api.exportWorkflow}>↓ Export</button>\n )}\n {builtins.import !== false && (\n <button className=\"ff-editor__btn\" data-action=\"import\" onClick={api.importWorkflow}>↑ Import</button>\n )}\n {endActions.map((a) => renderAction(a, api))}\n {extraToolbar}\n {builtins.count !== false && (\n <span className=\"ff-editor__count\">{api.nodes.length} nodes · {api.edges.length} edges</span>\n )}\n </>\n );\n\n return (\n <FlowEditorProvider value={api}>\n {showPalette && (slots.palette ? slots.palette(api) : <NodePalette className=\"ff-editor__palette\" />)}\n <div className=\"ff-editor__main\" {...dropHandlers}>\n <FlowCanvas\n nodes={renderedNodes}\n edges={flow.edges}\n nodeTypes={nodeTypes}\n onNodesChange={flow.onNodesChange}\n onEdgesChange={flow.onEdgesChange}\n onConnect={flow.onConnect}\n // Drag an edge endpoint to rewire it; the new endpoint is validated by\n // the same isValidConnection rule (G2), so a bad reconnect is refused.\n onReconnect={onReconnect}\n edgesReconnectable\n // Snapshot the pre-drag graph once so a drag is a single undo step.\n onNodeDragStart={hist.onNodeDragStart}\n // Drop a node onto a lane to file it there (or drag it out to unfile).\n onNodeDragStop={handleNodeDragStop}\n onNodeClick={handleNodeClick}\n onNodeContextMenu={builtins.contextMenu === false ? undefined : handleNodeContextMenu}\n onEdgeClick={handleEdgeClick}\n onEdgeContextMenu={builtins.edgeContextMenu === false ? undefined : handleEdgeContextMenu}\n onEdgesDelete={(deleted: Edge[]) => onEdgeDelete?.(deleted.map((e) => e.id))}\n onNodesDelete={(deleted) => onDelete?.(deleted.map((n) => n.id))}\n // Stage the native (keyboard) delete path when a confirm gate is wired.\n onBeforeDelete={\n confirmDelete\n ? async ({ nodes, edges }) => confirmDelete({ nodes: nodes as FlowNode[], edges })\n : undefined\n }\n // Both keys delete, so muscle memory from either platform works.\n deleteKeyCode={[\"Delete\", \"Backspace\"]}\n height=\"100%\"\n toolbar={toolbar}\n {...canvasProps}\n />\n {slots.empty && api.nodes.length === 0 && (\n <div className=\"ff-editor__empty\">{slots.empty(api)}</div>\n )}\n {menu?.target.type === \"node\" && builtins.contextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n // Keep the outside-click listener from closing us before the click lands.\n onClick={(e) => e.stopPropagation()}\n >\n {slots.contextMenu ? (\n slots.contextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-duplicate\"\n onClick={() => { api.duplicateNode(menu.target.id); closeMenu(); }}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-delete\"\n onClick={() => { api.deleteNodes([menu.target.id]); closeMenu(); }}\n >\n Delete\n </button>\n </>\n )}\n </div>\n )}\n\n {menu?.target.type === \"edge\" && builtins.edgeContextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n onClick={(e) => e.stopPropagation()}\n >\n {slots.edgeContextMenu ? (\n slots.edgeContextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-edge-label\"\n onClick={() => {\n setLabelEdit({ x: menu.x, y: menu.y, edgeId: menu.target.id });\n setMenu(null);\n }}\n >\n Label…\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-edge-delete\"\n onClick={() => { api.deleteEdges([menu.target.id]); closeMenu(); }}\n >\n Delete connection\n </button>\n </>\n )}\n </div>\n )}\n\n {labelEdit !== null && (\n <EdgeLabelEditor\n x={labelEdit.x}\n y={labelEdit.y}\n initial={\n (flow.edges.find((e: Edge) => e.id === labelEdit.edgeId)?.label as string | undefined) ?? \"\"\n }\n onCommit={(text) => {\n api.setEdgeLabel(labelEdit.edgeId, text);\n setLabelEdit(null);\n }}\n onCancel={() => setLabelEdit(null)}\n />\n )}\n {showFeed &&\n (slots.feed ? slots.feed(api) : <FlowRunFeed entries={runner.feed} running={api.running} className=\"ff-editor__feed\" />)}\n {prompt && (\n <HumanPrompt\n request={prompt}\n onCancel={() => { setPrompt(null); runner.cancel(); }}\n fieldRenderers={humanFieldRenderers}\n />\n )}\n </div>\n {showPanel &&\n (slots.panel ? (\n slots.panel(api)\n ) : (\n <div className=\"ff-editor__panel-wrap\">\n <NodeConfigPanel\n className=\"ff-editor__panel\"\n node={api.selected}\n onChange={api.updateNode}\n fieldRenderers={fieldRenderers}\n // The editor already holds the graph; passing it is what turns the\n // {{ }} picker from a static list into a context-aware one.\n graph={flow}\n // The delete affordance lives IN the panel (one source of truth),\n // not a private FlowEditor toolbar button — so a dev composing\n // their own editor from NodeConfigPanel gets it for free.\n onDelete={builtins.delete === false ? undefined : (n) => api.deleteNodes([n.id])}\n />\n {slots.panelFooter && <div className=\"ff-editor__panel-footer\">{slots.panelFooter(api)}</div>}\n </div>\n ))}\n </FlowEditorProvider>\n );\n}\n\nfunction renderAction(action: FlowEditorAction, api: FlowEditorApi) {\n if (action.visible && !action.visible(api)) return null;\n const disabled = action.disabled ? action.disabled(api) : action.requiresSelection === true && api.selected === null;\n return (\n <button\n key={action.id}\n className=\"ff-editor__btn\"\n data-action={action.id}\n title={action.title}\n disabled={disabled}\n onClick={() => action.onSelect(api)}\n >\n {action.label}\n </button>\n );\n}\n\nfunction newNodeId(): string {\n return `n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n}\n\nfunction downloadWorkflow(schema: WorkflowSchema, metadata?: WorkflowMetadata) {\n const url = URL.createObjectURL(workflowToBlob(schema));\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${metadata?.id ?? \"workflow\"}.json`;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nfunction pickWorkflow(onLoad: (graph: FlowGraph) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"application/json\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const result = importWorkflow(JSON.parse(await file.text()), { lenient: true });\n onLoad(result.graph);\n } catch (e) {\n console.error(\"import failed\", e);\n }\n };\n input.click();\n}\n\n/**\n * Build a UseFlowStateReturn-shaped adapter that proxies through to the\n * host's onChange. Edits route through onChange; reads come from `value`.\n */\nfunction makeControlledFlowAdapter(\n value: FlowGraph,\n onChange?: (graph: FlowGraph) => void,\n): UseFlowStateReturn {\n const apply = (next: FlowGraph) => onChange?.(next);\n return {\n nodes: value.nodes,\n edges: value.edges,\n setNodes: (next) => {\n const nextNodes = typeof next === \"function\" ? (next as any)(value.nodes) : next;\n apply({ nodes: nextNodes, edges: value.edges });\n },\n setEdges: (next) => {\n const nextEdges = typeof next === \"function\" ? (next as any)(value.edges) : next;\n apply({ nodes: value.nodes, edges: nextEdges });\n },\n // Atomic both-at-once commit — the reason this exists (see UseFlowStateReturn).\n setGraph: (graph) => apply(graph),\n onNodesChange: (changes) => {\n apply({ nodes: applyNodeChanges(changes, value.nodes) as any, edges: value.edges });\n },\n onEdgesChange: (changes) => {\n apply({ nodes: value.nodes, edges: applyEdgeChanges(changes, value.edges) });\n },\n onConnect: (connection: Connection) => {\n apply({ nodes: value.nodes, edges: addEdge(connection, value.edges) as Edge[] });\n },\n toGraph: () => value,\n };\n}\n\n/**\n * EdgeLabelEditor — small popover for naming a connection.\n *\n * Anchored in viewport coords like the context menu it replaces. Enter\n * commits, Escape cancels, blur commits (so clicking away doesn't silently\n * discard the edit).\n */\nfunction EdgeLabelEditor({\n x,\n y,\n initial,\n onCommit,\n onCancel,\n}: {\n x: number;\n y: number;\n initial: string;\n onCommit: (text: string) => void;\n onCancel: () => void;\n}) {\n const [text, setText] = useState(initial);\n const ref = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n return (\n <div\n className=\"ff-editor__ctx ff-editor__edge-label\"\n style={{ top: y, left: x }}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n ref={ref}\n className=\"ff-panel__input\"\n value={text}\n placeholder=\"Label this connection\"\n aria-label=\"Connection label\"\n data-action=\"edge-label-input\"\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n // Stop the canvas seeing these — Backspace would delete the edge\n // out from under the editor.\n e.stopPropagation();\n if (e.key === \"Enter\") onCommit(text);\n if (e.key === \"Escape\") onCancel();\n }}\n onBlur={() => onCommit(text)}\n />\n </div>\n );\n}\n","/**\n * Authoring API for custom node kinds. The point of this file is to keep\n * consumers from importing @xyflow/react directly when they write a node —\n * they get `defineNode` + `<NodePort>` from us, and we hold the seam.\n *\n * Internal node code (NodeShell, RegistryNode, FlowCanvas) still imports\n * from @xyflow/react directly. The hiding is only for the public authoring\n * surface.\n */\nimport { memo, type ComponentType, type CSSProperties, type ReactNode } from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\n\n/**\n * Subset of NodeProps that the typical node author cares about. Strips the\n * react-flow-specific surface (xPos, yPos, dragging, zIndex, isConnectable,\n * targetPosition, sourcePosition, etc.) — if you need any of that you can\n * still import directly, but you usually don't.\n */\nexport interface FlowNodeRenderProps<TData = unknown> {\n id: string;\n data: TData;\n selected: boolean;\n}\n\n/**\n * Wraps a render function as a memoized node component compatible with the\n * underlying flow engine.\n *\n * const MyNode = defineNode<MyData>(({ data, selected }) => (\n * <div>\n * <NodePort side=\"left\" type=\"target\" />\n * <span>{data.label}</span>\n * <NodePort side=\"right\" type=\"source\" />\n * </div>\n * ));\n */\nexport function defineNode<TData = unknown>(\n render: (props: FlowNodeRenderProps<TData>) => ReactNode,\n): ComponentType<NodeProps<FlowNode>> {\n function Wrapped(props: NodeProps<FlowNode>) {\n return render({\n id: props.id,\n data: props.data as TData,\n selected: Boolean(props.selected),\n });\n }\n Wrapped.displayName = \"FancyFlowNode\";\n return memo(Wrapped);\n}\n\nexport type NodePortSide = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport type NodePortType = \"source\" | \"target\";\n\nconst POSITION_MAP: Record<NodePortSide, Position> = {\n left: Position.Left,\n right: Position.Right,\n top: Position.Top,\n bottom: Position.Bottom,\n};\n\nexport interface NodePortProps {\n /** Which edge of the node the port docks on. */\n side: NodePortSide;\n /** Direction of data flow. `source` emits; `target` receives. */\n type: NodePortType;\n /** Stable id — required when a node has multiple ports on the same side. */\n id?: string;\n style?: CSSProperties;\n title?: string;\n className?: string;\n}\n\n/**\n * Connection handle. Render one per port; the flow engine wires edges to\n * matching `id`s on the source and target nodes.\n *\n * <NodePort side=\"left\" type=\"target\" id=\"in\" />\n * <NodePort side=\"right\" type=\"source\" id=\"ok\" title=\"success\" />\n * <NodePort side=\"right\" type=\"source\" id=\"err\" title=\"error\" style={{ top: '70%' }} />\n */\nexport function NodePort({ side, type, id, style, title, className }: NodePortProps) {\n return (\n <Handle\n position={POSITION_MAP[side]}\n type={type}\n id={id}\n style={style}\n title={title}\n className={className}\n />\n );\n}\n","import type { LiveContract } from \"@particle-academy/fancy-query\";\n\n/**\n * The fancy-flow Live Contract — the run / job stream shape.\n *\n * Pure data, with `LiveContract` imported as a TYPE, so this adds no dependency.\n * `FancyFlow\\Laravel\\LiveContract` declares the identical list and both sides\n * assert parity.\n *\n * ## What makes this shape different\n *\n * A run emits far more than it stores. `NodeStatusChanged` and `NodeOutput`\n * fire per node, many times a second on a wide graph — and a node's log line is\n * not a cache entry, it is a **stream**. So the contract covers the run's\n * DURABLE state (does this run exist, has it finished, is it waiting on a\n * person) and deliberately leaves per-node chatter to `useFancyStream`, the\n * same split the whiteboard makes between its document and its cursors.\n *\n * Get that wrong and a 40-node run invalidates the run list forty times while\n * it executes, each one a re-fetch that tells the UI nothing it did not already\n * learn from the stream.\n *\n * ## `awaiting` is the one that matters\n *\n * A run parking on a human step is the event a host most needs to react to —\n * it is when a form has to appear in front of somebody. It gets its own event\n * rather than folding into `updated`, so a host can subscribe to just that.\n *\n * ## Broadcast status, stated plainly\n *\n * `fancy-flow-php` currently dispatches these as **in-process Laravel events**;\n * none of them implement `ShouldBroadcast` yet. This contract is therefore the\n * agreed vocabulary rather than a description of traffic already on the wire: a\n * host that wants live runs today re-broadcasts these under these names. Making\n * the PHP events broadcast natively is a separate change, because it turns on\n * websocket traffic for every consumer.\n */\nexport const flowLive = {\n namespace: \"flow\",\n events: [\n { event: \"flow.run.created\", keys: [[\"flow\", \"runs\"]] },\n { event: \"flow.run.updated\", keys: [[\"flow\", \"runs\"]] },\n { event: \"flow.run.completed\", keys: [[\"flow\", \"runs\"]] },\n {\n event: \"flow.run.awaiting\",\n keys: [[\"flow\", \"runs\"]],\n note: \"A run parking on a human step — the moment a form has to appear in front of somebody. Its own event so a host can subscribe to just that, rather than filtering every update.\",\n },\n {\n event: \"flow.run.failed\",\n keys: [[\"flow\", \"runs\"]],\n note: \"Not one of the standard verbs: a failed run is a terminal state a host renders differently from a completed one, so collapsing the two would lose the distinction.\",\n },\n ],\n} as const satisfies LiveContract;\n\n/**\n * Per-run keys, for a host showing a single run rather than the list.\n *\n * The contract declares prefixes because it is static data and a run id is not\n * known until runtime. TanStack matches by prefix, so `[\"flow\", \"runs\"]` still\n * invalidates `[\"flow\", \"runs\", runId]`.\n */\nexport const flowKeys = {\n runs: () => [\"flow\", \"runs\"] as const,\n run: (runId: string) => [\"flow\", \"runs\", runId] as const,\n} as const;\n","// Public surface for @particle-academy/fancy-flow.\n\n// Register the built-in agentic kit. The registry ALSO ensures this itself on\n// first use, so a consumer importing a subpath (or only types) still gets the\n// kit -- this call just makes it eager for the common root import. Hosts can\n// replace individual kinds via re-registration after it fires.\nimport { ensureBuiltinKinds } from \"./registry/registry\";\nensureBuiltinKinds();\n\n// Editor\nexport { FlowCanvas, type FlowCanvasProps } from \"./components/canvas\";\nexport {\n FlowEditor,\n useFlowEditor,\n useFlowEditorOptional,\n type FlowEditorProps,\n type FlowEditorApi,\n type FlowEditorAction,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n type AlignEdge,\n} from \"./components/FlowEditor\";\nexport { NodePalette, paletteDropHandlers, type NodePaletteProps } from \"./components/NodePalette\";\nexport {\n FlowViewer,\n type FlowViewerProps,\n type FlowViewerClassNames,\n type FlowNodeStatus,\n} from \"./components/FlowViewer\";\nexport {\n NodeConfigPanel,\n ConfigFieldRenderer,\n type ConfigFieldRenderFn,\n type ConfigFieldRenderContext,\n type NodeConfigPanelProps,\n type ConfigFieldRendererProps,\n} from \"./components/NodeConfigPanel\";\n\n// Legacy 6-pack (kept for backwards compat with v0.1; new work uses the registry)\nexport {\n TriggerNode,\n ActionNode,\n DecisionNode,\n OutputNode,\n NoteNode,\n SubgraphNode,\n LaneNode,\n NodeShell,\n defaultNodeTypes,\n type NodeShellProps,\n} from \"./components/nodes\";\n\n// Authoring API for custom node kinds — defineNode + NodePort. Consumers\n// who write their own nodes use these instead of importing @xyflow/react,\n// which keeps the underlying engine swappable and avoids react-flow types\n// leaking into application code.\nexport {\n defineNode,\n NodePort,\n type FlowNodeRenderProps,\n type NodePortProps,\n type NodePortSide,\n type NodePortType,\n} from \"./components/nodes/api\";\n\nexport { FlowRunControls, type FlowRunControlsProps } from \"./components/FlowRunControls\";\nexport { FlowRunFeed, type FlowRunFeedProps } from \"./components/FlowRunFeed\";\n\n// Registry (also: fancy-flow/registry)\nexport {\n registerNodeKind,\n overrideNodeKind,\n clearNodeKindOverrides,\n type NodeKindPresentation,\n getNodeKind,\n listNodeKinds,\n onNodeKindsChanged,\n defaultConfigFor,\n validateConfig,\n categoryAccent,\n buildNodeTypes,\n RegistryNode,\n registerBuiltinKinds,\n ensureBuiltinKinds,\n BUILTIN_KINDS,\n resolvePortSpec,\n resolveNodePorts,\n createConnectionValidator,\n defaultPortCompatibility,\n ANY_PORT_TYPE,\n type PortCompatibility,\n type ConnectionValidatorOptions,\n registerRichInputAdapter,\n getRichInputAdapter,\n isRichInputEnabled,\n onRichInputAdapterChanged,\n RichInputPreview,\n type RichInputAdapter,\n type NodeKindDefinition,\n type EmitsRelation,\n type NodeCategory,\n type ConfigField,\n type RepeaterConfigField,\n type RepeaterRowField,\n type KeyValueConfigField,\n type DocumentConfigField,\n type PortSpec,\n type RenderBodyContext,\n pauseForHuman,\n encodePause,\n decodePause,\n isPause,\n PAUSE_PREFIX,\n LEGACY_PAUSE_PREFIXES,\n type PauseAwaiting,\n type PauseSignal,\n} from \"./registry\";\n\n// Schema (also: fancy-flow/schema)\nexport {\n exportWorkflow,\n importWorkflow,\n migrateSchema,\n workflowToBlob,\n WORKFLOW_SCHEMA_VERSION,\n WORKFLOW_SCHEMA_URL,\n type WorkflowSchema,\n type WorkflowSchemaNode,\n type WorkflowSchemaEdge,\n type WorkflowMetadata,\n type ImportIssue,\n type ImportResult,\n type ImportOptions,\n} from \"./schema\";\n\n// Runtime (also: fancy-flow/runtime)\nexport {\n runFlow,\n runCohort,\n useFlowRun,\n useFlowState,\n useFlowHistory,\n createHistory,\n applyStatusesToNodes,\n applyOutputsToNodes,\n type RunOptions,\n type RunResult,\n type CohortGuard,\n type CohortOptions,\n type CohortPolicy,\n type CohortResult,\n type UseFlowRunReturn,\n type UseFlowRunOptions,\n type UseFlowStateReturn,\n type UseFlowHistoryReturn,\n type HistoryController,\n type FlowRunFeedEntry,\n} from \"./runtime\";\n\n// Auto-layout types (the value `autoLayout` lives on the `fancy-flow/layout`\n// subpath so dagre stays out of the eager bundle; it's also on `api.autoLayout`).\nexport type { AutoLayoutOptions, AutoLayoutDirection } from \"./layout\";\n\n// Domain types\nexport type {\n FlowNode,\n FlowEdge,\n FlowGraph,\n FlowNodeData,\n FlowNodeKind,\n TriggerNodeData,\n ActionNodeData,\n DecisionNodeData,\n OutputNodeData,\n NoteNodeData,\n SubgraphNodeData,\n BaseNodeData,\n PortDescriptor,\n NodeRunStatus,\n NodeExecutor,\n ExecutorRegistry,\n RunEvent,\n} from \"./types\";\n\nexport { flowLive, flowKeys } from \"./live\";\n\n// Expression authoring — what an author can write in a `{{ }}` field at a given\n// node, and the reference help that explains the grammar (issue #5).\nexport {\n availableVariables,\n baseVariables,\n describeExpressionGrammar,\n outputFieldsFor,\n} from \"./expressions/variables\";\nexport type {\n AvailableVariable,\n ExpressionForm,\n ExpressionGrammarHelp,\n OutputField,\n OutputShape,\n} from \"./expressions/variables\";\nexport { ExpressionField } from \"./components/NodeConfigPanel/ExpressionField\";\nexport type { ExpressionFieldProps } from \"./components/NodeConfigPanel/ExpressionField\";\n\n// `{{ }}` resolution — the TypeScript twin of fancy-flow-php's `Expr`.\n//\n// OPT-IN: `runFlow` does not call these. It hands config to your executor\n// verbatim, and every host using `{{ }}` today already resolves it itself, so\n// resolving inside the runtime would interpolate a second time over values\n// those hosts had already substituted. Call it yourself where you want it.\nexport {\n evaluateExpression,\n evaluateConfig,\n resolvePath,\n tryResolvePath,\n UnresolvedPathError,\n truthy,\n text,\n} from \"./expressions/expr\";\nexport type {\n ExprContext,\n ExprValue,\n EvaluateOptions,\n Resolution,\n UnresolvedPolicy,\n} from \"./expressions/expr\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/NodePalette/NodePalette.tsx","../src/expressions/variables.ts","../src/components/NodeConfigPanel/ExpressionField.tsx","../src/components/NodeConfigPanel/ConfigFieldRenderer.tsx","../src/components/NodeConfigPanel/NodeConfigPanel.tsx","../src/components/FlowRunControls.tsx","../src/components/FlowRunFeed.tsx","../src/components/FlowEditor/HumanPrompt.tsx","../src/components/FlowEditor/FlowEditor.tsx","../src/components/nodes/api.tsx","../src/live.ts","../src/index.ts"],"names":["text","useState","useMemo","jsxs","jsx","useRef","Fragment","useEffect","useId","FlowEditor","internal"],"mappings":"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","file":"index.js","sourcesContent":["import { type CSSProperties, useEffect, useMemo, useState } from \"react\";\nimport { categoryAccent, listNodeKinds, onNodeKindsChanged } from \"../../registry/registry\";\nimport type { NodeCategory, NodeKindDefinition } from \"../../registry/types\";\n\nexport type NodePaletteProps = {\n /** Filter to only these categories. */\n categories?: NodeCategory[];\n /** Called when the user clicks a kind (in addition to drag). Optional. */\n onPick?: (kind: NodeKindDefinition) => void;\n className?: string;\n style?: CSSProperties;\n};\n\nconst CATEGORY_ORDER: NodeCategory[] = [\"trigger\", \"logic\", \"data\", \"ai\", \"io\", \"human\", \"output\", \"layout\", \"annotation\", \"custom\"];\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n trigger: \"Triggers\",\n logic: \"Logic\",\n data: \"Data\",\n ai: \"AI\",\n io: \"Connectors\",\n human: \"Human\",\n output: \"Output\",\n layout: \"Layout\",\n annotation: \"Notes\",\n custom: \"Custom\",\n};\n\n/**\n * NodePalette — sidebar listing every registered node kind, grouped by\n * category. Drag a kind onto a `<FlowCanvas>` to add a new node — set\n * `onDrop` on the canvas to handle the drop with the kind name from the\n * `application/x-fancy-flow-kind` data type.\n */\nexport function NodePalette({ categories, onPick, className, style }: NodePaletteProps) {\n const [, setRev] = useState(0);\n useEffect(() => onNodeKindsChanged(() => setRev((n) => n + 1)), []);\n\n const [query, setQuery] = useState(\"\");\n const visibleCats = categories ?? CATEGORY_ORDER;\n\n const grouped = useMemo(() => {\n const all = listNodeKinds();\n const q = query.trim().toLowerCase();\n const filtered = q\n ? all.filter((k) => k.name.includes(q) || k.label.toLowerCase().includes(q) || (k.description ?? \"\").toLowerCase().includes(q))\n : all;\n const map = new Map<NodeCategory, NodeKindDefinition[]>();\n for (const cat of visibleCats) map.set(cat, []);\n for (const k of filtered) {\n if (!map.has(k.category)) map.set(k.category, []);\n map.get(k.category)!.push(k);\n }\n return map;\n }, [query, visibleCats]);\n\n return (\n <aside className={[\"ff-palette\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n <div className=\"ff-palette__search\">\n <input\n className=\"ff-palette__search-input\"\n placeholder=\"Search nodes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n <div className=\"ff-palette__list\">\n {Array.from(grouped.entries()).map(([cat, kinds]) =>\n kinds.length === 0 ? null : (\n <section key={cat} className=\"ff-palette__group\">\n <header className=\"ff-palette__group-label\">{CATEGORY_LABELS[cat] ?? cat}</header>\n {kinds.map((k) => (\n <KindRow key={k.name} kind={k} onPick={onPick} />\n ))}\n </section>\n ),\n )}\n </div>\n </aside>\n );\n}\n\nfunction KindRow({ kind, onPick }: { kind: NodeKindDefinition; onPick?: (k: NodeKindDefinition) => void }) {\n const accent = kind.accent ?? categoryAccent(kind.category);\n const onDragStart = (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/x-fancy-flow-kind\", kind.name);\n // Setting both lets non-aware drop targets (e.g. text inputs) ignore it cleanly.\n e.dataTransfer.setData(\"text/plain\", kind.name);\n };\n return (\n <button\n type=\"button\"\n className=\"ff-palette__row\"\n draggable\n onDragStart={onDragStart}\n onClick={() => onPick?.(kind)}\n title={kind.description ?? kind.name}\n >\n <span className=\"ff-palette__row-dot\" style={{ background: accent }}>{kind.icon ?? \"\"}</span>\n <span className=\"ff-palette__row-text\">\n <span className=\"ff-palette__row-label\">{kind.label}</span>\n {kind.description && <span className=\"ff-palette__row-desc\">{kind.description}</span>}\n </span>\n </button>\n );\n}\n\n/**\n * useDropFromPalette — wires the canvas drop target. Returns the drop /\n * dragOver handlers; they parse the dragged kind name and call `onDrop`\n * with `(kindName, position)` in viewport coords.\n */\nexport function paletteDropHandlers(onDrop: (kindName: string, evt: React.DragEvent) => void) {\n return {\n onDragOver: (e: React.DragEvent) => {\n if (e.dataTransfer.types.includes(\"application/x-fancy-flow-kind\")) {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n }\n },\n onDrop: (e: React.DragEvent) => {\n const name = e.dataTransfer.getData(\"application/x-fancy-flow-kind\");\n if (!name) return;\n e.preventDefault();\n onDrop(name, e);\n },\n };\n}\n","import { getNodeKind } from \"../registry/registry\";\nimport type { FlowGraph, FlowNode } from \"../types\";\n\n/**\n * What a node emits, described well enough for an author to reference it.\n *\n * This is deliberately NOT `outputs` — that is a `PortSpec`, which describes\n * WIRES (port ids and labels). Nothing in the registry described the DATA on\n * those wires, so \"what can I write in this field\" had no answer to derive\n * from. Hence a second, small declaration.\n */\nexport type OutputField = {\n /** Dot-path relative to the emitted value: `text`, `user.email`. */\n path: string;\n type?: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"unknown\";\n description?: string;\n};\n\n/**\n * A kind's output shape — static, or computed from the node's config.\n *\n * The function form is the important one. A `user_input` step emits exactly the\n * field keys its author defined, and a `transform` emits the keys it was told\n * to build; no static list can know either. A static list would have forced\n * every dynamic kind to declare nothing, which is the case an author most needs\n * help with.\n */\nexport type OutputShape<TConfig = Record<string, unknown>> =\n | OutputField[]\n | ((config: TConfig) => OutputField[]);\n\n/** One entry in the variable picker. */\nexport type AvailableVariable = {\n /** Exactly what gets inserted, including the braces. */\n expression: string;\n /** The bare path, for display: `$json.text`. */\n path: string;\n type?: OutputField[\"type\"];\n description?: string;\n /** Label of the upstream node this came from, for disambiguation. */\n source?: string;\n};\n\n/**\n * `$json` and `$input` both alias the `in` port value in the PHP resolver\n * (`Expr::resolvePath`). We suggest ONE of them so the picker does not present\n * the same variable twice under two names; `$json` is the spelling every\n * builtin kind's `example` already uses.\n */\nconst ROOT = \"$json\";\n\nfunction expr(path: string): string {\n return `{{ ${path} }}`;\n}\n\n/** Resolve a kind's output shape for a specific node. */\nexport function outputFieldsFor(node: FlowNode): OutputField[] {\n const kindName = (node.data as { kind?: string } | undefined)?.kind ?? node.type;\n if (!kindName) return [];\n\n const kind = getNodeKind(kindName) as { outputShape?: OutputShape } | undefined;\n const shape = kind?.outputShape;\n if (!shape) return [];\n\n if (typeof shape === \"function\") {\n // A kind computes this from author-supplied config, which is exactly where\n // a throw would be easiest to write and worst to ship — a malformed config\n // would take the whole panel down rather than showing one short list.\n try {\n const config = (node.data as { config?: Record<string, unknown> } | undefined)?.config ?? {};\n return shape(config) ?? [];\n } catch {\n return [];\n }\n }\n return shape;\n}\n\n/**\n * The variables an author can reference from `nodeId`, in this graph.\n *\n * Only the DIRECT predecessors are consulted, because `in` is the value on the\n * incoming wire. Walking further would offer a grandparent's fields, which\n * resolve to `null` at runtime — a suggestion that silently produces nothing is\n * worse than no suggestion, since the author has no reason to doubt it.\n *\n * Always includes the whole input. That one exists no matter what upstream\n * declared, and it is the escape hatch when a kind has no `outputShape` yet.\n */\nexport function baseVariables(): AvailableVariable[] {\n return [\n { expression: expr(ROOT), path: ROOT, type: \"unknown\", description: \"The whole incoming value.\" },\n ];\n}\n\nexport function availableVariables(graph: FlowGraph, nodeId: string): AvailableVariable[] {\n const out: AvailableVariable[] = baseVariables();\n const seen = new Set<string>([ROOT]);\n\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const upstreamIds = graph.edges.filter((e) => e.target === nodeId).map((e) => e.source);\n\n for (const id of upstreamIds) {\n if (id === nodeId) continue; // a self-edge is not an input shape\n const upstream = byId.get(id);\n if (!upstream) continue;\n\n const kindName = (upstream.data as { kind?: string } | undefined)?.kind ?? upstream.type;\n const label =\n (upstream.data as { label?: string } | undefined)?.label ??\n (kindName ? getNodeKind(kindName)?.label : undefined);\n\n for (const field of outputFieldsFor(upstream)) {\n const path = `${ROOT}.${field.path}`;\n if (seen.has(path)) continue;\n seen.add(path);\n out.push({\n expression: expr(path),\n path,\n type: field.type,\n description: field.description,\n source: label,\n });\n }\n }\n\n return out;\n}\n\n/** One documented form of the expression grammar. */\nexport type ExpressionForm = { syntax: string; meaning: string };\n\nexport type ExpressionGrammarHelp = {\n forms: ExpressionForm[];\n note: string;\n};\n\n/**\n * The reference help shown beside an expression field.\n *\n * Every form here is one `Expr::resolvePath` implements — a dot-path and\n * nothing else. It is tempting to document `{{ a && b }}` or `{{ a + b }}`\n * because they look like expressions; the resolver would return `null` for\n * both, and an author following the help would have no way to tell why.\n */\nexport function describeExpressionGrammar(): ExpressionGrammarHelp {\n return {\n forms: [\n { syntax: \"{{ $json }}\", meaning: \"The whole value arriving on this node's input.\" },\n { syntax: \"{{ $json.field }}\", meaning: \"One key of that value. Dot-paths nest: $json.user.email.\" },\n { syntax: \"{{ $input.field }}\", meaning: \"An alias for $json — the same value, either spelling.\" },\n { syntax: \"{{ in }}\", meaning: \"The input by its context key, rather than through the alias.\" },\n ],\n note:\n \"Dot-paths only — no arithmetic, comparisons or function calls; anything else resolves to nothing. \" +\n \"A field that is exactly one expression keeps the resolved value's type; mixed text interpolates as a string. \" +\n \"fancy-flow's own runFlow does not interpolate: it hands config to your executor verbatim, and the \" +\n \"fancy-flow-php runtime is what resolves these.\",\n };\n}\n","import { useMemo, useRef, useState, type KeyboardEvent } from \"react\";\nimport {\n availableVariables,\n baseVariables,\n describeExpressionGrammar,\n type AvailableVariable,\n} from \"../../expressions/variables\";\nimport type { FlowGraph } from \"../../types\";\n\nexport type ExpressionFieldProps = {\n value: string;\n onChange: (next: string) => void;\n placeholder?: string;\n rows?: number;\n /** The panel's field id + agent handle. */\n handle: { id?: string; \"data-ff-field\": string };\n /**\n * The graph and the node being edited. Both are needed to answer \"what can I\n * write here\" — without them the picker can still offer `{{ $json }}` but\n * nothing node-specific, which is the static list issue #5 asked us not to\n * ship.\n */\n graph?: FlowGraph;\n nodeId?: string;\n};\n\n/** Where the caret sits relative to an unclosed `{{`. */\ntype Trigger = { open: number; query: string } | null;\n\n/**\n * Find the `{{` the caret is currently inside, if any.\n *\n * Scans back from the caret and stops at the first `}}`, so a completed\n * expression earlier in the field does not re-open the picker while the author\n * types ordinary text after it.\n */\nexport function findTrigger(text: string, caret: number): Trigger {\n const before = text.slice(0, caret);\n const open = before.lastIndexOf(\"{{\");\n if (open === -1) return null;\n if (before.indexOf(\"}}\", open) !== -1) return null;\n return { open, query: before.slice(open + 2).trim() };\n}\n\n/** Case-insensitive substring match on the path, which is what an author types. */\nexport function filterVariables(vars: AvailableVariable[], query: string): AvailableVariable[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") return vars;\n return vars.filter((v) => v.path.toLowerCase().includes(q));\n}\n\n/**\n * Replace the open `{{ …` run with a chosen variable.\n *\n * Returns the caret position too: leaving it before the closing braces is the\n * difference between \"insert-on-select\" and \"insert, then hunt for where to\n * carry on typing\".\n */\nexport function applyCompletion(\n text: string,\n caret: number,\n trigger: NonNullable<Trigger>,\n variable: AvailableVariable,\n): { value: string; caret: number } {\n const head = text.slice(0, trigger.open);\n const tail = text.slice(caret);\n return { value: `${head}${variable.expression}${tail}`, caret: head.length + variable.expression.length };\n}\n\n/**\n * ExpressionField — a `{{ }}` field that tells the author what it accepts.\n *\n * Issue #5: the panel rendered a bare textarea with a placeholder and nothing\n * else, so writing an expression required already knowing both the grammar and\n * the exact shape of the upstream node's output. Two affordances close that:\n * typing `{{ ` opens a picker of the variables actually reachable at THIS node,\n * and a reference toggle explains the grammar.\n *\n * The picker deliberately lists only what the resolver can reach — see\n * `availableVariables`. A suggestion that resolves to `null` at runtime is\n * worse than no suggestion, because the author has no reason to doubt it.\n */\nexport function ExpressionField({\n value,\n onChange,\n placeholder,\n rows = 2,\n handle,\n graph,\n nodeId,\n}: ExpressionFieldProps) {\n const ref = useRef<HTMLTextAreaElement>(null);\n const [trigger, setTrigger] = useState<Trigger>(null);\n const [active, setActive] = useState(0);\n const [showHelp, setShowHelp] = useState(false);\n\n // With no graph the picker still opens — `$json` is valid at every node, and\n // an empty menu would read as \"this field takes no variables\".\n const variables = useMemo(\n () => (graph && nodeId ? availableVariables(graph, nodeId) : baseVariables()),\n [graph, nodeId],\n );\n const matches = useMemo(\n () => (trigger ? filterVariables(variables, trigger.query) : []),\n [trigger, variables],\n );\n const help = useMemo(() => describeExpressionGrammar(), []);\n const open = trigger !== null && matches.length > 0;\n\n const sync = (el: HTMLTextAreaElement) => {\n const next = findTrigger(el.value, el.selectionStart ?? el.value.length);\n setTrigger(next);\n setActive(0);\n };\n\n const choose = (variable: AvailableVariable) => {\n const el = ref.current;\n if (!el || !trigger) return;\n const { value: next, caret } = applyCompletion(\n el.value,\n el.selectionStart ?? el.value.length,\n trigger,\n variable,\n );\n onChange(next);\n setTrigger(null);\n // The value round-trips through the parent, so move the caret after React\n // has written it back — otherwise it lands wherever the re-render put it.\n requestAnimationFrame(() => {\n el.focus();\n el.setSelectionRange(caret, caret);\n });\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (!open) return;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive((i) => (i + 1) % matches.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((i) => (i - 1 + matches.length) % matches.length);\n } else if (e.key === \"Enter\" || e.key === \"Tab\") {\n // Enter in a picker means \"take this one\", not \"newline\".\n e.preventDefault();\n choose(matches[active] ?? matches[0]!);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setTrigger(null);\n }\n };\n\n return (\n <div className=\"ff-expression\" data-ff-expression={handle[\"data-ff-field\"]}>\n <textarea\n {...handle}\n ref={ref}\n className=\"ff-panel__input ff-panel__input--expression\"\n rows={rows}\n value={value ?? \"\"}\n placeholder={placeholder ?? \"{{ $json.field }}\"}\n spellCheck={false}\n role=\"combobox\"\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? `${handle.id ?? handle[\"data-ff-field\"]}-vars` : undefined}\n onChange={(e) => {\n onChange(e.target.value);\n sync(e.target);\n }}\n onKeyDown={onKeyDown}\n onClick={(e) => sync(e.currentTarget)}\n onBlur={() => {\n // A click on an option fires blur first; let it land.\n window.setTimeout(() => setTrigger(null), 120);\n }}\n />\n\n <div className=\"ff-expression__bar\">\n <button\n type=\"button\"\n className=\"ff-expression__helpbtn\"\n aria-expanded={showHelp}\n onClick={() => setShowHelp((s) => !s)}\n >\n {\"{{ }}\"} reference\n </button>\n {variables.length > 1 && (\n <span className=\"ff-expression__hint\">\n type <code>{\"{{\"}</code> for {variables.length} variables\n </span>\n )}\n </div>\n\n {open && (\n <ul\n className=\"ff-expression__menu\"\n id={`${handle.id ?? handle[\"data-ff-field\"]}-vars`}\n role=\"listbox\"\n data-ff-expression-menu={handle[\"data-ff-field\"]}\n >\n {matches.map((v, i) => (\n <li key={v.expression} role=\"option\" aria-selected={i === active}>\n <button\n type=\"button\"\n className={`ff-expression__option${i === active ? \" is-active\" : \"\"}`}\n data-ff-expression-option={v.path}\n // `onMouseDown` rather than `onClick`: the textarea's blur would\n // otherwise close the menu before the click resolved.\n onMouseDown={(e) => {\n e.preventDefault();\n choose(v);\n }}\n >\n <code className=\"ff-expression__path\">{v.path}</code>\n {v.source && <span className=\"ff-expression__source\">{v.source}</span>}\n {v.description && <span className=\"ff-expression__desc\">{v.description}</span>}\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {showHelp && (\n <div className=\"ff-expression__help\" role=\"note\" data-ff-expression-help>\n <dl>\n {help.forms.map((f) => (\n <div key={f.syntax}>\n <dt><code>{f.syntax}</code></dt>\n <dd>{f.meaning}</dd>\n </div>\n ))}\n </dl>\n <p className=\"ff-expression__note\">{help.note}</p>\n </div>\n )}\n </div>\n );\n}\n","import { type ReactNode, useMemo, useRef, useState } from \"react\";\nimport { ExpressionField } from \"./ExpressionField\";\nimport type { FlowGraph } from \"../../types\";\nimport type {\n ConfigField,\n KeyValueConfigField,\n RepeaterConfigField,\n TextConfigField,\n} from \"../../registry/types\";\n\n/** What a host renderer is handed. */\nexport type ConfigFieldRenderContext = {\n field: ConfigField;\n value: unknown;\n onChange: (next: unknown) => void;\n /** The id the panel's `<label>` points at. Put it on your control. */\n id?: string;\n};\n\n/**\n * Render one field. Return `null` to fall back to the package's own rendering,\n * so a host can claim a type conditionally instead of reimplementing every case.\n *\n * Named `...Fn` because `ConfigFieldRenderer` is already the component this\n * module exports; two things with one name in a public API is a paper cut a\n * consumer pays for, not us.\n */\nexport type ConfigFieldRenderFn = (ctx: ConfigFieldRenderContext) => ReactNode;\n\nexport type ConfigFieldRendererProps = {\n field: ConfigField;\n value: unknown;\n onChange: (value: unknown) => void;\n /**\n * DOM id for the control this renders.\n *\n * Supplied by the caller rather than generated here so the panel's `<label>`\n * can point at it — a label beside a control is not a label attached to one.\n * Also the agent-facing handle: the Human+ contract asks that every\n * interactive element have a stable identity so an agent targets it instead\n * of guessing at the DOM, and until this existed nothing in the editor had\n * one.\n */\n id?: string;\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Editor for `document` fields. fancy-flow stores the document but never\n * interprets it — the host owns the editing surface, exactly as it does for\n * `credential`. This is the seam for rich human-input steps (authored pages,\n * required reading, multi-section forms) without the package depending on\n * any particular document model.\n */\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Host renderers keyed by field `type`.\n *\n * The generic form of `renderDocumentField` / `renderCredentialField`: those\n * cover two types the package deliberately does not interpret, this covers\n * any type at all — including one the package has never heard of.\n *\n * Without it, a richer field had to be rendered OUTSIDE the panel, so that\n * node's config stopped living where every other field does. An unknown type\n * also fell through to `default:` and rendered nothing, so the schema said the\n * field existed and the panel showed empty space.\n *\n * Consulted BEFORE the built-in switch, so a host can also replace a built-in\n * (react-fancy inputs, say) through the same seam rather than a second one.\n */\n fieldRenderers?: Record<string, ConfigFieldRenderFn>;\n /**\n * The graph and the node being edited — what makes the `{{ }}` picker\n * CONTEXT-aware rather than a static list. Optional: a panel composed without\n * them still renders, it just cannot offer node-specific variables.\n */\n graph?: FlowGraph;\n nodeId?: string;\n};\n\n/**\n * ConfigFieldRenderer — dispatches to the right input element per field type.\n *\n * Plain HTML inputs styled via the package's CSS so the package stays\n * standalone (no react-fancy import required) and every surface stays themeable\n * through the `--ff-*` token layer. Hosts that want react-fancy form components\n * can supply their own field renderers via the kind's `renderPanel`.\n *\n * Each control carries the caller's `id` and a `data-ff-field` handle keyed by\n * the field, so a label can point at it and an agent can find it by name.\n */\nexport function ConfigFieldRenderer({\n field,\n value,\n onChange,\n id,\n renderCredentialField,\n renderDocumentField,\n fieldRenderers,\n graph,\n nodeId,\n}: ConfigFieldRendererProps) {\n /** Applied to whichever control this field renders. */\n const handle = { id, \"data-ff-field\": field.key } as const;\n\n // Host renderers win, and `null` means \"you take it\" — so claiming a type\n // conditionally does not mean reimplementing the rest.\n const custom = fieldRenderers?.[field.type];\n if (custom) {\n const rendered = custom({ field, value, onChange, id });\n if (rendered !== null && rendered !== undefined) return <>{rendered}</>;\n }\n\n switch (field.type) {\n case \"text\": {\n // Declaring `choices` turns a text field into a picker without changing\n // its type or the shape of the value it stores.\n if (field.choices?.length) {\n return <ChoiceField field={field} value={value} onChange={onChange} />;\n }\n return (\n <input\n {...handle}\n className=\"ff-panel__input\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n case \"textarea\":\n return (\n <textarea\n {...handle}\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 {...handle}\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 {...handle}\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 {...handle}\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} handle={handle} />;\n\n case \"expression\":\n return (\n <ExpressionField\n handle={handle}\n value={(value as string) ?? \"\"}\n onChange={onChange}\n placeholder={field.example ?? \"{{ $json.field }}\"}\n graph={graph}\n nodeId={nodeId}\n />\n );\n\n case \"credential\":\n if (renderCredentialField) {\n return <>{renderCredentialField({ credentialType: field.credentialType, value, onChange })}</>;\n }\n return (\n <input\n className=\"ff-panel__input ff-panel__input--credential\"\n type=\"text\"\n value={(value as string) ?? \"\"}\n placeholder={`Credential reference (${field.credentialType})`}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n case \"repeater\":\n return (\n <RepeaterField\n id={id}\n field={field}\n value={value}\n onChange={onChange}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n fieldRenderers={fieldRenderers}\n graph={graph}\n nodeId={nodeId}\n />\n );\n\n case \"keyvalue\":\n return <KeyValueField id={id} field={field} value={value} onChange={onChange} />;\n\n case \"document\":\n if (renderDocumentField) {\n return <>{renderDocumentField({ documentType: field.documentType, value, onChange })}</>;\n }\n return (\n <p className=\"ff-panel__hint ff-panel__hint--missing\">\n No document editor supplied. Pass <code>renderDocumentField</code> to\n NodeConfigPanel to author this field.\n </p>\n );\n\n default:\n return null;\n }\n}\n\n/** Normalize the `choices` shorthand — a bare string means value === label. */\nexport function normalizeChoices(\n choices: NonNullable<TextConfigField[\"choices\"]>,\n): Array<{ value: string; label: string }> {\n return choices.map((c) =>\n typeof c === \"string\" ? { value: c, label: c } : { value: c.value, label: c.label ?? c.value },\n );\n}\n\n/**\n * ChoiceField — a text field rendered as a select because the kind declared\n * `choices`.\n *\n * A stored value that is no longer among the choices is appended as an option\n * instead of being dropped. Choices are authored data and can change after\n * configs are saved; silently resetting the author's value on render would\n * lose work with no indication it happened.\n */\nfunction ChoiceField({\n field,\n value,\n onChange,\n}: {\n field: TextConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const options = normalizeChoices(field.choices ?? []);\n const current = typeof value === \"string\" ? value : \"\";\n const known = options.some((o) => o.value === current);\n\n return (\n <select\n className=\"ff-panel__input\"\n value={current}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>{field.placeholder ?? \"—\"}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n {current !== \"\" && !known && (\n <option value={current}>{current} (not in list)</option>\n )}\n </select>\n );\n}\n\n/**\n * RepeaterField — editable list of objects, each row driven by the field's\n * own sub-schema. Rows carry stable `data-ff-repeater-row` indices so an\n * agent can target a specific row without guessing DOM.\n */\nfunction RepeaterField({\n id,\n field,\n value,\n onChange,\n graph,\n nodeId,\n renderCredentialField,\n renderDocumentField,\n fieldRenderers,\n}: {\n id?: string;\n field: RepeaterConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n renderCredentialField?: ConfigFieldRendererProps[\"renderCredentialField\"];\n renderDocumentField?: ConfigFieldRendererProps[\"renderDocumentField\"];\n fieldRenderers?: ConfigFieldRendererProps[\"fieldRenderers\"];\n graph?: FlowGraph;\n nodeId?: string;\n}) {\n const rows: Array<Record<string, unknown>> = Array.isArray(value) ? (value as Array<Record<string, unknown>>) : [];\n const max = field.maxItems ?? Infinity;\n const min = field.minItems ?? 0;\n\n const replace = (next: Array<Record<string, unknown>>) => onChange(next);\n\n const addRow = () => {\n const blank: Record<string, unknown> = {};\n for (const f of field.fields) {\n if (\"default\" in f && f.default !== undefined) blank[f.key] = f.default;\n }\n replace([...rows, blank]);\n };\n\n const removeRow = (i: number) => replace(rows.filter((_, idx) => idx !== i));\n\n const moveRow = (i: number, delta: number) => {\n const target = i + delta;\n if (target < 0 || target >= rows.length) return;\n const next = [...rows];\n [next[i], next[target]] = [next[target], next[i]];\n replace(next);\n };\n\n const setCell = (i: number, key: string, cell: unknown) =>\n replace(rows.map((row, idx) => (idx === i ? { ...row, [key]: cell } : row)));\n\n const rowTitle = (row: Record<string, unknown>, i: number): string => {\n const key = field.titleKey ?? field.fields[0]?.key;\n const raw = key ? row[key] : undefined;\n if (typeof raw === \"string\" && raw.trim() !== \"\") return raw;\n if (typeof raw === \"number\" || typeof raw === \"boolean\") return String(raw);\n return `Item ${i + 1}`;\n };\n\n return (\n <div id={id} role=\"group\" className=\"ff-repeater\" data-ff-repeater={field.key} data-ff-field={field.key}>\n {rows.length === 0 && <p className=\"ff-repeater__empty\">None yet.</p>}\n\n {rows.map((row, i) => (\n <div className=\"ff-repeater__row\" key={i} data-ff-repeater-row={i}>\n <div className=\"ff-repeater__row-head\">\n <span className=\"ff-repeater__row-title\">{rowTitle(row, i)}</span>\n <div className=\"ff-repeater__row-actions\">\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, -1)}\n disabled={i === 0}\n aria-label={`Move ${rowTitle(row, i)} up`}\n >↑</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn\"\n onClick={() => moveRow(i, 1)}\n disabled={i === rows.length - 1}\n aria-label={`Move ${rowTitle(row, i)} down`}\n >↓</button>\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => removeRow(i)}\n disabled={rows.length <= min}\n aria-label={`Remove ${rowTitle(row, i)}`}\n >✕</button>\n </div>\n </div>\n\n {field.fields.map((sub) => (\n <div className=\"ff-repeater__cell\" key={sub.key}>\n <label className=\"ff-panel__label ff-panel__label--sub\">\n {sub.label}\n {sub.required && <span className=\"ff-panel__required\" aria-hidden> *</span>}\n </label>\n <ConfigFieldRenderer\n graph={graph}\n nodeId={nodeId}\n field={sub}\n value={row[sub.key]}\n onChange={(cell) => setCell(i, sub.key, cell)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={renderDocumentField}\n fieldRenderers={fieldRenderers}\n />\n </div>\n ))}\n </div>\n ))}\n\n <button\n type=\"button\"\n className=\"ff-repeater__add\"\n onClick={addRow}\n disabled={rows.length >= max}\n >\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\n/**\n * KeyValueField — editable string→string map.\n *\n * Renaming a key preserves insertion order (rebuilding the object rather than\n * delete-then-add), so rows don't jump around while the author is typing.\n */\nfunction KeyValueField({\n id,\n field,\n value,\n onChange,\n}: {\n id?: string;\n field: KeyValueConfigField;\n value: unknown;\n onChange: (v: unknown) => void;\n}) {\n const map = (value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {}) as Record<string, string>;\n const entries = Object.entries(map);\n\n const commit = (next: Array<[string, string]>) => {\n const obj: Record<string, string> = {};\n for (const [k, v] of next) {\n if (k === \"\") continue;\n obj[k] = v;\n }\n onChange(obj);\n };\n\n const setKey = (i: number, key: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [key, v] : [k, v])));\n const setVal = (i: number, val: string) =>\n commit(entries.map(([k, v], idx) => (idx === i ? [k, val] : [k, v])));\n const remove = (i: number) => commit(entries.filter((_, idx) => idx !== i));\n const add = () => commit([...entries, [\"\", \"\"]]);\n\n return (\n <div id={id} role=\"group\" className=\"ff-keyvalue\" data-ff-keyvalue={field.key} data-ff-field={field.key}>\n {entries.length > 0 && (\n <div className=\"ff-keyvalue__head\">\n <span>{field.keyLabel ?? \"Key\"}</span>\n <span>{field.valueLabel ?? \"Value\"}</span>\n <span />\n </div>\n )}\n\n {entries.map(([k, v], i) => (\n <div className=\"ff-keyvalue__row\" key={i} data-ff-keyvalue-row={i}>\n <input\n className=\"ff-panel__input\"\n value={k}\n placeholder={field.keyPlaceholder}\n aria-label={`${field.keyLabel ?? \"Key\"} ${i + 1}`}\n onChange={(e) => setKey(i, e.target.value)}\n />\n {field.valueOptions ? (\n <select\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n >\n <option value=\"\" disabled>—</option>\n {field.valueOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n ) : (\n <input\n className=\"ff-panel__input\"\n value={v ?? \"\"}\n placeholder={field.valuePlaceholder}\n aria-label={`${field.valueLabel ?? \"Value\"} ${i + 1}`}\n onChange={(e) => setVal(i, e.target.value)}\n />\n )}\n <button\n type=\"button\"\n className=\"ff-repeater__btn ff-repeater__btn--danger\"\n onClick={() => remove(i)}\n aria-label={`Remove ${k || `entry ${i + 1}`}`}\n >✕</button>\n </div>\n ))}\n\n <button type=\"button\" className=\"ff-repeater__add\" onClick={add}>\n + {field.addLabel ?? \"Add\"}\n </button>\n </div>\n );\n}\n\n/**\n * JsonField — the built-in fallback for `type: \"json\"`.\n *\n * **It used to eat invalid input.** Parsing happened on blur and the `catch`\n * block was empty save for a comment claiming the visual would revert. It could\n * not: the textarea was uncontrolled, so the broken text stayed on screen while\n * the config silently kept its previous value. The panel showed one document\n * and the node ran another, with nothing anywhere saying so — and a missing\n * comma is not a rare event in an `api_request` body.\n *\n * Now the text is a real buffer, the parse error is reported, and the config is\n * still never written from unparseable text. Refusing to store garbage was\n * right; doing it silently was not.\n *\n * The error appears on blur rather than per keystroke — every partially-typed\n * object is invalid on the way to being valid, and flagging that is noise.\n *\n * Hosts on react-fancy can swap this for a real typed editor by passing\n * `fieldRenderers` from `@particle-academy/fancy-flow/fields/react-fancy`.\n */\nfunction JsonField({\n value,\n onChange,\n rows,\n handle,\n}: {\n value: unknown;\n onChange: (v: unknown) => void;\n rows?: number;\n handle: { id?: string; \"data-ff-field\": string };\n}) {\n const serialized = useMemo(() => {\n try {\n return value === undefined ? \"\" : JSON.stringify(value, null, 2);\n } catch {\n return \"\";\n }\n }, [value]);\n\n const [text, setText] = useState(serialized);\n const [error, setError] = useState<string | null>(null);\n const [touched, setTouched] = useState(false);\n\n // Two refs, because \"the props changed\" and \"our own edit came back\" are\n // different events and only the first should touch the buffer.\n const lastProps = useRef(serialized);\n const committed = useRef<string | null>(null);\n\n // Re-sync on a genuinely EXTERNAL change — an undo, an agent write, another\n // node selected into the same panel.\n //\n // Comparing props against previous props (not against our own last commit) is\n // what keeps this from fighting a host that doesn't apply changes\n // immediately: a debounced or read-only host leaves `value` alone, which used\n // to read as \"reverted externally\" and wiped whatever had just been typed.\n // And skipping when the incoming value is our own commit is what stops the\n // author's `{\"a\":1}` being reformatted onto four lines mid-edit.\n if (serialized !== lastProps.current) {\n lastProps.current = serialized;\n if (serialized !== committed.current) {\n setText(serialized);\n setError(null);\n setTouched(false);\n }\n }\n\n /** Parse and commit; returns the message when it cannot. */\n const commit = (next: string): string | null => {\n const trimmed = next.trim();\n if (trimmed === \"\") {\n committed.current = \"\";\n onChange(undefined);\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed);\n // Record what this commit will serialize to, so recognising it on the way\n // back is an exact string comparison rather than a guess.\n committed.current = JSON.stringify(parsed, null, 2);\n onChange(parsed);\n return null;\n } catch (e) {\n return e instanceof Error ? e.message : \"Invalid JSON\";\n }\n };\n\n const errorId = handle.id ? `${handle.id}-error` : undefined;\n const showError = touched && error !== null;\n\n return (\n <>\n <textarea\n {...handle}\n className=\"ff-panel__input ff-panel__input--json\"\n rows={rows ?? 6}\n value={text}\n spellCheck={false}\n aria-invalid={showError || undefined}\n aria-describedby={showError ? errorId : undefined}\n onChange={(e) => {\n setText(e.target.value);\n setError(commit(e.target.value));\n }}\n onBlur={(e) => {\n setTouched(true);\n setError(commit(e.target.value));\n }}\n />\n {showError && (\n <p className=\"ff-panel__issue ff-panel__issue--field\" id={errorId} role=\"alert\">\n ⚠ {error}\n </p>\n )}\n </>\n );\n}\n","import { type ReactNode, useId, useMemo } from \"react\";\nimport type { FlowNode, FlowGraph} from \"../../types\";\nimport type { ConfigField, NodeKindDefinition } from \"../../registry/types\";\nimport { categoryAccent, getNodeKind, validateConfig } from \"../../registry/registry\";\nimport { getRichInputAdapter } from \"../../registry/rich-input\";\nimport { ConfigFieldRenderer, type ConfigFieldRenderFn } from \"./ConfigFieldRenderer\";\n\nexport type NodeConfigPanelProps = {\n /** Currently-selected node — pass null to render the empty state. */\n node: FlowNode | null;\n /** Called when the user edits the node label, description, or config. */\n onChange: (next: FlowNode) => void;\n /**\n * Called when the user deletes the node from the panel. When provided, the\n * panel renders a \"Delete node\" button while a node is selected — so the\n * delete affordance lives WITH the panel (a dev composing their own editor\n * gets it for free), rather than in a host toolbar it has to re-implement.\n */\n onDelete?: (node: FlowNode) => void;\n /** Label for the delete button. Default \"Delete node\". */\n deleteLabel?: string;\n /** Optional header content (e.g. close button). */\n header?: ReactNode;\n /** Optional credential picker hook — host renders the picker. */\n renderCredentialField?: (props: {\n credentialType: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n /**\n * Optional document editor hook — host renders the editor for `document`\n * fields. Lets rich authored content live in node config without fancy-flow\n * taking on a document model.\n */\n /** Host renderers keyed by field `type`. See {@link ConfigFieldRenderer}. */\n fieldRenderers?: Record<string, ConfigFieldRenderFn>;\n /**\n * Presentation-only visibility policy for schema fields. Returning `false`\n * omits the complete field wrapper (label, description, and control) while\n * leaving the registered kind and its runtime schema untouched.\n */\n fieldFilter?: (context: {\n node: FlowNode;\n kind: NodeKindDefinition;\n field: ConfigField;\n }) => boolean;\n /**\n * The graph the node lives in. Supplying it is what makes the `{{ }}` variable\n * picker context-aware — it reads the UPSTREAM node's declared `outputShape`\n * to list what is actually reachable here (issue #5). Without it the picker\n * still opens, but can only offer the whole input.\n */\n graph?: FlowGraph;\n renderDocumentField?: (props: {\n documentType?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n }) => ReactNode;\n className?: string;\n style?: React.CSSProperties;\n};\n\n/**\n * NodeConfigPanel — schema-driven form for the selected node. Defers to\n * `kind.renderPanel` if the kind opts out of the auto-form.\n */\nexport function NodeConfigPanel({\n node,\n onChange,\n onDelete,\n deleteLabel = \"Delete node\",\n header,\n renderCredentialField,\n renderDocumentField,\n fieldRenderers,\n fieldFilter,\n graph,\n className,\n style,\n}: NodeConfigPanelProps) {\n // EVERY hook runs before EVERY early return.\n //\n // The two `useMemo`s below used to sit after the `if (!node)` return, so the\n // panel called no hooks with nothing selected and two with a node — a\n // rules-of-hooks violation that React reports as #310, \"rendered more hooks\n // than during the previous render\". It survived because nothing in this repo\n // could render a component: the vitest config collected only `.test.ts`.\n // Adding a third hook is what finally made it crash on selecting a node.\n //\n // `uid` gives one prefix per mounted panel, so two panels on a page (a split\n // view, a comparison) cannot mint the same id and steal each other's label\n // clicks.\n const uid = useId();\n const kindName = node ? ((node.data as any).kind ?? node.type) : null;\n const kind = useMemo(() => (kindName ? getNodeKind(kindName) : undefined), [kindName]);\n const config = useMemo(\n () => ((node?.data as any)?.config ?? {}) as Record<string, unknown>,\n [node?.data],\n );\n\n /**\n * A stable DOM id for one field's control.\n *\n * The field KEY is in the id rather than an index, so the handle survives\n * reordering the schema, and an agent reading `data-ff-field` finds the same\n * element the label points at.\n */\n const fieldId = (key: string) => `${uid}-${key}`;\n\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 if (!kind) {\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <p className=\"ff-panel__empty\">Unknown kind: {kindName}</p>\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n }\n\n const setLabel = (label: string) =>\n onChange({ ...node, data: { ...node.data, label } });\n\n const setDescription = (description: string) =>\n onChange({ ...node, data: { ...node.data, description } });\n\n const setStatusMsg = (key: \"startingMsg\" | \"stoppingMsg\", value: string) =>\n onChange({ ...node, data: { ...node.data, [key]: value } });\n\n const setConfigValue = (key: string, value: unknown) =>\n onChange({ ...node, data: { ...node.data, config: { ...config, [key]: value } } });\n\n const configFields = (kind.configSchema ?? []).filter((field) =>\n fieldFilter ? fieldFilter({ node, kind, field }) : true,\n );\n const visibleFieldKeys = new Set(configFields.map((field) => field.key));\n // Validation itself still runs against the complete registered schema. Only\n // its presentation follows fieldFilter: a host-owned hidden value must not\n // leave an impossible warning for a control the host deliberately removed.\n const issues = validateConfig(kind, config).filter((issue) => visibleFieldKeys.has(issue.key));\n\n // An explicit prop wins; otherwise fall back to the rich-input adapter, so a\n // single registerRichInputAdapter() call enables BOTH authoring here and the\n // in-node preview without the host wiring the same editor twice.\n const adapter = getRichInputAdapter();\n const documentField = renderDocumentField\n ?? (adapter?.renderEditor\n ? ({ value, onChange: set }: { value: unknown; onChange: (n: unknown) => void }) =>\n adapter.renderEditor!({ value, onChange: set })\n : undefined);\n\n return (\n <aside className={[\"ff-panel\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {header}\n <header className=\"ff-panel__header\">\n <span className=\"ff-panel__head-icon\" style={{ background: kind.accent ?? categoryAccent(kind.category) }} aria-hidden>\n {kind.icon}\n </span>\n <span className=\"ff-panel__head-text\">\n <span className=\"ff-panel__head-kind\">{kind.label}</span>\n <span className=\"ff-panel__head-name\">{node.data.label || kind.label}</span>\n </span>\n </header>\n {kind.description && <p className=\"ff-panel__kind-desc\">{kind.description}</p>}\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(\"label\")}>Label</label>\n <input\n id={fieldId(\"label\")}\n data-ff-field=\"label\"\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\" htmlFor={fieldId(\"description\")}>Description</label>\n <textarea\n id={fieldId(\"description\")}\n data-ff-field=\"description\"\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 {/* Run narration. Node-level and kind-agnostic, so it sits with label and\n description rather than in the kind's configSchema — any node can\n announce itself, and no kind should have to opt in to be allowed to.\n Left blank on most nodes by design: narrating every step buries the\n two or three a person actually follows. */}\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(\"startingMsg\")}>Message when it starts</label>\n <input\n id={fieldId(\"startingMsg\")}\n data-ff-field=\"startingMsg\"\n className=\"ff-panel__input\"\n value={(node.data.startingMsg as string) ?? \"\"}\n onChange={(e) => setStatusMsg(\"startingMsg\", e.target.value)}\n placeholder=\"e.g. Starting the deep analysis\"\n />\n <p className=\"ff-panel__hint\">Announced just before this node runs. Leave blank to say nothing.</p>\n </div>\n\n <div className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(\"stoppingMsg\")}>Message when it finishes</label>\n <input\n id={fieldId(\"stoppingMsg\")}\n data-ff-field=\"stoppingMsg\"\n className=\"ff-panel__input\"\n value={(node.data.stoppingMsg as string) ?? \"\"}\n onChange={(e) => setStatusMsg(\"stoppingMsg\", e.target.value)}\n placeholder=\"e.g. Analysis complete\"\n />\n <p className=\"ff-panel__hint\">Announced only if the node succeeds — never after a failure.</p>\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 {configFields.length > 0 && <hr className=\"ff-panel__divider\" />}\n {configFields.map((field) => (\n <div key={field.key} className=\"ff-panel__field\">\n <label className=\"ff-panel__label\" htmlFor={fieldId(field.key)}>\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 id={fieldId(field.key)}\n field={field}\n value={config[field.key]}\n onChange={(v) => setConfigValue(field.key, v)}\n renderCredentialField={renderCredentialField}\n renderDocumentField={documentField}\n fieldRenderers={fieldRenderers}\n graph={graph}\n nodeId={node.id}\n />\n </div>\n ))}\n </>\n )}\n\n {issues.length > 0 && (\n <div className=\"ff-panel__issues\">\n {issues.map((iss) => (\n <p key={iss.key} className=\"ff-panel__issue\">⚠ {iss.message}</p>\n ))}\n </div>\n )}\n\n {onDelete && (\n <div className=\"ff-panel__actions\">\n <button\n type=\"button\"\n className=\"ff-panel__delete\"\n data-action=\"delete-node\"\n onClick={() => onDelete(node)}\n title=\"Delete this node (Del / Backspace)\"\n >\n ✕ {deleteLabel}\n </button>\n </div>\n )}\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type FlowRunControlsProps = {\n running: boolean;\n onRun: () => void;\n onCancel?: () => void;\n onReset?: () => void;\n className?: string;\n style?: CSSProperties;\n};\n\n/** FlowRunControls — Run / Cancel / Reset buttons. Wire to a `useFlowRun`. */\nexport function FlowRunControls({ running, onRun, onCancel, onReset, className, style }: FlowRunControlsProps) {\n return (\n <div className={[\"ff-run-controls\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {!running ? (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--run\" onClick={onRun}>\n ▶ Run\n </button>\n ) : (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--cancel\" onClick={onCancel}>\n ⏹ Cancel\n </button>\n )}\n {onReset && (\n <button type=\"button\" className=\"ff-run-controls__btn ff-run-controls__btn--reset\" onClick={onReset} disabled={running}>\n Reset\n </button>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useEffect, useRef } from \"react\";\nimport type { FlowRunFeedEntry } from \"../runtime/use-flow-run\";\n\nexport type FlowRunFeedProps = {\n entries: FlowRunFeedEntry[];\n /** Show the header bar (title + running badge + event count). Default true. */\n showHeader?: boolean;\n /** Header title. Default \"Run feed\". */\n title?: string;\n /** When true, a \"running\" badge shows in the header. */\n running?: boolean;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowRunFeed — scrolling run log with a header (title + live event count).\n * Auto-scrolls its body to the bottom on new entries.\n */\nexport function FlowRunFeed({ entries, showHeader = true, title = \"Run feed\", running, className, style }: FlowRunFeedProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = scrollRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n }, [entries.length]);\n\n return (\n <div className={[\"ff-run-feed\", className ?? \"\"].filter(Boolean).join(\" \")} style={style}>\n {showHeader && (\n <div className=\"ff-run-feed__header\">\n <span className=\"ff-run-feed__title\" aria-hidden>▸</span>\n <span className=\"ff-run-feed__title-text\">{title}</span>\n {running && <span className=\"ff-run-feed__badge\">running</span>}\n <span className=\"ff-run-feed__count\">{entries.length} {entries.length === 1 ? \"event\" : \"events\"}</span>\n </div>\n )}\n <div className=\"ff-run-feed__body\" ref={scrollRef}>\n {entries.length === 0 ? (\n <p className=\"ff-run-feed__empty\">No run events yet.</p>\n ) : (\n entries.map((e) => (\n <div key={e.id} className={`ff-run-feed__row ff-run-feed__row--${e.level}`}>\n <span className=\"ff-run-feed__time\">{formatTime(e.at)}</span>\n {e.nodeId && <span className=\"ff-run-feed__node\">{e.nodeId}</span>}\n <span className=\"ff-run-feed__text\">{e.text}</span>\n </div>\n ))\n )}\n </div>\n </div>\n );\n}\n\nfunction formatTime(at: number): string {\n const d = new Date(at);\n return `${d.getMinutes().toString().padStart(2, \"0\")}:${d.getSeconds().toString().padStart(2, \"0\")}.${Math.floor(d.getMilliseconds() / 100)}`;\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { HumanField, HumanFieldType } from \"./human-fields\";\n\n/** What a host renderer is handed for one field. */\nexport type HumanFieldRenderContext = {\n field: HumanField;\n /** The id the field's `<label>` points at — put it on your control. */\n id: string;\n value: unknown;\n onChange: (v: unknown) => void;\n /** Present only on the first field; attach it so the modal autofocuses. */\n autoFocusRef?: React.RefObject<HTMLElement | null>;\n};\n\n/**\n * Render one field, or return `null` to decline it.\n *\n * `null` means \"not mine\" and falls through to the built-in control. That is\n * what makes a PARTIAL map safe to spread: a host handing over someone else's\n * renderers does not silently lose every type that map does not cover.\n */\nexport type HumanFieldRenderFn = (ctx: HumanFieldRenderContext) => ReactNode | null;\n\n/**\n * Host overrides for pause-form controls, keyed by CANONICAL field type\n * (`\"switch\"`, not `\"boolean\"` — aliases are normalised before the lookup, so\n * one entry covers every spelling of that type).\n *\n * The built-ins are deliberately native `--ff-*`-themed elements rather than\n * react-fancy primitives: react-fancy is an OPTIONAL peer and this modal ships\n * in the main entry, so importing it here would break a standalone install and\n * bypass the token layer a host themes `.ff-editor` with. This seam is how a\n * host that HAS react-fancy gets Fancy controls anyway —\n * `@particle-academy/fancy-flow/fields/react-fancy` exports a ready map.\n */\nexport type HumanFieldRenderers = Partial<Record<HumanFieldType, HumanFieldRenderFn>>;\n\n/** What the modal was asked to collect — a form, or a yes/no decision. */\nexport type HumanPromptRequest =\n | { kind: \"input\"; title: string; submitLabel?: string; fields: HumanField[]; resolve: (values: Record<string, unknown>) => void }\n | { kind: \"approval\"; title: string; description?: string; resolve: (approved: boolean) => void };\n\nexport {\n humanInputFields,\n humanFieldType,\n humanFieldOptions,\n HUMAN_FIELD_TYPE_ALIASES,\n type HumanField,\n type HumanFieldType,\n type HumanFieldOption,\n} from \"./human-fields\";\n\n/** The `<input type>` each canonical field renders with. */\nconst INPUT_TYPE: Partial<Record<HumanFieldType, string>> = {\n text: \"text\",\n number: \"number\",\n date: \"date\",\n datetime: \"datetime-local\",\n time: \"time\",\n email: \"email\",\n url: \"url\",\n tel: \"tel\",\n password: \"password\",\n};\n\n/**\n * The value a field starts on, in the type the field will resolve in.\n *\n * A switch starts `false` rather than `\"\"` so the submitted value is a boolean\n * whether or not the person touched it — a form that returns `\"\"` for an\n * untouched checkbox and `true` for a touched one hands the next node two\n * different types for the same field.\n */\nfunction initialValues(fields: HumanField[]): Record<string, unknown> {\n const v: Record<string, unknown> = {};\n for (const f of fields) {\n if (f.type === \"switch\") {\n v[f.key] = !!f.default;\n } else if (f.type === \"number\") {\n v[f.key] = typeof f.default === \"number\" ? f.default : f.default === undefined || f.default === \"\" ? \"\" : Number(f.default);\n } else {\n v[f.key] = f.default ?? \"\";\n }\n }\n return v;\n}\n\n/**\n * The in-editor human-input modal. When a run reaches a `user_input` or\n * `human_approval` node, FlowEditor's default executor opens this and BLOCKS the\n * run (the executor returns a Promise) until the person submits — the same\n * async-executor pattern the headless engine already supports. A host that\n * passes its own `user_input` / `human_approval` executor overrides this.\n *\n * ## Why the controls are native elements and not react-fancy primitives\n *\n * Same reason the config panel's are, and it is a hard constraint rather than a\n * preference: `@particle-academy/react-fancy` is an OPTIONAL peer of this\n * package (`peerDependenciesMeta`) and is listed `external` in `tsup.config.ts`.\n * This file ships in the main `.` entry, so importing react-fancy here would\n * make a standalone `npm install @particle-academy/fancy-flow` fail to resolve\n * at import time — and it would break the `--ff-*` token layer a host overrides\n * on `.ff-editor`, because react-fancy's primitives are hardcoded Tailwind\n * palette classes that read no custom properties. See the docblock on\n * `src/fields/react-fancy.tsx` and the one on `tests/panel-labels.test.tsx`.\n *\n * A host that wants react-fancy controls here already has the seam: pass its\n * own `user_input` executor to `<FlowEditor executors={…}>` and render whatever\n * it likes. Host executors are spread last, so they win.\n */\n\nexport function HumanPrompt({\n request,\n onCancel,\n fieldRenderers,\n}: {\n request: HumanPromptRequest;\n onCancel: () => void;\n fieldRenderers?: HumanFieldRenderers;\n}) {\n const firstRef = useRef<HTMLElement | null>(null);\n useEffect(() => {\n firstRef.current?.focus();\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") onCancel(); };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onCancel]);\n\n return (\n <div className=\"ff-prompt-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label={request.title}>\n <div className=\"ff-prompt\" onClick={(e) => e.stopPropagation()}>\n <div className=\"ff-prompt__title\">{request.title}</div>\n {request.kind === \"approval\" ? (\n <ApprovalBody request={request} onCancel={onCancel} />\n ) : (\n <InputBody request={request} onCancel={onCancel} firstRef={firstRef} fieldRenderers={fieldRenderers} />\n )}\n </div>\n </div>\n );\n}\n\nfunction ApprovalBody({ request, onCancel }: { request: Extract<HumanPromptRequest, { kind: \"approval\" }>; onCancel: () => void }) {\n return (\n <>\n {request.description && <p className=\"ff-prompt__desc\">{request.description}</p>}\n <div className=\"ff-prompt__actions\">\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--ghost\" onClick={onCancel}>Cancel</button>\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--danger\" onClick={() => request.resolve(false)}>Deny</button>\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--primary\" onClick={() => request.resolve(true)}>Approve</button>\n </div>\n </>\n );\n}\n\nfunction InputBody({\n request,\n onCancel,\n firstRef,\n fieldRenderers,\n}: {\n request: Extract<HumanPromptRequest, { kind: \"input\" }>;\n onCancel: () => void;\n firstRef: React.RefObject<HTMLElement | null>;\n fieldRenderers?: HumanFieldRenderers;\n}) {\n const [values, setValues] = useState<Record<string, unknown>>(() => initialValues(request.fields));\n const set = (k: string, v: unknown) => setValues((prev) => ({ ...prev, [k]: v }));\n\n // Ids are scoped to this modal instance so two prompts on one page — a split\n // view, a comparison — never share an id and make one label focus the other's\n // control. Keyed by the FIELD, not its position, so an agent that stored\n // `data-ff-field=\"email\"` still finds it after the schema is reordered.\n const uid = useId();\n const fieldId = (key: string) => `${uid}-${key}`;\n\n const missing = request.fields.filter((f) => f.required && (values[f.key] === undefined || values[f.key] === \"\"));\n const submit = () => { if (missing.length === 0) request.resolve(values); };\n\n return (\n <form\n onSubmit={(e) => { e.preventDefault(); submit(); }}\n onKeyDown={(e) => { if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); submit(); } }}\n >\n <div className=\"ff-prompt__fields\">\n {request.fields.map((f, i) => (\n <div key={f.key} className=\"ff-prompt__field\">\n <label className=\"ff-prompt__label\" htmlFor={fieldId(f.key)}>\n {f.label ?? f.key}\n {/* aria-hidden so the field is announced \"Email\", not \"Email star\". */}\n {f.required && <span className=\"ff-prompt__req\" aria-hidden=\"true\"> *</span>}\n </label>\n <FieldControl\n field={f}\n id={fieldId(f.key)}\n value={values[f.key]}\n onChange={(v) => set(f.key, v)}\n autoFocusRef={i === 0 ? firstRef : undefined}\n renderers={fieldRenderers}\n />\n </div>\n ))}\n </div>\n <div className=\"ff-prompt__actions\">\n <button type=\"button\" className=\"ff-prompt__btn ff-prompt__btn--ghost\" onClick={onCancel}>Cancel</button>\n <button type=\"submit\" className=\"ff-prompt__btn ff-prompt__btn--primary\" disabled={missing.length > 0}>\n {request.submitLabel || \"Continue\"}\n </button>\n </div>\n </form>\n );\n}\n\n/**\n * One control, chosen by the field's canonical type.\n *\n * Every branch is controlled (`value` + `onChange`) and carries the same two\n * handles — the `id` its label points at, and `data-ff-field` keyed by the\n * field — because this modal is a Human+ surface an agent drives through an\n * MCP bridge rather than by guessing at the DOM.\n */\nfunction FieldControl({\n field,\n id,\n value,\n onChange,\n autoFocusRef,\n renderers,\n}: {\n field: HumanField;\n id: string;\n value: unknown;\n onChange: (v: unknown) => void;\n autoFocusRef?: React.RefObject<HTMLElement | null>;\n renderers?: HumanFieldRenderers;\n}) {\n // A host override wins, but only if it actually renders something. `null`\n // is the documented way to decline a field, so a partial map falls through\n // to the built-in below instead of leaving an empty row where a control\n // belongs -- which would read as a rendering bug rather than a seam working.\n const override = renderers?.[field.type ?? \"text\"];\n if (override) {\n const rendered = override({ field, id, value, onChange, autoFocusRef });\n if (rendered !== null && rendered !== undefined) return <>{rendered}</>;\n }\n\n const handle = { id, \"data-ff-field\": field.key } as const;\n\n if (field.type === \"textarea\") {\n return (\n <textarea\n {...handle}\n className=\"ff-prompt__input\"\n placeholder={field.placeholder}\n ref={autoFocusRef as React.RefObject<HTMLTextAreaElement> | undefined}\n rows={3}\n value={String(value ?? \"\")}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n if (field.type === \"switch\") {\n return (\n <input\n {...handle}\n type=\"checkbox\"\n className=\"ff-prompt__switch\"\n ref={autoFocusRef as React.RefObject<HTMLInputElement> | undefined}\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n );\n }\n\n if (field.type === \"select\") {\n // A select stays a select even with nothing to choose. Falling through to a\n // text box — which is what used to happen — hid the authoring mistake AND\n // collected an unconstrained string for a field whose whole point is that\n // the downstream node gets one of a fixed set.\n const options = field.options ?? [];\n return (\n <select\n {...handle}\n className=\"ff-prompt__input\"\n ref={autoFocusRef as React.RefObject<HTMLSelectElement> | undefined}\n value={String(value ?? \"\")}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\" disabled>{options.length ? \"Choose…\" : \"No choices configured\"}</option>\n {options.map((o) => <option key={o.value} value={o.value}>{o.label}</option>)}\n </select>\n );\n }\n\n return (\n <input\n {...handle}\n className=\"ff-prompt__input\"\n placeholder={field.placeholder}\n ref={autoFocusRef as React.RefObject<HTMLInputElement> | undefined}\n type={INPUT_TYPE[field.type ?? \"text\"] ?? \"text\"}\n value={String(value ?? \"\")}\n onChange={(e) =>\n onChange(field.type === \"number\" ? (e.target.value === \"\" ? \"\" : Number(e.target.value)) : e.target.value)\n }\n />\n );\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type ComponentProps,\n} from \"react\";\nimport {\n ReactFlowProvider,\n useReactFlow,\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n type Connection,\n type Edge,\n type NodeMouseHandler,\n} from \"@xyflow/react\";\nimport type { UseFlowStateReturn } from \"../../runtime/use-flow-state\";\nimport { FlowCanvas, type FlowCanvasProps } from \"../canvas/FlowCanvas\";\nimport { NodePalette, paletteDropHandlers } from \"../NodePalette\";\nimport { NodeConfigPanel } from \"../NodeConfigPanel\";\nimport { FlowRunControls } from \"../FlowRunControls\";\nimport { FlowRunFeed } from \"../FlowRunFeed\";\nimport { useFlowState } from \"../../runtime/use-flow-state\";\nimport { useFlowHistory } from \"../../runtime/use-flow-history\";\nimport { useFlowRun, applyStatusesToNodes, applyOutputsToNodes } from \"../../runtime/use-flow-run\";\nimport { exportWorkflow, importWorkflow, workflowToBlob, type WorkflowMetadata, type WorkflowSchema } from \"../../schema\";\nimport { buildNodeTypes, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged } from \"../../registry\";\nimport type { ExecutorRegistry, FlowGraph, FlowNode } from \"../../types\";\nimport {\n duplicateNode as cloneNode,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n assignToLane as assignToLaneOp,\n removeFromLane as removeFromLaneOp,\n removeEdges,\n removeNodes,\n setEdgeLabel,\n type AlignEdge,\n} from \"./graph-ops\";\nimport {\n FlowEditorProvider,\n type FlowEditorAction,\n type FlowEditorApi,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n} from \"./api\";\nimport {\n HumanPrompt,\n humanInputFields,\n type HumanFieldRenderers,\n type HumanPromptRequest,\n} from \"./HumanPrompt\";\n\nexport type FlowEditorProps = {\n initial?: FlowGraph;\n /** Controlled mode — host owns the graph state. When set, takes precedence\n * over `initial`. Pair with `onChange` to receive edits. */\n value?: FlowGraph;\n /** Executor registry passed to runFlow. Each kind name maps to an executor. */\n executors?: ExecutorRegistry;\n /**\n * Host controls for the `user_input` / `human_approval` pause form, keyed by\n * canonical field type. A renderer returning `null` declines that field and\n * falls through to the built-in, so a PARTIAL map is safe to spread.\n *\n * The built-ins are native `--ff-*`-themed elements because react-fancy is an\n * OPTIONAL peer and this component ships in the main entry. A host that has\n * react-fancy opts into its primitives with\n * `humanFieldRenderers` from `@particle-academy/fancy-flow/fields/react-fancy`.\n */\n humanFieldRenderers?: HumanFieldRenderers;\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 /**\n * Host renderers for config-field types, keyed by `type`, handed straight to\n * `NodeConfigPanel`.\n *\n * Use it to claim a type the package renders plainly — the built-in `json`\n * field is a bare textarea, and\n * `@particle-academy/fancy-flow/fields/react-fancy` swaps it for a real typed\n * editor — or to supply one the package has never heard of.\n *\n * This forwarding is the whole point: the seam existed on `NodeConfigPanel`\n * and had no route through `FlowEditor`, so reaching it meant abandoning the\n * editor and composing one by hand.\n */\n fieldRenderers?: ComponentProps<typeof NodeConfigPanel>[\"fieldRenderers\"];\n /** Presentation-only config-field filter, forwarded to `NodeConfigPanel`. */\n fieldFilter?: ComponentProps<typeof NodeConfigPanel>[\"fieldFilter\"];\n /** Show run feed below the canvas. Default true. */\n showFeed?: boolean;\n /** Total editor height. Default 720. */\n height?: number;\n /** Extra toolbar content, appended after the built-ins. Prefer `actions`\n * (declarative + agent-emittable); this stays for back-compat. */\n extraToolbar?: ReactNode;\n /** Declarative custom toolbar buttons. */\n actions?: FlowEditorAction[];\n /** Turn built-in toolbar affordances off individually. */\n builtins?: FlowEditorBuiltins;\n /** Replace whole regions of the editor. */\n slots?: FlowEditorSlots;\n /** Forwarded to `<FlowCanvas>` / React Flow — snapToGrid, minimap, context\n * menus, edge types, and anything else xyflow accepts. */\n canvasProps?: Partial<Omit<FlowCanvasProps, \"nodes\" | \"edges\">>;\n /** Called whenever the graph changes — host can persist. */\n onChange?: (graph: FlowGraph) => void;\n /** Called when the selected node changes. */\n onSelectionChange?: (node: FlowNode | null) => void;\n /** Called after nodes are deleted, with the deleted ids. */\n onDelete?: (ids: string[]) => void;\n /** Called after connections are broken, with the deleted edge ids. */\n onEdgeDelete?: (ids: string[]) => void;\n /**\n * Stage destructive edits for human confirmation. When set, every delete path\n * — keyboard, panel, context menu, and `api.deleteNodes`/`deleteEdges` —\n * calls this first; return false to veto. Default: delete immediately. This\n * realizes the component contract's \"agents propose, humans confirm\" on the\n * canvas.\n */\n confirmDelete?: (targets: { nodes: FlowNode[]; edges: Edge[] }) => boolean | Promise<boolean>;\n className?: string;\n style?: CSSProperties;\n};\n\n/**\n * FlowEditor — batteries-included workflow editor, but not a black box.\n *\n * Defaults compose NodePalette + FlowCanvas + NodeConfigPanel + run controls +\n * feed. Every part is replaceable: pass `actions` for custom toolbar buttons,\n * `slots` to swap a whole region, `canvasProps` to reach React Flow, or grab\n * the {@link FlowEditorApi} from `ref` / `useFlowEditor()` and build your own\n * chrome around the primitives.\n */\nexport const FlowEditor = forwardRef<FlowEditorApi, FlowEditorProps>(function FlowEditor(props, ref) {\n return (\n <ReactFlowProvider>\n <div\n className={[\"ff-editor\", props.className ?? \"\"].filter(Boolean).join(\" \")}\n style={{ height: props.height ?? 720, ...props.style }}\n >\n <FlowEditorInner {...props} apiRef={ref} />\n </div>\n </ReactFlowProvider>\n );\n});\n\nfunction FlowEditorInner({\n initial = { nodes: [], edges: [] },\n value,\n executors = {},\n metadata,\n showPalette = true,\n showPanel = true,\n fieldRenderers,\n fieldFilter,\n showFeed = true,\n extraToolbar,\n actions = [],\n builtins = {},\n slots = {},\n canvasProps = {},\n onChange,\n onSelectionChange,\n onDelete,\n onEdgeDelete,\n confirmDelete,\n humanFieldRenderers,\n apiRef,\n}: FlowEditorProps & { apiRef?: React.ForwardedRef<FlowEditorApi> }) {\n const internal = useFlowState(initial);\n const runner = useFlowRun();\n const rf = useReactFlow();\n\n // In-editor human-input: when a run reaches a `user_input` / `human_approval`\n // node, open a modal and BLOCK the run until the person submits. These are\n // DEFAULT executors — a host that passes its own `user_input` / `human_approval`\n // executor overrides them (host executors are spread last below).\n const [prompt, setPrompt] = useState<HumanPromptRequest | null>(null);\n const humanExecutors = useMemo<ExecutorRegistry>(\n () => ({\n user_input: ({ node }) =>\n new Promise((resolve) => {\n const cfg = (((node as any).data?.config ?? {}) as Record<string, unknown>);\n setPrompt({\n kind: \"input\",\n title: (typeof cfg.title === \"string\" && cfg.title) || \"Your input\",\n submitLabel: typeof cfg.submitLabel === \"string\" ? cfg.submitLabel : undefined,\n fields: humanInputFields(cfg),\n resolve: (values) => { setPrompt(null); resolve(values); },\n });\n }),\n human_approval: ({ node }) =>\n new Promise((resolve) => {\n const cfg = (((node as any).data?.config ?? {}) as Record<string, unknown>);\n setPrompt({\n kind: \"approval\",\n title: (typeof cfg.title === \"string\" && cfg.title) || \"Approve action\",\n description: typeof cfg.description === \"string\" ? cfg.description : undefined,\n resolve: (approved) => { setPrompt(null); resolve({ branch: approved ? \"approved\" : \"denied\" }); },\n });\n }),\n }),\n [],\n );\n const runExecutors = useMemo(() => ({ ...humanExecutors, ...executors }), [humanExecutors, executors]);\n // Close the modal if the run ends (finished or cancelled) while it's open.\n useEffect(() => {\n if (!runner.running) setPrompt(null);\n }, [runner.running]);\n\n // When `value` is provided we run in controlled mode: host owns nodes/edges,\n // local edits go through onChange. Internal state is unused but the hook\n // still has to run (rules of hooks).\n const controlled = value !== undefined;\n const baseFlow = controlled ? makeControlledFlowAdapter(value!, onChange) : internal;\n // Wrap the sink with the commit/undo pipeline — one interception point for\n // every committing mutation, whichever mode we're in.\n const hist = useFlowHistory(baseFlow);\n const flow = hist.flow;\n\n // Re-render when registry kinds change so the palette + nodeTypes reflect it.\n const [, force] = useState(0);\n useEffect(() => onNodeKindsChanged(() => force((n) => n + 1)), []);\n const nodeTypes = useMemo(() => buildNodeTypes(), [listNodeKinds().length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const renderedNodes = useMemo(\n () =>\n applyOutputsToNodes(\n applyStatusesToNodes(flow.nodes, runner.statuses, runner.statusText),\n runner.outputs,\n ),\n [flow.nodes, runner.statuses, runner.statusText, runner.outputs],\n );\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const selected = useMemo(() => flow.nodes.find((n) => n.id === selectedId) ?? null, [flow.nodes, selectedId]);\n\n useEffect(() => onSelectionChange?.(selected), [selected, onSelectionChange]);\n\n const [selectedEdgeId, setSelectedEdgeId] = useState<string | null>(null);\n const selectedEdge = useMemo(\n () => flow.edges.find((e: Edge) => e.id === selectedEdgeId) ?? null,\n [flow.edges, selectedEdgeId],\n );\n\n const handleNodeClick: NodeMouseHandler = (_e, node) => {\n setSelectedId(node.id);\n // Node and edge selection are mutually exclusive, so Delete is never\n // ambiguous about what it would remove.\n setSelectedEdgeId(null);\n };\n\n // Right-click menu, for a node OR a connection. Anchored in viewport coords\n // (position: fixed), so it is not clipped by the canvas' overflow.\n const [menu, setMenu] = useState<\n { x: number; y: number; target: { type: \"node\" | \"edge\"; id: string } } | null\n >(null);\n // Inline \"label this connection\" editor, anchored like the menu.\n const [labelEdit, setLabelEdit] = useState<{ x: number; y: number; edgeId: string } | null>(null);\n\n const closeMenu = useCallback(() => setMenu(null), []);\n\n const handleNodeContextMenu: NodeMouseHandler = (event, node) => {\n event.preventDefault();\n setSelectedId(node.id);\n setSelectedEdgeId(null);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"node\", id: node.id } });\n };\n\n const handleEdgeClick = (_e: React.MouseEvent, edge: Edge) => {\n setSelectedEdgeId(edge.id);\n };\n\n const handleEdgeContextMenu = (event: React.MouseEvent, edge: Edge) => {\n event.preventDefault();\n setSelectedEdgeId(edge.id);\n setMenu({ x: event.clientX, y: event.clientY, target: { type: \"edge\", id: edge.id } });\n };\n\n // Dismiss on any outside click, scroll, or Escape.\n useEffect(() => {\n if (menu === null && labelEdit === null) return;\n const close = () => { setMenu(null); setLabelEdit(null); };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && close();\n window.addEventListener(\"click\", close);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n window.removeEventListener(\"click\", close);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [menu, labelEdit]);\n\n // Editor keyboard shortcuts. Ignored while a field is focused, so Ctrl+Z does\n // native text-undo inside inputs/textareas rather than reverting the graph.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n hist.undo();\n } else if ((key === \"z\" && e.shiftKey) || key === \"y\") {\n e.preventDefault();\n hist.redo();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [hist]);\n\n // Uncontrolled: notify host on every graph mutation. Controlled mode\n // already notifies via the adapter on each setNodes/setEdges call.\n useEffect(() => {\n if (!controlled) onChange?.({ nodes: flow.nodes, edges: flow.edges });\n }, [flow.nodes, flow.edges, onChange, controlled]);\n\n const addNode = useCallback(\n (kindName: string, position?: { x: number; y: number }): string | null => {\n const kind = getNodeKind(kindName);\n if (!kind) return null;\n const at = position ?? { x: 80, y: 80 };\n const id = newNodeId();\n flow.setNodes((all: FlowNode[]) => [\n ...all,\n {\n id,\n type: kind.name,\n position: at,\n data: { kind: kind.name, label: kind.label, config: defaultConfigFor(kind) } as any,\n } as FlowNode,\n ]);\n setSelectedId(id);\n return id;\n },\n [flow],\n );\n\n /** Delete nodes AND every edge attached to them — an orphaned edge would\n * otherwise survive the node it connected. */\n const deleteNodes = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.nodes.filter((n) => ids.includes(n.id));\n if (targets.length === 0) return;\n if (confirmDelete) {\n const attached = flow.edges.filter((e: Edge) => ids.includes(e.source) || ids.includes(e.target));\n if (!(await confirmDelete({ nodes: targets, edges: attached }))) return;\n }\n const doomed = new Set(ids);\n // Atomic: prune edges + remove nodes in ONE commit — one undo step, and\n // correct in controlled mode where two sequential writes would clobber.\n flow.setGraph(removeNodes({ nodes: flow.nodes, edges: flow.edges }, ids));\n setSelectedId((cur) => (cur !== null && doomed.has(cur) ? null : cur));\n onDelete?.(ids);\n },\n [flow, onDelete, confirmDelete],\n );\n\n const deleteEdges = useCallback(\n async (ids: string[]) => {\n if (ids.length === 0) return;\n const targets = flow.edges.filter((e: Edge) => ids.includes(e.id));\n if (targets.length === 0) return;\n if (confirmDelete && !(await confirmDelete({ nodes: [], edges: targets }))) return;\n flow.setEdges((all: Edge[]) => removeEdges(all, ids));\n setSelectedEdgeId((cur) => (cur !== null && ids.includes(cur) ? null : cur));\n onEdgeDelete?.(ids);\n },\n [flow, onEdgeDelete, confirmDelete],\n );\n\n // ── Multi-selection + clipboard (Release 2) ──\n // xyflow owns the real multi-selection (box / shift-click) on `node.selected`;\n // we read it rather than tracking a parallel list.\n const selectedNodes = useMemo(() => flow.nodes.filter((n) => n.selected), [flow.nodes]);\n const selectedIds = useMemo(() => selectedNodes.map((n) => n.id), [selectedNodes]);\n\n const clipboard = useRef<FlowGraph | null>(null);\n\n const copySelection = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const edges = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n clipboard.current = { nodes: sel.map((n) => ({ ...n })), edges: edges.map((e) => ({ ...e })) };\n }, [flow]);\n\n const pasteClipboard = useCallback(\n (at?: { x: number; y: number }) => {\n const clip = clipboard.current;\n if (!clip || clip.nodes.length === 0) return;\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(clip.nodes, clip.edges, { makeId: newNodeId, offset: 40 });\n let placed = clones;\n if (at) {\n const minX = Math.min(...clones.map((n) => n.position.x));\n const minY = Math.min(...clones.map((n) => n.position.y));\n placed = clones.map((n) => ({ ...n, position: { x: n.position.x - minX + at.x, y: n.position.y - minY + at.y } }));\n }\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...placed.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n },\n [flow],\n );\n\n const duplicateSelected = useCallback(() => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length === 0) return;\n const ids = new Set(sel.map((n) => n.id));\n const internal = flow.edges.filter((e: Edge) => ids.has(e.source) && ids.has(e.target));\n const { nodes: clones, edges: cloneEdges } = cloneSubgraph(sel, internal, { makeId: newNodeId, offset: 40 });\n flow.setGraph({\n nodes: [...flow.nodes.map((n) => ({ ...n, selected: false })), ...clones.map((n) => ({ ...n, selected: true }))],\n edges: [...flow.edges, ...cloneEdges],\n });\n }, [flow]);\n\n const alignSelected = useCallback(\n (edge: AlignEdge) => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 2) return;\n const byId = new Map(alignNodes(sel, edge).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const distributeSelected = useCallback(\n (axis: \"h\" | \"v\") => {\n const sel = flow.nodes.filter((n) => n.selected);\n if (sel.length < 3) return;\n const byId = new Map(distributeNodes(sel, axis).map((n) => [n.id, n] as const));\n flow.setNodes((all: FlowNode[]) => all.map((n) => byId.get(n.id) ?? n));\n },\n [flow],\n );\n\n const onReconnect = useCallback(\n (oldEdge: Edge, conn: Connection) => flow.setEdges((eds: Edge[]) => reconnectEdge(eds, oldEdge, conn)),\n [flow],\n );\n\n // ── Swimlanes (Release 4) ──\n const isLaneNode = useCallback(\n (n: FlowNode) => getNodeKind((n.data as any)?.kind ?? n.type)?.category === \"layout\",\n [],\n );\n\n const addLane = useCallback(\n (orientation: \"horizontal\" | \"vertical\" = \"horizontal\", title?: string): string => {\n const vertical = orientation === \"vertical\";\n const lanes = flow.nodes.filter(isLaneNode);\n const w = vertical ? 280 : 680;\n const h = vertical ? 480 : 168;\n const end = lanes.reduce(\n (m, l) =>\n Math.max(m, vertical ? l.position.x + ((l as any).width ?? w) : l.position.y + ((l as any).height ?? h)),\n 0,\n );\n const id = newNodeId();\n const name = title ?? `Lane ${lanes.length + 1}`;\n const node = {\n id,\n type: \"@particle-academy/lane\",\n position: vertical ? { x: lanes.length ? end + 12 : 0, y: 0 } : { x: 0, y: lanes.length ? end + 12 : 0 },\n width: w,\n height: h,\n data: { kind: \"@particle-academy/lane\", label: name, config: { title: name, orientation } } as any,\n } as FlowNode;\n flow.setNodes((all: FlowNode[]) => [...all, node]);\n setSelectedId(id);\n return id;\n },\n [flow, isLaneNode],\n );\n\n // Drop a node onto a lane to file it there; drag it out to unfile it.\n const handleNodeDragStop = useCallback(\n (_e: MouseEvent | TouchEvent, node: FlowNode) => {\n if (isLaneNode(node)) return; // v1: lanes don't nest inside lanes\n const overLane = rf.getIntersectingNodes(node).find((n) => isLaneNode(n as FlowNode));\n const currentParent = (node as any).parentId as string | undefined;\n if (overLane && overLane.id !== currentParent) {\n flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, node.id, overLane.id));\n } else if (!overLane && currentParent) {\n flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, node.id));\n }\n },\n [rf, flow, isLaneNode],\n );\n\n // Clipboard + duplicate shortcuts. (Undo/redo live in the effect above.)\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = e.key.toLowerCase();\n if (key === \"c\") copySelection();\n else if (key === \"x\") {\n e.preventDefault();\n copySelection();\n deleteNodes(selectedIds);\n } else if (key === \"v\") {\n e.preventDefault();\n pasteClipboard();\n } else if (key === \"d\") {\n e.preventDefault();\n duplicateSelected();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [copySelection, pasteClipboard, duplicateSelected, deleteNodes, selectedIds]);\n\n const api: FlowEditorApi = useMemo(() => {\n const toWorkflow = () => exportWorkflow({ nodes: flow.nodes, edges: flow.edges }, metadata);\n\n return {\n graph: { nodes: flow.nodes, edges: flow.edges },\n nodes: flow.nodes,\n edges: flow.edges,\n selectedId,\n selected,\n selectedEdgeId,\n selectedEdge,\n selectedIds,\n selectedNodes,\n running: runner.running,\n statuses: runner.statuses,\n\n select: setSelectedId,\n selectEdge: setSelectedEdgeId,\n\n addNode,\n updateNode: (next) => flow.setNodes((all: FlowNode[]) => all.map((x) => (x.id === next.id ? next : x))),\n deleteNodes,\n deleteSelected: () => deleteNodes(selectedId ? [selectedId] : []),\n deleteEdges,\n deleteSelectedEdge: () => deleteEdges(selectedEdgeId ? [selectedEdgeId] : []),\n setEdgeLabel: (id, label) => flow.setEdges((all: Edge[]) => setEdgeLabel(all, id, label)),\n duplicateNode: (id) => {\n const src = flow.nodes.find((n) => n.id === id);\n if (!src) return null;\n const copy = cloneNode(src, newNodeId());\n flow.setNodes((all: FlowNode[]) => [...all, copy]);\n setSelectedId(copy.id);\n return copy.id;\n },\n setGraph: (graph) => flow.setGraph(graph),\n\n duplicateSelected,\n alignSelected,\n distributeSelected,\n copy: copySelection,\n cut: () => {\n copySelection();\n deleteNodes(selectedIds);\n },\n paste: pasteClipboard,\n\n addLane,\n assignToLane: (nodeId, laneId) => flow.setNodes((all: FlowNode[]) => assignToLaneOp(all, nodeId, laneId)),\n removeFromLane: (nodeId) => flow.setNodes((all: FlowNode[]) => removeFromLaneOp(all, nodeId)),\n // dagre is loaded lazily so it stays out of the eager bundle — consumers\n // who never tidy pay nothing for it.\n autoLayout: (opts) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, opts), edges: flow.edges }),\n );\n },\n tidyLane: (laneId) => {\n void import(\"../../layout\").then(({ autoLayout }) =>\n flow.setGraph({ nodes: autoLayout({ nodes: flow.nodes, edges: flow.edges }, { scope: laneId }), edges: flow.edges }),\n );\n },\n\n run: () => runner.run({ nodes: flow.nodes, edges: flow.edges }, runExecutors),\n cancel: runner.cancel,\n reset: runner.reset,\n\n toWorkflow,\n exportWorkflow: () => downloadWorkflow(toWorkflow(), metadata),\n importWorkflow: () => pickWorkflow((graph) => flow.setGraph(graph)),\n\n fitView: () => rf.fitView({ padding: 0.2 }),\n\n undo: hist.undo,\n redo: hist.redo,\n canUndo: hist.canUndo,\n canRedo: hist.canRedo,\n };\n }, [flow, selectedId, selected, selectedEdgeId, selectedEdge, selectedIds, selectedNodes, runner, runExecutors, metadata, addNode, deleteNodes, deleteEdges, duplicateSelected, alignSelected, distributeSelected, copySelection, pasteClipboard, addLane, hist, rf]);\n\n useImperativeHandle(apiRef, () => api, [api]);\n\n const dropHandlers = paletteDropHandlers((kindName, evt) => {\n const point = rf.screenToFlowPosition({ x: evt.clientX, y: evt.clientY });\n addNode(kindName, { x: point.x - 100, y: point.y - 30 });\n });\n\n const startActions = actions.filter((a) => a.placement === \"start\");\n const endActions = actions.filter((a) => a.placement !== \"start\");\n\n const toolbar = slots.toolbar ? (\n slots.toolbar(api)\n ) : (\n <>\n {startActions.map((a) => renderAction(a, api))}\n {builtins.run !== false && (\n <FlowRunControls running={api.running} onRun={api.run} onCancel={api.cancel} onReset={api.reset} />\n )}\n {builtins.history !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button\n className=\"ff-editor__btn\"\n data-action=\"undo\"\n title=\"Undo (Ctrl+Z)\"\n disabled={!api.canUndo}\n onClick={api.undo}\n >\n ↶ Undo\n </button>\n <button\n className=\"ff-editor__btn\"\n data-action=\"redo\"\n title=\"Redo (Ctrl+Shift+Z)\"\n disabled={!api.canRedo}\n onClick={api.redo}\n >\n ↷ Redo\n </button>\n </>\n )}\n {builtins.addLane !== false && (\n <>\n <span className=\"ff-editor__sep\" />\n <button className=\"ff-editor__btn\" data-action=\"add-lane\" title=\"Add a swimlane\" onClick={() => api.addLane()}>\n ▤ Lane\n </button>\n </>\n )}\n {builtins.autoLayout !== false && (\n <button className=\"ff-editor__btn\" data-action=\"auto-layout\" title=\"Tidy — auto-arrange\" onClick={() => api.autoLayout()}>\n ⤢ Tidy\n </button>\n )}\n {(builtins.export !== false || builtins.import !== false) && (\n <span className=\"ff-editor__sep\" />\n )}\n {/* Node deletion is not a toolbar button — it lives in NodeConfigPanel\n (see below), so the affordance is a property of the reusable panel\n rather than duplicated chrome that drifts. Keyboard Del/Backspace and\n the right-click menu still delete. `builtins.delete` gates the panel\n button. */}\n {builtins.export !== false && (\n <button className=\"ff-editor__btn\" data-action=\"export\" onClick={api.exportWorkflow}>↓ Export</button>\n )}\n {builtins.import !== false && (\n <button className=\"ff-editor__btn\" data-action=\"import\" onClick={api.importWorkflow}>↑ Import</button>\n )}\n {endActions.map((a) => renderAction(a, api))}\n {extraToolbar}\n {builtins.count !== false && (\n <span className=\"ff-editor__count\">{api.nodes.length} nodes · {api.edges.length} edges</span>\n )}\n </>\n );\n\n return (\n <FlowEditorProvider value={api}>\n {showPalette && (slots.palette ? slots.palette(api) : <NodePalette className=\"ff-editor__palette\" />)}\n <div className=\"ff-editor__main\" {...dropHandlers}>\n <FlowCanvas\n nodes={renderedNodes}\n edges={flow.edges}\n nodeTypes={nodeTypes}\n onNodesChange={flow.onNodesChange}\n onEdgesChange={flow.onEdgesChange}\n onConnect={flow.onConnect}\n // Drag an edge endpoint to rewire it; the new endpoint is validated by\n // the same isValidConnection rule (G2), so a bad reconnect is refused.\n onReconnect={onReconnect}\n edgesReconnectable\n // Snapshot the pre-drag graph once so a drag is a single undo step.\n onNodeDragStart={hist.onNodeDragStart}\n // Drop a node onto a lane to file it there (or drag it out to unfile).\n onNodeDragStop={handleNodeDragStop}\n onNodeClick={handleNodeClick}\n onNodeContextMenu={builtins.contextMenu === false ? undefined : handleNodeContextMenu}\n onEdgeClick={handleEdgeClick}\n onEdgeContextMenu={builtins.edgeContextMenu === false ? undefined : handleEdgeContextMenu}\n onEdgesDelete={(deleted: Edge[]) => onEdgeDelete?.(deleted.map((e) => e.id))}\n onNodesDelete={(deleted) => onDelete?.(deleted.map((n) => n.id))}\n // Stage the native (keyboard) delete path when a confirm gate is wired.\n onBeforeDelete={\n confirmDelete\n ? async ({ nodes, edges }) => confirmDelete({ nodes: nodes as FlowNode[], edges })\n : undefined\n }\n // Both keys delete, so muscle memory from either platform works.\n deleteKeyCode={[\"Delete\", \"Backspace\"]}\n height=\"100%\"\n toolbar={toolbar}\n {...canvasProps}\n />\n {slots.empty && api.nodes.length === 0 && (\n <div className=\"ff-editor__empty\">{slots.empty(api)}</div>\n )}\n {menu?.target.type === \"node\" && builtins.contextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n // Keep the outside-click listener from closing us before the click lands.\n onClick={(e) => e.stopPropagation()}\n >\n {slots.contextMenu ? (\n slots.contextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-duplicate\"\n onClick={() => { api.duplicateNode(menu.target.id); closeMenu(); }}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-delete\"\n onClick={() => { api.deleteNodes([menu.target.id]); closeMenu(); }}\n >\n Delete\n </button>\n </>\n )}\n </div>\n )}\n\n {menu?.target.type === \"edge\" && builtins.edgeContextMenu !== false && (\n <div\n className=\"ff-editor__ctx\"\n style={{ top: menu.y, left: menu.x }}\n role=\"menu\"\n onClick={(e) => e.stopPropagation()}\n >\n {slots.edgeContextMenu ? (\n slots.edgeContextMenu(api, menu.target.id, closeMenu)\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item\"\n data-action=\"ctx-edge-label\"\n onClick={() => {\n setLabelEdit({ x: menu.x, y: menu.y, edgeId: menu.target.id });\n setMenu(null);\n }}\n >\n Label…\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"ff-editor__ctx-item ff-editor__ctx-item--danger\"\n data-action=\"ctx-edge-delete\"\n onClick={() => { api.deleteEdges([menu.target.id]); closeMenu(); }}\n >\n Delete connection\n </button>\n </>\n )}\n </div>\n )}\n\n {labelEdit !== null && (\n <EdgeLabelEditor\n x={labelEdit.x}\n y={labelEdit.y}\n initial={\n (flow.edges.find((e: Edge) => e.id === labelEdit.edgeId)?.label as string | undefined) ?? \"\"\n }\n onCommit={(text) => {\n api.setEdgeLabel(labelEdit.edgeId, text);\n setLabelEdit(null);\n }}\n onCancel={() => setLabelEdit(null)}\n />\n )}\n {showFeed &&\n (slots.feed ? slots.feed(api) : <FlowRunFeed entries={runner.feed} running={api.running} className=\"ff-editor__feed\" />)}\n {prompt && (\n <HumanPrompt\n request={prompt}\n onCancel={() => { setPrompt(null); runner.cancel(); }}\n fieldRenderers={humanFieldRenderers}\n />\n )}\n </div>\n {showPanel &&\n (slots.panel ? (\n slots.panel(api)\n ) : (\n <div className=\"ff-editor__panel-wrap\">\n <NodeConfigPanel\n className=\"ff-editor__panel\"\n node={api.selected}\n onChange={api.updateNode}\n fieldRenderers={fieldRenderers}\n fieldFilter={fieldFilter}\n // The editor already holds the graph; passing it is what turns the\n // {{ }} picker from a static list into a context-aware one.\n graph={flow}\n // The delete affordance lives IN the panel (one source of truth),\n // not a private FlowEditor toolbar button — so a dev composing\n // their own editor from NodeConfigPanel gets it for free.\n onDelete={builtins.delete === false ? undefined : (n) => api.deleteNodes([n.id])}\n />\n {slots.panelFooter && <div className=\"ff-editor__panel-footer\">{slots.panelFooter(api)}</div>}\n </div>\n ))}\n </FlowEditorProvider>\n );\n}\n\nfunction renderAction(action: FlowEditorAction, api: FlowEditorApi) {\n if (action.visible && !action.visible(api)) return null;\n const disabled = action.disabled ? action.disabled(api) : action.requiresSelection === true && api.selected === null;\n return (\n <button\n key={action.id}\n className=\"ff-editor__btn\"\n data-action={action.id}\n title={action.title}\n disabled={disabled}\n onClick={() => action.onSelect(api)}\n >\n {action.label}\n </button>\n );\n}\n\nfunction newNodeId(): string {\n return `n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n}\n\nfunction downloadWorkflow(schema: WorkflowSchema, metadata?: WorkflowMetadata) {\n const url = URL.createObjectURL(workflowToBlob(schema));\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${metadata?.id ?? \"workflow\"}.json`;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nfunction pickWorkflow(onLoad: (graph: FlowGraph) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"application/json\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const result = importWorkflow(JSON.parse(await file.text()), { lenient: true });\n onLoad(result.graph);\n } catch (e) {\n console.error(\"import failed\", e);\n }\n };\n input.click();\n}\n\n/**\n * Build a UseFlowStateReturn-shaped adapter that proxies through to the\n * host's onChange. Edits route through onChange; reads come from `value`.\n */\nfunction makeControlledFlowAdapter(\n value: FlowGraph,\n onChange?: (graph: FlowGraph) => void,\n): UseFlowStateReturn {\n const apply = (next: FlowGraph) => onChange?.(next);\n return {\n nodes: value.nodes,\n edges: value.edges,\n setNodes: (next) => {\n const nextNodes = typeof next === \"function\" ? (next as any)(value.nodes) : next;\n apply({ nodes: nextNodes, edges: value.edges });\n },\n setEdges: (next) => {\n const nextEdges = typeof next === \"function\" ? (next as any)(value.edges) : next;\n apply({ nodes: value.nodes, edges: nextEdges });\n },\n // Atomic both-at-once commit — the reason this exists (see UseFlowStateReturn).\n setGraph: (graph) => apply(graph),\n onNodesChange: (changes) => {\n apply({ nodes: applyNodeChanges(changes, value.nodes) as any, edges: value.edges });\n },\n onEdgesChange: (changes) => {\n apply({ nodes: value.nodes, edges: applyEdgeChanges(changes, value.edges) });\n },\n onConnect: (connection: Connection) => {\n apply({ nodes: value.nodes, edges: addEdge(connection, value.edges) as Edge[] });\n },\n toGraph: () => value,\n };\n}\n\n/**\n * EdgeLabelEditor — small popover for naming a connection.\n *\n * Anchored in viewport coords like the context menu it replaces. Enter\n * commits, Escape cancels, blur commits (so clicking away doesn't silently\n * discard the edit).\n */\nfunction EdgeLabelEditor({\n x,\n y,\n initial,\n onCommit,\n onCancel,\n}: {\n x: number;\n y: number;\n initial: string;\n onCommit: (text: string) => void;\n onCancel: () => void;\n}) {\n const [text, setText] = useState(initial);\n const ref = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n return (\n <div\n className=\"ff-editor__ctx ff-editor__edge-label\"\n style={{ top: y, left: x }}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n ref={ref}\n className=\"ff-panel__input\"\n value={text}\n placeholder=\"Label this connection\"\n aria-label=\"Connection label\"\n data-action=\"edge-label-input\"\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n // Stop the canvas seeing these — Backspace would delete the edge\n // out from under the editor.\n e.stopPropagation();\n if (e.key === \"Enter\") onCommit(text);\n if (e.key === \"Escape\") onCancel();\n }}\n onBlur={() => onCommit(text)}\n />\n </div>\n );\n}\n","/**\n * Authoring API for custom node kinds. The point of this file is to keep\n * consumers from importing @xyflow/react directly when they write a node —\n * they get `defineNode` + `<NodePort>` from us, and we hold the seam.\n *\n * Internal node code (NodeShell, RegistryNode, FlowCanvas) still imports\n * from @xyflow/react directly. The hiding is only for the public authoring\n * surface.\n */\nimport { memo, type ComponentType, type CSSProperties, type ReactNode } from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport type { FlowNode } from \"../../types\";\n\n/**\n * Subset of NodeProps that the typical node author cares about. Strips the\n * react-flow-specific surface (xPos, yPos, dragging, zIndex, isConnectable,\n * targetPosition, sourcePosition, etc.) — if you need any of that you can\n * still import directly, but you usually don't.\n */\nexport interface FlowNodeRenderProps<TData = unknown> {\n id: string;\n data: TData;\n selected: boolean;\n}\n\n/**\n * Wraps a render function as a memoized node component compatible with the\n * underlying flow engine.\n *\n * const MyNode = defineNode<MyData>(({ data, selected }) => (\n * <div>\n * <NodePort side=\"left\" type=\"target\" />\n * <span>{data.label}</span>\n * <NodePort side=\"right\" type=\"source\" />\n * </div>\n * ));\n */\nexport function defineNode<TData = unknown>(\n render: (props: FlowNodeRenderProps<TData>) => ReactNode,\n): ComponentType<NodeProps<FlowNode>> {\n function Wrapped(props: NodeProps<FlowNode>) {\n return render({\n id: props.id,\n data: props.data as TData,\n selected: Boolean(props.selected),\n });\n }\n Wrapped.displayName = \"FancyFlowNode\";\n return memo(Wrapped);\n}\n\nexport type NodePortSide = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport type NodePortType = \"source\" | \"target\";\n\nconst POSITION_MAP: Record<NodePortSide, Position> = {\n left: Position.Left,\n right: Position.Right,\n top: Position.Top,\n bottom: Position.Bottom,\n};\n\nexport interface NodePortProps {\n /** Which edge of the node the port docks on. */\n side: NodePortSide;\n /** Direction of data flow. `source` emits; `target` receives. */\n type: NodePortType;\n /** Stable id — required when a node has multiple ports on the same side. */\n id?: string;\n style?: CSSProperties;\n title?: string;\n className?: string;\n}\n\n/**\n * Connection handle. Render one per port; the flow engine wires edges to\n * matching `id`s on the source and target nodes.\n *\n * <NodePort side=\"left\" type=\"target\" id=\"in\" />\n * <NodePort side=\"right\" type=\"source\" id=\"ok\" title=\"success\" />\n * <NodePort side=\"right\" type=\"source\" id=\"err\" title=\"error\" style={{ top: '70%' }} />\n */\nexport function NodePort({ side, type, id, style, title, className }: NodePortProps) {\n return (\n <Handle\n position={POSITION_MAP[side]}\n type={type}\n id={id}\n style={style}\n title={title}\n className={className}\n />\n );\n}\n","import type { LiveContract } from \"@particle-academy/fancy-query\";\n\n/**\n * The fancy-flow Live Contract — the run / job stream shape.\n *\n * Pure data, with `LiveContract` imported as a TYPE, so this adds no dependency.\n * `FancyFlow\\Laravel\\LiveContract` declares the identical list and both sides\n * assert parity.\n *\n * ## What makes this shape different\n *\n * A run emits far more than it stores. `NodeStatusChanged` and `NodeOutput`\n * fire per node, many times a second on a wide graph — and a node's log line is\n * not a cache entry, it is a **stream**. So the contract covers the run's\n * DURABLE state (does this run exist, has it finished, is it waiting on a\n * person) and deliberately leaves per-node chatter to `useFancyStream`, the\n * same split the whiteboard makes between its document and its cursors.\n *\n * Get that wrong and a 40-node run invalidates the run list forty times while\n * it executes, each one a re-fetch that tells the UI nothing it did not already\n * learn from the stream.\n *\n * ## `awaiting` is the one that matters\n *\n * A run parking on a human step is the event a host most needs to react to —\n * it is when a form has to appear in front of somebody. It gets its own event\n * rather than folding into `updated`, so a host can subscribe to just that.\n *\n * ## Broadcast status, stated plainly\n *\n * `fancy-flow-php` currently dispatches these as **in-process Laravel events**;\n * none of them implement `ShouldBroadcast` yet. This contract is therefore the\n * agreed vocabulary rather than a description of traffic already on the wire: a\n * host that wants live runs today re-broadcasts these under these names. Making\n * the PHP events broadcast natively is a separate change, because it turns on\n * websocket traffic for every consumer.\n */\nexport const flowLive = {\n namespace: \"flow\",\n events: [\n { event: \"flow.run.created\", keys: [[\"flow\", \"runs\"]] },\n { event: \"flow.run.updated\", keys: [[\"flow\", \"runs\"]] },\n { event: \"flow.run.completed\", keys: [[\"flow\", \"runs\"]] },\n {\n event: \"flow.run.awaiting\",\n keys: [[\"flow\", \"runs\"]],\n note: \"A run parking on a human step — the moment a form has to appear in front of somebody. Its own event so a host can subscribe to just that, rather than filtering every update.\",\n },\n {\n event: \"flow.run.failed\",\n keys: [[\"flow\", \"runs\"]],\n note: \"Not one of the standard verbs: a failed run is a terminal state a host renders differently from a completed one, so collapsing the two would lose the distinction.\",\n },\n ],\n} as const satisfies LiveContract;\n\n/**\n * Per-run keys, for a host showing a single run rather than the list.\n *\n * The contract declares prefixes because it is static data and a run id is not\n * known until runtime. TanStack matches by prefix, so `[\"flow\", \"runs\"]` still\n * invalidates `[\"flow\", \"runs\", runId]`.\n */\nexport const flowKeys = {\n runs: () => [\"flow\", \"runs\"] as const,\n run: (runId: string) => [\"flow\", \"runs\", runId] as const,\n} as const;\n","// Public surface for @particle-academy/fancy-flow.\n\n// Register the built-in agentic kit. The registry ALSO ensures this itself on\n// first use, so a consumer importing a subpath (or only types) still gets the\n// kit -- this call just makes it eager for the common root import. Hosts can\n// replace individual kinds via re-registration after it fires.\nimport { ensureBuiltinKinds } from \"./registry/registry\";\nensureBuiltinKinds();\n\n// Editor\nexport { FlowCanvas, type FlowCanvasProps } from \"./components/canvas\";\nexport {\n FlowEditor,\n useFlowEditor,\n useFlowEditorOptional,\n type FlowEditorProps,\n type FlowEditorApi,\n type FlowEditorAction,\n type FlowEditorBuiltins,\n type FlowEditorSlots,\n cloneSubgraph,\n reconnectEdge,\n alignNodes,\n distributeNodes,\n type AlignEdge,\n} from \"./components/FlowEditor\";\nexport { NodePalette, paletteDropHandlers, type NodePaletteProps } from \"./components/NodePalette\";\nexport {\n FlowViewer,\n type FlowViewerProps,\n type FlowViewerClassNames,\n type FlowNodeStatus,\n} from \"./components/FlowViewer\";\nexport {\n NodeConfigPanel,\n ConfigFieldRenderer,\n type ConfigFieldRenderFn,\n type ConfigFieldRenderContext,\n type NodeConfigPanelProps,\n type ConfigFieldRendererProps,\n} from \"./components/NodeConfigPanel\";\n\n// Legacy 6-pack (kept for backwards compat with v0.1; new work uses the registry)\nexport {\n TriggerNode,\n ActionNode,\n DecisionNode,\n OutputNode,\n NoteNode,\n SubgraphNode,\n LaneNode,\n NodeShell,\n defaultNodeTypes,\n type NodeShellProps,\n} from \"./components/nodes\";\n\n// Authoring API for custom node kinds — defineNode + NodePort. Consumers\n// who write their own nodes use these instead of importing @xyflow/react,\n// which keeps the underlying engine swappable and avoids react-flow types\n// leaking into application code.\nexport {\n defineNode,\n NodePort,\n type FlowNodeRenderProps,\n type NodePortProps,\n type NodePortSide,\n type NodePortType,\n} from \"./components/nodes/api\";\n\nexport { FlowRunControls, type FlowRunControlsProps } from \"./components/FlowRunControls\";\nexport { FlowRunFeed, type FlowRunFeedProps } from \"./components/FlowRunFeed\";\n\n// Registry (also: fancy-flow/registry)\nexport {\n registerNodeKind,\n overrideNodeKind,\n clearNodeKindOverrides,\n type NodeKindPresentation,\n getNodeKind,\n listNodeKinds,\n onNodeKindsChanged,\n defaultConfigFor,\n validateConfig,\n categoryAccent,\n buildNodeTypes,\n RegistryNode,\n registerBuiltinKinds,\n ensureBuiltinKinds,\n BUILTIN_KINDS,\n resolvePortSpec,\n resolveNodePorts,\n createConnectionValidator,\n defaultPortCompatibility,\n ANY_PORT_TYPE,\n type PortCompatibility,\n type ConnectionValidatorOptions,\n registerRichInputAdapter,\n getRichInputAdapter,\n isRichInputEnabled,\n onRichInputAdapterChanged,\n RichInputPreview,\n type RichInputAdapter,\n type NodeKindDefinition,\n type EmitsRelation,\n type NodeCategory,\n type ConfigField,\n type RepeaterConfigField,\n type RepeaterRowField,\n type KeyValueConfigField,\n type DocumentConfigField,\n type PortSpec,\n type RenderBodyContext,\n pauseForHuman,\n encodePause,\n decodePause,\n isPause,\n PAUSE_PREFIX,\n LEGACY_PAUSE_PREFIXES,\n type PauseAwaiting,\n type PauseSignal,\n} from \"./registry\";\n\n// Schema (also: fancy-flow/schema)\nexport {\n exportWorkflow,\n importWorkflow,\n migrateSchema,\n workflowToBlob,\n WORKFLOW_SCHEMA_VERSION,\n WORKFLOW_SCHEMA_URL,\n type WorkflowSchema,\n type WorkflowSchemaNode,\n type WorkflowSchemaEdge,\n type WorkflowMetadata,\n type ImportIssue,\n type ImportResult,\n type ImportOptions,\n} from \"./schema\";\n\n// Runtime (also: fancy-flow/runtime)\nexport {\n runFlow,\n runCohort,\n useFlowRun,\n useFlowState,\n useFlowHistory,\n createHistory,\n applyStatusesToNodes,\n applyOutputsToNodes,\n type RunOptions,\n type RunResult,\n type CohortGuard,\n type CohortOptions,\n type CohortPolicy,\n type CohortResult,\n type UseFlowRunReturn,\n type UseFlowRunOptions,\n type UseFlowStateReturn,\n type UseFlowHistoryReturn,\n type HistoryController,\n type FlowRunFeedEntry,\n} from \"./runtime\";\n\n// Auto-layout types (the value `autoLayout` lives on the `fancy-flow/layout`\n// subpath so dagre stays out of the eager bundle; it's also on `api.autoLayout`).\nexport type { AutoLayoutOptions, AutoLayoutDirection } from \"./layout\";\n\n// Domain types\nexport type {\n FlowNode,\n FlowEdge,\n FlowGraph,\n FlowNodeData,\n FlowNodeKind,\n TriggerNodeData,\n ActionNodeData,\n DecisionNodeData,\n OutputNodeData,\n NoteNodeData,\n SubgraphNodeData,\n BaseNodeData,\n PortDescriptor,\n NodeRunStatus,\n NodeExecutor,\n ExecutorRegistry,\n RunEvent,\n} from \"./types\";\n\nexport { flowLive, flowKeys } from \"./live\";\n\n// Expression authoring — what an author can write in a `{{ }}` field at a given\n// node, and the reference help that explains the grammar (issue #5).\nexport {\n availableVariables,\n baseVariables,\n describeExpressionGrammar,\n outputFieldsFor,\n} from \"./expressions/variables\";\nexport type {\n AvailableVariable,\n ExpressionForm,\n ExpressionGrammarHelp,\n OutputField,\n OutputShape,\n} from \"./expressions/variables\";\nexport { ExpressionField } from \"./components/NodeConfigPanel/ExpressionField\";\nexport type { ExpressionFieldProps } from \"./components/NodeConfigPanel/ExpressionField\";\n\n// `{{ }}` resolution — the TypeScript twin of fancy-flow-php's `Expr`.\n//\n// OPT-IN: `runFlow` does not call these. It hands config to your executor\n// verbatim, and every host using `{{ }}` today already resolves it itself, so\n// resolving inside the runtime would interpolate a second time over values\n// those hosts had already substituted. Call it yourself where you want it.\nexport {\n evaluateExpression,\n evaluateConfig,\n resolvePath,\n tryResolvePath,\n UnresolvedPathError,\n truthy,\n text,\n} from \"./expressions/expr\";\nexport type {\n ExprContext,\n ExprValue,\n EvaluateOptions,\n Resolution,\n UnresolvedPolicy,\n} from \"./expressions/expr\";\n"]}
|