footprintjs 0.12.0 → 0.13.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.
package/CLAUDE.md CHANGED
@@ -92,6 +92,31 @@ executor.attachFlowRecorder(r) // plug flow observer
92
92
  executor.setRedactionPolicy({}) // PII protection
93
93
  ```
94
94
 
95
+ ### ComposableRunner & Snapshot Navigation
96
+
97
+ ```typescript
98
+ import type { ComposableRunner } from 'footprintjs';
99
+ import { getSubtreeSnapshot } from 'footprintjs';
100
+
101
+ // Interface for runners that expose their internal flowChart
102
+ interface ComposableRunner<TIn, TOut> {
103
+ toFlowChart(): FlowChart;
104
+ run(input: TIn, options?: RunOptions): Promise<TOut>;
105
+ }
106
+
107
+ // Drill into subflow subtrees by path
108
+ const subtree = getSubtreeSnapshot(snapshot, 'sf-payment');
109
+ const nested = getSubtreeSnapshot(snapshot, 'sf-outer/sf-inner');
110
+ // Returns { subflowId, executionTree, sharedState, narrativeEntries } or undefined
111
+
112
+ // Pass narrative entries for scoped narrative
113
+ const subtreeWithNarrative = getSubtreeSnapshot(snapshot, 'sf-payment', executor.getNarrativeEntries());
114
+
115
+ // Discover available drill-down targets
116
+ import { listSubflowPaths } from 'footprintjs';
117
+ listSubflowPaths(snapshot); // ['sf-payment', 'sf-outer/sf-inner']
118
+ ```
119
+
95
120
  ## Two Observer Systems
96
121
 
97
122
  Both use `{ id, hooks } → dispatcher → error isolation → attach/detach`. Intentionally NOT unified.
package/dist/esm/index.js CHANGED
@@ -13,6 +13,7 @@ export { flowChart, FlowChartBuilder } from './lib/builder';
13
13
  // Runner — Execution convenience layer
14
14
  // ============================================================================
15
15
  export { FlowChartExecutor } from './lib/runner';
16
+ export { getSubtreeSnapshot, listSubflowPaths } from './lib/runner';
16
17
  // ============================================================================
17
18
  // Scope — Per-stage facades and recorders
18
19
  // ============================================================================
@@ -39,4 +40,4 @@ export { normalizeSchema, zodToJsonSchema } from './lib/contract';
39
40
  export { generateOpenAPI } from './lib/contract';
40
41
  export { detectSchema, isValidatable, isZod } from './lib/schema';
41
42
  export { InputValidationError, validateAgainstSchema, validateOrThrow } from './lib/schema';
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBT0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RCwrRUFBK0U7QUFDL0UsdUNBQXVDO0FBQ3ZDLCtFQUErRTtBQUUvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFakQsK0VBQStFO0FBQy9FLDBDQUEwQztBQUMxQywrRUFBK0U7QUFFL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUxQyxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFoRCw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBT2pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVV4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUlqRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBb0I3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPakQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZvb3RQcmludCDigJQgUHVibGljIEFQSVxuICpcbiAqIENvbm5lY3RlZCBjYXVzYWwgdHJhY2UgbGlicmFyeSBmb3IgTExNIHBpcGVsaW5lcy5cbiAqIEJ1aWxkcyBmbG93Y2hhcnRzLCBleGVjdXRlcyB0aGVtIHZpYSBERlMgdHJhdmVyc2FsLCBhbmQgY2FwdHVyZXNcbiAqIGV2ZXJ5IHN0YWdlJ3MgY29udGV4dCAoc3RhdGUsIGRlY2lzaW9ucywgZXJyb3JzKSBpbiBhbiBhdWRpdGFibGUgdHJhY2UuXG4gKlxuICogRm9yIGFkdmFuY2VkL2ludGVybmFsIEFQSXMgKG1lbW9yeSBwcmltaXRpdmVzLCBlbmdpbmUgaGFuZGxlcnMsIHByb3ZpZGVycyksXG4gKiBpbXBvcnQgZnJvbSAnZm9vdHByaW50L2FkdmFuY2VkJy5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsZGVyIOKAlCBGbG93Y2hhcnQgY29uc3RydWN0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0LCBQaXBlbGluZVN0YWdlRnVuY3Rpb24gYXMgU3RhZ2VIYW5kbGVyLCBTdHJlYW1IYW5kbGVycyB9IGZyb20gJy4vbGliL2J1aWxkZXInO1xuZXhwb3J0IHsgZmxvd0NoYXJ0LCBGbG93Q2hhcnRCdWlsZGVyIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1bm5lciDigJQgRXhlY3V0aW9uIGNvbnZlbmllbmNlIGxheWVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB7IEZsb3dDaGFydEV4ZWN1dG9yIH0gZnJvbSAnLi9saWIvcnVubmVyJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGUg4oCUIFBlci1zdGFnZSBmYWNhZGVzIGFuZCByZWNvcmRlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5cbi8vIFJlY29yZGVyc1xuZXhwb3J0IHsgTWV0cmljUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5leHBvcnQgeyBEZWJ1Z1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUnO1xuZXhwb3J0IHsgTmFycmF0aXZlUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5cbi8vIFJlY29yZGVyIGludGVyZmFjZSBhbmQgY29yZSBldmVudCB0eXBlcyAobmVlZGVkIHRvIGltcGxlbWVudCBjdXN0b20gUmVjb3JkZXIpXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEV2ZW50LFxuICBFcnJvckV2ZW50LFxuICBSZWFkRXZlbnQsXG4gIFJlY29yZGVyLFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUnO1xuXG4vLyBab2QtYmFzZWQgc2NvcGUgZGVmaW5pdGlvbnNcbmV4cG9ydCB7IGRlZmluZVNjb3BlRnJvbVpvZCB9IGZyb20gJy4vbGliL3Njb3BlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5naW5lIOKAlCBOYXJyYXRpdmUgKGNvbW1vbmx5IHVzZWQpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyBGbG93UmVjb3JkZXIg4oCUIFBsdWdnYWJsZSBvYnNlcnZlciBmb3IgY29udHJvbCBmbG93IGV2ZW50cyAobWlycm9ycyBzY29wZSBSZWNvcmRlcilcbmV4cG9ydCB0eXBlIHtcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG59IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyBTdHJ1Y3R1cmVkIGVycm9yIGV4dHJhY3Rpb24g4oCUIHByZXNlcnZlcyBmaWVsZC1sZXZlbCBkZXRhaWxzIHRocm91Z2ggdGhlIHBpcGVsaW5lXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lJztcblxuLy8gQnVpbHQtaW4gRmxvd1JlY29yZGVyIHN0cmF0ZWdpZXMgKHRyZWUtc2hha2VhYmxlIOKAlCBpbXBvcnQgb25seSB3aGF0IHlvdSB1c2UpXG5leHBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFByb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFJMRU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgV2luZG93ZWROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vcnkg4oCUIFNjb3BlRmFjdG9yeSB0eXBlIChuZWVkZWQgZm9yIEZsb3dDaGFydEV4ZWN1dG9yIGNvbnN0cnVjdG9yKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgdHlwZSB7IFNjb3BlRmFjdG9yeSB9IGZyb20gJy4vbGliL21lbW9yeSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRyYWN0IOKAlCBJL08gYm91bmRhcnksIHNjaGVtYXMsIGFuZCBPcGVuQVBJIGdlbmVyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBGbG93Q2hhcnRDb250cmFjdCxcbiAgRmxvd0NoYXJ0Q29udHJhY3RPcHRpb25zLFxuICBKc29uU2NoZW1hLFxuICBPcGVuQVBJT3B0aW9ucyxcbiAgT3BlbkFQSVNwZWMsXG59IGZyb20gJy4vbGliL2NvbnRyYWN0JztcbmV4cG9ydCB7IGRlZmluZUNvbnRyYWN0IH0gZnJvbSAnLi9saWIvY29udHJhY3QnO1xuZXhwb3J0IHsgbm9ybWFsaXplU2NoZW1hLCB6b2RUb0pzb25TY2hlbWEgfSBmcm9tICcuL2xpYi9jb250cmFjdCc7XG5leHBvcnQgeyBnZW5lcmF0ZU9wZW5BUEkgfSBmcm9tICcuL2xpYi9jb250cmFjdCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjaGVtYSDigJQgVW5pZmllZCBkZXRlY3Rpb24sIHZhbGlkYXRpb24sIGFuZCBzdHJ1Y3R1cmVkIGVycm9yc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IFNjaGVtYUtpbmQsIFZhbGlkYXRpb25Jc3N1ZSwgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vbGliL3NjaGVtYSc7XG5leHBvcnQgeyBkZXRlY3RTY2hlbWEsIGlzVmFsaWRhdGFibGUsIGlzWm9kIH0gZnJvbSAnLi9saWIvc2NoZW1hJztcbmV4cG9ydCB7IElucHV0VmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEsIHZhbGlkYXRlT3JUaHJvdyB9IGZyb20gJy4vbGliL3NjaGVtYSc7XG4iXX0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBT0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RCwrRUFBK0U7QUFDL0UsdUNBQXVDO0FBQ3ZDLCtFQUErRTtBQUUvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXBFLCtFQUErRTtBQUMvRSwwQ0FBMEM7QUFDMUMsK0VBQStFO0FBRS9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsWUFBWTtBQUNaLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFhaEQsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQU9qRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFVeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSXJELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQW9CN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb290UHJpbnQg4oCUIFB1YmxpYyBBUElcbiAqXG4gKiBDb25uZWN0ZWQgY2F1c2FsIHRyYWNlIGxpYnJhcnkgZm9yIExMTSBwaXBlbGluZXMuXG4gKiBCdWlsZHMgZmxvd2NoYXJ0cywgZXhlY3V0ZXMgdGhlbSB2aWEgREZTIHRyYXZlcnNhbCwgYW5kIGNhcHR1cmVzXG4gKiBldmVyeSBzdGFnZSdzIGNvbnRleHQgKHN0YXRlLCBkZWNpc2lvbnMsIGVycm9ycykgaW4gYW4gYXVkaXRhYmxlIHRyYWNlLlxuICpcbiAqIEZvciBhZHZhbmNlZC9pbnRlcm5hbCBBUElzIChtZW1vcnkgcHJpbWl0aXZlcywgZW5naW5lIGhhbmRsZXJzLCBwcm92aWRlcnMpLFxuICogaW1wb3J0IGZyb20gJ2Zvb3RwcmludC9hZHZhbmNlZCcuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbGRlciDigJQgRmxvd2NoYXJ0IGNvbnN0cnVjdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydCwgUGlwZWxpbmVTdGFnZUZ1bmN0aW9uIGFzIFN0YWdlSGFuZGxlciwgU3RyZWFtSGFuZGxlcnMgfSBmcm9tICcuL2xpYi9idWlsZGVyJztcbmV4cG9ydCB7IGZsb3dDaGFydCwgRmxvd0NoYXJ0QnVpbGRlciB9IGZyb20gJy4vbGliL2J1aWxkZXInO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSdW5uZXIg4oCUIEV4ZWN1dGlvbiBjb252ZW5pZW5jZSBsYXllclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vbGliL3J1bm5lcic7XG5cbi8vIENvbXBvc2FibGVSdW5uZXIg4oCUIGludGVyZmFjZSBmb3IgcnVubmVycyB0aGF0IGV4cG9zZSB0aGVpciBpbnRlcm5hbCBmbG93Q2hhcnRcbi8vIGZvciBzdWJmbG93IGNvbXBvc2l0aW9uIChlbmFibGVzIFVJIGRyaWxsLWRvd24gaW50byBuZXN0ZWQgcnVubmVycylcbmV4cG9ydCB0eXBlIHsgQ29tcG9zYWJsZVJ1bm5lciB9IGZyb20gJy4vbGliL3J1bm5lcic7XG5cbi8vIFNuYXBzaG90IG5hdmlnYXRpb24g4oCUIGRyaWxsIGludG8gc3ViZmxvdyBzdWJ0cmVlcyBieSBwYXRoXG5leHBvcnQgdHlwZSB7IFN1YnRyZWVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lcic7XG5leHBvcnQgeyBnZXRTdWJ0cmVlU25hcHNob3QsIGxpc3RTdWJmbG93UGF0aHMgfSBmcm9tICcuL2xpYi9ydW5uZXInO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTY29wZSDigJQgUGVyLXN0YWdlIGZhY2FkZXMgYW5kIHJlY29yZGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgeyBTY29wZUZhY2FkZSB9IGZyb20gJy4vbGliL3Njb3BlJztcblxuLy8gUmVjb3JkZXJzXG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlJztcbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5leHBvcnQgeyBOYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlJztcblxuLy8gUmVjb3JkZXIgaW50ZXJmYWNlIGFuZCBjb3JlIGV2ZW50IHR5cGVzIChuZWVkZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBSZWNvcmRlcilcbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVjb3JkZXIsXG4gIFJlZGFjdGlvblBvbGljeSxcbiAgUmVkYWN0aW9uUmVwb3J0LFxuICBXcml0ZUV2ZW50LFxufSBmcm9tICcuL2xpYi9zY29wZSc7XG5cbi8vIFpvZC1iYXNlZCBzY29wZSBkZWZpbml0aW9uc1xuZXhwb3J0IHsgZGVmaW5lU2NvcGVGcm9tWm9kIH0gZnJvbSAnLi9saWIvc2NvcGUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmdpbmUg4oCUIE5hcnJhdGl2ZSAoY29tbW9ubHkgdXNlZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5cbi8vIEZsb3dSZWNvcmRlciDigJQgUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBjb250cm9sIGZsb3cgZXZlbnRzIChtaXJyb3JzIHNjb3BlIFJlY29yZGVyKVxuZXhwb3J0IHR5cGUge1xuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxuICBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCxcbn0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5cbi8vIFN0cnVjdHVyZWQgZXJyb3IgZXh0cmFjdGlvbiDigJQgcHJlc2VydmVzIGZpZWxkLWxldmVsIGRldGFpbHMgdGhyb3VnaCB0aGUgcGlwZWxpbmVcbmV4cG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCBmb3JtYXRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyBCdWlsdC1pbiBGbG93UmVjb3JkZXIgc3RyYXRlZ2llcyAodHJlZS1zaGFrZWFibGUg4oCUIGltcG9ydCBvbmx5IHdoYXQgeW91IHVzZSlcbmV4cG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFNpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1lbW9yeSDigJQgU2NvcGVGYWN0b3J5IHR5cGUgKG5lZWRlZCBmb3IgRmxvd0NoYXJ0RXhlY3V0b3IgY29uc3RydWN0b3IpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52LCBSdW5PcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB0eXBlIHsgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29udHJhY3Qg4oCUIEkvTyBib3VuZGFyeSwgc2NoZW1hcywgYW5kIE9wZW5BUEkgZ2VuZXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dDaGFydENvbnRyYWN0LFxuICBGbG93Q2hhcnRDb250cmFjdE9wdGlvbnMsXG4gIEpzb25TY2hlbWEsXG4gIE9wZW5BUElPcHRpb25zLFxuICBPcGVuQVBJU3BlYyxcbn0gZnJvbSAnLi9saWIvY29udHJhY3QnO1xuZXhwb3J0IHsgZGVmaW5lQ29udHJhY3QgfSBmcm9tICcuL2xpYi9jb250cmFjdCc7XG5leHBvcnQgeyBub3JtYWxpemVTY2hlbWEsIHpvZFRvSnNvblNjaGVtYSB9IGZyb20gJy4vbGliL2NvbnRyYWN0JztcbmV4cG9ydCB7IGdlbmVyYXRlT3BlbkFQSSB9IGZyb20gJy4vbGliL2NvbnRyYWN0JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NoZW1hIOKAlCBVbmlmaWVkIGRldGVjdGlvbiwgdmFsaWRhdGlvbiwgYW5kIHN0cnVjdHVyZWQgZXJyb3JzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hJztcbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEnO1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hJztcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ComposableRunner — interface for runners that expose their internal flowChart.
3
+ *
4
+ * Any runner implementing this interface can be mounted as a subflow
5
+ * in a parent flowChart via `addSubFlowChart(id, runner.toFlowChart())`.
6
+ * This enables UI drill-down: the parent's snapshot contains the child's
7
+ * full execution tree, addressable by subflow ID.
8
+ *
9
+ * Usage:
10
+ * class MyAgent implements ComposableRunner<string, AgentResult> {
11
+ * toFlowChart() { return this.chart; }
12
+ * async run(input) { ... }
13
+ * }
14
+ *
15
+ * // Mount in parent
16
+ * flowChart('Seed', seedFn, 'seed')
17
+ * .addSubFlowChart('my-agent', agent.toFlowChart(), 'MyAgent')
18
+ * .build();
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9zYWJsZVJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0NvbXBvc2FibGVSdW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcG9zYWJsZVJ1bm5lciDigJQgaW50ZXJmYWNlIGZvciBydW5uZXJzIHRoYXQgZXhwb3NlIHRoZWlyIGludGVybmFsIGZsb3dDaGFydC5cbiAqXG4gKiBBbnkgcnVubmVyIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBjYW4gYmUgbW91bnRlZCBhcyBhIHN1YmZsb3dcbiAqIGluIGEgcGFyZW50IGZsb3dDaGFydCB2aWEgYGFkZFN1YkZsb3dDaGFydChpZCwgcnVubmVyLnRvRmxvd0NoYXJ0KCkpYC5cbiAqIFRoaXMgZW5hYmxlcyBVSSBkcmlsbC1kb3duOiB0aGUgcGFyZW50J3Mgc25hcHNob3QgY29udGFpbnMgdGhlIGNoaWxkJ3NcbiAqIGZ1bGwgZXhlY3V0aW9uIHRyZWUsIGFkZHJlc3NhYmxlIGJ5IHN1YmZsb3cgSUQuXG4gKlxuICogVXNhZ2U6XG4gKiAgIGNsYXNzIE15QWdlbnQgaW1wbGVtZW50cyBDb21wb3NhYmxlUnVubmVyPHN0cmluZywgQWdlbnRSZXN1bHQ+IHtcbiAqICAgICB0b0Zsb3dDaGFydCgpIHsgcmV0dXJuIHRoaXMuY2hhcnQ7IH1cbiAqICAgICBhc3luYyBydW4oaW5wdXQpIHsgLi4uIH1cbiAqICAgfVxuICpcbiAqICAgLy8gTW91bnQgaW4gcGFyZW50XG4gKiAgIGZsb3dDaGFydCgnU2VlZCcsIHNlZWRGbiwgJ3NlZWQnKVxuICogICAgIC5hZGRTdWJGbG93Q2hhcnQoJ215LWFnZW50JywgYWdlbnQudG9GbG93Q2hhcnQoKSwgJ015QWdlbnQnKVxuICogICAgIC5idWlsZCgpO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0LCBSdW5PcHRpb25zIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzJztcblxuLyoqXG4gKiBBIHJ1bm5lciB0aGF0IGNhbiBleHBvc2UgaXRzIGludGVybmFsIGZsb3dDaGFydCBmb3Igc3ViZmxvdyBjb21wb3NpdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFRJbiAg4oCUIHRoZSBpbnB1dCB0eXBlIGFjY2VwdGVkIGJ5IGBydW4oKWBcbiAqIEB0eXBlUGFyYW0gVE91dCDigJQgdGhlIG91dHB1dCB0eXBlIHJldHVybmVkIGJ5IGBydW4oKWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NhYmxlUnVubmVyPFRJbiA9IHVua25vd24sIFRPdXQgPSB1bmtub3duPiB7XG4gIC8qKiBFeHBvc2UgdGhlIGludGVybmFsIGZsb3dDaGFydCBmb3Igc3ViZmxvdyBtb3VudGluZyAoZW5hYmxlcyBVSSBkcmlsbC1kb3duKS4gKi9cbiAgdG9GbG93Q2hhcnQoKTogRmxvd0NoYXJ0O1xuXG4gIC8qKiBFeGVjdXRlIHRoZSBydW5uZXIuICovXG4gIHJ1bihpbnB1dDogVEluLCBvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8VE91dD47XG59XG4iXX0=
@@ -0,0 +1,132 @@
1
+ /**
2
+ * getSubtreeSnapshot — navigate an execution snapshot tree by subflow path.
3
+ *
4
+ * Given a RuntimeSnapshot and a slash-separated path of subflow IDs,
5
+ * returns the subtree rooted at that subflow. Useful for LLM drill-down:
6
+ * instead of dumping the full trace, fetch only the relevant subtree.
7
+ *
8
+ * Usage:
9
+ * const snapshot = executor.getSnapshot();
10
+ *
11
+ * // Top-level subflow
12
+ * getSubtreeSnapshot(snapshot, 'sf-payment');
13
+ *
14
+ * // Nested subflow (payment → validation)
15
+ * getSubtreeSnapshot(snapshot, 'sf-payment/sf-validation');
16
+ *
17
+ * // Returns undefined if path not found
18
+ * getSubtreeSnapshot(snapshot, 'nonexistent'); // undefined
19
+ *
20
+ * // Discover available paths
21
+ * listSubflowPaths(snapshot); // ['sf-payment', 'sf-payment/sf-validation']
22
+ */
23
+ /**
24
+ * Navigate the execution snapshot tree by a slash-separated subflow path.
25
+ *
26
+ * **Implementation note:** footprintjs's SubflowExecutor stores nested subflow
27
+ * results with composite slash-separated keys (e.g. "sf-outer/sf-inner") in
28
+ * the flat `subflowResults` map. This function uses those keys for lookup.
29
+ *
30
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
31
+ * @param path — slash-separated subflow IDs, e.g. `"sf-payment"` or `"sf-payment/sf-validation"`
32
+ * @param allNarrativeEntries — optional full narrative entries from `executor.getNarrativeEntries()`, used to extract scoped narrative for the subtree
33
+ * @returns the matching SubtreeSnapshot, or `undefined` if the path is not found
34
+ */
35
+ export function getSubtreeSnapshot(snapshot, path, allNarrativeEntries) {
36
+ var _a, _b;
37
+ if (!snapshot || !path)
38
+ return undefined;
39
+ const normalizedPath = path.split('/').filter(Boolean).join('/');
40
+ if (!normalizedPath)
41
+ return undefined;
42
+ const subflowResults = snapshot.subflowResults;
43
+ const lastSegment = normalizedPath.split('/').pop();
44
+ // Strategy 1: Direct lookup in subflowResults by full path.
45
+ // SubflowExecutor stores nested results with composite slash-separated keys.
46
+ if (subflowResults && subflowResults[normalizedPath]) {
47
+ const sfResult = subflowResults[normalizedPath];
48
+ const treeCtx = sfResult.treeContext;
49
+ return {
50
+ subflowId: lastSegment,
51
+ executionTree: (_a = treeCtx === null || treeCtx === void 0 ? void 0 : treeCtx.stageContexts) !== null && _a !== void 0 ? _a : findSubflowInTree(snapshot.executionTree, lastSegment),
52
+ sharedState: treeCtx === null || treeCtx === void 0 ? void 0 : treeCtx.globalContext,
53
+ narrativeEntries: allNarrativeEntries
54
+ ? extractScopedNarrative(allNarrativeEntries, (_b = sfResult.subflowName) !== null && _b !== void 0 ? _b : lastSegment)
55
+ : undefined,
56
+ };
57
+ }
58
+ // Strategy 2: Find the node in the execution tree by subflowId
59
+ const foundNode = findSubflowInTree(snapshot.executionTree, lastSegment);
60
+ if (!foundNode)
61
+ return undefined;
62
+ return {
63
+ subflowId: lastSegment,
64
+ executionTree: foundNode,
65
+ sharedState: undefined,
66
+ narrativeEntries: allNarrativeEntries ? extractScopedNarrative(allNarrativeEntries, lastSegment) : undefined,
67
+ };
68
+ }
69
+ /**
70
+ * List all available subflow paths in a snapshot.
71
+ *
72
+ * Returns the keys from `subflowResults`, which are slash-separated
73
+ * subflow ID paths (e.g. `["sf-payment", "sf-outer/sf-inner"]`).
74
+ * Useful for discovery — an LLM or UI can enumerate available drill-down targets.
75
+ *
76
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
77
+ * @returns array of available subflow paths, empty if none
78
+ */
79
+ export function listSubflowPaths(snapshot) {
80
+ if (!(snapshot === null || snapshot === void 0 ? void 0 : snapshot.subflowResults))
81
+ return [];
82
+ return Object.keys(snapshot.subflowResults);
83
+ }
84
+ /**
85
+ * Extract narrative entries scoped to a specific subflow.
86
+ * Finds entries between the subflow's entry and exit events.
87
+ */
88
+ function extractScopedNarrative(entries, subflowName) {
89
+ const scoped = [];
90
+ let inside = false;
91
+ for (const entry of entries) {
92
+ if (entry.type === 'subflow' && entry.text.includes(subflowName)) {
93
+ if (entry.text.toLowerCase().includes('entering')) {
94
+ inside = true;
95
+ scoped.push(entry);
96
+ continue;
97
+ }
98
+ if (entry.text.toLowerCase().includes('exiting')) {
99
+ scoped.push(entry);
100
+ inside = false;
101
+ continue;
102
+ }
103
+ }
104
+ if (inside) {
105
+ scoped.push(entry);
106
+ }
107
+ }
108
+ return scoped;
109
+ }
110
+ /**
111
+ * Find a subflow node in the execution tree by searching for a node
112
+ * whose subflowId matches.
113
+ * Searches depth-first through `next` and `children` links.
114
+ */
115
+ function findSubflowInTree(node, subflowId) {
116
+ if (!node)
117
+ return undefined;
118
+ if (node.subflowId === subflowId)
119
+ return node;
120
+ if (node.children) {
121
+ for (const child of node.children) {
122
+ const found = findSubflowInTree(child, subflowId);
123
+ if (found)
124
+ return found;
125
+ }
126
+ }
127
+ if (node.next) {
128
+ return findSubflowInTree(node.next, subflowId);
129
+ }
130
+ return undefined;
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3VidHJlZVNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvZ2V0U3VidHJlZVNuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFrQkg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFFBQXlCLEVBQ3pCLElBQVksRUFDWixtQkFBOEM7O0lBRTlDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFekMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxjQUFjO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFdEMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRyxDQUFDO0lBRXJELDREQUE0RDtJQUM1RCw2RUFBNkU7SUFDN0UsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBNEIsQ0FBQztRQUMzRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsV0FBa0QsQ0FBQztRQUU1RSxPQUFPO1lBQ0wsU0FBUyxFQUFFLFdBQVc7WUFDdEIsYUFBYSxFQUNYLE1BQUMsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGFBQTBDLG1DQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDO1lBQ2hILFdBQVcsRUFBRSxPQUFPLGFBQVAs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QUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0U3VidHJlZVNuYXBzaG90IOKAlCBuYXZpZ2F0ZSBhbiBleGVjdXRpb24gc25hcHNob3QgdHJlZSBieSBzdWJmbG93IHBhdGguXG4gKlxuICogR2l2ZW4gYSBSdW50aW1lU25hcHNob3QgYW5kIGEgc2xhc2gtc2VwYXJhdGVkIHBhdGggb2Ygc3ViZmxvdyBJRHMsXG4gKiByZXR1cm5zIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGF0IHN1YmZsb3cuIFVzZWZ1bCBmb3IgTExNIGRyaWxsLWRvd246XG4gKiBpbnN0ZWFkIG9mIGR1bXBpbmcgdGhlIGZ1bGwgdHJhY2UsIGZldGNoIG9ubHkgdGhlIHJlbGV2YW50IHN1YnRyZWUuXG4gKlxuICogVXNhZ2U6XG4gKiAgIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqXG4gKiAgIC8vIFRvcC1sZXZlbCBzdWJmbG93XG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ3NmLXBheW1lbnQnKTtcbiAqXG4gKiAgIC8vIE5lc3RlZCBzdWJmbG93IChwYXltZW50IOKGkiB2YWxpZGF0aW9uKVxuICogICBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50L3NmLXZhbGlkYXRpb24nKTtcbiAqXG4gKiAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHBhdGggbm90IGZvdW5kXG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ25vbmV4aXN0ZW50Jyk7IC8vIHVuZGVmaW5lZFxuICpcbiAqICAgLy8gRGlzY292ZXIgYXZhaWxhYmxlIHBhdGhzXG4gKiAgIGxpc3RTdWJmbG93UGF0aHMoc25hcHNob3QpOyAvLyBbJ3NmLXBheW1lbnQnLCAnc2YtcGF5bWVudC9zZi12YWxpZGF0aW9uJ11cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlcic7XG5pbXBvcnQgdHlwZSB7IFN0YWdlU25hcHNob3QgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUnO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBuYXZpZ2F0aW5nIHRvIGEgc3VidHJlZSB3aXRoaW4gYSBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VidHJlZVNuYXBzaG90IHtcbiAgLyoqIFRoZSBzdWJmbG93IElEIHRoYXQgd2FzIG1hdGNoZWQgKGxhc3Qgc2VnbWVudCBvZiB0aGUgcGF0aCkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIGV4ZWN1dGlvbiB0cmVlIHJvb3RlZCBhdCB0aGlzIHN1YmZsb3cuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKiBTaGFyZWQgc3RhdGUgc2NvcGVkIHRvIHRoaXMgc3ViZmxvdyAoZnJvbSBzdWJmbG93UmVzdWx0cyBpZiBhdmFpbGFibGUpLiAqL1xuICByZWFkb25seSBzaGFyZWRTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogTmFycmF0aXZlIGVudHJpZXMgc2NvcGVkIHRvIHRoaXMgc3ViZmxvdyAoYmV0d2VlbiBlbnRyeS9leGl0IGV2ZW50cykuICovXG4gIHJlYWRvbmx5IG5hcnJhdGl2ZUVudHJpZXM/OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W107XG59XG5cbi8qKlxuICogTmF2aWdhdGUgdGhlIGV4ZWN1dGlvbiBzbmFwc2hvdCB0cmVlIGJ5IGEgc2xhc2gtc2VwYXJhdGVkIHN1YmZsb3cgcGF0aC5cbiAqXG4gKiAqKkltcGxlbWVudGF0aW9uIG5vdGU6KiogZm9vdHByaW50anMncyBTdWJmbG93RXhlY3V0b3Igc3RvcmVzIG5lc3RlZCBzdWJmbG93XG4gKiByZXN1bHRzIHdpdGggY29tcG9zaXRlIHNsYXNoLXNlcGFyYXRlZCBrZXlzIChlLmcuIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIikgaW5cbiAqIHRoZSBmbGF0IGBzdWJmbG93UmVzdWx0c2AgbWFwLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhvc2Uga2V5cyBmb3IgbG9va3VwLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCDigJQgdGhlIGZ1bGwgUnVudGltZVNuYXBzaG90IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgXG4gKiBAcGFyYW0gcGF0aCDigJQgc2xhc2gtc2VwYXJhdGVkIHN1YmZsb3cgSURzLCBlLmcuIGBcInNmLXBheW1lbnRcImAgb3IgYFwic2YtcGF5bWVudC9zZi12YWxpZGF0aW9uXCJgXG4gKiBAcGFyYW0gYWxsTmFycmF0aXZlRW50cmllcyDigJQgb3B0aW9uYWwgZnVsbCBuYXJyYXRpdmUgZW50cmllcyBmcm9tIGBleGVjdXRvci5nZXROYXJyYXRpdmVFbnRyaWVzKClgLCB1c2VkIHRvIGV4dHJhY3Qgc2NvcGVkIG5hcnJhdGl2ZSBmb3IgdGhlIHN1YnRyZWVcbiAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBTdWJ0cmVlU25hcHNob3QsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBwYXRoIGlzIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VidHJlZVNuYXBzaG90KFxuICBzbmFwc2hvdDogUnVudGltZVNuYXBzaG90LFxuICBwYXRoOiBzdHJpbmcsXG4gIGFsbE5hcnJhdGl2ZUVudHJpZXM/OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sXG4pOiBTdWJ0cmVlU25hcHNob3QgfCB1bmRlZmluZWQge1xuICBpZiAoIXNuYXBzaG90IHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5qb2luKCcvJyk7XG4gIGlmICghbm9ybWFsaXplZFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3ViZmxvd1Jlc3VsdHMgPSBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cztcbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBub3JtYWxpemVkUGF0aC5zcGxpdCgnLycpLnBvcCgpITtcblxuICAvLyBTdHJhdGVneSAxOiBEaXJlY3QgbG9va3VwIGluIHN1YmZsb3dSZXN1bHRzIGJ5IGZ1bGwgcGF0aC5cbiAgLy8gU3ViZmxvd0V4ZWN1dG9yIHN0b3JlcyBuZXN0ZWQgcmVzdWx0cyB3aXRoIGNvbXBvc2l0ZSBzbGFzaC1zZXBhcmF0ZWQga2V5cy5cbiAgaWYgKHN1YmZsb3dSZXN1bHRzICYmIHN1YmZsb3dSZXN1bHRzW25vcm1hbGl6ZWRQYXRoXSkge1xuICAgIGNvbnN0IHNmUmVzdWx0ID0gc3ViZmxvd1Jlc3VsdHNbbm9ybWFsaXplZFBhdGhdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHRyZWVDdHggPSBzZlJlc3VsdC50cmVlQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWJmbG93SWQ6IGxhc3RTZWdtZW50LFxuICAgICAgZXhlY3V0aW9uVHJlZTpcbiAgICAgICAgKHRyZWVDdHg/LnN0YWdlQ29udGV4dHMgYXMgdW5rbm93biBhcyBTdGFnZVNuYXBzaG90KSA/PyBmaW5kU3ViZmxvd0luVHJlZShzbmFwc2hvdC5leGVjdXRpb25UcmVlLCBsYXN0U2VnbWVudCksXG4gICAgICBzaGFyZWRTdGF0ZTogdHJlZUN0eD8uZ2xvYmFsQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgIG5hcnJhdGl2ZUVudHJpZXM6IGFsbE5hcnJhdGl2ZUVudHJpZXNcbiAgICAgICAgPyBleHRyYWN0U2NvcGVkTmFycmF0aXZlKGFsbE5hcnJhdGl2ZUVudHJpZXMsIChzZlJlc3VsdC5zdWJmbG93TmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IGxhc3RTZWdtZW50KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gU3RyYXRlZ3kgMjogRmluZCB0aGUgbm9kZSBpbiB0aGUgZXhlY3V0aW9uIHRyZWUgYnkgc3ViZmxvd0lkXG4gIGNvbnN0IGZvdW5kTm9kZSA9IGZpbmRTdWJmbG93SW5UcmVlKHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsIGxhc3RTZWdtZW50KTtcbiAgaWYgKCFmb3VuZE5vZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBzdWJmbG93SWQ6IGxhc3RTZWdtZW50LFxuICAgIGV4ZWN1dGlvblRyZWU6IGZvdW5kTm9kZSxcbiAgICBzaGFyZWRTdGF0ZTogdW5kZWZpbmVkLFxuICAgIG5hcnJhdGl2ZUVudHJpZXM6IGFsbE5hcnJhdGl2ZUVudHJpZXMgPyBleHRyYWN0U2NvcGVkTmFycmF0aXZlKGFsbE5hcnJhdGl2ZUVudHJpZXMsIGxhc3RTZWdtZW50KSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBhdmFpbGFibGUgc3ViZmxvdyBwYXRocyBpbiBhIHNuYXBzaG90LlxuICpcbiAqIFJldHVybnMgdGhlIGtleXMgZnJvbSBgc3ViZmxvd1Jlc3VsdHNgLCB3aGljaCBhcmUgc2xhc2gtc2VwYXJhdGVkXG4gKiBzdWJmbG93IElEIHBhdGhzIChlLmcuIGBbXCJzZi1wYXltZW50XCIsIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIl1gKS5cbiAqIFVzZWZ1bCBmb3IgZGlzY292ZXJ5IOKAlCBhbiBMTE0gb3IgVUkgY2FuIGVudW1lcmF0ZSBhdmFpbGFibGUgZHJpbGwtZG93biB0YXJnZXRzLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCDigJQgdGhlIGZ1bGwgUnVudGltZVNuYXBzaG90IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgXG4gKiBAcmV0dXJucyBhcnJheSBvZiBhdmFpbGFibGUgc3ViZmxvdyBwYXRocywgZW1wdHkgaWYgbm9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFN1YmZsb3dQYXRocyhzbmFwc2hvdDogUnVudGltZVNuYXBzaG90KTogc3RyaW5nW10ge1xuICBpZiAoIXNuYXBzaG90Py5zdWJmbG93UmVzdWx0cykgcmV0dXJuIFtdO1xuICByZXR1cm4gT2JqZWN0LmtleXMoc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgbmFycmF0aXZlIGVudHJpZXMgc2NvcGVkIHRvIGEgc3BlY2lmaWMgc3ViZmxvdy5cbiAqIEZpbmRzIGVudHJpZXMgYmV0d2VlbiB0aGUgc3ViZmxvdydzIGVudHJ5IGFuZCBleGl0IGV2ZW50cy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sIHN1YmZsb3dOYW1lOiBzdHJpbmcpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICBjb25zdCBzY29wZWQ6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSA9IFtdO1xuICBsZXQgaW5zaWRlID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5LnR5cGUgPT09ICdzdWJmbG93JyAmJiBlbnRyeS50ZXh0LmluY2x1ZGVzKHN1YmZsb3dOYW1lKSkge1xuICAgICAgaWYgKGVudHJ5LnRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZW50ZXJpbmcnKSkge1xuICAgICAgICBpbnNpZGUgPSB0cnVlO1xuICAgICAgICBzY29wZWQucHVzaChlbnRyeSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LnRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZXhpdGluZycpKSB7XG4gICAgICAgIHNjb3BlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgaW5zaWRlID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5zaWRlKSB7XG4gICAgICBzY29wZWQucHVzaChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNjb3BlZDtcbn1cblxuLyoqXG4gKiBGaW5kIGEgc3ViZmxvdyBub2RlIGluIHRoZSBleGVjdXRpb24gdHJlZSBieSBzZWFyY2hpbmcgZm9yIGEgbm9kZVxuICogd2hvc2Ugc3ViZmxvd0lkIG1hdGNoZXMuXG4gKiBTZWFyY2hlcyBkZXB0aC1maXJzdCB0aHJvdWdoIGBuZXh0YCBhbmQgYGNoaWxkcmVuYCBsaW5rcy5cbiAqL1xuZnVuY3Rpb24gZmluZFN1YmZsb3dJblRyZWUobm9kZTogU3RhZ2VTbmFwc2hvdCB8IHVuZGVmaW5lZCwgc3ViZmxvd0lkOiBzdHJpbmcpOiBTdGFnZVNuYXBzaG90IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmIChub2RlLnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gbm9kZTtcblxuICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgZm91bmQgPSBmaW5kU3ViZmxvd0luVHJlZShjaGlsZCwgc3ViZmxvd0lkKTtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub2RlLm5leHQpIHtcbiAgICByZXR1cm4gZmluZFN1YmZsb3dJblRyZWUobm9kZS5uZXh0LCBzdWJmbG93SWQpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -1,3 +1,4 @@
1
1
  export { ExecutionRuntime } from './ExecutionRuntime';
2
2
  export { FlowChartExecutor } from './FlowChartExecutor';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5leHBvcnQgdHlwZSB7IE5hcnJhdGl2ZUVudHJ5LCBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUnO1xuZXhwb3J0IHsgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZSc7XG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vRmxvd0NoYXJ0RXhlY3V0b3InO1xuIl19
3
+ export { getSubtreeSnapshot, listSubflowPaths } from './getSubtreeSnapshot';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL0NvbXBvc2FibGVSdW5uZXInO1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVFbnRyeSwgUnVudGltZVNuYXBzaG90IH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lJztcbmV4cG9ydCB7IEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUnO1xuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL0Zsb3dDaGFydEV4ZWN1dG9yJztcbmV4cG9ydCB0eXBlIHsgU3VidHJlZVNuYXBzaG90IH0gZnJvbSAnLi9nZXRTdWJ0cmVlU25hcHNob3QnO1xuZXhwb3J0IHsgZ2V0U3VidHJlZVNuYXBzaG90LCBsaXN0U3ViZmxvd1BhdGhzIH0gZnJvbSAnLi9nZXRTdWJ0cmVlU25hcHNob3QnO1xuIl19
@@ -11,6 +11,9 @@
11
11
  export type { FlowChart, PipelineStageFunction as StageHandler, StreamHandlers } from './lib/builder';
12
12
  export { flowChart, FlowChartBuilder } from './lib/builder';
13
13
  export { FlowChartExecutor } from './lib/runner';
14
+ export type { ComposableRunner } from './lib/runner';
15
+ export type { SubtreeSnapshot } from './lib/runner';
16
+ export { getSubtreeSnapshot, listSubflowPaths } from './lib/runner';
14
17
  export { ScopeFacade } from './lib/scope';
15
18
  export { MetricRecorder } from './lib/scope';
16
19
  export { DebugRecorder } from './lib/scope';
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ComposableRunner — interface for runners that expose their internal flowChart.
3
+ *
4
+ * Any runner implementing this interface can be mounted as a subflow
5
+ * in a parent flowChart via `addSubFlowChart(id, runner.toFlowChart())`.
6
+ * This enables UI drill-down: the parent's snapshot contains the child's
7
+ * full execution tree, addressable by subflow ID.
8
+ *
9
+ * Usage:
10
+ * class MyAgent implements ComposableRunner<string, AgentResult> {
11
+ * toFlowChart() { return this.chart; }
12
+ * async run(input) { ... }
13
+ * }
14
+ *
15
+ * // Mount in parent
16
+ * flowChart('Seed', seedFn, 'seed')
17
+ * .addSubFlowChart('my-agent', agent.toFlowChart(), 'MyAgent')
18
+ * .build();
19
+ */
20
+ import type { FlowChart, RunOptions } from '../engine/types';
21
+ /**
22
+ * A runner that can expose its internal flowChart for subflow composition.
23
+ *
24
+ * @typeParam TIn — the input type accepted by `run()`
25
+ * @typeParam TOut — the output type returned by `run()`
26
+ */
27
+ export interface ComposableRunner<TIn = unknown, TOut = unknown> {
28
+ /** Expose the internal flowChart for subflow mounting (enables UI drill-down). */
29
+ toFlowChart(): FlowChart;
30
+ /** Execute the runner. */
31
+ run(input: TIn, options?: RunOptions): Promise<TOut>;
32
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * getSubtreeSnapshot — navigate an execution snapshot tree by subflow path.
3
+ *
4
+ * Given a RuntimeSnapshot and a slash-separated path of subflow IDs,
5
+ * returns the subtree rooted at that subflow. Useful for LLM drill-down:
6
+ * instead of dumping the full trace, fetch only the relevant subtree.
7
+ *
8
+ * Usage:
9
+ * const snapshot = executor.getSnapshot();
10
+ *
11
+ * // Top-level subflow
12
+ * getSubtreeSnapshot(snapshot, 'sf-payment');
13
+ *
14
+ * // Nested subflow (payment → validation)
15
+ * getSubtreeSnapshot(snapshot, 'sf-payment/sf-validation');
16
+ *
17
+ * // Returns undefined if path not found
18
+ * getSubtreeSnapshot(snapshot, 'nonexistent'); // undefined
19
+ *
20
+ * // Discover available paths
21
+ * listSubflowPaths(snapshot); // ['sf-payment', 'sf-payment/sf-validation']
22
+ */
23
+ import type { CombinedNarrativeEntry } from '../engine/narrative/CombinedNarrativeBuilder';
24
+ import type { StageSnapshot } from '../memory/types';
25
+ import type { RuntimeSnapshot } from './ExecutionRuntime';
26
+ /** The result of navigating to a subtree within a snapshot. */
27
+ export interface SubtreeSnapshot {
28
+ /** The subflow ID that was matched (last segment of the path). */
29
+ readonly subflowId: string;
30
+ /** The execution tree rooted at this subflow. */
31
+ readonly executionTree: StageSnapshot;
32
+ /** Shared state scoped to this subflow (from subflowResults if available). */
33
+ readonly sharedState?: Record<string, unknown>;
34
+ /** Narrative entries scoped to this subflow (between entry/exit events). */
35
+ readonly narrativeEntries?: CombinedNarrativeEntry[];
36
+ }
37
+ /**
38
+ * Navigate the execution snapshot tree by a slash-separated subflow path.
39
+ *
40
+ * **Implementation note:** footprintjs's SubflowExecutor stores nested subflow
41
+ * results with composite slash-separated keys (e.g. "sf-outer/sf-inner") in
42
+ * the flat `subflowResults` map. This function uses those keys for lookup.
43
+ *
44
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
45
+ * @param path — slash-separated subflow IDs, e.g. `"sf-payment"` or `"sf-payment/sf-validation"`
46
+ * @param allNarrativeEntries — optional full narrative entries from `executor.getNarrativeEntries()`, used to extract scoped narrative for the subtree
47
+ * @returns the matching SubtreeSnapshot, or `undefined` if the path is not found
48
+ */
49
+ export declare function getSubtreeSnapshot(snapshot: RuntimeSnapshot, path: string, allNarrativeEntries?: CombinedNarrativeEntry[]): SubtreeSnapshot | undefined;
50
+ /**
51
+ * List all available subflow paths in a snapshot.
52
+ *
53
+ * Returns the keys from `subflowResults`, which are slash-separated
54
+ * subflow ID paths (e.g. `["sf-payment", "sf-outer/sf-inner"]`).
55
+ * Useful for discovery — an LLM or UI can enumerate available drill-down targets.
56
+ *
57
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
58
+ * @returns array of available subflow paths, empty if none
59
+ */
60
+ export declare function listSubflowPaths(snapshot: RuntimeSnapshot): string[];
@@ -1,3 +1,6 @@
1
+ export type { ComposableRunner } from './ComposableRunner';
1
2
  export type { NarrativeEntry, RuntimeSnapshot } from './ExecutionRuntime';
2
3
  export { ExecutionRuntime } from './ExecutionRuntime';
3
4
  export { FlowChartExecutor } from './FlowChartExecutor';
5
+ export type { SubtreeSnapshot } from './getSubtreeSnapshot';
6
+ export { getSubtreeSnapshot, listSubflowPaths } from './getSubtreeSnapshot';
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * import from 'footprint/advanced'.
11
11
  */
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.validateOrThrow = exports.validateAgainstSchema = exports.InputValidationError = exports.isZod = exports.isValidatable = exports.detectSchema = exports.generateOpenAPI = exports.zodToJsonSchema = exports.normalizeSchema = exports.defineContract = exports.WindowedNarrativeFlowRecorder = exports.SilentNarrativeFlowRecorder = exports.SeparateNarrativeFlowRecorder = exports.RLENarrativeFlowRecorder = exports.ProgressiveNarrativeFlowRecorder = exports.MilestoneNarrativeFlowRecorder = exports.AdaptiveNarrativeFlowRecorder = exports.ManifestFlowRecorder = exports.formatErrorInfo = exports.extractErrorInfo = exports.NarrativeFlowRecorder = exports.CombinedNarrativeBuilder = exports.defineScopeFromZod = exports.NarrativeRecorder = exports.DebugRecorder = exports.MetricRecorder = exports.ScopeFacade = exports.FlowChartExecutor = exports.FlowChartBuilder = exports.flowChart = void 0;
13
+ exports.validateOrThrow = exports.validateAgainstSchema = exports.InputValidationError = exports.isZod = exports.isValidatable = exports.detectSchema = exports.generateOpenAPI = exports.zodToJsonSchema = exports.normalizeSchema = exports.defineContract = exports.WindowedNarrativeFlowRecorder = exports.SilentNarrativeFlowRecorder = exports.SeparateNarrativeFlowRecorder = exports.RLENarrativeFlowRecorder = exports.ProgressiveNarrativeFlowRecorder = exports.MilestoneNarrativeFlowRecorder = exports.AdaptiveNarrativeFlowRecorder = exports.ManifestFlowRecorder = exports.formatErrorInfo = exports.extractErrorInfo = exports.NarrativeFlowRecorder = exports.CombinedNarrativeBuilder = exports.defineScopeFromZod = exports.NarrativeRecorder = exports.DebugRecorder = exports.MetricRecorder = exports.ScopeFacade = exports.listSubflowPaths = exports.getSubtreeSnapshot = exports.FlowChartExecutor = exports.FlowChartBuilder = exports.flowChart = void 0;
14
14
  var builder_1 = require("./lib/builder");
15
15
  Object.defineProperty(exports, "flowChart", { enumerable: true, get: function () { return builder_1.flowChart; } });
16
16
  Object.defineProperty(exports, "FlowChartBuilder", { enumerable: true, get: function () { return builder_1.FlowChartBuilder; } });
@@ -19,6 +19,9 @@ Object.defineProperty(exports, "FlowChartBuilder", { enumerable: true, get: func
19
19
  // ============================================================================
20
20
  var runner_1 = require("./lib/runner");
21
21
  Object.defineProperty(exports, "FlowChartExecutor", { enumerable: true, get: function () { return runner_1.FlowChartExecutor; } });
22
+ var runner_2 = require("./lib/runner");
23
+ Object.defineProperty(exports, "getSubtreeSnapshot", { enumerable: true, get: function () { return runner_2.getSubtreeSnapshot; } });
24
+ Object.defineProperty(exports, "listSubflowPaths", { enumerable: true, get: function () { return runner_2.listSubflowPaths; } });
22
25
  // ============================================================================
23
26
  // Scope — Per-stage facades and recorders
24
27
  // ============================================================================
@@ -72,4 +75,4 @@ var schema_2 = require("./lib/schema");
72
75
  Object.defineProperty(exports, "InputValidationError", { enumerable: true, get: function () { return schema_2.InputValidationError; } });
73
76
  Object.defineProperty(exports, "validateAgainstSchema", { enumerable: true, get: function () { return schema_2.validateAgainstSchema; } });
74
77
  Object.defineProperty(exports, "validateOrThrow", { enumerable: true, get: function () { return schema_2.validateOrThrow; } });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7O0FBT0gseUNBQTREO0FBQW5ELG9HQUFBLFNBQVMsT0FBQTtBQUFFLDJHQUFBLGdCQUFnQixPQUFBO0FBRXBDLCtFQUErRTtBQUMvRSx1Q0FBdUM7QUFDdkMsK0VBQStFO0FBRS9FLHVDQUFpRDtBQUF4QywyR0FBQSxpQkFBaUIsT0FBQTtBQUUxQiwrRUFBK0U7QUFDL0UsMENBQTBDO0FBQzFDLCtFQUErRTtBQUUvRSxxQ0FBMEM7QUFBakMsb0dBQUEsV0FBVyxPQUFBO0FBRXBCLFlBQVk7QUFDWixxQ0FBNkM7QUFBcEMsdUdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHFDQUE0QztBQUFuQyxzR0FBQSxhQUFhLE9BQUE7QUFDdEIscUNBQWdEO0FBQXZDLDBHQUFBLGlCQUFpQixPQUFBO0FBYTFCLDhCQUE4QjtBQUM5QixxQ0FBaUQ7QUFBeEMsMkdBQUEsa0JBQWtCLE9BQUE7QUFPM0IsdUNBQXdEO0FBQS9DLGtIQUFBLHdCQUF3QixPQUFBO0FBVWpDLHVDQUFxRDtBQUE1QywrR0FBQSxxQkFBcUIsT0FBQTtBQUk5Qix1Q0FBaUU7QUFBeEQsMEdBQUEsZ0JBQWdCLE9BQUE7QUFBRSx5R0FBQSxlQUFlLE9BQUE7QUFJMUMsdUNBQW9EO0FBQTNDLDhHQUFBLG9CQUFvQixPQUFBO0FBQzdCLHVDQUE2RDtBQUFwRCx1SEFBQSw2QkFBNkIsT0FBQTtBQUN0Qyx1Q0FBOEQ7QUFBckQsd0hBQUEsOEJBQThCLE9BQUE7QUFDdkMsdUNBQWdFO0FBQXZELDBIQUFBLGdDQUFnQyxPQUFBO0FBQ3pDLHVDQUF3RDtBQUEvQyxrSEFBQSx3QkFBd0IsT0FBQTtBQUNqQyx1Q0FBNkQ7QUFBcEQsdUhBQUEsNkJBQTZCLE9BQUE7QUFDdEMsd0NBQTJEO0FBQWxELHNIQUFBLDJCQUEyQixPQUFBO0FBQ3BDLHdDQUE2RDtBQUFwRCx3SEFBQSw2QkFBNkIsT0FBQTtBQW9CdEMsMkNBQWdEO0FBQXZDLDBHQUFBLGNBQWMsT0FBQTtBQUN2QiwyQ0FBa0U7QUFBekQsMkdBQUEsZUFBZSxPQUFBO0FBQUUsMkdBQUEsZUFBZSxPQUFBO0FBQ3pDLDJDQUFpRDtBQUF4QywyR0FBQSxlQUFlLE9BQUE7QUFPeEIsdUNBQWtFO0FBQXpELHNHQUFBLFlBQVksT0FBQTtBQUFFLHVHQUFBLGFBQWEsT0FBQTtBQUFFLCtGQUFBLEtBQUssT0FBQTtBQUMzQyx1Q0FBNEY7QUFBbkYsOEdBQUEsb0JBQW9CLE9BQUE7QUFBRSwrR0FBQSxxQkFBcUIsT0FBQTtBQUFFLHlHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJXG4gKlxuICogQ29ubmVjdGVkIGNhdXNhbCB0cmFjZSBsaWJyYXJ5IGZvciBMTE0gcGlwZWxpbmVzLlxuICogQnVpbGRzIGZsb3djaGFydHMsIGV4ZWN1dGVzIHRoZW0gdmlhIERGUyB0cmF2ZXJzYWwsIGFuZCBjYXB0dXJlc1xuICogZXZlcnkgc3RhZ2UncyBjb250ZXh0IChzdGF0ZSwgZGVjaXNpb25zLCBlcnJvcnMpIGluIGFuIGF1ZGl0YWJsZSB0cmFjZS5cbiAqXG4gKiBGb3IgYWR2YW5jZWQvaW50ZXJuYWwgQVBJcyAobWVtb3J5IHByaW1pdGl2ZXMsIGVuZ2luZSBoYW5kbGVycywgcHJvdmlkZXJzKSxcbiAqIGltcG9ydCBmcm9tICdmb290cHJpbnQvYWR2YW5jZWQnLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkZXIg4oCUIEZsb3djaGFydCBjb25zdHJ1Y3Rpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnQsIFBpcGVsaW5lU3RhZ2VGdW5jdGlvbiBhcyBTdGFnZUhhbmRsZXIsIFN0cmVhbUhhbmRsZXJzIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5leHBvcnQgeyBmbG93Q2hhcnQsIEZsb3dDaGFydEJ1aWxkZXIgfSBmcm9tICcuL2xpYi9idWlsZGVyJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVubmVyIOKAlCBFeGVjdXRpb24gY29udmVuaWVuY2UgbGF5ZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL2xpYi9ydW5uZXInO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTY29wZSDigJQgUGVyLXN0YWdlIGZhY2FkZXMgYW5kIHJlY29yZGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgeyBTY29wZUZhY2FkZSB9IGZyb20gJy4vbGliL3Njb3BlJztcblxuLy8gUmVjb3JkZXJzXG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlJztcbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5leHBvcnQgeyBOYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlJztcblxuLy8gUmVjb3JkZXIgaW50ZXJmYWNlIGFuZCBjb3JlIGV2ZW50IHR5cGVzIChuZWVkZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBSZWNvcmRlcilcbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVjb3JkZXIsXG4gIFJlZGFjdGlvblBvbGljeSxcbiAgUmVkYWN0aW9uUmVwb3J0LFxuICBXcml0ZUV2ZW50LFxufSBmcm9tICcuL2xpYi9zY29wZSc7XG5cbi8vIFpvZC1iYXNlZCBzY29wZSBkZWZpbml0aW9uc1xuZXhwb3J0IHsgZGVmaW5lU2NvcGVGcm9tWm9kIH0gZnJvbSAnLi9saWIvc2NvcGUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmdpbmUg4oCUIE5hcnJhdGl2ZSAoY29tbW9ubHkgdXNlZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5cbi8vIEZsb3dSZWNvcmRlciDigJQgUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBjb250cm9sIGZsb3cgZXZlbnRzIChtaXJyb3JzIHNjb3BlIFJlY29yZGVyKVxuZXhwb3J0IHR5cGUge1xuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxuICBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCxcbn0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5cbi8vIFN0cnVjdHVyZWQgZXJyb3IgZXh0cmFjdGlvbiDigJQgcHJlc2VydmVzIGZpZWxkLWxldmVsIGRldGFpbHMgdGhyb3VnaCB0aGUgcGlwZWxpbmVcbmV4cG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCBmb3JtYXRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyBCdWlsdC1pbiBGbG93UmVjb3JkZXIgc3RyYXRlZ2llcyAodHJlZS1zaGFrZWFibGUg4oCUIGltcG9ydCBvbmx5IHdoYXQgeW91IHVzZSlcbmV4cG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFNpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1lbW9yeSDigJQgU2NvcGVGYWN0b3J5IHR5cGUgKG5lZWRlZCBmb3IgRmxvd0NoYXJ0RXhlY3V0b3IgY29uc3RydWN0b3IpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52LCBSdW5PcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB0eXBlIHsgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29udHJhY3Qg4oCUIEkvTyBib3VuZGFyeSwgc2NoZW1hcywgYW5kIE9wZW5BUEkgZ2VuZXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dDaGFydENvbnRyYWN0LFxuICBGbG93Q2hhcnRDb250cmFjdE9wdGlvbnMsXG4gIEpzb25TY2hlbWEsXG4gIE9wZW5BUElPcHRpb25zLFxuICBPcGVuQVBJU3BlYyxcbn0gZnJvbSAnLi9saWIvY29udHJhY3QnO1xuZXhwb3J0IHsgZGVmaW5lQ29udHJhY3QgfSBmcm9tICcuL2xpYi9jb250cmFjdCc7XG5leHBvcnQgeyBub3JtYWxpemVTY2hlbWEsIHpvZFRvSnNvblNjaGVtYSB9IGZyb20gJy4vbGliL2NvbnRyYWN0JztcbmV4cG9ydCB7IGdlbmVyYXRlT3BlbkFQSSB9IGZyb20gJy4vbGliL2NvbnRyYWN0JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NoZW1hIOKAlCBVbmlmaWVkIGRldGVjdGlvbiwgdmFsaWRhdGlvbiwgYW5kIHN0cnVjdHVyZWQgZXJyb3JzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hJztcbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEnO1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hJztcbiJdfQ==
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7O0FBT0gseUNBQTREO0FBQW5ELG9HQUFBLFNBQVMsT0FBQTtBQUFFLDJHQUFBLGdCQUFnQixPQUFBO0FBRXBDLCtFQUErRTtBQUMvRSx1Q0FBdUM7QUFDdkMsK0VBQStFO0FBRS9FLHVDQUFpRDtBQUF4QywyR0FBQSxpQkFBaUIsT0FBQTtBQVExQix1Q0FBb0U7QUFBM0QsNEdBQUEsa0JBQWtCLE9BQUE7QUFBRSwwR0FBQSxnQkFBZ0IsT0FBQTtBQUU3QywrRUFBK0U7QUFDL0UsMENBQTBDO0FBQzFDLCtFQUErRTtBQUUvRSxxQ0FBMEM7QUFBakMsb0dBQUEsV0FBVyxPQUFBO0FBRXBCLFlBQVk7QUFDWixxQ0FBNkM7QUFBcEMsdUdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHFDQUE0QztBQUFuQyxzR0FBQSxhQUFhLE9BQUE7QUFDdEIscUNBQWdEO0FBQXZDLDBHQUFBLGlCQUFpQixPQUFBO0FBYTFCLDhCQUE4QjtBQUM5QixxQ0FBaUQ7QUFBeEMsMkdBQUEsa0JBQWtCLE9BQUE7QUFPM0IsdUNBQXdEO0FBQS9DLGtIQUFBLHdCQUF3QixPQUFBO0FBVWpDLHVDQUFxRDtBQUE1QywrR0FBQSxxQkFBcUIsT0FBQTtBQUk5Qix1Q0FBaUU7QUFBeEQsMEdBQUEsZ0JBQWdCLE9BQUE7QUFBRSx5R0FBQSxlQUFlLE9BQUE7QUFJMUMsdUNBQW9EO0FBQTNDLDhHQUFBLG9CQUFvQixPQUFBO0FBQzdCLHVDQUE2RDtBQUFwRCx1SEFBQSw2QkFBNkIsT0FBQTtBQUN0Qyx1Q0FBOEQ7QUFBckQsd0hBQUEsOEJBQThCLE9BQUE7QUFDdkMsdUNBQWdFO0FBQXZELDBIQUFBLGdDQUFnQyxPQUFBO0FBQ3pDLHVDQUF3RDtBQUEvQyxrSEFBQSx3QkFBd0IsT0FBQTtBQUNqQyx1Q0FBNkQ7QUFBcEQsdUhBQUEsNkJBQTZCLE9BQUE7QUFDdEMsd0NBQTJEO0FBQWxELHNIQUFBLDJCQUEyQixPQUFBO0FBQ3BDLHdDQUE2RDtBQUFwRCx3SEFBQSw2QkFBNkIsT0FBQTtBQW9CdEMsMkNBQWdEO0FBQXZDLDBHQUFBLGNBQWMsT0FBQTtBQUN2QiwyQ0FBa0U7QUFBekQsMkdBQUEsZUFBZSxPQUFBO0FBQUUsMkdBQUEsZUFBZSxPQUFBO0FBQ3pDLDJDQUFpRDtBQUF4QywyR0FBQSxlQUFlLE9BQUE7QUFPeEIsdUNBQWtFO0FBQXpELHNHQUFBLFlBQVksT0FBQTtBQUFFLHVHQUFBLGFBQWEsT0FBQTtBQUFFLCtGQUFBLEtBQUssT0FBQTtBQUMzQyx1Q0FBNEY7QUFBbkYsOEdBQUEsb0JBQW9CLE9BQUE7QUFBRSwrR0FBQSxxQkFBcUIsT0FBQTtBQUFFLHlHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJXG4gKlxuICogQ29ubmVjdGVkIGNhdXNhbCB0cmFjZSBsaWJyYXJ5IGZvciBMTE0gcGlwZWxpbmVzLlxuICogQnVpbGRzIGZsb3djaGFydHMsIGV4ZWN1dGVzIHRoZW0gdmlhIERGUyB0cmF2ZXJzYWwsIGFuZCBjYXB0dXJlc1xuICogZXZlcnkgc3RhZ2UncyBjb250ZXh0IChzdGF0ZSwgZGVjaXNpb25zLCBlcnJvcnMpIGluIGFuIGF1ZGl0YWJsZSB0cmFjZS5cbiAqXG4gKiBGb3IgYWR2YW5jZWQvaW50ZXJuYWwgQVBJcyAobWVtb3J5IHByaW1pdGl2ZXMsIGVuZ2luZSBoYW5kbGVycywgcHJvdmlkZXJzKSxcbiAqIGltcG9ydCBmcm9tICdmb290cHJpbnQvYWR2YW5jZWQnLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkZXIg4oCUIEZsb3djaGFydCBjb25zdHJ1Y3Rpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnQsIFBpcGVsaW5lU3RhZ2VGdW5jdGlvbiBhcyBTdGFnZUhhbmRsZXIsIFN0cmVhbUhhbmRsZXJzIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5leHBvcnQgeyBmbG93Q2hhcnQsIEZsb3dDaGFydEJ1aWxkZXIgfSBmcm9tICcuL2xpYi9idWlsZGVyJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVubmVyIOKAlCBFeGVjdXRpb24gY29udmVuaWVuY2UgbGF5ZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL2xpYi9ydW5uZXInO1xuXG4vLyBDb21wb3NhYmxlUnVubmVyIOKAlCBpbnRlcmZhY2UgZm9yIHJ1bm5lcnMgdGhhdCBleHBvc2UgdGhlaXIgaW50ZXJuYWwgZmxvd0NoYXJ0XG4vLyBmb3Igc3ViZmxvdyBjb21wb3NpdGlvbiAoZW5hYmxlcyBVSSBkcmlsbC1kb3duIGludG8gbmVzdGVkIHJ1bm5lcnMpXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL2xpYi9ydW5uZXInO1xuXG4vLyBTbmFwc2hvdCBuYXZpZ2F0aW9uIOKAlCBkcmlsbCBpbnRvIHN1YmZsb3cgc3VidHJlZXMgYnkgcGF0aFxuZXhwb3J0IHR5cGUgeyBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXInO1xuZXhwb3J0IHsgZ2V0U3VidHJlZVNuYXBzaG90LCBsaXN0U3ViZmxvd1BhdGhzIH0gZnJvbSAnLi9saWIvcnVubmVyJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGUg4oCUIFBlci1zdGFnZSBmYWNhZGVzIGFuZCByZWNvcmRlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5cbi8vIFJlY29yZGVyc1xuZXhwb3J0IHsgTWV0cmljUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5leHBvcnQgeyBEZWJ1Z1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUnO1xuZXhwb3J0IHsgTmFycmF0aXZlUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZSc7XG5cbi8vIFJlY29yZGVyIGludGVyZmFjZSBhbmQgY29yZSBldmVudCB0eXBlcyAobmVlZGVkIHRvIGltcGxlbWVudCBjdXN0b20gUmVjb3JkZXIpXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEV2ZW50LFxuICBFcnJvckV2ZW50LFxuICBSZWFkRXZlbnQsXG4gIFJlY29yZGVyLFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUnO1xuXG4vLyBab2QtYmFzZWQgc2NvcGUgZGVmaW5pdGlvbnNcbmV4cG9ydCB7IGRlZmluZVNjb3BlRnJvbVpvZCB9IGZyb20gJy4vbGliL3Njb3BlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5naW5lIOKAlCBOYXJyYXRpdmUgKGNvbW1vbmx5IHVzZWQpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyBGbG93UmVjb3JkZXIg4oCUIFBsdWdnYWJsZSBvYnNlcnZlciBmb3IgY29udHJvbCBmbG93IGV2ZW50cyAobWlycm9ycyBzY29wZSBSZWNvcmRlcilcbmV4cG9ydCB0eXBlIHtcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG59IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyBTdHJ1Y3R1cmVkIGVycm9yIGV4dHJhY3Rpb24g4oCUIHByZXNlcnZlcyBmaWVsZC1sZXZlbCBkZXRhaWxzIHRocm91Z2ggdGhlIHBpcGVsaW5lXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lJztcblxuLy8gQnVpbHQtaW4gRmxvd1JlY29yZGVyIHN0cmF0ZWdpZXMgKHRyZWUtc2hha2VhYmxlIOKAlCBpbXBvcnQgb25seSB3aGF0IHlvdSB1c2UpXG5leHBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFByb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lJztcbmV4cG9ydCB7IFJMRU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuZXhwb3J0IHsgV2luZG93ZWROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vcnkg4oCUIFNjb3BlRmFjdG9yeSB0eXBlIChuZWVkZWQgZm9yIEZsb3dDaGFydEV4ZWN1dG9yIGNvbnN0cnVjdG9yKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZSc7XG5leHBvcnQgdHlwZSB7IFNjb3BlRmFjdG9yeSB9IGZyb20gJy4vbGliL21lbW9yeSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRyYWN0IOKAlCBJL08gYm91bmRhcnksIHNjaGVtYXMsIGFuZCBPcGVuQVBJIGdlbmVyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBGbG93Q2hhcnRDb250cmFjdCxcbiAgRmxvd0NoYXJ0Q29udHJhY3RPcHRpb25zLFxuICBKc29uU2NoZW1hLFxuICBPcGVuQVBJT3B0aW9ucyxcbiAgT3BlbkFQSVNwZWMsXG59IGZyb20gJy4vbGliL2NvbnRyYWN0JztcbmV4cG9ydCB7IGRlZmluZUNvbnRyYWN0IH0gZnJvbSAnLi9saWIvY29udHJhY3QnO1xuZXhwb3J0IHsgbm9ybWFsaXplU2NoZW1hLCB6b2RUb0pzb25TY2hlbWEgfSBmcm9tICcuL2xpYi9jb250cmFjdCc7XG5leHBvcnQgeyBnZW5lcmF0ZU9wZW5BUEkgfSBmcm9tICcuL2xpYi9jb250cmFjdCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjaGVtYSDigJQgVW5pZmllZCBkZXRlY3Rpb24sIHZhbGlkYXRpb24sIGFuZCBzdHJ1Y3R1cmVkIGVycm9yc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IFNjaGVtYUtpbmQsIFZhbGlkYXRpb25Jc3N1ZSwgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vbGliL3NjaGVtYSc7XG5leHBvcnQgeyBkZXRlY3RTY2hlbWEsIGlzVmFsaWRhdGFibGUsIGlzWm9kIH0gZnJvbSAnLi9saWIvc2NoZW1hJztcbmV4cG9ydCB7IElucHV0VmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEsIHZhbGlkYXRlT3JUaHJvdyB9IGZyb20gJy4vbGliL3NjaGVtYSc7XG4iXX0=
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * ComposableRunner — interface for runners that expose their internal flowChart.
4
+ *
5
+ * Any runner implementing this interface can be mounted as a subflow
6
+ * in a parent flowChart via `addSubFlowChart(id, runner.toFlowChart())`.
7
+ * This enables UI drill-down: the parent's snapshot contains the child's
8
+ * full execution tree, addressable by subflow ID.
9
+ *
10
+ * Usage:
11
+ * class MyAgent implements ComposableRunner<string, AgentResult> {
12
+ * toFlowChart() { return this.chart; }
13
+ * async run(input) { ... }
14
+ * }
15
+ *
16
+ * // Mount in parent
17
+ * flowChart('Seed', seedFn, 'seed')
18
+ * .addSubFlowChart('my-agent', agent.toFlowChart(), 'MyAgent')
19
+ * .build();
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9zYWJsZVJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0NvbXBvc2FibGVSdW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBvc2FibGVSdW5uZXIg4oCUIGludGVyZmFjZSBmb3IgcnVubmVycyB0aGF0IGV4cG9zZSB0aGVpciBpbnRlcm5hbCBmbG93Q2hhcnQuXG4gKlxuICogQW55IHJ1bm5lciBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIG1vdW50ZWQgYXMgYSBzdWJmbG93XG4gKiBpbiBhIHBhcmVudCBmbG93Q2hhcnQgdmlhIGBhZGRTdWJGbG93Q2hhcnQoaWQsIHJ1bm5lci50b0Zsb3dDaGFydCgpKWAuXG4gKiBUaGlzIGVuYWJsZXMgVUkgZHJpbGwtZG93bjogdGhlIHBhcmVudCdzIHNuYXBzaG90IGNvbnRhaW5zIHRoZSBjaGlsZCdzXG4gKiBmdWxsIGV4ZWN1dGlvbiB0cmVlLCBhZGRyZXNzYWJsZSBieSBzdWJmbG93IElELlxuICpcbiAqIFVzYWdlOlxuICogICBjbGFzcyBNeUFnZW50IGltcGxlbWVudHMgQ29tcG9zYWJsZVJ1bm5lcjxzdHJpbmcsIEFnZW50UmVzdWx0PiB7XG4gKiAgICAgdG9GbG93Q2hhcnQoKSB7IHJldHVybiB0aGlzLmNoYXJ0OyB9XG4gKiAgICAgYXN5bmMgcnVuKGlucHV0KSB7IC4uLiB9XG4gKiAgIH1cbiAqXG4gKiAgIC8vIE1vdW50IGluIHBhcmVudFxuICogICBmbG93Q2hhcnQoJ1NlZWQnLCBzZWVkRm4sICdzZWVkJylcbiAqICAgICAuYWRkU3ViRmxvd0NoYXJ0KCdteS1hZ2VudCcsIGFnZW50LnRvRmxvd0NoYXJ0KCksICdNeUFnZW50JylcbiAqICAgICAuYnVpbGQoKTtcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCwgUnVuT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS90eXBlcyc7XG5cbi8qKlxuICogQSBydW5uZXIgdGhhdCBjYW4gZXhwb3NlIGl0cyBpbnRlcm5hbCBmbG93Q2hhcnQgZm9yIHN1YmZsb3cgY29tcG9zaXRpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUSW4gIOKAlCB0aGUgaW5wdXQgdHlwZSBhY2NlcHRlZCBieSBgcnVuKClgXG4gKiBAdHlwZVBhcmFtIFRPdXQg4oCUIHRoZSBvdXRwdXQgdHlwZSByZXR1cm5lZCBieSBgcnVuKClgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zYWJsZVJ1bm5lcjxUSW4gPSB1bmtub3duLCBUT3V0ID0gdW5rbm93bj4ge1xuICAvKiogRXhwb3NlIHRoZSBpbnRlcm5hbCBmbG93Q2hhcnQgZm9yIHN1YmZsb3cgbW91bnRpbmcgKGVuYWJsZXMgVUkgZHJpbGwtZG93bikuICovXG4gIHRvRmxvd0NoYXJ0KCk6IEZsb3dDaGFydDtcblxuICAvKiogRXhlY3V0ZSB0aGUgcnVubmVyLiAqL1xuICBydW4oaW5wdXQ6IFRJbiwgb3B0aW9ucz86IFJ1bk9wdGlvbnMpOiBQcm9taXNlPFRPdXQ+O1xufVxuIl19
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ /**
3
+ * getSubtreeSnapshot — navigate an execution snapshot tree by subflow path.
4
+ *
5
+ * Given a RuntimeSnapshot and a slash-separated path of subflow IDs,
6
+ * returns the subtree rooted at that subflow. Useful for LLM drill-down:
7
+ * instead of dumping the full trace, fetch only the relevant subtree.
8
+ *
9
+ * Usage:
10
+ * const snapshot = executor.getSnapshot();
11
+ *
12
+ * // Top-level subflow
13
+ * getSubtreeSnapshot(snapshot, 'sf-payment');
14
+ *
15
+ * // Nested subflow (payment → validation)
16
+ * getSubtreeSnapshot(snapshot, 'sf-payment/sf-validation');
17
+ *
18
+ * // Returns undefined if path not found
19
+ * getSubtreeSnapshot(snapshot, 'nonexistent'); // undefined
20
+ *
21
+ * // Discover available paths
22
+ * listSubflowPaths(snapshot); // ['sf-payment', 'sf-payment/sf-validation']
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.listSubflowPaths = exports.getSubtreeSnapshot = void 0;
26
+ /**
27
+ * Navigate the execution snapshot tree by a slash-separated subflow path.
28
+ *
29
+ * **Implementation note:** footprintjs's SubflowExecutor stores nested subflow
30
+ * results with composite slash-separated keys (e.g. "sf-outer/sf-inner") in
31
+ * the flat `subflowResults` map. This function uses those keys for lookup.
32
+ *
33
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
34
+ * @param path — slash-separated subflow IDs, e.g. `"sf-payment"` or `"sf-payment/sf-validation"`
35
+ * @param allNarrativeEntries — optional full narrative entries from `executor.getNarrativeEntries()`, used to extract scoped narrative for the subtree
36
+ * @returns the matching SubtreeSnapshot, or `undefined` if the path is not found
37
+ */
38
+ function getSubtreeSnapshot(snapshot, path, allNarrativeEntries) {
39
+ var _a, _b;
40
+ if (!snapshot || !path)
41
+ return undefined;
42
+ const normalizedPath = path.split('/').filter(Boolean).join('/');
43
+ if (!normalizedPath)
44
+ return undefined;
45
+ const subflowResults = snapshot.subflowResults;
46
+ const lastSegment = normalizedPath.split('/').pop();
47
+ // Strategy 1: Direct lookup in subflowResults by full path.
48
+ // SubflowExecutor stores nested results with composite slash-separated keys.
49
+ if (subflowResults && subflowResults[normalizedPath]) {
50
+ const sfResult = subflowResults[normalizedPath];
51
+ const treeCtx = sfResult.treeContext;
52
+ return {
53
+ subflowId: lastSegment,
54
+ executionTree: (_a = treeCtx === null || treeCtx === void 0 ? void 0 : treeCtx.stageContexts) !== null && _a !== void 0 ? _a : findSubflowInTree(snapshot.executionTree, lastSegment),
55
+ sharedState: treeCtx === null || treeCtx === void 0 ? void 0 : treeCtx.globalContext,
56
+ narrativeEntries: allNarrativeEntries
57
+ ? extractScopedNarrative(allNarrativeEntries, (_b = sfResult.subflowName) !== null && _b !== void 0 ? _b : lastSegment)
58
+ : undefined,
59
+ };
60
+ }
61
+ // Strategy 2: Find the node in the execution tree by subflowId
62
+ const foundNode = findSubflowInTree(snapshot.executionTree, lastSegment);
63
+ if (!foundNode)
64
+ return undefined;
65
+ return {
66
+ subflowId: lastSegment,
67
+ executionTree: foundNode,
68
+ sharedState: undefined,
69
+ narrativeEntries: allNarrativeEntries ? extractScopedNarrative(allNarrativeEntries, lastSegment) : undefined,
70
+ };
71
+ }
72
+ exports.getSubtreeSnapshot = getSubtreeSnapshot;
73
+ /**
74
+ * List all available subflow paths in a snapshot.
75
+ *
76
+ * Returns the keys from `subflowResults`, which are slash-separated
77
+ * subflow ID paths (e.g. `["sf-payment", "sf-outer/sf-inner"]`).
78
+ * Useful for discovery — an LLM or UI can enumerate available drill-down targets.
79
+ *
80
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
81
+ * @returns array of available subflow paths, empty if none
82
+ */
83
+ function listSubflowPaths(snapshot) {
84
+ if (!(snapshot === null || snapshot === void 0 ? void 0 : snapshot.subflowResults))
85
+ return [];
86
+ return Object.keys(snapshot.subflowResults);
87
+ }
88
+ exports.listSubflowPaths = listSubflowPaths;
89
+ /**
90
+ * Extract narrative entries scoped to a specific subflow.
91
+ * Finds entries between the subflow's entry and exit events.
92
+ */
93
+ function extractScopedNarrative(entries, subflowName) {
94
+ const scoped = [];
95
+ let inside = false;
96
+ for (const entry of entries) {
97
+ if (entry.type === 'subflow' && entry.text.includes(subflowName)) {
98
+ if (entry.text.toLowerCase().includes('entering')) {
99
+ inside = true;
100
+ scoped.push(entry);
101
+ continue;
102
+ }
103
+ if (entry.text.toLowerCase().includes('exiting')) {
104
+ scoped.push(entry);
105
+ inside = false;
106
+ continue;
107
+ }
108
+ }
109
+ if (inside) {
110
+ scoped.push(entry);
111
+ }
112
+ }
113
+ return scoped;
114
+ }
115
+ /**
116
+ * Find a subflow node in the execution tree by searching for a node
117
+ * whose subflowId matches.
118
+ * Searches depth-first through `next` and `children` links.
119
+ */
120
+ function findSubflowInTree(node, subflowId) {
121
+ if (!node)
122
+ return undefined;
123
+ if (node.subflowId === subflowId)
124
+ return node;
125
+ if (node.children) {
126
+ for (const child of node.children) {
127
+ const found = findSubflowInTree(child, subflowId);
128
+ if (found)
129
+ return found;
130
+ }
131
+ }
132
+ if (node.next) {
133
+ return findSubflowInTree(node.next, subflowId);
134
+ }
135
+ return undefined;
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3VidHJlZVNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvZ2V0U3VidHJlZVNuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7QUFrQkg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsUUFBeUIsRUFDekIsSUFBWSxFQUNaLG1CQUE4Qzs7SUFFOUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV0QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUM7SUFFckQsNERBQTREO0lBQzVELDZFQUE2RTtJQUM3RSxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUE0QixDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxXQUFrRCxDQUFDO1FBRTVFLE9BQU87WUFDTCxTQUFTLEVBQUUsV0FBVztZQUN0QixhQUFhLEVBQ1gsTUFBQyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsYUFBMEMsbUNBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUM7WUFDaEgsV0FBVyxFQUFFLE9BQU8sYUFBUCxPQUFP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QUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGdldFN1YnRyZWVTbmFwc2hvdCDigJQgbmF2aWdhdGUgYW4gZXhlY3V0aW9uIHNuYXBzaG90IHRyZWUgYnkgc3ViZmxvdyBwYXRoLlxuICpcbiAqIEdpdmVuIGEgUnVudGltZVNuYXBzaG90IGFuZCBhIHNsYXNoLXNlcGFyYXRlZCBwYXRoIG9mIHN1YmZsb3cgSURzLFxuICogcmV0dXJucyB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhhdCBzdWJmbG93LiBVc2VmdWwgZm9yIExMTSBkcmlsbC1kb3duOlxuICogaW5zdGVhZCBvZiBkdW1waW5nIHRoZSBmdWxsIHRyYWNlLCBmZXRjaCBvbmx5IHRoZSByZWxldmFudCBzdWJ0cmVlLlxuICpcbiAqIFVzYWdlOlxuICogICBjb25zdCBzbmFwc2hvdCA9IGV4ZWN1dG9yLmdldFNuYXBzaG90KCk7XG4gKlxuICogICAvLyBUb3AtbGV2ZWwgc3ViZmxvd1xuICogICBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50Jyk7XG4gKlxuICogICAvLyBOZXN0ZWQgc3ViZmxvdyAocGF5bWVudCDihpIgdmFsaWRhdGlvbilcbiAqICAgZ2V0U3VidHJlZVNuYXBzaG90KHNuYXBzaG90LCAnc2YtcGF5bWVudC9zZi12YWxpZGF0aW9uJyk7XG4gKlxuICogICAvLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiBwYXRoIG5vdCBmb3VuZFxuICogICBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdub25leGlzdGVudCcpOyAvLyB1bmRlZmluZWRcbiAqXG4gKiAgIC8vIERpc2NvdmVyIGF2YWlsYWJsZSBwYXRoc1xuICogICBsaXN0U3ViZmxvd1BhdGhzKHNuYXBzaG90KTsgLy8gWydzZi1wYXltZW50JywgJ3NmLXBheW1lbnQvc2YtdmFsaWRhdGlvbiddXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXInO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUnVudGltZVNuYXBzaG90IH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lJztcblxuLyoqIFRoZSByZXN1bHQgb2YgbmF2aWdhdGluZyB0byBhIHN1YnRyZWUgd2l0aGluIGEgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnRyZWVTbmFwc2hvdCB7XG4gIC8qKiBUaGUgc3ViZmxvdyBJRCB0aGF0IHdhcyBtYXRjaGVkIChsYXN0IHNlZ21lbnQgb2YgdGhlIHBhdGgpLiAqL1xuICByZWFkb25seSBzdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIFRoZSBleGVjdXRpb24gdHJlZSByb290ZWQgYXQgdGhpcyBzdWJmbG93LiAqL1xuICByZWFkb25seSBleGVjdXRpb25UcmVlOiBTdGFnZVNuYXBzaG90O1xuICAvKiogU2hhcmVkIHN0YXRlIHNjb3BlZCB0byB0aGlzIHN1YmZsb3cgKGZyb20gc3ViZmxvd1Jlc3VsdHMgaWYgYXZhaWxhYmxlKS4gKi9cbiAgcmVhZG9ubHkgc2hhcmVkU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIE5hcnJhdGl2ZSBlbnRyaWVzIHNjb3BlZCB0byB0aGlzIHN1YmZsb3cgKGJldHdlZW4gZW50cnkvZXhpdCBldmVudHMpLiAqL1xuICByZWFkb25seSBuYXJyYXRpdmVFbnRyaWVzPzogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdO1xufVxuXG4vKipcbiAqIE5hdmlnYXRlIHRoZSBleGVjdXRpb24gc25hcHNob3QgdHJlZSBieSBhIHNsYXNoLXNlcGFyYXRlZCBzdWJmbG93IHBhdGguXG4gKlxuICogKipJbXBsZW1lbnRhdGlvbiBub3RlOioqIGZvb3RwcmludGpzJ3MgU3ViZmxvd0V4ZWN1dG9yIHN0b3JlcyBuZXN0ZWQgc3ViZmxvd1xuICogcmVzdWx0cyB3aXRoIGNvbXBvc2l0ZSBzbGFzaC1zZXBhcmF0ZWQga2V5cyAoZS5nLiBcInNmLW91dGVyL3NmLWlubmVyXCIpIGluXG4gKiB0aGUgZmxhdCBgc3ViZmxvd1Jlc3VsdHNgIG1hcC4gVGhpcyBmdW5jdGlvbiB1c2VzIHRob3NlIGtleXMgZm9yIGxvb2t1cC5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3Qg4oCUIHRoZSBmdWxsIFJ1bnRpbWVTbmFwc2hvdCBmcm9tIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpYFxuICogQHBhcmFtIHBhdGgg4oCUIHNsYXNoLXNlcGFyYXRlZCBzdWJmbG93IElEcywgZS5nLiBgXCJzZi1wYXltZW50XCJgIG9yIGBcInNmLXBheW1lbnQvc2YtdmFsaWRhdGlvblwiYFxuICogQHBhcmFtIGFsbE5hcnJhdGl2ZUVudHJpZXMg4oCUIG9wdGlvbmFsIGZ1bGwgbmFycmF0aXZlIGVudHJpZXMgZnJvbSBgZXhlY3V0b3IuZ2V0TmFycmF0aXZlRW50cmllcygpYCwgdXNlZCB0byBleHRyYWN0IHNjb3BlZCBuYXJyYXRpdmUgZm9yIHRoZSBzdWJ0cmVlXG4gKiBAcmV0dXJucyB0aGUgbWF0Y2hpbmcgU3VidHJlZVNuYXBzaG90LCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBpcyBub3QgZm91bmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN1YnRyZWVTbmFwc2hvdChcbiAgc25hcHNob3Q6IFJ1bnRpbWVTbmFwc2hvdCxcbiAgcGF0aDogc3RyaW5nLFxuICBhbGxOYXJyYXRpdmVFbnRyaWVzPzogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdLFxuKTogU3VidHJlZVNuYXBzaG90IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzbmFwc2hvdCB8fCAhcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikuam9pbignLycpO1xuICBpZiAoIW5vcm1hbGl6ZWRQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN1YmZsb3dSZXN1bHRzID0gc25hcHNob3Quc3ViZmxvd1Jlc3VsdHM7XG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gbm9ybWFsaXplZFBhdGguc3BsaXQoJy8nKS5wb3AoKSE7XG5cbiAgLy8gU3RyYXRlZ3kgMTogRGlyZWN0IGxvb2t1cCBpbiBzdWJmbG93UmVzdWx0cyBieSBmdWxsIHBhdGguXG4gIC8vIFN1YmZsb3dFeGVjdXRvciBzdG9yZXMgbmVzdGVkIHJlc3VsdHMgd2l0aCBjb21wb3NpdGUgc2xhc2gtc2VwYXJhdGVkIGtleXMuXG4gIGlmIChzdWJmbG93UmVzdWx0cyAmJiBzdWJmbG93UmVzdWx0c1tub3JtYWxpemVkUGF0aF0pIHtcbiAgICBjb25zdCBzZlJlc3VsdCA9IHN1YmZsb3dSZXN1bHRzW25vcm1hbGl6ZWRQYXRoXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCB0cmVlQ3R4ID0gc2ZSZXN1bHQudHJlZUNvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3ViZmxvd0lkOiBsYXN0U2VnbWVudCxcbiAgICAgIGV4ZWN1dGlvblRyZWU6XG4gICAgICAgICh0cmVlQ3R4Py5zdGFnZUNvbnRleHRzIGFzIHVua25vd24gYXMgU3RhZ2VTbmFwc2hvdCkgPz8gZmluZFN1YmZsb3dJblRyZWUoc25hcHNob3QuZXhlY3V0aW9uVHJlZSwgbGFzdFNlZ21lbnQpLFxuICAgICAgc2hhcmVkU3RhdGU6IHRyZWVDdHg/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICBuYXJyYXRpdmVFbnRyaWVzOiBhbGxOYXJyYXRpdmVFbnRyaWVzXG4gICAgICAgID8gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShhbGxOYXJyYXRpdmVFbnRyaWVzLCAoc2ZSZXN1bHQuc3ViZmxvd05hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyBsYXN0U2VnbWVudClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFN0cmF0ZWd5IDI6IEZpbmQgdGhlIG5vZGUgaW4gdGhlIGV4ZWN1dGlvbiB0cmVlIGJ5IHN1YmZsb3dJZFxuICBjb25zdCBmb3VuZE5vZGUgPSBmaW5kU3ViZmxvd0luVHJlZShzbmFwc2hvdC5leGVjdXRpb25UcmVlLCBsYXN0U2VnbWVudCk7XG4gIGlmICghZm91bmROb2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgc3ViZmxvd0lkOiBsYXN0U2VnbWVudCxcbiAgICBleGVjdXRpb25UcmVlOiBmb3VuZE5vZGUsXG4gICAgc2hhcmVkU3RhdGU6IHVuZGVmaW5lZCxcbiAgICBuYXJyYXRpdmVFbnRyaWVzOiBhbGxOYXJyYXRpdmVFbnRyaWVzID8gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShhbGxOYXJyYXRpdmVFbnRyaWVzLCBsYXN0U2VnbWVudCkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBhbGwgYXZhaWxhYmxlIHN1YmZsb3cgcGF0aHMgaW4gYSBzbmFwc2hvdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIGZyb20gYHN1YmZsb3dSZXN1bHRzYCwgd2hpY2ggYXJlIHNsYXNoLXNlcGFyYXRlZFxuICogc3ViZmxvdyBJRCBwYXRocyAoZS5nLiBgW1wic2YtcGF5bWVudFwiLCBcInNmLW91dGVyL3NmLWlubmVyXCJdYCkuXG4gKiBVc2VmdWwgZm9yIGRpc2NvdmVyeSDigJQgYW4gTExNIG9yIFVJIGNhbiBlbnVtZXJhdGUgYXZhaWxhYmxlIGRyaWxsLWRvd24gdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3Qg4oCUIHRoZSBmdWxsIFJ1bnRpbWVTbmFwc2hvdCBmcm9tIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpYFxuICogQHJldHVybnMgYXJyYXkgb2YgYXZhaWxhYmxlIHN1YmZsb3cgcGF0aHMsIGVtcHR5IGlmIG5vbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTdWJmbG93UGF0aHMoc25hcHNob3Q6IFJ1bnRpbWVTbmFwc2hvdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCFzbmFwc2hvdD8uc3ViZmxvd1Jlc3VsdHMpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IG5hcnJhdGl2ZSBlbnRyaWVzIHNjb3BlZCB0byBhIHNwZWNpZmljIHN1YmZsb3cuXG4gKiBGaW5kcyBlbnRyaWVzIGJldHdlZW4gdGhlIHN1YmZsb3cncyBlbnRyeSBhbmQgZXhpdCBldmVudHMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTY29wZWROYXJyYXRpdmUoZW50cmllczogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdLCBzdWJmbG93TmFtZTogc3RyaW5nKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgY29uc3Qgc2NvcGVkOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10gPSBbXTtcbiAgbGV0IGluc2lkZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmIChlbnRyeS50eXBlID09PSAnc3ViZmxvdycgJiYgZW50cnkudGV4dC5pbmNsdWRlcyhzdWJmbG93TmFtZSkpIHtcbiAgICAgIGlmIChlbnRyeS50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2VudGVyaW5nJykpIHtcbiAgICAgICAgaW5zaWRlID0gdHJ1ZTtcbiAgICAgICAgc2NvcGVkLnB1c2goZW50cnkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2V4aXRpbmcnKSkge1xuICAgICAgICBzY29wZWQucHVzaChlbnRyeSk7XG4gICAgICAgIGluc2lkZSA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluc2lkZSkge1xuICAgICAgc2NvcGVkLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzY29wZWQ7XG59XG5cbi8qKlxuICogRmluZCBhIHN1YmZsb3cgbm9kZSBpbiB0aGUgZXhlY3V0aW9uIHRyZWUgYnkgc2VhcmNoaW5nIGZvciBhIG5vZGVcbiAqIHdob3NlIHN1YmZsb3dJZCBtYXRjaGVzLlxuICogU2VhcmNoZXMgZGVwdGgtZmlyc3QgdGhyb3VnaCBgbmV4dGAgYW5kIGBjaGlsZHJlbmAgbGlua3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTdWJmbG93SW5UcmVlKG5vZGU6IFN0YWdlU25hcHNob3QgfCB1bmRlZmluZWQsIHN1YmZsb3dJZDogc3RyaW5nKTogU3RhZ2VTbmFwc2hvdCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAobm9kZS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIG5vZGU7XG5cbiAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZFN1YmZsb3dJblRyZWUoY2hpbGQsIHN1YmZsb3dJZCk7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS5uZXh0KSB7XG4gICAgcmV0dXJuIGZpbmRTdWJmbG93SW5UcmVlKG5vZGUubmV4dCwgc3ViZmxvd0lkKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FlowChartExecutor = exports.ExecutionRuntime = void 0;
3
+ exports.listSubflowPaths = exports.getSubtreeSnapshot = exports.FlowChartExecutor = exports.ExecutionRuntime = void 0;
4
4
  var ExecutionRuntime_1 = require("./ExecutionRuntime");
5
5
  Object.defineProperty(exports, "ExecutionRuntime", { enumerable: true, get: function () { return ExecutionRuntime_1.ExecutionRuntime; } });
6
6
  var FlowChartExecutor_1 = require("./FlowChartExecutor");
7
7
  Object.defineProperty(exports, "FlowChartExecutor", { enumerable: true, get: function () { return FlowChartExecutor_1.FlowChartExecutor; } });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBc0Q7QUFBN0Msb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIseURBQXdEO0FBQS9DLHNIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmV4cG9ydCB0eXBlIHsgTmFycmF0aXZlRW50cnksIFJ1bnRpbWVTbmFwc2hvdCB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZSc7XG5leHBvcnQgeyBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lJztcbmV4cG9ydCB7IEZsb3dDaGFydEV4ZWN1dG9yIH0gZnJvbSAnLi9GbG93Q2hhcnRFeGVjdXRvcic7XG4iXX0=
8
+ var getSubtreeSnapshot_1 = require("./getSubtreeSnapshot");
9
+ Object.defineProperty(exports, "getSubtreeSnapshot", { enumerable: true, get: function () { return getSubtreeSnapshot_1.getSubtreeSnapshot; } });
10
+ Object.defineProperty(exports, "listSubflowPaths", { enumerable: true, get: function () { return getSubtreeSnapshot_1.listSubflowPaths; } });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx1REFBc0Q7QUFBN0Msb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIseURBQXdEO0FBQS9DLHNIQUFBLGlCQUFpQixPQUFBO0FBRTFCLDJEQUE0RTtBQUFuRSx3SEFBQSxrQkFBa0IsT0FBQTtBQUFFLHNIQUFBLGdCQUFnQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zYWJsZVJ1bm5lciB9IGZyb20gJy4vQ29tcG9zYWJsZVJ1bm5lcic7XG5leHBvcnQgdHlwZSB7IE5hcnJhdGl2ZUVudHJ5LCBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUnO1xuZXhwb3J0IHsgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZSc7XG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vRmxvd0NoYXJ0RXhlY3V0b3InO1xuZXhwb3J0IHR5cGUgeyBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2dldFN1YnRyZWVTbmFwc2hvdCc7XG5leHBvcnQgeyBnZXRTdWJ0cmVlU25hcHNob3QsIGxpc3RTdWJmbG93UGF0aHMgfSBmcm9tICcuL2dldFN1YnRyZWVTbmFwc2hvdCc7XG4iXX0=
@@ -11,6 +11,9 @@
11
11
  export type { FlowChart, PipelineStageFunction as StageHandler, StreamHandlers } from './lib/builder';
12
12
  export { flowChart, FlowChartBuilder } from './lib/builder';
13
13
  export { FlowChartExecutor } from './lib/runner';
14
+ export type { ComposableRunner } from './lib/runner';
15
+ export type { SubtreeSnapshot } from './lib/runner';
16
+ export { getSubtreeSnapshot, listSubflowPaths } from './lib/runner';
14
17
  export { ScopeFacade } from './lib/scope';
15
18
  export { MetricRecorder } from './lib/scope';
16
19
  export { DebugRecorder } from './lib/scope';
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ComposableRunner — interface for runners that expose their internal flowChart.
3
+ *
4
+ * Any runner implementing this interface can be mounted as a subflow
5
+ * in a parent flowChart via `addSubFlowChart(id, runner.toFlowChart())`.
6
+ * This enables UI drill-down: the parent's snapshot contains the child's
7
+ * full execution tree, addressable by subflow ID.
8
+ *
9
+ * Usage:
10
+ * class MyAgent implements ComposableRunner<string, AgentResult> {
11
+ * toFlowChart() { return this.chart; }
12
+ * async run(input) { ... }
13
+ * }
14
+ *
15
+ * // Mount in parent
16
+ * flowChart('Seed', seedFn, 'seed')
17
+ * .addSubFlowChart('my-agent', agent.toFlowChart(), 'MyAgent')
18
+ * .build();
19
+ */
20
+ import type { FlowChart, RunOptions } from '../engine/types';
21
+ /**
22
+ * A runner that can expose its internal flowChart for subflow composition.
23
+ *
24
+ * @typeParam TIn — the input type accepted by `run()`
25
+ * @typeParam TOut — the output type returned by `run()`
26
+ */
27
+ export interface ComposableRunner<TIn = unknown, TOut = unknown> {
28
+ /** Expose the internal flowChart for subflow mounting (enables UI drill-down). */
29
+ toFlowChart(): FlowChart;
30
+ /** Execute the runner. */
31
+ run(input: TIn, options?: RunOptions): Promise<TOut>;
32
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * getSubtreeSnapshot — navigate an execution snapshot tree by subflow path.
3
+ *
4
+ * Given a RuntimeSnapshot and a slash-separated path of subflow IDs,
5
+ * returns the subtree rooted at that subflow. Useful for LLM drill-down:
6
+ * instead of dumping the full trace, fetch only the relevant subtree.
7
+ *
8
+ * Usage:
9
+ * const snapshot = executor.getSnapshot();
10
+ *
11
+ * // Top-level subflow
12
+ * getSubtreeSnapshot(snapshot, 'sf-payment');
13
+ *
14
+ * // Nested subflow (payment → validation)
15
+ * getSubtreeSnapshot(snapshot, 'sf-payment/sf-validation');
16
+ *
17
+ * // Returns undefined if path not found
18
+ * getSubtreeSnapshot(snapshot, 'nonexistent'); // undefined
19
+ *
20
+ * // Discover available paths
21
+ * listSubflowPaths(snapshot); // ['sf-payment', 'sf-payment/sf-validation']
22
+ */
23
+ import type { CombinedNarrativeEntry } from '../engine/narrative/CombinedNarrativeBuilder';
24
+ import type { StageSnapshot } from '../memory/types';
25
+ import type { RuntimeSnapshot } from './ExecutionRuntime';
26
+ /** The result of navigating to a subtree within a snapshot. */
27
+ export interface SubtreeSnapshot {
28
+ /** The subflow ID that was matched (last segment of the path). */
29
+ readonly subflowId: string;
30
+ /** The execution tree rooted at this subflow. */
31
+ readonly executionTree: StageSnapshot;
32
+ /** Shared state scoped to this subflow (from subflowResults if available). */
33
+ readonly sharedState?: Record<string, unknown>;
34
+ /** Narrative entries scoped to this subflow (between entry/exit events). */
35
+ readonly narrativeEntries?: CombinedNarrativeEntry[];
36
+ }
37
+ /**
38
+ * Navigate the execution snapshot tree by a slash-separated subflow path.
39
+ *
40
+ * **Implementation note:** footprintjs's SubflowExecutor stores nested subflow
41
+ * results with composite slash-separated keys (e.g. "sf-outer/sf-inner") in
42
+ * the flat `subflowResults` map. This function uses those keys for lookup.
43
+ *
44
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
45
+ * @param path — slash-separated subflow IDs, e.g. `"sf-payment"` or `"sf-payment/sf-validation"`
46
+ * @param allNarrativeEntries — optional full narrative entries from `executor.getNarrativeEntries()`, used to extract scoped narrative for the subtree
47
+ * @returns the matching SubtreeSnapshot, or `undefined` if the path is not found
48
+ */
49
+ export declare function getSubtreeSnapshot(snapshot: RuntimeSnapshot, path: string, allNarrativeEntries?: CombinedNarrativeEntry[]): SubtreeSnapshot | undefined;
50
+ /**
51
+ * List all available subflow paths in a snapshot.
52
+ *
53
+ * Returns the keys from `subflowResults`, which are slash-separated
54
+ * subflow ID paths (e.g. `["sf-payment", "sf-outer/sf-inner"]`).
55
+ * Useful for discovery — an LLM or UI can enumerate available drill-down targets.
56
+ *
57
+ * @param snapshot — the full RuntimeSnapshot from `executor.getSnapshot()`
58
+ * @returns array of available subflow paths, empty if none
59
+ */
60
+ export declare function listSubflowPaths(snapshot: RuntimeSnapshot): string[];
@@ -1,3 +1,6 @@
1
+ export type { ComposableRunner } from './ComposableRunner';
1
2
  export type { NarrativeEntry, RuntimeSnapshot } from './ExecutionRuntime';
2
3
  export { ExecutionRuntime } from './ExecutionRuntime';
3
4
  export { FlowChartExecutor } from './FlowChartExecutor';
5
+ export type { SubtreeSnapshot } from './getSubtreeSnapshot';
6
+ export { getSubtreeSnapshot, listSubflowPaths } from './getSubtreeSnapshot';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Turn your whiteboard flowchart into running code — with automatic causal traces for LLM reasoning",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",