@particle-academy/fancy-flow 0.48.1 → 0.50.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-ACGCHWCM.js → chunk-3W26FA7Q.js} +7 -3
  8. package/dist/chunk-3W26FA7Q.js.map +1 -0
  9. package/dist/{chunk-6HGXAU5L.js → chunk-BAHJVX3S.js} +9 -4
  10. package/dist/chunk-BAHJVX3S.js.map +1 -0
  11. package/dist/{chunk-54SN6LML.js → chunk-DQJIU55F.js} +3 -3
  12. package/dist/{chunk-54SN6LML.js.map → chunk-DQJIU55F.js.map} +1 -1
  13. package/dist/{chunk-HHGU7JXJ.js → chunk-I4F6GI3A.js} +3 -3
  14. package/dist/{chunk-HHGU7JXJ.js.map → chunk-I4F6GI3A.js.map} +1 -1
  15. package/dist/{chunk-FCCGV52I.js → chunk-OWDSPRAF.js} +4 -4
  16. package/dist/{chunk-FCCGV52I.js.map → chunk-OWDSPRAF.js.map} +1 -1
  17. package/dist/{chunk-M7H3ASBI.js → chunk-XJMWMU4J.js} +20 -3
  18. package/dist/chunk-XJMWMU4J.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 +18 -1
  24. package/dist/durable.cjs.map +1 -1
  25. package/dist/durable.js +1 -1
  26. package/dist/engine.cjs +18 -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 +59 -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 +18 -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 +24 -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 +22 -1
  64. package/dist/schema.cjs.map +1 -1
  65. package/dist/schema.js +2 -2
  66. package/dist/screens.cjs +18 -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 +18 -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/engine.d.cts CHANGED
@@ -1,12 +1,12 @@
1
- export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-1KiXhy59.cjs';
2
- import { F as FlowGraph, R as RunEvent, N as NodeExecutor } from './types-Jx1TwehV.cjs';
3
- export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, E as ExecutorRegistry, d as FlowEdge, a as FlowNode, e as FlowNodeData, f as FlowNodeKind, g as NodeRunStatus, h as NoteNodeData, O as OutputNodeData, P as PortDescriptor, b as RunIdentity, c as RunIdentityJson, S as SubgraphNodeData, T as TriggerNodeData, i as escapeSegment } from './types-Jx1TwehV.cjs';
4
- export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-DdPPowJ3.cjs';
5
- export { d as defaultConfigFor, g as getNodeKind, k as kindIds, l as listNodeKinds, r as registerNodeKind, a as resolveKindId, v as validateConfig } from './registry-BnnifM-t.cjs';
6
- export { b as CapabilityRequirement, C as ConfigField, M as ManifestProblem, c as ManifestValidation, d as NODE_MANIFEST_SCHEMA_VERSION, a as NodeCategory, N as NodeKindDefinition, e as NodePackageManifest, f as NodeRuntimeId, g as NodeRuntimeSpec, O as OutputField, h as OutputShape, P as PortSpec, S as SideEffects, i as checkCapabilities, j as checkRuntimeSupport, s as satisfiesRange, v as validateNodeManifest } from './types-BO8TgI2M.cjs';
1
+ export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-B24QUO1H.cjs';
2
+ import { F as FlowGraph, R as RunEvent, N as NodeExecutor } from './types-7cXcSQlx.cjs';
3
+ export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, E as ExecutorRegistry, d as FlowEdge, a as FlowNode, e as FlowNodeData, f as FlowNodeKind, g as NodeRunStatus, h as NoteNodeData, O as OutputNodeData, P as PortDescriptor, b as RunIdentity, c as RunIdentityJson, S as SubgraphNodeData, T as TriggerNodeData, i as escapeSegment } from './types-7cXcSQlx.cjs';
4
+ export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-DYCL8Qv6.cjs';
5
+ export { d as defaultConfigFor, g as getNodeKind, k as kindIds, l as listNodeKinds, r as registerNodeKind, a as resolveKindId, v as validateConfig } from './registry-DQh7ZmnM.cjs';
6
+ export { b as CapabilityRequirement, C as ConfigField, M as ManifestProblem, c as ManifestValidation, d as NODE_MANIFEST_SCHEMA_VERSION, a as NodeCategory, N as NodeKindDefinition, e as NodePackageManifest, f as NodeRuntimeId, g as NodeRuntimeSpec, O as OutputField, h as OutputShape, P as PortSpec, S as SideEffects, i as checkCapabilities, j as checkRuntimeSupport, s as satisfiesRange, v as validateNodeManifest } from './types-BtMOnb9I.cjs';
7
7
  import { P as PauseAwaiting } from './pause-9iT4tCEV.cjs';
8
8
  export { L as LEGACY_PAUSE_PREFIXES, a as PAUSE_PREFIX, b as PauseSignal, d as decodePause, e as encodePause, i as isPause, p as pauseForHuman } from './pause-9iT4tCEV.cjs';
9
- import { W as WorkflowResolver } from './capabilities-Dmd26aAs.cjs';
9
+ import { W as WorkflowResolver } from './capabilities-VzgDApur.cjs';
10
10
  import '@xyflow/react';
11
11
  import 'react';
12
12
 
package/dist/engine.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-CQvTDBYk.js';
2
- import { F as FlowGraph, R as RunEvent, N as NodeExecutor } from './types-Jx1TwehV.js';
3
- export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, E as ExecutorRegistry, d as FlowEdge, a as FlowNode, e as FlowNodeData, f as FlowNodeKind, g as NodeRunStatus, h as NoteNodeData, O as OutputNodeData, P as PortDescriptor, b as RunIdentity, c as RunIdentityJson, S as SubgraphNodeData, T as TriggerNodeData, i as escapeSegment } from './types-Jx1TwehV.js';
4
- export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-Cyeny2Uu.js';
5
- export { d as defaultConfigFor, g as getNodeKind, k as kindIds, l as listNodeKinds, r as registerNodeKind, a as resolveKindId, v as validateConfig } from './registry-DpARG95T.js';
6
- export { b as CapabilityRequirement, C as ConfigField, M as ManifestProblem, c as ManifestValidation, d as NODE_MANIFEST_SCHEMA_VERSION, a as NodeCategory, N as NodeKindDefinition, e as NodePackageManifest, f as NodeRuntimeId, g as NodeRuntimeSpec, O as OutputField, h as OutputShape, P as PortSpec, S as SideEffects, i as checkCapabilities, j as checkRuntimeSupport, s as satisfiesRange, v as validateNodeManifest } from './types-DJAmfiJC.js';
1
+ export { R as RunOptions, a as RunResult, r as runFlow } from './run-flow-DPUPAWk6.js';
2
+ import { F as FlowGraph, R as RunEvent, N as NodeExecutor } from './types-7cXcSQlx.js';
3
+ export { A as ActionNodeData, B as BaseNodeData, D as DecisionNodeData, E as ExecutorRegistry, d as FlowEdge, a as FlowNode, e as FlowNodeData, f as FlowNodeKind, g as NodeRunStatus, h as NoteNodeData, O as OutputNodeData, P as PortDescriptor, b as RunIdentity, c as RunIdentityJson, S as SubgraphNodeData, T as TriggerNodeData, i as escapeSegment } from './types-7cXcSQlx.js';
4
+ export { C as CohortGuard, a as CohortOptions, b as CohortPolicy, c as CohortResult, r as runCohort } from './run-cohort-VX4JG21l.js';
5
+ export { d as defaultConfigFor, g as getNodeKind, k as kindIds, l as listNodeKinds, r as registerNodeKind, a as resolveKindId, v as validateConfig } from './registry-6cB5wCv6.js';
6
+ export { b as CapabilityRequirement, C as ConfigField, M as ManifestProblem, c as ManifestValidation, d as NODE_MANIFEST_SCHEMA_VERSION, a as NodeCategory, N as NodeKindDefinition, e as NodePackageManifest, f as NodeRuntimeId, g as NodeRuntimeSpec, O as OutputField, h as OutputShape, P as PortSpec, S as SideEffects, i as checkCapabilities, j as checkRuntimeSupport, s as satisfiesRange, v as validateNodeManifest } from './types-CDgIIj4c.js';
7
7
  import { P as PauseAwaiting } from './pause-9iT4tCEV.js';
8
8
  export { L as LEGACY_PAUSE_PREFIXES, a as PAUSE_PREFIX, b as PauseSignal, d as decodePause, e as encodePause, i as isPause, p as pauseForHuman } from './pause-9iT4tCEV.js';
9
- import { W as WorkflowResolver } from './capabilities-DMUhnyZD.js';
9
+ import { W as WorkflowResolver } from './capabilities-B00VXLUp.js';
10
10
  import '@xyflow/react';
11
11
  import 'react';
12
12
 
package/dist/engine.js CHANGED
@@ -1,8 +1,8 @@
1
- export { runCohort } from './chunk-54SN6LML.js';
1
+ export { runCohort } from './chunk-DQJIU55F.js';
2
2
  import { decodePause } from './chunk-UEOE6B52.js';
3
3
  export { LEGACY_PAUSE_PREFIXES, PAUSE_PREFIX, decodePause, encodePause, isPause, pauseForHuman } from './chunk-UEOE6B52.js';
4
- import { runFlow, getNodeKind, resolveNodePorts } from './chunk-M7H3ASBI.js';
5
- export { RunIdentity, defaultConfigFor, escapeSegment, getNodeKind, kindIds, listNodeKinds, registerNodeKind, resolveKindId, runFlow, validateConfig } from './chunk-M7H3ASBI.js';
4
+ import { runFlow, getNodeKind, resolveNodePorts } from './chunk-XJMWMU4J.js';
5
+ export { RunIdentity, defaultConfigFor, escapeSegment, getNodeKind, kindIds, listNodeKinds, registerNodeKind, resolveKindId, runFlow, validateConfig } from './chunk-XJMWMU4J.js';
6
6
  import './chunk-F5RPRB7A.js';
7
7
  import { isResolutionFailure, registerLlmClient, registerWorkflowResolver } from './chunk-USL4FMFU.js';
8
8
 
@@ -1,8 +1,8 @@
1
- import { C as ConfigFieldRenderFn } from '../ConfigFieldRenderer-NuDjtun1.cjs';
1
+ import { C as ConfigFieldRenderFn } from '../ConfigFieldRenderer-CrXFq6Eb.cjs';
2
2
  import 'react';
3
- import '../types-Jx1TwehV.cjs';
3
+ import '../types-7cXcSQlx.cjs';
4
4
  import '@xyflow/react';
5
- import '../types-BO8TgI2M.cjs';
5
+ import '../types-BtMOnb9I.cjs';
6
6
  import '../pause-9iT4tCEV.cjs';
7
7
 
8
8
  /**
@@ -1,8 +1,8 @@
1
- import { C as ConfigFieldRenderFn } from '../ConfigFieldRenderer-DrD2-Qml.js';
1
+ import { C as ConfigFieldRenderFn } from '../ConfigFieldRenderer-u3nYHovX.js';
2
2
  import 'react';
3
- import '../types-Jx1TwehV.js';
3
+ import '../types-7cXcSQlx.js';
4
4
  import '@xyflow/react';
5
- import '../types-DJAmfiJC.js';
5
+ import '../types-CDgIIj4c.js';
6
6
  import '../pause-9iT4tCEV.js';
7
7
 
8
8
  /**
package/dist/index.cjs CHANGED
@@ -11153,6 +11153,7 @@ async function runFlow(graph, executors, onEvent = () => {
11153
11153
  continue;
11154
11154
  }
11155
11155
  onEvent({ type: "node-status", nodeId: node.id, status: "running" });
11156
+ announce(onEvent, node, "start");
11156
11157
  const inputs = collectInputs(node, incoming, portValues, initialInputs);
11157
11158
  const exec = pickExecutor(executors, node);
11158
11159
  if (!exec) {
@@ -11171,6 +11172,7 @@ async function runFlow(graph, executors, onEvent = () => {
11171
11172
  throw new Error(reason ?? "aborted");
11172
11173
  },
11173
11174
  emit: onEvent,
11175
+ executors,
11174
11176
  depth,
11175
11177
  run
11176
11178
  })
@@ -11183,6 +11185,7 @@ async function runFlow(graph, executors, onEvent = () => {
11183
11185
  }
11184
11186
  completed.add(node.id);
11185
11187
  onEvent({ type: "node-status", nodeId: node.id, status: "done" });
11188
+ announce(onEvent, node, "end");
11186
11189
  } catch (e) {
11187
11190
  const msg = e instanceof Error ? e.message : String(e);
11188
11191
  errors.push(msg);
@@ -11235,6 +11238,9 @@ function collectInputs(node, incoming, portValues, initial) {
11235
11238
  const key = `${e.source}:${e.sourceHandle ?? "out"}`;
11236
11239
  if (!portValues.has(key)) continue;
11237
11240
  inputs[portId] = portValues.get(key);
11241
+ if (e.targetHandle == null && !(e.source in inputs)) {
11242
+ inputs[e.source] = portValues.get(key);
11243
+ }
11238
11244
  }
11239
11245
  return inputs;
11240
11246
  }
@@ -11266,6 +11272,14 @@ function activatedPorts(node, result) {
11266
11272
  const declared = resolveNodePorts(node, kind).outputs?.map((p2) => p2.id);
11267
11273
  return { ports: declared?.length ? declared : ["out"], value: result };
11268
11274
  }
11275
+ function announce(onEvent, node, phase) {
11276
+ const data = node.data;
11277
+ const raw = phase === "start" ? data?.startingMsg : data?.stoppingMsg;
11278
+ if (typeof raw !== "string") return;
11279
+ const message = raw.trim();
11280
+ if (message === "") return;
11281
+ onEvent({ type: "node-message", nodeId: node.id, phase, message });
11282
+ }
11269
11283
 
11270
11284
  // src/registry/subflow.ts
11271
11285
  var DEFAULT_MAX_DEPTH = 8;
@@ -11319,7 +11333,10 @@ var subflowExecutor = async (ctx) => {
11319
11333
  };
11320
11334
  const result = await runFlow(
11321
11335
  child,
11322
- config.executors ?? {},
11336
+ // Inherit the parent's registry, then let the graph layer its own on top.
11337
+ // The inherited half is the fix; the layered half keeps a graph that
11338
+ // deliberately hands its child extra or different executors working.
11339
+ { ...ctx.executors ?? {}, ...config.executors ?? {} },
11323
11340
  forward,
11324
11341
  {
11325
11342
  initialInputs: config.inputs ?? {
@@ -13704,6 +13721,7 @@ function NodeConfigPanel({
13704
13721
  }
13705
13722
  const setLabel = (label) => onChange({ ...node, data: { ...node.data, label } });
13706
13723
  const setDescription = (description) => onChange({ ...node, data: { ...node.data, description } });
13724
+ const setStatusMsg = (key, value) => onChange({ ...node, data: { ...node.data, [key]: value } });
13707
13725
  const setConfigValue = (key, value) => onChange({ ...node, data: { ...node.data, config: { ...config, [key]: value } } });
13708
13726
  const issues = validateConfig(kind, config);
13709
13727
  const adapter2 = getRichInputAdapter();
@@ -13746,6 +13764,36 @@ function NodeConfigPanel({
13746
13764
  }
13747
13765
  )
13748
13766
  ] }),
13767
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ff-panel__field", children: [
13768
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "ff-panel__label", htmlFor: fieldId("startingMsg"), children: "Message when it starts" }),
13769
+ /* @__PURE__ */ jsxRuntime.jsx(
13770
+ "input",
13771
+ {
13772
+ id: fieldId("startingMsg"),
13773
+ "data-ff-field": "startingMsg",
13774
+ className: "ff-panel__input",
13775
+ value: node.data.startingMsg ?? "",
13776
+ onChange: (e) => setStatusMsg("startingMsg", e.target.value),
13777
+ placeholder: "e.g. Starting the deep analysis"
13778
+ }
13779
+ ),
13780
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ff-panel__hint", children: "Announced just before this node runs. Leave blank to say nothing." })
13781
+ ] }),
13782
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ff-panel__field", children: [
13783
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "ff-panel__label", htmlFor: fieldId("stoppingMsg"), children: "Message when it finishes" }),
13784
+ /* @__PURE__ */ jsxRuntime.jsx(
13785
+ "input",
13786
+ {
13787
+ id: fieldId("stoppingMsg"),
13788
+ "data-ff-field": "stoppingMsg",
13789
+ className: "ff-panel__input",
13790
+ value: node.data.stoppingMsg ?? "",
13791
+ onChange: (e) => setStatusMsg("stoppingMsg", e.target.value),
13792
+ placeholder: "e.g. Analysis complete"
13793
+ }
13794
+ ),
13795
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ff-panel__hint", children: "Announced only if the node succeeds \u2014 never after a failure." })
13796
+ ] }),
13749
13797
  kind.renderPanel ? kind.renderPanel({
13750
13798
  config,
13751
13799
  onChange: (next) => onChange({ ...node, data: { ...node.data, config: next } }),
@@ -13955,6 +14003,7 @@ function useFlowHistory(flow) {
13955
14003
  function useFlowRun({ maxFeed = 200 } = {}) {
13956
14004
  const [statuses, setStatuses] = ReactExports.useState({});
13957
14005
  const [statusText, setStatusText] = ReactExports.useState({});
14006
+ const [nodeMessages, setNodeMessages] = ReactExports.useState({});
13958
14007
  const [outputs, setOutputs] = ReactExports.useState({});
13959
14008
  const [feed, setFeed] = ReactExports.useState([]);
13960
14009
  const [running, setRunning] = ReactExports.useState(false);
@@ -13968,6 +14017,10 @@ function useFlowRun({ maxFeed = 200 } = {}) {
13968
14017
  setStatusText((t) => ({ ...t, [e.nodeId]: e.text }));
13969
14018
  appendFeed({ level: "status", text: `${e.nodeId} \u2192 ${e.status}${e.text ? ` (${e.text})` : ""}`, nodeId: e.nodeId });
13970
14019
  break;
14020
+ case "node-message":
14021
+ setNodeMessages((m) => ({ ...m, [e.nodeId]: e.message }));
14022
+ appendFeed({ level: "message", text: e.message, nodeId: e.nodeId });
14023
+ break;
13971
14024
  case "node-output":
13972
14025
  setOutputs((o) => ({ ...o, [e.nodeId]: e.value }));
13973
14026
  appendFeed({ level: "info", text: `${e.nodeId}.${e.portId} = ${preview(e.value)}`, nodeId: e.nodeId, detail: e.value });
@@ -14027,7 +14080,7 @@ function useFlowRun({ maxFeed = 200 } = {}) {
14027
14080
  setFeed([]);
14028
14081
  setLastResult(null);
14029
14082
  }, []);
14030
- return { statuses, statusText, outputs, feed, running, lastResult, run, cancel, reset };
14083
+ return { statuses, statusText, nodeMessages, outputs, feed, running, lastResult, run, cancel, reset };
14031
14084
  }
14032
14085
  function applyOutputsToNodes(nodes, outputs) {
14033
14086
  return nodes.map((n) => {
@@ -14081,6 +14134,8 @@ function toSchemaNode(n) {
14081
14134
  position: { x: n.position.x, y: n.position.y },
14082
14135
  label: data.label,
14083
14136
  description: data.description,
14137
+ ...typeof data.startingMsg === "string" && data.startingMsg !== "" ? { startingMsg: data.startingMsg } : {},
14138
+ ...typeof data.stoppingMsg === "string" && data.stoppingMsg !== "" ? { stoppingMsg: data.stoppingMsg } : {},
14084
14139
  config: data.config,
14085
14140
  inputs: ports.inputs,
14086
14141
  outputs: ports.outputs,
@@ -14153,6 +14208,8 @@ function importWorkflow(schema, options = {}) {
14153
14208
  kind: kindId,
14154
14209
  label: n.label ?? kind?.label ?? n.kind,
14155
14210
  description: n.description,
14211
+ ...n.startingMsg ? { startingMsg: n.startingMsg } : {},
14212
+ ...n.stoppingMsg ? { stoppingMsg: n.stoppingMsg } : {},
14156
14213
  config,
14157
14214
  // Carry serialized ports back onto the node so a round-trip is stable
14158
14215
  // and an unknown kind still routes the way the document described.