@particle-academy/fancy-flow 0.53.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/{ConfigFieldRenderer-Bc9Txnql.d.cts → HumanPrompt-CPl-Spmp.d.cts} +75 -1
  2. package/dist/{ConfigFieldRenderer-Bt3RGT7Z.d.ts → HumanPrompt-DlJSFi3F.d.ts} +75 -1
  3. package/dist/{chunk-CIBW5ATA.js → chunk-22OJOD4X.js} +7 -3
  4. package/dist/chunk-22OJOD4X.js.map +1 -0
  5. package/dist/{chunk-VWANLNL5.js → chunk-E3AGYTHP.js} +3 -3
  6. package/dist/{chunk-VWANLNL5.js.map → chunk-E3AGYTHP.js.map} +1 -1
  7. package/dist/{chunk-FTGVVKWX.js → chunk-HMEI2LFU.js} +4 -4
  8. package/dist/{chunk-FTGVVKWX.js.map → chunk-HMEI2LFU.js.map} +1 -1
  9. package/dist/{chunk-WCFRKXH5.js → chunk-KP4TBF3A.js} +3 -3
  10. package/dist/{chunk-WCFRKXH5.js.map → chunk-KP4TBF3A.js.map} +1 -1
  11. package/dist/{chunk-FG3C7LIG.js → chunk-L4QAAGLV.js} +3 -3
  12. package/dist/{chunk-FG3C7LIG.js.map → chunk-L4QAAGLV.js.map} +1 -1
  13. package/dist/{chunk-FH6MWLKD.js → chunk-YVLOLS25.js} +3 -3
  14. package/dist/{chunk-FH6MWLKD.js.map → chunk-YVLOLS25.js.map} +1 -1
  15. package/dist/durable/index.d.cts +1 -1
  16. package/dist/durable/index.d.ts +1 -1
  17. package/dist/durable.cjs +5 -1
  18. package/dist/durable.cjs.map +1 -1
  19. package/dist/durable.js +1 -1
  20. package/dist/engine.cjs +5 -1
  21. package/dist/engine.cjs.map +1 -1
  22. package/dist/engine.d.cts +2 -2
  23. package/dist/engine.d.ts +2 -2
  24. package/dist/engine.js +3 -3
  25. package/dist/fields/react-fancy.cjs +66 -0
  26. package/dist/fields/react-fancy.cjs.map +1 -1
  27. package/dist/fields/react-fancy.d.cts +35 -2
  28. package/dist/fields/react-fancy.d.ts +35 -2
  29. package/dist/fields/react-fancy.js +67 -2
  30. package/dist/fields/react-fancy.js.map +1 -1
  31. package/dist/index.cjs +34 -10
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +15 -4
  34. package/dist/index.d.ts +15 -4
  35. package/dist/index.js +40 -20
  36. package/dist/index.js.map +1 -1
  37. package/dist/registry.cjs +5 -1
  38. package/dist/registry.cjs.map +1 -1
  39. package/dist/registry.js +2 -2
  40. package/dist/{run-cohort-BPIOpE8A.d.ts → run-cohort-C1nRh_mi.d.ts} +1 -1
  41. package/dist/{run-cohort-r-L8dMED.d.cts → run-cohort-CBRAUj-z.d.cts} +1 -1
  42. package/dist/{run-flow-COdAOFg2.d.cts → run-flow-2XsHBwpd.d.cts} +31 -0
  43. package/dist/{run-flow-DJ7KYT6E.d.ts → run-flow-D7AOCcfE.d.ts} +31 -0
  44. package/dist/runtime/index.d.cts +3 -3
  45. package/dist/runtime/index.d.ts +3 -3
  46. package/dist/runtime.cjs +5 -1
  47. package/dist/runtime.cjs.map +1 -1
  48. package/dist/runtime.js +3 -3
  49. package/dist/schema.cjs +5 -1
  50. package/dist/schema.cjs.map +1 -1
  51. package/dist/schema.js +2 -2
  52. package/dist/screens.cjs +5 -1
  53. package/dist/screens.cjs.map +1 -1
  54. package/dist/screens.js +4 -4
  55. package/dist/ux.cjs +5 -1
  56. package/dist/ux.cjs.map +1 -1
  57. package/dist/ux.js +1 -1
  58. package/package.json +2 -2
  59. package/dist/chunk-CIBW5ATA.js.map +0 -1
package/dist/index.d.cts CHANGED
@@ -5,8 +5,8 @@ import { ConnectionValidatorOptions } from './registry/index.cjs';
5
5
  export { ANY_PORT_TYPE, BUILTIN_KINDS, PortCompatibility, RegistryNode, RichInputAdapter, RichInputPreview, buildNodeTypes, createConnectionValidator, defaultPortCompatibility, getRichInputAdapter, isRichInputEnabled, onRichInputAdapterChanged, registerBuiltinKinds, registerRichInputAdapter, resolveNodePorts, resolvePortSpec } from './registry/index.cjs';
6
6
  import { a as FlowNode, F as FlowGraph, g as NodeRunStatus, E as ExecutorRegistry } from './types-JFYjPJAG.cjs';
7
7
  export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, d as FlowEdge, e as FlowNodeData, f as FlowNodeKind, N as NodeExecutor, h as NoteNodeData, O as OutputNodeData, P as PortDescriptor, R as RunEvent, S as SubgraphNodeData, T as TriggerNodeData } from './types-JFYjPJAG.cjs';
8
- import { C as ConfigFieldRenderFn } from './ConfigFieldRenderer-Bc9Txnql.cjs';
9
- export { a as ConfigFieldRenderContext, b as ConfigFieldRenderer, c as ConfigFieldRendererProps } from './ConfigFieldRenderer-Bc9Txnql.cjs';
8
+ import { C as ConfigFieldRenderFn, H as HumanFieldRenderers } from './HumanPrompt-CPl-Spmp.cjs';
9
+ export { a as ConfigFieldRenderContext, b as ConfigFieldRenderer, c as ConfigFieldRendererProps } from './HumanPrompt-CPl-Spmp.cjs';
10
10
  import { WorkflowSchema, WorkflowMetadata } from './schema/index.cjs';
11
11
  export { ImportIssue, ImportOptions, ImportResult, WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, WorkflowSchemaEdge, WorkflowSchemaNode, exportWorkflow, importWorkflow, migrateSchema, workflowToBlob } from './schema/index.cjs';
12
12
  import { AutoLayoutOptions } from './layout/index.cjs';
@@ -16,8 +16,8 @@ export { A as AvailableVariable, C as ConfigField, D as DocumentConfigField, r a
16
16
  export { F as FlowNodeStatus, a as FlowViewer, b as FlowViewerClassNames, c as FlowViewerProps } from './FlowViewer-DABx-6A-.cjs';
17
17
  import { FlowRunFeedEntry } from './runtime/index.cjs';
18
18
  export { HistoryController, UseFlowHistoryReturn, UseFlowRunOptions, UseFlowRunReturn, UseFlowStateReturn, applyOutputsToNodes, applyStatusesToNodes, createHistory, useFlowHistory, useFlowRun, useFlowState } from './runtime/index.cjs';
19
- export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-COdAOFg2.cjs';
20
- export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-r-L8dMED.cjs';
19
+ export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-2XsHBwpd.cjs';
20
+ export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-CBRAUj-z.cjs';
21
21
  export { L as LEGACY_PAUSE_PREFIXES, a as PAUSE_PREFIX, P as PauseAwaiting, b as PauseSignal, d as decodePause, e as encodePause, i as isPause, p as pauseForHuman } from './pause-9iT4tCEV.cjs';
22
22
  export { N as NodeKindPresentation, c as categoryAccent, b as clearNodeKindOverrides, d as defaultConfigFor, e as ensureBuiltinKinds, g as getNodeKind, l as listNodeKinds, o as onNodeKindsChanged, f as overrideNodeKind, r as registerNodeKind, v as validateConfig } from './registry-C6TMfiD_.cjs';
23
23
  import './capabilities-BYa5p5jw.cjs';
@@ -321,6 +321,17 @@ type FlowEditorProps = {
321
321
  value?: FlowGraph;
322
322
  /** Executor registry passed to runFlow. Each kind name maps to an executor. */
323
323
  executors?: ExecutorRegistry;
324
+ /**
325
+ * Host controls for the `user_input` / `human_approval` pause form, keyed by
326
+ * canonical field type. A renderer returning `null` declines that field and
327
+ * falls through to the built-in, so a PARTIAL map is safe to spread.
328
+ *
329
+ * The built-ins are native `--ff-*`-themed elements because react-fancy is an
330
+ * OPTIONAL peer and this component ships in the main entry. A host that has
331
+ * react-fancy opts into its primitives with
332
+ * `humanFieldRenderers` from `@particle-academy/fancy-flow/fields/react-fancy`.
333
+ */
334
+ humanFieldRenderers?: HumanFieldRenderers;
324
335
  /** Saved metadata for export. */
325
336
  metadata?: WorkflowMetadata;
326
337
  /** Show the palette sidebar. Default true. */
package/dist/index.d.ts CHANGED
@@ -5,8 +5,8 @@ import { ConnectionValidatorOptions } from './registry/index.js';
5
5
  export { ANY_PORT_TYPE, BUILTIN_KINDS, PortCompatibility, RegistryNode, RichInputAdapter, RichInputPreview, buildNodeTypes, createConnectionValidator, defaultPortCompatibility, getRichInputAdapter, isRichInputEnabled, onRichInputAdapterChanged, registerBuiltinKinds, registerRichInputAdapter, resolveNodePorts, resolvePortSpec } from './registry/index.js';
6
6
  import { a as FlowNode, F as FlowGraph, g as NodeRunStatus, E as ExecutorRegistry } from './types-JFYjPJAG.js';
7
7
  export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, d as FlowEdge, e as FlowNodeData, f as FlowNodeKind, N as NodeExecutor, h as NoteNodeData, O as OutputNodeData, P as PortDescriptor, R as RunEvent, S as SubgraphNodeData, T as TriggerNodeData } from './types-JFYjPJAG.js';
8
- import { C as ConfigFieldRenderFn } from './ConfigFieldRenderer-Bt3RGT7Z.js';
9
- export { a as ConfigFieldRenderContext, b as ConfigFieldRenderer, c as ConfigFieldRendererProps } from './ConfigFieldRenderer-Bt3RGT7Z.js';
8
+ import { C as ConfigFieldRenderFn, H as HumanFieldRenderers } from './HumanPrompt-DlJSFi3F.js';
9
+ export { a as ConfigFieldRenderContext, b as ConfigFieldRenderer, c as ConfigFieldRendererProps } from './HumanPrompt-DlJSFi3F.js';
10
10
  import { WorkflowSchema, WorkflowMetadata } from './schema/index.js';
11
11
  export { ImportIssue, ImportOptions, ImportResult, WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, WorkflowSchemaEdge, WorkflowSchemaNode, exportWorkflow, importWorkflow, migrateSchema, workflowToBlob } from './schema/index.js';
12
12
  import { AutoLayoutOptions } from './layout/index.js';
@@ -16,8 +16,8 @@ export { A as AvailableVariable, C as ConfigField, D as DocumentConfigField, r a
16
16
  export { F as FlowNodeStatus, a as FlowViewer, b as FlowViewerClassNames, c as FlowViewerProps } from './FlowViewer-BI_AyyvU.js';
17
17
  import { FlowRunFeedEntry } from './runtime/index.js';
18
18
  export { HistoryController, UseFlowHistoryReturn, UseFlowRunOptions, UseFlowRunReturn, UseFlowStateReturn, applyOutputsToNodes, applyStatusesToNodes, createHistory, useFlowHistory, useFlowRun, useFlowState } from './runtime/index.js';
19
- export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-DJ7KYT6E.js';
20
- export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-BPIOpE8A.js';
19
+ export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-D7AOCcfE.js';
20
+ export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-C1nRh_mi.js';
21
21
  export { L as LEGACY_PAUSE_PREFIXES, a as PAUSE_PREFIX, P as PauseAwaiting, b as PauseSignal, d as decodePause, e as encodePause, i as isPause, p as pauseForHuman } from './pause-9iT4tCEV.js';
22
22
  export { N as NodeKindPresentation, c as categoryAccent, b as clearNodeKindOverrides, d as defaultConfigFor, e as ensureBuiltinKinds, g as getNodeKind, l as listNodeKinds, o as onNodeKindsChanged, f as overrideNodeKind, r as registerNodeKind, v as validateConfig } from './registry-3RkSYrMi.js';
23
23
  import './capabilities-COOXRiNL.js';
@@ -321,6 +321,17 @@ type FlowEditorProps = {
321
321
  value?: FlowGraph;
322
322
  /** Executor registry passed to runFlow. Each kind name maps to an executor. */
323
323
  executors?: ExecutorRegistry;
324
+ /**
325
+ * Host controls for the `user_input` / `human_approval` pause form, keyed by
326
+ * canonical field type. A renderer returning `null` declines that field and
327
+ * falls through to the built-in, so a PARTIAL map is safe to spread.
328
+ *
329
+ * The built-ins are native `--ff-*`-themed elements because react-fancy is an
330
+ * OPTIONAL peer and this component ships in the main entry. A host that has
331
+ * react-fancy opts into its primitives with
332
+ * `humanFieldRenderers` from `@particle-academy/fancy-flow/fields/react-fancy`.
333
+ */
334
+ humanFieldRenderers?: HumanFieldRenderers;
324
335
  /** Saved metadata for export. */
325
336
  metadata?: WorkflowMetadata;
326
337
  /** Show the palette sidebar. Default true. */
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
- import { removeNodes, removeEdges, cloneSubgraph, alignNodes, distributeNodes, reconnectEdge, assignToLane, removeFromLane, duplicateNode, setEdgeLabel, FlowCanvas } from './chunk-FTGVVKWX.js';
2
- export { ActionNode, DecisionNode, FlowCanvas, FlowViewer, NodeShell, OutputNode, SubgraphNode, TriggerNode, alignNodes, cloneSubgraph, defaultNodeTypes, distributeNodes, reconnectEdge } from './chunk-FTGVVKWX.js';
3
- import { useFlowState, useFlowRun, useFlowHistory, applyOutputsToNodes, applyStatusesToNodes } from './chunk-FG3C7LIG.js';
4
- export { applyOutputsToNodes, applyStatusesToNodes, createHistory, useFlowHistory, useFlowRun, useFlowState } from './chunk-FG3C7LIG.js';
5
- export { runCohort } from './chunk-WCFRKXH5.js';
1
+ import { removeNodes, removeEdges, cloneSubgraph, alignNodes, distributeNodes, reconnectEdge, assignToLane, removeFromLane, duplicateNode, setEdgeLabel, FlowCanvas } from './chunk-HMEI2LFU.js';
2
+ export { ActionNode, DecisionNode, FlowCanvas, FlowViewer, NodeShell, OutputNode, SubgraphNode, TriggerNode, alignNodes, cloneSubgraph, defaultNodeTypes, distributeNodes, reconnectEdge } from './chunk-HMEI2LFU.js';
3
+ import { useFlowState, useFlowRun, useFlowHistory, applyOutputsToNodes, applyStatusesToNodes } from './chunk-L4QAAGLV.js';
4
+ export { applyOutputsToNodes, applyStatusesToNodes, createHistory, useFlowHistory, useFlowRun, useFlowState } from './chunk-L4QAAGLV.js';
5
+ export { runCohort } from './chunk-KP4TBF3A.js';
6
6
  export { evaluateConfig, evaluateExpression, resolvePath, text, truthy } from './chunk-BHM5HGXH.js';
7
- import { buildNodeTypes } from './chunk-VWANLNL5.js';
8
- export { ANY_PORT_TYPE, RegistryNode, buildNodeTypes, createConnectionValidator, defaultPortCompatibility } from './chunk-VWANLNL5.js';
7
+ import { buildNodeTypes } from './chunk-E3AGYTHP.js';
8
+ export { ANY_PORT_TYPE, RegistryNode, buildNodeTypes, createConnectionValidator, defaultPortCompatibility } from './chunk-E3AGYTHP.js';
9
9
  export { LEGACY_PAUSE_PREFIXES, PAUSE_PREFIX, decodePause, encodePause, isPause, pauseForHuman } from './chunk-UEOE6B52.js';
10
- import { workflowToBlob, importWorkflow, exportWorkflow } from './chunk-FH6MWLKD.js';
11
- export { WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, exportWorkflow, importWorkflow, migrateSchema, workflowToBlob } from './chunk-FH6MWLKD.js';
12
- import { ReactFlowProvider, useReactFlow, humanInputFields, onNodeKindsChanged, listNodeKinds, getNodeKind, defaultConfigFor, FlowEditorProvider, addEdge, applyEdgeChanges, applyNodeChanges, Position, ensureBuiltinKinds, validateConfig, categoryAccent, Handle } from './chunk-CIBW5ATA.js';
13
- export { BUILTIN_KINDS, LaneNode, NoteNode, categoryAccent, clearNodeKindOverrides, defaultConfigFor, ensureBuiltinKinds, getNodeKind, listNodeKinds, onNodeKindsChanged, overrideNodeKind, registerBuiltinKinds, registerNodeKind, resolveNodePorts, resolvePortSpec, runFlow, useFlowEditor, useFlowEditorOptional, validateConfig } from './chunk-CIBW5ATA.js';
10
+ import { workflowToBlob, importWorkflow, exportWorkflow } from './chunk-YVLOLS25.js';
11
+ export { WORKFLOW_SCHEMA_URL, WORKFLOW_SCHEMA_VERSION, exportWorkflow, importWorkflow, migrateSchema, workflowToBlob } from './chunk-YVLOLS25.js';
12
+ import { ReactFlowProvider, useReactFlow, humanInputFields, onNodeKindsChanged, listNodeKinds, getNodeKind, defaultConfigFor, FlowEditorProvider, addEdge, applyEdgeChanges, applyNodeChanges, Position, ensureBuiltinKinds, validateConfig, categoryAccent, Handle } from './chunk-22OJOD4X.js';
13
+ export { BUILTIN_KINDS, LaneNode, NoteNode, categoryAccent, clearNodeKindOverrides, defaultConfigFor, ensureBuiltinKinds, getNodeKind, listNodeKinds, onNodeKindsChanged, overrideNodeKind, registerBuiltinKinds, registerNodeKind, resolveNodePorts, resolvePortSpec, runFlow, useFlowEditor, useFlowEditorOptional, validateConfig } from './chunk-22OJOD4X.js';
14
14
  import { getRichInputAdapter } from './chunk-F5RPRB7A.js';
15
15
  export { RichInputPreview, getRichInputAdapter, isRichInputEnabled, onRichInputAdapterChanged, registerRichInputAdapter } from './chunk-F5RPRB7A.js';
16
16
  import './chunk-USL4FMFU.js';
@@ -998,7 +998,11 @@ function initialValues(fields) {
998
998
  }
999
999
  return v;
1000
1000
  }
1001
- function HumanPrompt({ request, onCancel }) {
1001
+ function HumanPrompt({
1002
+ request,
1003
+ onCancel,
1004
+ fieldRenderers
1005
+ }) {
1002
1006
  const firstRef = useRef(null);
1003
1007
  useEffect(() => {
1004
1008
  firstRef.current?.focus();
@@ -1010,7 +1014,7 @@ function HumanPrompt({ request, onCancel }) {
1010
1014
  }, [onCancel]);
1011
1015
  return /* @__PURE__ */ jsx("div", { className: "ff-prompt-overlay", role: "dialog", "aria-modal": "true", "aria-label": request.title, children: /* @__PURE__ */ jsxs("div", { className: "ff-prompt", onClick: (e) => e.stopPropagation(), children: [
1012
1016
  /* @__PURE__ */ jsx("div", { className: "ff-prompt__title", children: request.title }),
1013
- request.kind === "approval" ? /* @__PURE__ */ jsx(ApprovalBody, { request, onCancel }) : /* @__PURE__ */ jsx(InputBody, { request, onCancel, firstRef })
1017
+ request.kind === "approval" ? /* @__PURE__ */ jsx(ApprovalBody, { request, onCancel }) : /* @__PURE__ */ jsx(InputBody, { request, onCancel, firstRef, fieldRenderers })
1014
1018
  ] }) });
1015
1019
  }
1016
1020
  function ApprovalBody({ request, onCancel }) {
@@ -1026,7 +1030,8 @@ function ApprovalBody({ request, onCancel }) {
1026
1030
  function InputBody({
1027
1031
  request,
1028
1032
  onCancel,
1029
- firstRef
1033
+ firstRef,
1034
+ fieldRenderers
1030
1035
  }) {
1031
1036
  const [values, setValues] = useState(() => initialValues(request.fields));
1032
1037
  const set = (k, v) => setValues((prev) => ({ ...prev, [k]: v }));
@@ -1062,7 +1067,8 @@ function InputBody({
1062
1067
  id: fieldId(f.key),
1063
1068
  value: values[f.key],
1064
1069
  onChange: (v) => set(f.key, v),
1065
- autoFocusRef: i === 0 ? firstRef : void 0
1070
+ autoFocusRef: i === 0 ? firstRef : void 0,
1071
+ renderers: fieldRenderers
1066
1072
  }
1067
1073
  )
1068
1074
  ] }, f.key)) }),
@@ -1079,8 +1085,14 @@ function FieldControl({
1079
1085
  id,
1080
1086
  value,
1081
1087
  onChange,
1082
- autoFocusRef
1088
+ autoFocusRef,
1089
+ renderers
1083
1090
  }) {
1091
+ const override = renderers?.[field.type ?? "text"];
1092
+ if (override) {
1093
+ const rendered = override({ field, id, value, onChange, autoFocusRef });
1094
+ if (rendered !== null && rendered !== void 0) return /* @__PURE__ */ jsx(Fragment, { children: rendered });
1095
+ }
1084
1096
  const handle = { id, "data-ff-field": field.key };
1085
1097
  if (field.type === "textarea") {
1086
1098
  return /* @__PURE__ */ jsx(
@@ -1168,6 +1180,7 @@ function FlowEditorInner({
1168
1180
  onDelete,
1169
1181
  onEdgeDelete,
1170
1182
  confirmDelete,
1183
+ humanFieldRenderers,
1171
1184
  apiRef
1172
1185
  }) {
1173
1186
  const internal = useFlowState(initial);
@@ -1704,10 +1717,17 @@ function FlowEditorInner({
1704
1717
  }
1705
1718
  ),
1706
1719
  showFeed && (slots.feed ? slots.feed(api) : /* @__PURE__ */ jsx(FlowRunFeed, { entries: runner.feed, running: api.running, className: "ff-editor__feed" })),
1707
- prompt && /* @__PURE__ */ jsx(HumanPrompt, { request: prompt, onCancel: () => {
1708
- setPrompt(null);
1709
- runner.cancel();
1710
- } })
1720
+ prompt && /* @__PURE__ */ jsx(
1721
+ HumanPrompt,
1722
+ {
1723
+ request: prompt,
1724
+ onCancel: () => {
1725
+ setPrompt(null);
1726
+ runner.cancel();
1727
+ },
1728
+ fieldRenderers: humanFieldRenderers
1729
+ }
1730
+ )
1711
1731
  ] }),
1712
1732
  showPanel && (slots.panel ? slots.panel(api) : /* @__PURE__ */ jsxs("div", { className: "ff-editor__panel-wrap", children: [
1713
1733
  /* @__PURE__ */ jsx(