@particle-academy/fancy-flow 0.48.1 → 0.49.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 (83) hide show
  1. package/dist/{ConfigFieldRenderer-NuDjtun1.d.cts → ConfigFieldRenderer-CrXFq6Eb.d.cts} +2 -2
  2. package/dist/{ConfigFieldRenderer-DrD2-Qml.d.ts → ConfigFieldRenderer-u3nYHovX.d.ts} +2 -2
  3. package/dist/{FlowViewer-CY3_vHSg.d.cts → FlowViewer-CFSMlCqi.d.cts} +1 -1
  4. package/dist/{FlowViewer-DGW6t-80.d.ts → FlowViewer-DRgjeWJ7.d.ts} +1 -1
  5. package/dist/{capabilities-DMUhnyZD.d.ts → capabilities-B00VXLUp.d.ts} +1 -1
  6. package/dist/{capabilities-Dmd26aAs.d.cts → capabilities-VzgDApur.d.cts} +1 -1
  7. package/dist/{chunk-M7H3ASBI.js → chunk-6FP3F5YR.js} +17 -3
  8. package/dist/chunk-6FP3F5YR.js.map +1 -0
  9. package/dist/{chunk-HHGU7JXJ.js → chunk-6XKR65XM.js} +3 -3
  10. package/dist/{chunk-HHGU7JXJ.js.map → chunk-6XKR65XM.js.map} +1 -1
  11. package/dist/{chunk-FCCGV52I.js → chunk-AVRGZFXG.js} +4 -4
  12. package/dist/{chunk-FCCGV52I.js.map → chunk-AVRGZFXG.js.map} +1 -1
  13. package/dist/{chunk-6HGXAU5L.js → chunk-UL3DGSSG.js} +9 -4
  14. package/dist/chunk-UL3DGSSG.js.map +1 -0
  15. package/dist/{chunk-54SN6LML.js → chunk-VUL7CUFW.js} +3 -3
  16. package/dist/{chunk-54SN6LML.js.map → chunk-VUL7CUFW.js.map} +1 -1
  17. package/dist/{chunk-ACGCHWCM.js → chunk-YOK3WKWC.js} +7 -3
  18. package/dist/chunk-YOK3WKWC.js.map +1 -0
  19. package/dist/connectors.d.cts +2 -2
  20. package/dist/connectors.d.ts +2 -2
  21. package/dist/durable/index.d.cts +2 -2
  22. package/dist/durable/index.d.ts +2 -2
  23. package/dist/durable.cjs +15 -1
  24. package/dist/durable.cjs.map +1 -1
  25. package/dist/durable.js +1 -1
  26. package/dist/engine.cjs +15 -1
  27. package/dist/engine.cjs.map +1 -1
  28. package/dist/engine.d.cts +7 -7
  29. package/dist/engine.d.ts +7 -7
  30. package/dist/engine.js +3 -3
  31. package/dist/fields/react-fancy.d.cts +3 -3
  32. package/dist/fields/react-fancy.d.ts +3 -3
  33. package/dist/index.cjs +56 -2
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +11 -11
  36. package/dist/index.d.ts +11 -11
  37. package/dist/index.js +42 -11
  38. package/dist/index.js.map +1 -1
  39. package/dist/layout/index.d.cts +1 -1
  40. package/dist/layout/index.d.ts +1 -1
  41. package/dist/llm/prism.d.cts +2 -2
  42. package/dist/llm/prism.d.ts +2 -2
  43. package/dist/llm/vercel-ai.d.cts +2 -2
  44. package/dist/llm/vercel-ai.d.ts +2 -2
  45. package/dist/registry/index.d.cts +6 -6
  46. package/dist/registry/index.d.ts +6 -6
  47. package/dist/{registry-DpARG95T.d.ts → registry-6cB5wCv6.d.ts} +1 -1
  48. package/dist/{registry-BnnifM-t.d.cts → registry-DQh7ZmnM.d.cts} +1 -1
  49. package/dist/registry.cjs +15 -1
  50. package/dist/registry.cjs.map +1 -1
  51. package/dist/registry.js +2 -2
  52. package/dist/{run-cohort-DdPPowJ3.d.cts → run-cohort-DYCL8Qv6.d.cts} +2 -2
  53. package/dist/{run-cohort-Cyeny2Uu.d.ts → run-cohort-VX4JG21l.d.ts} +2 -2
  54. package/dist/{run-flow-1KiXhy59.d.cts → run-flow-B24QUO1H.d.cts} +1 -1
  55. package/dist/{run-flow-CQvTDBYk.d.ts → run-flow-DPUPAWk6.d.ts} +1 -1
  56. package/dist/runtime/index.d.cts +18 -6
  57. package/dist/runtime/index.d.ts +18 -6
  58. package/dist/runtime.cjs +21 -2
  59. package/dist/runtime.cjs.map +1 -1
  60. package/dist/runtime.js +3 -3
  61. package/dist/schema/index.d.cts +9 -1
  62. package/dist/schema/index.d.ts +9 -1
  63. package/dist/schema.cjs +19 -1
  64. package/dist/schema.cjs.map +1 -1
  65. package/dist/schema.js +2 -2
  66. package/dist/screens.cjs +15 -1
  67. package/dist/screens.cjs.map +1 -1
  68. package/dist/screens.d.cts +2 -2
  69. package/dist/screens.d.ts +2 -2
  70. package/dist/screens.js +4 -4
  71. package/dist/{types-Jx1TwehV.d.cts → types-7cXcSQlx.d.cts} +50 -0
  72. package/dist/{types-Jx1TwehV.d.ts → types-7cXcSQlx.d.ts} +50 -0
  73. package/dist/{types-BO8TgI2M.d.cts → types-BtMOnb9I.d.cts} +1 -1
  74. package/dist/{types-DJAmfiJC.d.ts → types-CDgIIj4c.d.ts} +1 -1
  75. package/dist/ux.cjs +15 -1
  76. package/dist/ux.cjs.map +1 -1
  77. package/dist/ux.d.cts +2 -2
  78. package/dist/ux.d.ts +2 -2
  79. package/dist/ux.js +1 -1
  80. package/package.json +1 -1
  81. package/dist/chunk-6HGXAU5L.js.map +0 -1
  82. package/dist/chunk-ACGCHWCM.js.map +0 -1
  83. package/dist/chunk-M7H3ASBI.js.map +0 -1
package/dist/registry.js CHANGED
@@ -1,6 +1,6 @@
1
- export { ANY_PORT_TYPE, RegistryNode, buildNodeTypes, createConnectionValidator, defaultPortCompatibility } from './chunk-HHGU7JXJ.js';
1
+ export { ANY_PORT_TYPE, RegistryNode, buildNodeTypes, createConnectionValidator, defaultPortCompatibility } from './chunk-6XKR65XM.js';
2
2
  export { LEGACY_PAUSE_PREFIXES, PAUSE_PREFIX, decodePause, encodePause, isPause, pauseForHuman } from './chunk-UEOE6B52.js';
3
- export { BUILTIN_KINDS, DEFAULT_MAX_DEPTH, categoryAccent, clearNodeKindOverrides, declaredRoutes, defaultConfigFor, ensureBuiltinKinds, getNodeKind, kindIds, listNodeKinds, llmRouterExecutor as llmBranchExecutor, llmRouterExecutor, nodeConfig, onNodeKindsChanged, overrideNodeKind, registerBuiltinKinds, registerNodeKind, resolveFallbackPort, resolveKindId, resolveNodePorts, resolvePortSpec, subflowExecutor, subflowMode, subflowPorts, validateConfig } from './chunk-M7H3ASBI.js';
3
+ export { BUILTIN_KINDS, DEFAULT_MAX_DEPTH, categoryAccent, clearNodeKindOverrides, declaredRoutes, defaultConfigFor, ensureBuiltinKinds, getNodeKind, kindIds, listNodeKinds, llmRouterExecutor as llmBranchExecutor, llmRouterExecutor, nodeConfig, onNodeKindsChanged, overrideNodeKind, registerBuiltinKinds, registerNodeKind, resolveFallbackPort, resolveKindId, resolveNodePorts, resolvePortSpec, subflowExecutor, subflowMode, subflowPorts, validateConfig } from './chunk-6FP3F5YR.js';
4
4
  export { RichInputPreview, getRichInputAdapter, isRichInputEnabled, onRichInputAdapterChanged, registerRichInputAdapter } from './chunk-F5RPRB7A.js';
5
5
  export { capabilityStatus, getLlmClient, getWorkflowResolver, isResolutionFailure, registerLlmClient, registerWorkflowResolver } from './chunk-USL4FMFU.js';
6
6
  //# sourceMappingURL=registry.js.map
@@ -1,5 +1,5 @@
1
- import { F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-Jx1TwehV.cjs';
2
- import { R as RunOptions, a as RunResult } from './run-flow-1KiXhy59.cjs';
1
+ import { F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-7cXcSQlx.cjs';
2
+ import { R as RunOptions, a as RunResult } from './run-flow-B24QUO1H.cjs';
3
3
 
4
4
  /**
5
5
  * How the flows one trigger fired should treat each other.
@@ -1,5 +1,5 @@
1
- import { F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-Jx1TwehV.js';
2
- import { R as RunOptions, a as RunResult } from './run-flow-CQvTDBYk.js';
1
+ import { F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-7cXcSQlx.js';
2
+ import { R as RunOptions, a as RunResult } from './run-flow-DPUPAWk6.js';
3
3
 
4
4
  /**
5
5
  * How the flows one trigger fired should treat each other.
@@ -1,4 +1,4 @@
1
- import { b as RunIdentity, c as RunIdentityJson, F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-Jx1TwehV.cjs';
1
+ import { b as RunIdentity, c as RunIdentityJson, F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-7cXcSQlx.cjs';
2
2
 
3
3
  type RunOptions = {
4
4
  /** Stop the run after this many ms. Default: no timeout. */
@@ -1,4 +1,4 @@
1
- import { b as RunIdentity, c as RunIdentityJson, F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-Jx1TwehV.js';
1
+ import { b as RunIdentity, c as RunIdentityJson, F as FlowGraph, E as ExecutorRegistry, R as RunEvent } from './types-7cXcSQlx.js';
2
2
 
3
3
  type RunOptions = {
4
4
  /** Stop the run after this many ms. Default: no timeout. */
@@ -1,14 +1,20 @@
1
- import { a as RunResult, R as RunOptions } from '../run-flow-1KiXhy59.cjs';
2
- export { r as runFlow } from '../run-flow-1KiXhy59.cjs';
3
- import { g as NodeRunStatus, F as FlowGraph, E as ExecutorRegistry, a as FlowNode, d as FlowEdge } from '../types-Jx1TwehV.cjs';
4
- export { b as RunIdentity, c as RunIdentityJson, i as escapeSegment } from '../types-Jx1TwehV.cjs';
5
- export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from '../run-cohort-DdPPowJ3.cjs';
1
+ import { a as RunResult, R as RunOptions } from '../run-flow-B24QUO1H.cjs';
2
+ export { r as runFlow } from '../run-flow-B24QUO1H.cjs';
3
+ import { g as NodeRunStatus, F as FlowGraph, E as ExecutorRegistry, a as FlowNode, d as FlowEdge } from '../types-7cXcSQlx.cjs';
4
+ export { b as RunIdentity, c as RunIdentityJson, i as escapeSegment } from '../types-7cXcSQlx.cjs';
5
+ export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from '../run-cohort-DYCL8Qv6.cjs';
6
6
  import { NodeChange, EdgeChange, Connection } from '@xyflow/react';
7
7
 
8
8
  type FlowRunFeedEntry = {
9
9
  id: string;
10
10
  at: number;
11
- level: "info" | "warn" | "error" | "status";
11
+ /**
12
+ * `message` is a node's own human-facing announcement (`startingMsg` /
13
+ * `stoppingMsg`), kept distinct from `status` and `info` so a progress UI can
14
+ * show ONLY the narration. Folded in with diagnostics it would be unfindable,
15
+ * which is the same as not having it.
16
+ */
17
+ level: "info" | "warn" | "error" | "status" | "message";
12
18
  text: string;
13
19
  nodeId?: string;
14
20
  detail?: unknown;
@@ -20,6 +26,12 @@ type UseFlowRunReturn = {
20
26
  statusText: Record<string, string | undefined>;
21
27
  /** Latest computed output value per node (for reactive kinds). */
22
28
  outputs: Record<string, unknown>;
29
+ /**
30
+ * Latest status message per nodeId, from the node's own `startingMsg` /
31
+ * `stoppingMsg`. Undefined for the nodes that declared none, which is most
32
+ * of them by design.
33
+ */
34
+ nodeMessages: Record<string, string | undefined>;
23
35
  /** Live event log (capped to last N). */
24
36
  feed: FlowRunFeedEntry[];
25
37
  /** Whether a run is currently in progress. */
@@ -1,14 +1,20 @@
1
- import { a as RunResult, R as RunOptions } from '../run-flow-CQvTDBYk.js';
2
- export { r as runFlow } from '../run-flow-CQvTDBYk.js';
3
- import { g as NodeRunStatus, F as FlowGraph, E as ExecutorRegistry, a as FlowNode, d as FlowEdge } from '../types-Jx1TwehV.js';
4
- export { b as RunIdentity, c as RunIdentityJson, i as escapeSegment } from '../types-Jx1TwehV.js';
5
- export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from '../run-cohort-Cyeny2Uu.js';
1
+ import { a as RunResult, R as RunOptions } from '../run-flow-DPUPAWk6.js';
2
+ export { r as runFlow } from '../run-flow-DPUPAWk6.js';
3
+ import { g as NodeRunStatus, F as FlowGraph, E as ExecutorRegistry, a as FlowNode, d as FlowEdge } from '../types-7cXcSQlx.js';
4
+ export { b as RunIdentity, c as RunIdentityJson, i as escapeSegment } from '../types-7cXcSQlx.js';
5
+ export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from '../run-cohort-VX4JG21l.js';
6
6
  import { NodeChange, EdgeChange, Connection } from '@xyflow/react';
7
7
 
8
8
  type FlowRunFeedEntry = {
9
9
  id: string;
10
10
  at: number;
11
- level: "info" | "warn" | "error" | "status";
11
+ /**
12
+ * `message` is a node's own human-facing announcement (`startingMsg` /
13
+ * `stoppingMsg`), kept distinct from `status` and `info` so a progress UI can
14
+ * show ONLY the narration. Folded in with diagnostics it would be unfindable,
15
+ * which is the same as not having it.
16
+ */
17
+ level: "info" | "warn" | "error" | "status" | "message";
12
18
  text: string;
13
19
  nodeId?: string;
14
20
  detail?: unknown;
@@ -20,6 +26,12 @@ type UseFlowRunReturn = {
20
26
  statusText: Record<string, string | undefined>;
21
27
  /** Latest computed output value per node (for reactive kinds). */
22
28
  outputs: Record<string, unknown>;
29
+ /**
30
+ * Latest status message per nodeId, from the node's own `startingMsg` /
31
+ * `stoppingMsg`. Undefined for the nodes that declared none, which is most
32
+ * of them by design.
33
+ */
34
+ nodeMessages: Record<string, string | undefined>;
23
35
  /** Live event log (capped to last N). */
24
36
  feed: FlowRunFeedEntry[];
25
37
  /** Whether a run is currently in progress. */
package/dist/runtime.cjs CHANGED
@@ -9145,7 +9145,10 @@ var subflowExecutor = async (ctx) => {
9145
9145
  };
9146
9146
  const result = await runFlow(
9147
9147
  child,
9148
- config.executors ?? {},
9148
+ // Inherit the parent's registry, then let the graph layer its own on top.
9149
+ // The inherited half is the fix; the layered half keeps a graph that
9150
+ // deliberately hands its child extra or different executors working.
9151
+ { ...ctx.executors ?? {}, ...config.executors ?? {} },
9149
9152
  forward,
9150
9153
  {
9151
9154
  initialInputs: config.inputs ?? {
@@ -10276,6 +10279,7 @@ async function runFlow(graph, executors, onEvent = () => {
10276
10279
  continue;
10277
10280
  }
10278
10281
  onEvent({ type: "node-status", nodeId: node.id, status: "running" });
10282
+ announce(onEvent, node, "start");
10279
10283
  const inputs = collectInputs(node, incoming, portValues, initialInputs);
10280
10284
  const exec = pickExecutor(executors, node);
10281
10285
  if (!exec) {
@@ -10294,6 +10298,7 @@ async function runFlow(graph, executors, onEvent = () => {
10294
10298
  throw new Error(reason ?? "aborted");
10295
10299
  },
10296
10300
  emit: onEvent,
10301
+ executors,
10297
10302
  depth,
10298
10303
  run
10299
10304
  })
@@ -10306,6 +10311,7 @@ async function runFlow(graph, executors, onEvent = () => {
10306
10311
  }
10307
10312
  completed.add(node.id);
10308
10313
  onEvent({ type: "node-status", nodeId: node.id, status: "done" });
10314
+ announce(onEvent, node, "end");
10309
10315
  } catch (e) {
10310
10316
  const msg = e instanceof Error ? e.message : String(e);
10311
10317
  errors.push(msg);
@@ -10389,6 +10395,14 @@ function activatedPorts(node, result) {
10389
10395
  const declared = resolveNodePorts(node, kind).outputs?.map((p) => p.id);
10390
10396
  return { ports: declared?.length ? declared : ["out"], value: result };
10391
10397
  }
10398
+ function announce(onEvent, node, phase) {
10399
+ const data = node.data;
10400
+ const raw = phase === "start" ? data?.startingMsg : data?.stoppingMsg;
10401
+ if (typeof raw !== "string") return;
10402
+ const message = raw.trim();
10403
+ if (message === "") return;
10404
+ onEvent({ type: "node-message", nodeId: node.id, phase, message });
10405
+ }
10392
10406
 
10393
10407
  // src/runtime/run-cohort.ts
10394
10408
  async function runCohort(flows, executors, onEvent = () => {
@@ -10437,6 +10451,7 @@ function errorText(error) {
10437
10451
  function useFlowRun({ maxFeed = 200 } = {}) {
10438
10452
  const [statuses, setStatuses] = ReactExports.useState({});
10439
10453
  const [statusText, setStatusText] = ReactExports.useState({});
10454
+ const [nodeMessages, setNodeMessages] = ReactExports.useState({});
10440
10455
  const [outputs, setOutputs] = ReactExports.useState({});
10441
10456
  const [feed, setFeed] = ReactExports.useState([]);
10442
10457
  const [running, setRunning] = ReactExports.useState(false);
@@ -10450,6 +10465,10 @@ function useFlowRun({ maxFeed = 200 } = {}) {
10450
10465
  setStatusText((t) => ({ ...t, [e.nodeId]: e.text }));
10451
10466
  appendFeed({ level: "status", text: `${e.nodeId} \u2192 ${e.status}${e.text ? ` (${e.text})` : ""}`, nodeId: e.nodeId });
10452
10467
  break;
10468
+ case "node-message":
10469
+ setNodeMessages((m) => ({ ...m, [e.nodeId]: e.message }));
10470
+ appendFeed({ level: "message", text: e.message, nodeId: e.nodeId });
10471
+ break;
10453
10472
  case "node-output":
10454
10473
  setOutputs((o) => ({ ...o, [e.nodeId]: e.value }));
10455
10474
  appendFeed({ level: "info", text: `${e.nodeId}.${e.portId} = ${preview(e.value)}`, nodeId: e.nodeId, detail: e.value });
@@ -10509,7 +10528,7 @@ function useFlowRun({ maxFeed = 200 } = {}) {
10509
10528
  setFeed([]);
10510
10529
  setLastResult(null);
10511
10530
  }, []);
10512
- return { statuses, statusText, outputs, feed, running, lastResult, run, cancel, reset };
10531
+ return { statuses, statusText, nodeMessages, outputs, feed, running, lastResult, run, cancel, reset };
10513
10532
  }
10514
10533
  function applyOutputsToNodes(nodes, outputs) {
10515
10534
  return nodes.map((n) => {