footprintjs 4.6.0 → 4.7.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/AGENTS.md CHANGED
@@ -16,12 +16,13 @@ src/lib/
16
16
  ├── scope/ → Per-stage facades + recorders + providers
17
17
  ├── reactive/ → TypedScope<T> deep Proxy (typed property access, $-methods)
18
18
  ├── decide/ → decide()/select() decision evidence capture
19
+ ├── recorder/ → CompositeRecorder, KeyedRecorder<T> base class
19
20
  ├── engine/ → DFS traversal + narrative + handlers
20
21
  ├── runner/ → FlowChartExecutor
21
22
  └── contract/ → I/O schema + OpenAPI
22
23
  ```
23
24
 
24
- Entry points: `footprintjs` (public) and `footprintjs/advanced` (internals).
25
+ Entry points: `footprintjs` (public), `footprintjs/trace` (execution tracing), `footprintjs/advanced` (internals).
25
26
 
26
27
  ## Key API — TypedScope (Recommended)
27
28
 
@@ -108,6 +109,21 @@ executor.setRedactionPolicy({ keys, patterns, fields })
108
109
  - 8 built-in FlowRecorder strategies
109
110
  - Narrative via `executor.recorder(narrative())` at runtime
110
111
 
112
+ ## Execution Tracing (`footprintjs/trace`)
113
+
114
+ Every stage gets a unique `runtimeStageId`: `[subflowPath/]stageId#executionIndex` (e.g., `call-llm#5`, `sf-tools/execute-tool-calls#8`)
115
+
116
+ Use for: debugging (which stage wrote what?), backtracking (who changed a value?), custom recorder storage.
117
+
118
+ ```typescript
119
+ import { parseRuntimeStageId, findLastWriter, findCommit, KeyedRecorder } from 'footprintjs/trace';
120
+
121
+ // commitLog from executor.getSnapshot().commitLog (CommitBundle[])
122
+ // findCommit(commitLog, stageId, key?) → CommitBundle | undefined
123
+ // findLastWriter(commitLog, key, beforeIdx?) → CommitBundle | undefined — search backwards
124
+ // KeyedRecorder<T> — abstract base: store(runtimeStageId, entry), getByKey(), getMap(), values()
125
+ ```
126
+
111
127
  ## Rules
112
128
 
113
129
  - Use `flowChart<T>()` — scopeFactory is auto-embedded
package/CLAUDE.md CHANGED
@@ -16,7 +16,7 @@ src/lib/
16
16
  ├── scope/ → Per-stage facades + recorders + providers
17
17
  ├── reactive/ → TypedScope<T> deep Proxy (typed property access, $-methods, cycle-safe)
18
18
  ├── decide/ → decide()/select() decision evidence capture (filter + function)
19
- ├── recorder/ → CompositeRecorder composition primitives (domain presets)
19
+ ├── recorder/ → CompositeRecorder, KeyedRecorder<T> base class, composition primitives
20
20
  ├── pause/ → Pause/Resume (PauseSignal, FlowchartCheckpoint, PausableHandler)
21
21
  ├── engine/ → DFS traversal + narrative + 13 handlers
22
22
  ├── runner/ → High-level executor (FlowChartExecutor)
@@ -25,9 +25,10 @@ src/lib/
25
25
 
26
26
  Dependency DAG: `memory <- scope <- reactive <- engine <- runner`, `schema <- engine`, `builder (standalone) -> engine`, `contract <- schema`, `decide -> scope`
27
27
 
28
- Two entry points:
28
+ Three entry points:
29
29
  - `import { ... } from 'footprintjs'` — public API
30
- - `import { ... } from 'footprintjs/advanced'` — internals
30
+ - `import { ... } from 'footprintjs/trace'` — execution tracing: runtimeStageId, commitLog queries, KeyedRecorder
31
+ - `import { ... } from 'footprintjs/advanced'` — engine internals (also re-exports trace)
31
32
 
32
33
  ## Key API
33
34
 
@@ -218,6 +219,74 @@ Both use `{ id, hooks } -> dispatcher -> error isolation -> attach/detach`. Inte
218
219
  6. FlowRecorder.onNext/onDecision/onFork — control flow continues
219
220
  ```
220
221
 
222
+ ## Execution Tracing (`footprintjs/trace`)
223
+
224
+ Every stage execution gets a unique `runtimeStageId` — the universal key that links recorder events, commit log entries, and execution tree nodes.
225
+
226
+ **When to use:** Debugging (which stage set a value to something unexpected?), audit trails (trace every write to its source stage), custom recorders (correlate events with specific execution steps), quality trace backtracking (walk backwards to find where data quality dropped).
227
+
228
+ **Format:** `[subflowPath/]stageId#executionIndex`
229
+
230
+ ```
231
+ seed#0 — root stage
232
+ call-llm#5 — 5th execution step
233
+ sf-tools/execute-tool-calls#8 — subflow stage
234
+ call-llm#9 — same stageId, different execution (loop)
235
+ ```
236
+
237
+ **The commitLog:** An ordered array of `CommitBundle` — one per stage commit, recording what each stage wrote to shared state. Get it from `executor.getSnapshot().commitLog`.
238
+
239
+ ```typescript
240
+ import { parseRuntimeStageId, findLastWriter, findCommit } from 'footprintjs/trace';
241
+
242
+ // Parse a runtimeStageId into components
243
+ parseRuntimeStageId('sf-tools/execute-tool-calls#8');
244
+ // → { stageId: 'execute-tool-calls', executionIndex: 8, subflowPath: 'sf-tools' }
245
+
246
+ // Get the commit log after execution
247
+ const snapshot = executor.getSnapshot();
248
+ const commitLog = snapshot.commitLog; // CommitBundle[]
249
+
250
+ // Backtrack: who last wrote 'systemPrompt' before commitLog array index 8?
251
+ // beforeIdx is the CommitBundle.idx (array position), NOT the executionIndex from runtimeStageId.
252
+ const writer = findLastWriter(commitLog, 'systemPrompt', 8);
253
+ // → CommitBundle | undefined (has .stage, .stageId, .runtimeStageId, .trace, .overwrite, .updates)
254
+
255
+ // Find by stageId: use findCommit when you know the stage.
256
+ // Use findLastWriter when you know the key but not which stage wrote it.
257
+ const llmCommit = findCommit(commitLog, 'call-llm', 'adapterRawResponse');
258
+ ```
259
+
260
+ **Exports from `footprintjs/trace`:**
261
+
262
+ | Export | Returns | Use |
263
+ |--------|---------|-----|
264
+ | `buildRuntimeStageId(stageId, idx, subflowPath?)` | `string` | Construct an ID from components |
265
+ | `parseRuntimeStageId(id)` | `{ stageId, executionIndex, subflowPath }` | Decompose an ID |
266
+ | `findCommit(commitLog, stageId, key?)` | `CommitBundle \| undefined` | Find first commit by stageId |
267
+ | `findCommits(commitLog, stageId)` | `CommitBundle[]` | Find all commits by stageId |
268
+ | `findLastWriter(commitLog, key, beforeIdx?)` | `CommitBundle \| undefined` | Search backwards for who wrote a key |
269
+ | `KeyedRecorder<T>` | abstract class | Base for Map-based recorders |
270
+
271
+ **KeyedRecorder<T>** — abstract base class for recorders that store data as `Map<runtimeStageId, T>`:
272
+
273
+ ```typescript
274
+ import { KeyedRecorder } from 'footprintjs/trace';
275
+
276
+ class MyRecorder extends KeyedRecorder<MyEntry> {
277
+ readonly id = 'my-recorder'; // required (abstract)
278
+ onSomeEvent(event) {
279
+ this.store(event.runtimeStageId, { ... }); // protected
280
+ }
281
+ }
282
+ recorder.getByKey('call-llm#5'); // O(1) lookup
283
+ recorder.getMap(); // ReadonlyMap
284
+ recorder.values(); // MyEntry[] in insertion order
285
+ recorder.clear(); // reset
286
+ ```
287
+
288
+ **How runtimeStageId is generated:** A counter starts at 0 and increments by 1 for each stage execution across the entire run, including subflow stages. Subflow child traversers share the parent counter so indices are globally unique. Stages inside subflows have stageIds already prefixed by the builder (e.g., `sf-tools/execute-tool-calls`), so `buildRuntimeStageId` just appends `#index`.
289
+
221
290
  ## Anti-Patterns
222
291
 
223
292
  - Never post-process the tree — use recorders
package/dist/advanced.js CHANGED
@@ -22,7 +22,7 @@
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.createSubflowHandlerDeps = exports.ContinuationResolver = exports.computeNodeType = exports.ChildrenExecutor = exports.applyOutputMapping = exports.NullControlFlowNarrativeGenerator = exports.isStageNodeReturn = exports.FlowchartTraverser = exports.shouldWrapWithProxy = exports.SCOPE_METHOD_NAMES = exports.joinPath = exports.createArrayProxy = exports.buildNestedPatch = exports.BREAK_SETTER = exports.ExecutionRuntime = exports.ZodScopeResolver = exports.isScopeSchema = exports.defineScopeSchema = exports.createScopeProxyFromZod = exports.toScopeFactory = exports.resolveScopeProvider = exports.registerScopeResolver = exports.makeFactoryProvider = exports.makeClassProvider = exports.looksLikeFactory = exports.looksLikeClassCtor = exports.isSubclassOfScopeFacade = exports.attachScopeMethods = exports.ScopeFacade = exports.createProtectedScope = exports.createErrorMessage = exports.createTypedScopeFactory = exports.specToStageNode = exports.SelectorFnList = exports.DeciderList = exports.ArrayMergeMode = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.redactPatch = exports.normalisePath = exports.getRunAndGlobalPaths = exports.getNestedValue = exports.deepSmartMerge = exports.applySmartMerge = exports.DiagnosticCollector = exports.TransactionBuffer = exports.EventLog = exports.StageContext = exports.SharedMemory = void 0;
25
- exports.SubflowExecutor = exports.StageRunner = exports.SelectorHandler = exports.seedSubflowGlobalStore = exports.RuntimeStructureManager = exports.NodeResolver = exports.getInitialScopeValues = exports.extractParentScopeValues = exports.ExtractorRunner = exports.DEFAULT_MAX_ITERATIONS = exports.DeciderHandler = void 0;
25
+ exports.KeyedRecorder = exports.findLastWriter = exports.findCommits = exports.findCommit = exports.parseRuntimeStageId = exports.createExecutionCounter = exports.buildRuntimeStageId = exports.SubflowExecutor = exports.StageRunner = exports.SelectorHandler = exports.seedSubflowGlobalStore = exports.RuntimeStructureManager = exports.NodeResolver = exports.getInitialScopeValues = exports.extractParentScopeValues = exports.ExtractorRunner = exports.DEFAULT_MAX_ITERATIONS = exports.DeciderHandler = void 0;
26
26
  var index_js_1 = require("./lib/memory/index.js");
27
27
  Object.defineProperty(exports, "SharedMemory", { enumerable: true, get: function () { return index_js_1.SharedMemory; } });
28
28
  var index_js_2 = require("./lib/memory/index.js");
@@ -102,4 +102,14 @@ Object.defineProperty(exports, "seedSubflowGlobalStore", { enumerable: true, get
102
102
  Object.defineProperty(exports, "SelectorHandler", { enumerable: true, get: function () { return index_js_16.SelectorHandler; } });
103
103
  Object.defineProperty(exports, "StageRunner", { enumerable: true, get: function () { return index_js_16.StageRunner; } });
104
104
  Object.defineProperty(exports, "SubflowExecutor", { enumerable: true, get: function () { return index_js_16.SubflowExecutor; } });
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWR2YW5jZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNIOzs7Ozs7O0dBT0c7Ozs7QUFjSCxrREFBcUQ7QUFBNUMsd0dBQUEsWUFBWSxPQUFBO0FBQ3JCLGtEQUFxRDtBQUE1Qyx3R0FBQSxZQUFZLE9BQUE7QUFDckIsa0RBQWlEO0FBQXhDLG9HQUFBLFFBQVEsT0FBQTtBQUNqQixrREFBMEQ7QUFBakQsNkdBQUEsaUJBQWlCLE9BQUE7QUFDMUIsa0RBQTREO0FBQW5ELCtHQUFBLG1CQUFtQixPQUFBO0FBQzVCLGtEQVUrQjtBQVQ3QiwyR0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxjQUFjLE9BQUE7QUFDZCwwR0FBQSxjQUFjLE9BQUE7QUFDZCxnSEFBQSxvQkFBb0IsT0FBQTtBQUNwQix5R0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxXQUFXLE9BQUE7QUFDWCwwR0FBQSxjQUFjLE9BQUE7QUFDZCw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQix1R0FBQSxXQUFXLE9BQUE7QUF3QmIsbURBQXNHO0FBQTdGLDBHQUFBLGNBQWMsT0FBQTtBQUFFLHVHQUFBLFdBQVcsT0FBQTtBQUFFLDBHQUFBLGNBQWMsT0FBQTtBQUFFLDJHQUFBLGVBQWUsT0FBQTtBQUNyRSxxRUFBMEU7QUFBakUsNEhBQUEsdUJBQXVCLE9BQUE7QUFhaEMsaURBQTZGO0FBQXBGLDhHQUFBLGtCQUFrQixPQUFBO0FBQUUsZ0hBQUEsb0JBQW9CLE9BQUE7QUFBRSx1R0FBQSxXQUFXLE9BQUE7QUFDOUQsaURBVThCO0FBVDVCLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLG1IQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLDRHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDZHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLCtHQUFBLG1CQUFtQixPQUFBO0FBQ25CLGlIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLGdIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLDBHQUFBLGNBQWMsT0FBQTtBQWVoQixnQkFBZ0I7QUFDaEIsa0RBQW1IO0FBQTFHLG9IQUFBLHVCQUF1QixPQUFBO0FBQUUsOEdBQUEsaUJBQWlCLE9BQUE7QUFBRSwwR0FBQSxhQUFhLE9BQUE7QUFBRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQU9wRixtREFBeUQ7QUFBaEQsNkdBQUEsZ0JBQWdCLE9BQUE7QUFPekIscURBT2lDO0FBTi9CLHlHQUFBLFlBQVksT0FBQTtBQUNaLDZHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDZHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHFHQUFBLFFBQVEsT0FBQTtBQUNSLCtHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLGdIQUFBLG1CQUFtQixPQUFBO0FBU3JCLG1EQUEyRDtBQUFsRCwrR0FBQSxrQkFBa0IsT0FBQTtBQUMzQixtREFBMEQ7QUFBakQsOEdBQUEsaUJBQWlCLE9BQUE7QUFzQjFCLG1EQUEwRTtBQUFqRSw4SEFBQSxpQ0FBaUMsT0FBQTtBQUkxQyxtREFpQitCO0FBaEI3QiwrR0FBQSxrQkFBa0IsT0FBQTtBQUNsQiw2R0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxlQUFlLE9BQUE7QUFDZixpSEFBQSxvQkFBb0IsT0FBQTtBQUNwQixxSEFBQSx3QkFBd0IsT0FBQTtBQUN4QiwyR0FBQSxjQUFjLE9BQUE7QUFDZCxtSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qiw0R0FBQSxlQUFlLE9BQUE7QUFDZixxSEFBQSx3QkFBd0IsT0FBQTtBQUN4QixrSEFBQSxxQkFBcUIsT0FBQTtBQUNyQix5R0FBQSxZQUFZLE9BQUE7QUFDWixvSEFBQSx1QkFBdUIsT0FBQTtBQUN2QixtSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qiw0R0FBQSxlQUFlLE9BQUE7QUFDZix3R0FBQSxXQUFXLE9BQUE7QUFDWCw0R0FBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL2FkdmFuY2VkIOKAlCBMb3ctbGV2ZWwgaW50ZXJuYWxzIGZvciBjdXN0b20gZXhlY3V0aW9uIGVuZ2luZXMgYW5kIHRlc3RpbmcuXG4gKlxuICogTW9zdCB1c2VycyBuZXZlciBuZWVkIHRoaXMuIFVzZSBgZm9vdHByaW50anNgIChtYWluKSBpbnN0ZWFkLlxuICogVGhpcyBlbnRyeSBwb2ludCBleHBvc2VzIGBTaGFyZWRNZW1vcnlgLCBgU3RhZ2VDb250ZXh0YCwgYEZsb3djaGFydFRyYXZlcnNlcmAsXG4gKiBhbmQgb3RoZXIgcHJpbWl0aXZlcyB0aGF0IHBvd2VyIHRoZSBlbmdpbmUuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFNoYXJlZE1lbW9yeSwgU3RhZ2VDb250ZXh0IH0gZnJvbSAnZm9vdHByaW50anMvYWR2YW5jZWQnO1xuICogYGBgXG4gKlxuICogQG1vZHVsZSBhZHZhbmNlZFxuICovXG4vKipcbiAqIEZvb3RQcmludCDigJQgQWR2YW5jZWQgLyBJbnRlcm5hbCBBUElcbiAqXG4gKiBUaGVzZSBleHBvcnRzIGFyZSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLCB0ZXN0aW5nLCBhbmQgYnVpbGRpbmdcbiAqIGN1c3RvbSBleGVjdXRpb24gZW5naW5lcy4gTW9zdCB1c2VycyBzaG91bGQgdXNlIHRoZSBtYWluICdmb290cHJpbnQnIGVudHJ5IHBvaW50LlxuICpcbiAqIEltcG9ydCB2aWE6IGltcG9ydCB7IC4uLiB9IGZyb20gJ2Zvb3RwcmludC9hZHZhbmNlZCdcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vcnkg4oCUIExvdy1sZXZlbCB0cmFuc2FjdGlvbmFsIHN0YXRlIHByaW1pdGl2ZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBDb21taXRCdW5kbGUsXG4gIEZsb3dDb250cm9sVHlwZSxcbiAgRmxvd01lc3NhZ2UsXG4gIE1lbW9yeVBhdGNoLFxuICBTdGFnZVNuYXBzaG90LFxuICBUcmFjZUVudHJ5LFxufSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIGFwcGx5U21hcnRNZXJnZSxcbiAgZGVlcFNtYXJ0TWVyZ2UsXG4gIGdldE5lc3RlZFZhbHVlLFxuICBnZXRSdW5BbmRHbG9iYWxQYXRocyxcbiAgbm9ybWFsaXNlUGF0aCxcbiAgcmVkYWN0UGF0Y2gsXG4gIHNldE5lc3RlZFZhbHVlLFxuICB1cGRhdGVOZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlVmFsdWUsXG59IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkZXIg4oCUIFR5cGVzIGFuZCBpbnRlcm5hbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRpbWVFeHRyYWN0b3IsXG4gIEJ1aWxkVGltZU5vZGVNZXRhZGF0YSxcbiAgRXhlY09wdGlvbnMsXG4gIEZsb3dDaGFydFNwZWMsXG4gIElMb2dnZXIsXG4gIFNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgU2ltcGxpZmllZFBhcmFsbGVsU3BlYyxcbiAgU3RhZ2VGbixcbiAgU3RhZ2VOb2RlLFxuICBTdHJlYW1DYWxsYmFjayxcbiAgU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcixcbiAgU3RyZWFtVG9rZW5IYW5kbGVyLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBTdWJmbG93UmVmLFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcbmV4cG9ydCB7IEFycmF5TWVyZ2VNb2RlLCBEZWNpZGVyTGlzdCwgU2VsZWN0b3JGbkxpc3QsIHNwZWNUb1N0YWdlTm9kZSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuZXhwb3J0IHsgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGUg4oCUIFByb3ZpZGVycywgcHJvdGVjdGlvbiwgcmVjb3JkZXIgb3B0aW9ucywgYW5kIGV2ZW50IHR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHtcbiAgUHJvdmlkZXJSZXNvbHZlcixcbiAgUmVzb2x2ZU9wdGlvbnMsXG4gIFNjb3BlUHJvdmlkZXIsXG4gIFN0YWdlQ29udGV4dExpa2UsXG4gIFN0cmljdE1vZGUsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcbmV4cG9ydCB7IGNyZWF0ZUVycm9yTWVzc2FnZSwgY3JlYXRlUHJvdGVjdGVkU2NvcGUsIFNjb3BlRmFjYWRlIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgYXR0YWNoU2NvcGVNZXRob2RzLFxuICBpc1N1YmNsYXNzT2ZTY29wZUZhY2FkZSxcbiAgbG9va3NMaWtlQ2xhc3NDdG9yLFxuICBsb29rc0xpa2VGYWN0b3J5LFxuICBtYWtlQ2xhc3NQcm92aWRlcixcbiAgbWFrZUZhY3RvcnlQcm92aWRlcixcbiAgcmVnaXN0ZXJTY29wZVJlc29sdmVyLFxuICByZXNvbHZlU2NvcGVQcm92aWRlcixcbiAgdG9TY29wZUZhY3RvcnksXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLy8gUmVjb3JkZXIgY29uZmlnL29wdGlvbiB0eXBlc1xuZXhwb3J0IHR5cGUge1xuICBBZ2dyZWdhdGVkTWV0cmljcyxcbiAgRGVidWdFbnRyeSxcbiAgRGVidWdSZWNvcmRlck9wdGlvbnMsXG4gIERlYnVnVmVyYm9zaXR5LFxuICBEZWZpbmVTY29wZU9wdGlvbnMsXG4gIFJlY29yZGVyQ29udGV4dCxcbiAgU3RhZ2VFdmVudCxcbiAgU3RhZ2VNZXRyaWNzLFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8vIFpvZCBpbnRlcm5hbHNcbmV4cG9ydCB7IGNyZWF0ZVNjb3BlUHJveHlGcm9tWm9kLCBkZWZpbmVTY29wZVNjaGVtYSwgaXNTY29wZVNjaGVtYSwgWm9kU2NvcGVSZXNvbHZlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVubmVyIOKAlCBJbnRlcm5hbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuZXhwb3J0IHsgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlYWN0aXZlIOKAlCBUeXBlZFNjb3BlIGludGVybmFscyAoZm9yIGN1c3RvbSBwcm94eSBpbXBsZW1lbnRhdGlvbnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgUmVhY3RpdmVPcHRpb25zLCBSZWFjdGl2ZVRhcmdldCB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIEJSRUFLX1NFVFRFUixcbiAgYnVpbGROZXN0ZWRQYXRjaCxcbiAgY3JlYXRlQXJyYXlQcm94eSxcbiAgam9pblBhdGgsXG4gIFNDT1BFX01FVEhPRF9OQU1FUyxcbiAgc2hvdWxkV3JhcFdpdGhQcm94eSxcbn0gZnJvbSAnLi9saWIvcmVhY3RpdmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmdpbmUg4oCUIERGUyBncmFwaCB0cmF2ZXJzYWwgaW50ZXJuYWxzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgVHJhdmVyc2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5leHBvcnQgdHlwZSB7IERlY2lkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gTmFycmF0aXZlIGludGVybmFsc1xuZXhwb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5LCBDb21iaW5lZE5hcnJhdGl2ZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUge1xuICBCcmFuY2hSZXN1bHQsXG4gIEJyYW5jaFJlc3VsdHMsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSBhcyBFbmdpbmVTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlU25hcHNob3QgYXMgRW5naW5lU3RhZ2VTbmFwc2hvdCxcbiAgRXh0cmFjdG9yRXJyb3IsXG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgTm9kZVJlc3VsdFR5cGUsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVNZXRhZGF0YSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZXJpYWxpemVkUGlwZWxpbmVOb2RlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdWJmbG93UmVzdWx0LFxuICBUcmF2ZXJzYWxFeHRyYWN0b3IsXG4gIFRyYXZlcnNhbFJlc3VsdCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vIEhhbmRsZXJzICh0ZXN0aW5nIC8gY3VzdG9tIGVuZ2luZXMpXG5leHBvcnQgdHlwZSB7IENhbGxFeHRyYWN0b3JGbiwgRXhlY3V0ZU5vZGVGbiwgR2V0U3RhZ2VQYXRoRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgYXBwbHlPdXRwdXRNYXBwaW5nLFxuICBDaGlsZHJlbkV4ZWN1dG9yLFxuICBjb21wdXRlTm9kZVR5cGUsXG4gIENvbnRpbnVhdGlvblJlc29sdmVyLFxuICBjcmVhdGVTdWJmbG93SGFuZGxlckRlcHMsXG4gIERlY2lkZXJIYW5kbGVyLFxuICBERUZBVUxUX01BWF9JVEVSQVRJT05TLFxuICBFeHRyYWN0b3JSdW5uZXIsXG4gIGV4dHJhY3RQYXJlbnRTY29wZVZhbHVlcyxcbiAgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLFxuICBOb2RlUmVzb2x2ZXIsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLFxuICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlLFxuICBTZWxlY3RvckhhbmRsZXIsXG4gIFN0YWdlUnVubmVyLFxuICBTdWJmbG93RXhlY3V0b3IsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG4iXX0=
105
+ var runtimeStageId_js_1 = require("./lib/engine/runtimeStageId.js");
106
+ Object.defineProperty(exports, "buildRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.buildRuntimeStageId; } });
107
+ Object.defineProperty(exports, "createExecutionCounter", { enumerable: true, get: function () { return runtimeStageId_js_1.createExecutionCounter; } });
108
+ Object.defineProperty(exports, "parseRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.parseRuntimeStageId; } });
109
+ var commitLogUtils_js_1 = require("./lib/memory/commitLogUtils.js");
110
+ Object.defineProperty(exports, "findCommit", { enumerable: true, get: function () { return commitLogUtils_js_1.findCommit; } });
111
+ Object.defineProperty(exports, "findCommits", { enumerable: true, get: function () { return commitLogUtils_js_1.findCommits; } });
112
+ Object.defineProperty(exports, "findLastWriter", { enumerable: true, get: function () { return commitLogUtils_js_1.findLastWriter; } });
113
+ var KeyedRecorder_js_1 = require("./lib/recorder/KeyedRecorder.js");
114
+ Object.defineProperty(exports, "KeyedRecorder", { enumerable: true, get: function () { return KeyedRecorder_js_1.KeyedRecorder; } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWR2YW5jZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNIOzs7Ozs7O0dBT0c7Ozs7QUFjSCxrREFBcUQ7QUFBNUMsd0dBQUEsWUFBWSxPQUFBO0FBQ3JCLGtEQUFxRDtBQUE1Qyx3R0FBQSxZQUFZLE9BQUE7QUFDckIsa0RBQWlEO0FBQXhDLG9HQUFBLFFBQVEsT0FBQTtBQUNqQixrREFBMEQ7QUFBakQsNkdBQUEsaUJBQWlCLE9BQUE7QUFDMUIsa0RBQTREO0FBQW5ELCtHQUFBLG1CQUFtQixPQUFBO0FBQzVCLGtEQVUrQjtBQVQ3QiwyR0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxjQUFjLE9BQUE7QUFDZCwwR0FBQSxjQUFjLE9BQUE7QUFDZCxnSEFBQSxvQkFBb0IsT0FBQTtBQUNwQix5R0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxXQUFXLE9BQUE7QUFDWCwwR0FBQSxjQUFjLE9BQUE7QUFDZCw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQix1R0FBQSxXQUFXLE9BQUE7QUF3QmIsbURBQXNHO0FBQTdGLDBHQUFBLGNBQWMsT0FBQTtBQUFFLHVHQUFBLFdBQVcsT0FBQTtBQUFFLDBHQUFBLGNBQWMsT0FBQTtBQUFFLDJHQUFBLGVBQWUsT0FBQTtBQUNyRSxxRUFBMEU7QUFBakUsNEhBQUEsdUJBQXVCLE9BQUE7QUFhaEMsaURBQTZGO0FBQXBGLDhHQUFBLGtCQUFrQixPQUFBO0FBQUUsZ0hBQUEsb0JBQW9CLE9BQUE7QUFBRSx1R0FBQSxXQUFXLE9BQUE7QUFDOUQsaURBVThCO0FBVDVCLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLG1IQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLDRHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDZHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLCtHQUFBLG1CQUFtQixPQUFBO0FBQ25CLGlIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLGdIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLDBHQUFBLGNBQWMsT0FBQTtBQWVoQixnQkFBZ0I7QUFDaEIsa0RBQW1IO0FBQTFHLG9IQUFBLHVCQUF1QixPQUFBO0FBQUUsOEdBQUEsaUJBQWlCLE9BQUE7QUFBRSwwR0FBQSxhQUFhLE9BQUE7QUFBRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQU9wRixtREFBeUQ7QUFBaEQsNkdBQUEsZ0JBQWdCLE9BQUE7QUFPekIscURBT2lDO0FBTi9CLHlHQUFBLFlBQVksT0FBQTtBQUNaLDZHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDZHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHFHQUFBLFFBQVEsT0FBQTtBQUNSLCtHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLGdIQUFBLG1CQUFtQixPQUFBO0FBU3JCLG1EQUEyRDtBQUFsRCwrR0FBQSxrQkFBa0IsT0FBQTtBQUMzQixtREFBMEQ7QUFBakQsOEdBQUEsaUJBQWlCLE9BQUE7QUFzQjFCLG1EQUEwRTtBQUFqRSw4SEFBQSxpQ0FBaUMsT0FBQTtBQUkxQyxtREFpQitCO0FBaEI3QiwrR0FBQSxrQkFBa0IsT0FBQTtBQUNsQiw2R0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxlQUFlLE9BQUE7QUFDZixpSEFBQSxvQkFBb0IsT0FBQTtBQUNwQixxSEFBQSx3QkFBd0IsT0FBQTtBQUN4QiwyR0FBQSxjQUFjLE9BQUE7QUFDZCxtSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qiw0R0FBQSxlQUFlLE9BQUE7QUFDZixxSEFBQSx3QkFBd0IsT0FBQTtBQUN4QixrSEFBQSxxQkFBcUIsT0FBQTtBQUNyQix5R0FBQSxZQUFZLE9BQUE7QUFDWixvSEFBQSx1QkFBdUIsT0FBQTtBQUN2QixtSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qiw0R0FBQSxlQUFlLE9BQUE7QUFDZix3R0FBQSxXQUFXLE9BQUE7QUFDWCw0R0FBQSxlQUFlLE9BQUE7QUFLakIsb0VBQWtIO0FBQXpHLHdIQUFBLG1CQUFtQixPQUFBO0FBQUUsMkhBQUEsc0JBQXNCLE9BQUE7QUFBRSx3SEFBQSxtQkFBbUIsT0FBQTtBQUN6RSxvRUFBeUY7QUFBaEYsK0dBQUEsVUFBVSxPQUFBO0FBQUUsZ0hBQUEsV0FBVyxPQUFBO0FBQUUsbUhBQUEsY0FBYyxPQUFBO0FBQ2hELG9FQUFnRTtBQUF2RCxpSEFBQSxhQUFhLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL2FkdmFuY2VkIOKAlCBMb3ctbGV2ZWwgaW50ZXJuYWxzIGZvciBjdXN0b20gZXhlY3V0aW9uIGVuZ2luZXMgYW5kIHRlc3RpbmcuXG4gKlxuICogTW9zdCB1c2VycyBuZXZlciBuZWVkIHRoaXMuIFVzZSBgZm9vdHByaW50anNgIChtYWluKSBpbnN0ZWFkLlxuICogVGhpcyBlbnRyeSBwb2ludCBleHBvc2VzIGBTaGFyZWRNZW1vcnlgLCBgU3RhZ2VDb250ZXh0YCwgYEZsb3djaGFydFRyYXZlcnNlcmAsXG4gKiBhbmQgb3RoZXIgcHJpbWl0aXZlcyB0aGF0IHBvd2VyIHRoZSBlbmdpbmUuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFNoYXJlZE1lbW9yeSwgU3RhZ2VDb250ZXh0IH0gZnJvbSAnZm9vdHByaW50anMvYWR2YW5jZWQnO1xuICogYGBgXG4gKlxuICogQG1vZHVsZSBhZHZhbmNlZFxuICovXG4vKipcbiAqIEZvb3RQcmludCDigJQgQWR2YW5jZWQgLyBJbnRlcm5hbCBBUElcbiAqXG4gKiBUaGVzZSBleHBvcnRzIGFyZSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLCB0ZXN0aW5nLCBhbmQgYnVpbGRpbmdcbiAqIGN1c3RvbSBleGVjdXRpb24gZW5naW5lcy4gTW9zdCB1c2VycyBzaG91bGQgdXNlIHRoZSBtYWluICdmb290cHJpbnQnIGVudHJ5IHBvaW50LlxuICpcbiAqIEltcG9ydCB2aWE6IGltcG9ydCB7IC4uLiB9IGZyb20gJ2Zvb3RwcmludC9hZHZhbmNlZCdcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vcnkg4oCUIExvdy1sZXZlbCB0cmFuc2FjdGlvbmFsIHN0YXRlIHByaW1pdGl2ZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBDb21taXRCdW5kbGUsXG4gIEZsb3dDb250cm9sVHlwZSxcbiAgRmxvd01lc3NhZ2UsXG4gIE1lbW9yeVBhdGNoLFxuICBTdGFnZVNuYXBzaG90LFxuICBUcmFjZUVudHJ5LFxufSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIGFwcGx5U21hcnRNZXJnZSxcbiAgZGVlcFNtYXJ0TWVyZ2UsXG4gIGdldE5lc3RlZFZhbHVlLFxuICBnZXRSdW5BbmRHbG9iYWxQYXRocyxcbiAgbm9ybWFsaXNlUGF0aCxcbiAgcmVkYWN0UGF0Y2gsXG4gIHNldE5lc3RlZFZhbHVlLFxuICB1cGRhdGVOZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlVmFsdWUsXG59IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkZXIg4oCUIFR5cGVzIGFuZCBpbnRlcm5hbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRpbWVFeHRyYWN0b3IsXG4gIEJ1aWxkVGltZU5vZGVNZXRhZGF0YSxcbiAgRXhlY09wdGlvbnMsXG4gIEZsb3dDaGFydFNwZWMsXG4gIElMb2dnZXIsXG4gIFNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgU2ltcGxpZmllZFBhcmFsbGVsU3BlYyxcbiAgU3RhZ2VGbixcbiAgU3RhZ2VOb2RlLFxuICBTdHJlYW1DYWxsYmFjayxcbiAgU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcixcbiAgU3RyZWFtVG9rZW5IYW5kbGVyLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBTdWJmbG93UmVmLFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcbmV4cG9ydCB7IEFycmF5TWVyZ2VNb2RlLCBEZWNpZGVyTGlzdCwgU2VsZWN0b3JGbkxpc3QsIHNwZWNUb1N0YWdlTm9kZSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuZXhwb3J0IHsgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGUg4oCUIFByb3ZpZGVycywgcHJvdGVjdGlvbiwgcmVjb3JkZXIgb3B0aW9ucywgYW5kIGV2ZW50IHR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHtcbiAgUHJvdmlkZXJSZXNvbHZlcixcbiAgUmVzb2x2ZU9wdGlvbnMsXG4gIFNjb3BlUHJvdmlkZXIsXG4gIFN0YWdlQ29udGV4dExpa2UsXG4gIFN0cmljdE1vZGUsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcbmV4cG9ydCB7IGNyZWF0ZUVycm9yTWVzc2FnZSwgY3JlYXRlUHJvdGVjdGVkU2NvcGUsIFNjb3BlRmFjYWRlIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgYXR0YWNoU2NvcGVNZXRob2RzLFxuICBpc1N1YmNsYXNzT2ZTY29wZUZhY2FkZSxcbiAgbG9va3NMaWtlQ2xhc3NDdG9yLFxuICBsb29rc0xpa2VGYWN0b3J5LFxuICBtYWtlQ2xhc3NQcm92aWRlcixcbiAgbWFrZUZhY3RvcnlQcm92aWRlcixcbiAgcmVnaXN0ZXJTY29wZVJlc29sdmVyLFxuICByZXNvbHZlU2NvcGVQcm92aWRlcixcbiAgdG9TY29wZUZhY3RvcnksXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLy8gUmVjb3JkZXIgY29uZmlnL29wdGlvbiB0eXBlc1xuZXhwb3J0IHR5cGUge1xuICBBZ2dyZWdhdGVkTWV0cmljcyxcbiAgRGVidWdFbnRyeSxcbiAgRGVidWdSZWNvcmRlck9wdGlvbnMsXG4gIERlYnVnVmVyYm9zaXR5LFxuICBEZWZpbmVTY29wZU9wdGlvbnMsXG4gIFJlY29yZGVyQ29udGV4dCxcbiAgU3RhZ2VFdmVudCxcbiAgU3RhZ2VNZXRyaWNzLFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8vIFpvZCBpbnRlcm5hbHNcbmV4cG9ydCB7IGNyZWF0ZVNjb3BlUHJveHlGcm9tWm9kLCBkZWZpbmVTY29wZVNjaGVtYSwgaXNTY29wZVNjaGVtYSwgWm9kU2NvcGVSZXNvbHZlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVubmVyIOKAlCBJbnRlcm5hbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuZXhwb3J0IHsgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlYWN0aXZlIOKAlCBUeXBlZFNjb3BlIGludGVybmFscyAoZm9yIGN1c3RvbSBwcm94eSBpbXBsZW1lbnRhdGlvbnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgUmVhY3RpdmVPcHRpb25zLCBSZWFjdGl2ZVRhcmdldCB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIEJSRUFLX1NFVFRFUixcbiAgYnVpbGROZXN0ZWRQYXRjaCxcbiAgY3JlYXRlQXJyYXlQcm94eSxcbiAgam9pblBhdGgsXG4gIFNDT1BFX01FVEhPRF9OQU1FUyxcbiAgc2hvdWxkV3JhcFdpdGhQcm94eSxcbn0gZnJvbSAnLi9saWIvcmVhY3RpdmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmdpbmUg4oCUIERGUyBncmFwaCB0cmF2ZXJzYWwgaW50ZXJuYWxzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgVHJhdmVyc2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5leHBvcnQgdHlwZSB7IERlY2lkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gTmFycmF0aXZlIGludGVybmFsc1xuZXhwb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5LCBDb21iaW5lZE5hcnJhdGl2ZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUge1xuICBCcmFuY2hSZXN1bHQsXG4gIEJyYW5jaFJlc3VsdHMsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSBhcyBFbmdpbmVTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlU25hcHNob3QgYXMgRW5naW5lU3RhZ2VTbmFwc2hvdCxcbiAgRXh0cmFjdG9yRXJyb3IsXG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgTm9kZVJlc3VsdFR5cGUsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVNZXRhZGF0YSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZXJpYWxpemVkUGlwZWxpbmVOb2RlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdWJmbG93UmVzdWx0LFxuICBUcmF2ZXJzYWxFeHRyYWN0b3IsXG4gIFRyYXZlcnNhbFJlc3VsdCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vIEhhbmRsZXJzICh0ZXN0aW5nIC8gY3VzdG9tIGVuZ2luZXMpXG5leHBvcnQgdHlwZSB7IENhbGxFeHRyYWN0b3JGbiwgRXhlY3V0ZU5vZGVGbiwgR2V0U3RhZ2VQYXRoRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgYXBwbHlPdXRwdXRNYXBwaW5nLFxuICBDaGlsZHJlbkV4ZWN1dG9yLFxuICBjb21wdXRlTm9kZVR5cGUsXG4gIENvbnRpbnVhdGlvblJlc29sdmVyLFxuICBjcmVhdGVTdWJmbG93SGFuZGxlckRlcHMsXG4gIERlY2lkZXJIYW5kbGVyLFxuICBERUZBVUxUX01BWF9JVEVSQVRJT05TLFxuICBFeHRyYWN0b3JSdW5uZXIsXG4gIGV4dHJhY3RQYXJlbnRTY29wZVZhbHVlcyxcbiAgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLFxuICBOb2RlUmVzb2x2ZXIsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLFxuICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlLFxuICBTZWxlY3RvckhhbmRsZXIsXG4gIFN0YWdlUnVubmVyLFxuICBTdWJmbG93RXhlY3V0b3IsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vIFRyYWNlIHV0aWxpdGllcyDigJQgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgY29udmVuaWVuY2UuIENhbm9uaWNhbCBwYXRoOiAnZm9vdHByaW50anMvdHJhY2UnXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvdW50ZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvcnVudGltZVN0YWdlSWQuanMnO1xuZXhwb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCwgY3JlYXRlRXhlY3V0aW9uQ291bnRlciwgcGFyc2VSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4vbGliL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5leHBvcnQgeyBmaW5kQ29tbWl0LCBmaW5kQ29tbWl0cywgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2xpYi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuZXhwb3J0IHsgS2V5ZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL0tleWVkUmVjb3JkZXIuanMnO1xuIl19
@@ -37,4 +37,7 @@ export { FlowchartTraverser } from './lib/engine/index.js';
37
37
  export { isStageNodeReturn } from './lib/engine/index.js';
38
38
  export { NullControlFlowNarrativeGenerator } from './lib/engine/index.js';
39
39
  export { applyOutputMapping, ChildrenExecutor, computeNodeType, ContinuationResolver, createSubflowHandlerDeps, DeciderHandler, DEFAULT_MAX_ITERATIONS, ExtractorRunner, extractParentScopeValues, getInitialScopeValues, NodeResolver, RuntimeStructureManager, seedSubflowGlobalStore, SelectorHandler, StageRunner, SubflowExecutor, } from './lib/engine/index.js';
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWR2YW5jZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7Ozs7Ozs7R0FPRztBQWNILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFdBQVcsRUFDWCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsR0FDWixNQUFNLHVCQUF1QixDQUFDO0FBdUIvQixPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFhMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLHNCQUFzQixDQUFDO0FBYzlCLGdCQUFnQjtBQUNoQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFPbkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPekQsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsbUJBQW1CLEdBQ3BCLE1BQU0seUJBQXlCLENBQUM7QUFRakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFzQjFELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTFFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFdBQVcsRUFDWCxlQUFlLEdBQ2hCLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL2FkdmFuY2VkIOKAlCBMb3ctbGV2ZWwgaW50ZXJuYWxzIGZvciBjdXN0b20gZXhlY3V0aW9uIGVuZ2luZXMgYW5kIHRlc3RpbmcuXG4gKlxuICogTW9zdCB1c2VycyBuZXZlciBuZWVkIHRoaXMuIFVzZSBgZm9vdHByaW50anNgIChtYWluKSBpbnN0ZWFkLlxuICogVGhpcyBlbnRyeSBwb2ludCBleHBvc2VzIGBTaGFyZWRNZW1vcnlgLCBgU3RhZ2VDb250ZXh0YCwgYEZsb3djaGFydFRyYXZlcnNlcmAsXG4gKiBhbmQgb3RoZXIgcHJpbWl0aXZlcyB0aGF0IHBvd2VyIHRoZSBlbmdpbmUuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFNoYXJlZE1lbW9yeSwgU3RhZ2VDb250ZXh0IH0gZnJvbSAnZm9vdHByaW50anMvYWR2YW5jZWQnO1xuICogYGBgXG4gKlxuICogQG1vZHVsZSBhZHZhbmNlZFxuICovXG4vKipcbiAqIEZvb3RQcmludCDigJQgQWR2YW5jZWQgLyBJbnRlcm5hbCBBUElcbiAqXG4gKiBUaGVzZSBleHBvcnRzIGFyZSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLCB0ZXN0aW5nLCBhbmQgYnVpbGRpbmdcbiAqIGN1c3RvbSBleGVjdXRpb24gZW5naW5lcy4gTW9zdCB1c2VycyBzaG91bGQgdXNlIHRoZSBtYWluICdmb290cHJpbnQnIGVudHJ5IHBvaW50LlxuICpcbiAqIEltcG9ydCB2aWE6IGltcG9ydCB7IC4uLiB9IGZyb20gJ2Zvb3RwcmludC9hZHZhbmNlZCdcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNZW1vcnkg4oCUIExvdy1sZXZlbCB0cmFuc2FjdGlvbmFsIHN0YXRlIHByaW1pdGl2ZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBDb21taXRCdW5kbGUsXG4gIEZsb3dDb250cm9sVHlwZSxcbiAgRmxvd01lc3NhZ2UsXG4gIE1lbW9yeVBhdGNoLFxuICBTdGFnZVNuYXBzaG90LFxuICBUcmFjZUVudHJ5LFxufSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIGFwcGx5U21hcnRNZXJnZSxcbiAgZGVlcFNtYXJ0TWVyZ2UsXG4gIGdldE5lc3RlZFZhbHVlLFxuICBnZXRSdW5BbmRHbG9iYWxQYXRocyxcbiAgbm9ybWFsaXNlUGF0aCxcbiAgcmVkYWN0UGF0Y2gsXG4gIHNldE5lc3RlZFZhbHVlLFxuICB1cGRhdGVOZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlVmFsdWUsXG59IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWxkZXIg4oCUIFR5cGVzIGFuZCBpbnRlcm5hbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUge1xuICBCdWlsZFRpbWVFeHRyYWN0b3IsXG4gIEJ1aWxkVGltZU5vZGVNZXRhZGF0YSxcbiAgRXhlY09wdGlvbnMsXG4gIEZsb3dDaGFydFNwZWMsXG4gIElMb2dnZXIsXG4gIFNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgU2ltcGxpZmllZFBhcmFsbGVsU3BlYyxcbiAgU3RhZ2VGbixcbiAgU3RhZ2VOb2RlLFxuICBTdHJlYW1DYWxsYmFjayxcbiAgU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcixcbiAgU3RyZWFtVG9rZW5IYW5kbGVyLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBTdWJmbG93UmVmLFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcbmV4cG9ydCB7IEFycmF5TWVyZ2VNb2RlLCBEZWNpZGVyTGlzdCwgU2VsZWN0b3JGbkxpc3QsIHNwZWNUb1N0YWdlTm9kZSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuZXhwb3J0IHsgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGUg4oCUIFByb3ZpZGVycywgcHJvdGVjdGlvbiwgcmVjb3JkZXIgb3B0aW9ucywgYW5kIGV2ZW50IHR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHtcbiAgUHJvdmlkZXJSZXNvbHZlcixcbiAgUmVzb2x2ZU9wdGlvbnMsXG4gIFNjb3BlUHJvdmlkZXIsXG4gIFN0YWdlQ29udGV4dExpa2UsXG4gIFN0cmljdE1vZGUsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcbmV4cG9ydCB7IGNyZWF0ZUVycm9yTWVzc2FnZSwgY3JlYXRlUHJvdGVjdGVkU2NvcGUsIFNjb3BlRmFjYWRlIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgYXR0YWNoU2NvcGVNZXRob2RzLFxuICBpc1N1YmNsYXNzT2ZTY29wZUZhY2FkZSxcbiAgbG9va3NMaWtlQ2xhc3NDdG9yLFxuICBsb29rc0xpa2VGYWN0b3J5LFxuICBtYWtlQ2xhc3NQcm92aWRlcixcbiAgbWFrZUZhY3RvcnlQcm92aWRlcixcbiAgcmVnaXN0ZXJTY29wZVJlc29sdmVyLFxuICByZXNvbHZlU2NvcGVQcm92aWRlcixcbiAgdG9TY29wZUZhY3RvcnksXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLy8gUmVjb3JkZXIgY29uZmlnL29wdGlvbiB0eXBlc1xuZXhwb3J0IHR5cGUge1xuICBBZ2dyZWdhdGVkTWV0cmljcyxcbiAgRGVidWdFbnRyeSxcbiAgRGVidWdSZWNvcmRlck9wdGlvbnMsXG4gIERlYnVnVmVyYm9zaXR5LFxuICBEZWZpbmVTY29wZU9wdGlvbnMsXG4gIFJlY29yZGVyQ29udGV4dCxcbiAgU3RhZ2VFdmVudCxcbiAgU3RhZ2VNZXRyaWNzLFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8vIFpvZCBpbnRlcm5hbHNcbmV4cG9ydCB7IGNyZWF0ZVNjb3BlUHJveHlGcm9tWm9kLCBkZWZpbmVTY29wZVNjaGVtYSwgaXNTY29wZVNjaGVtYSwgWm9kU2NvcGVSZXNvbHZlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVubmVyIOKAlCBJbnRlcm5hbHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgeyBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuZXhwb3J0IHsgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlYWN0aXZlIOKAlCBUeXBlZFNjb3BlIGludGVybmFscyAoZm9yIGN1c3RvbSBwcm94eSBpbXBsZW1lbnRhdGlvbnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgUmVhY3RpdmVPcHRpb25zLCBSZWFjdGl2ZVRhcmdldCB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIEJSRUFLX1NFVFRFUixcbiAgYnVpbGROZXN0ZWRQYXRjaCxcbiAgY3JlYXRlQXJyYXlQcm94eSxcbiAgam9pblBhdGgsXG4gIFNDT1BFX01FVEhPRF9OQU1FUyxcbiAgc2hvdWxkV3JhcFdpdGhQcm94eSxcbn0gZnJvbSAnLi9saWIvcmVhY3RpdmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmdpbmUg4oCUIERGUyBncmFwaCB0cmF2ZXJzYWwgaW50ZXJuYWxzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgVHJhdmVyc2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5leHBvcnQgdHlwZSB7IERlY2lkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gTmFycmF0aXZlIGludGVybmFsc1xuZXhwb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5LCBDb21iaW5lZE5hcnJhdGl2ZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUge1xuICBCcmFuY2hSZXN1bHQsXG4gIEJyYW5jaFJlc3VsdHMsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSBhcyBFbmdpbmVTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlU25hcHNob3QgYXMgRW5naW5lU3RhZ2VTbmFwc2hvdCxcbiAgRXh0cmFjdG9yRXJyb3IsXG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgTm9kZVJlc3VsdFR5cGUsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVNZXRhZGF0YSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZXJpYWxpemVkUGlwZWxpbmVOb2RlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdWJmbG93UmVzdWx0LFxuICBUcmF2ZXJzYWxFeHRyYWN0b3IsXG4gIFRyYXZlcnNhbFJlc3VsdCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vIEhhbmRsZXJzICh0ZXN0aW5nIC8gY3VzdG9tIGVuZ2luZXMpXG5leHBvcnQgdHlwZSB7IENhbGxFeHRyYWN0b3JGbiwgRXhlY3V0ZU5vZGVGbiwgR2V0U3RhZ2VQYXRoRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgYXBwbHlPdXRwdXRNYXBwaW5nLFxuICBDaGlsZHJlbkV4ZWN1dG9yLFxuICBjb21wdXRlTm9kZVR5cGUsXG4gIENvbnRpbnVhdGlvblJlc29sdmVyLFxuICBjcmVhdGVTdWJmbG93SGFuZGxlckRlcHMsXG4gIERlY2lkZXJIYW5kbGVyLFxuICBERUZBVUxUX01BWF9JVEVSQVRJT05TLFxuICBFeHRyYWN0b3JSdW5uZXIsXG4gIGV4dHJhY3RQYXJlbnRTY29wZVZhbHVlcyxcbiAgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLFxuICBOb2RlUmVzb2x2ZXIsXG4gIFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLFxuICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlLFxuICBTZWxlY3RvckhhbmRsZXIsXG4gIFN0YWdlUnVubmVyLFxuICBTdWJmbG93RXhlY3V0b3IsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG4iXX0=
40
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/engine/runtimeStageId.js';
41
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
42
+ export { KeyedRecorder } from './lib/recorder/KeyedRecorder.js';
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWR2YW5jZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7Ozs7Ozs7R0FPRztBQWNILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFdBQVcsRUFDWCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsR0FDWixNQUFNLHVCQUF1QixDQUFDO0FBdUIvQixPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFhMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLHNCQUFzQixDQUFDO0FBYzlCLGdCQUFnQjtBQUNoQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFPbkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPekQsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsbUJBQW1CLEdBQ3BCLE1BQU0seUJBQXlCLENBQUM7QUFRakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFzQjFELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTFFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFdBQVcsRUFDWCxlQUFlLEdBQ2hCLE1BQU0sdUJBQXVCLENBQUM7QUFJL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBmb290cHJpbnRqcy9hZHZhbmNlZCDigJQgTG93LWxldmVsIGludGVybmFscyBmb3IgY3VzdG9tIGV4ZWN1dGlvbiBlbmdpbmVzIGFuZCB0ZXN0aW5nLlxuICpcbiAqIE1vc3QgdXNlcnMgbmV2ZXIgbmVlZCB0aGlzLiBVc2UgYGZvb3RwcmludGpzYCAobWFpbikgaW5zdGVhZC5cbiAqIFRoaXMgZW50cnkgcG9pbnQgZXhwb3NlcyBgU2hhcmVkTWVtb3J5YCwgYFN0YWdlQ29udGV4dGAsIGBGbG93Y2hhcnRUcmF2ZXJzZXJgLFxuICogYW5kIG90aGVyIHByaW1pdGl2ZXMgdGhhdCBwb3dlciB0aGUgZW5naW5lLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBTaGFyZWRNZW1vcnksIFN0YWdlQ29udGV4dCB9IGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJztcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGUgYWR2YW5jZWRcbiAqL1xuLyoqXG4gKiBGb290UHJpbnQg4oCUIEFkdmFuY2VkIC8gSW50ZXJuYWwgQVBJXG4gKlxuICogVGhlc2UgZXhwb3J0cyBhcmUgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcywgdGVzdGluZywgYW5kIGJ1aWxkaW5nXG4gKiBjdXN0b20gZXhlY3V0aW9uIGVuZ2luZXMuIE1vc3QgdXNlcnMgc2hvdWxkIHVzZSB0aGUgbWFpbiAnZm9vdHByaW50JyBlbnRyeSBwb2ludC5cbiAqXG4gKiBJbXBvcnQgdmlhOiBpbXBvcnQgeyAuLi4gfSBmcm9tICdmb290cHJpbnQvYWR2YW5jZWQnXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTWVtb3J5IOKAlCBMb3ctbGV2ZWwgdHJhbnNhY3Rpb25hbCBzdGF0ZSBwcmltaXRpdmVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0QnVuZGxlLFxuICBGbG93Q29udHJvbFR5cGUsXG4gIEZsb3dNZXNzYWdlLFxuICBNZW1vcnlQYXRjaCxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVHJhY2VFbnRyeSxcbn0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcbmV4cG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQge1xuICBhcHBseVNtYXJ0TWVyZ2UsXG4gIGRlZXBTbWFydE1lcmdlLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgZ2V0UnVuQW5kR2xvYmFsUGF0aHMsXG4gIG5vcm1hbGlzZVBhdGgsXG4gIHJlZGFjdFBhdGNoLFxuICBzZXROZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlTmVzdGVkVmFsdWUsXG4gIHVwZGF0ZVZhbHVlLFxufSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsZGVyIOKAlCBUeXBlcyBhbmQgaW50ZXJuYWxzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHtcbiAgQnVpbGRUaW1lRXh0cmFjdG9yLFxuICBCdWlsZFRpbWVOb2RlTWV0YWRhdGEsXG4gIEV4ZWNPcHRpb25zLFxuICBGbG93Q2hhcnRTcGVjLFxuICBJTG9nZ2VyLFxuICBTY29wZVByb3RlY3Rpb25Nb2RlLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFNpbXBsaWZpZWRQYXJhbGxlbFNwZWMsXG4gIFN0YWdlRm4sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtQ2FsbGJhY2ssXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgU3ViZmxvd1JlZixcbn0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5leHBvcnQgeyBBcnJheU1lcmdlTW9kZSwgRGVjaWRlckxpc3QsIFNlbGVjdG9yRm5MaXN0LCBzcGVjVG9TdGFnZU5vZGUgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcbmV4cG9ydCB7IGNyZWF0ZVR5cGVkU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi9saWIvYnVpbGRlci90eXBlZEZsb3dDaGFydC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjb3BlIOKAlCBQcm92aWRlcnMsIHByb3RlY3Rpb24sIHJlY29yZGVyIG9wdGlvbnMsIGFuZCBldmVudCB0eXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7XG4gIFByb3ZpZGVyUmVzb2x2ZXIsXG4gIFJlc29sdmVPcHRpb25zLFxuICBTY29wZVByb3ZpZGVyLFxuICBTdGFnZUNvbnRleHRMaWtlLFxuICBTdHJpY3RNb2RlLFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5leHBvcnQgeyBjcmVhdGVFcnJvck1lc3NhZ2UsIGNyZWF0ZVByb3RlY3RlZFNjb3BlLCBTY29wZUZhY2FkZSB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIGF0dGFjaFNjb3BlTWV0aG9kcyxcbiAgaXNTdWJjbGFzc09mU2NvcGVGYWNhZGUsXG4gIGxvb2tzTGlrZUNsYXNzQ3RvcixcbiAgbG9va3NMaWtlRmFjdG9yeSxcbiAgbWFrZUNsYXNzUHJvdmlkZXIsXG4gIG1ha2VGYWN0b3J5UHJvdmlkZXIsXG4gIHJlZ2lzdGVyU2NvcGVSZXNvbHZlcixcbiAgcmVzb2x2ZVNjb3BlUHJvdmlkZXIsXG4gIHRvU2NvcGVGYWN0b3J5LFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8vIFJlY29yZGVyIGNvbmZpZy9vcHRpb24gdHlwZXNcbmV4cG9ydCB0eXBlIHtcbiAgQWdncmVnYXRlZE1ldHJpY3MsXG4gIERlYnVnRW50cnksXG4gIERlYnVnUmVjb3JkZXJPcHRpb25zLFxuICBEZWJ1Z1ZlcmJvc2l0eSxcbiAgRGVmaW5lU2NvcGVPcHRpb25zLFxuICBSZWNvcmRlckNvbnRleHQsXG4gIFN0YWdlRXZlbnQsXG4gIFN0YWdlTWV0cmljcyxcbn0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vLyBab2QgaW50ZXJuYWxzXG5leHBvcnQgeyBjcmVhdGVTY29wZVByb3h5RnJvbVpvZCwgZGVmaW5lU2NvcGVTY2hlbWEsIGlzU2NvcGVTY2hlbWEsIFpvZFNjb3BlUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1bm5lciDigJQgSW50ZXJuYWxzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIHsgUnVudGltZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcbmV4cG9ydCB7IEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWFjdGl2ZSDigJQgVHlwZWRTY29wZSBpbnRlcm5hbHMgKGZvciBjdXN0b20gcHJveHkgaW1wbGVtZW50YXRpb25zKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQgfSBmcm9tICcuL2xpYi9yZWFjdGl2ZS9pbmRleC5qcyc7XG5leHBvcnQge1xuICBCUkVBS19TRVRURVIsXG4gIGJ1aWxkTmVzdGVkUGF0Y2gsXG4gIGNyZWF0ZUFycmF5UHJveHksXG4gIGpvaW5QYXRoLFxuICBTQ09QRV9NRVRIT0RfTkFNRVMsXG4gIHNob3VsZFdyYXBXaXRoUHJveHksXG59IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5naW5lIOKAlCBERlMgZ3JhcGggdHJhdmVyc2FsIGludGVybmFsc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSB7IFRyYXZlcnNlck9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBEZWNpZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5leHBvcnQgeyBpc1N0YWdlTm9kZVJldHVybiB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vIE5hcnJhdGl2ZSBpbnRlcm5hbHNcbmV4cG9ydCB0eXBlIHsgSUNvbnRyb2xGbG93TmFycmF0aXZlIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSwgQ29tYmluZWROYXJyYXRpdmVPcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQnJhbmNoUmVzdWx0LFxuICBCcmFuY2hSZXN1bHRzLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgYXMgRW5naW5lU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTdGFnZVNuYXBzaG90IGFzIEVuZ2luZVN0YWdlU25hcHNob3QsXG4gIEV4dHJhY3RvckVycm9yLFxuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBSdW50aW1lU3RydWN0dXJlTWV0YWRhdGEsXG4gIFNjb3BlRmFjdG9yeSxcbiAgU2VyaWFsaXplZFBpcGVsaW5lTm9kZSxcbiAgU3RhZ2VGdW5jdGlvbixcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgVHJhdmVyc2FsRXh0cmFjdG9yLFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5leHBvcnQgeyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyBIYW5kbGVycyAodGVzdGluZyAvIGN1c3RvbSBlbmdpbmVzKVxuZXhwb3J0IHR5cGUgeyBDYWxsRXh0cmFjdG9yRm4sIEV4ZWN1dGVOb2RlRm4sIEdldFN0YWdlUGF0aEZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIGFwcGx5T3V0cHV0TWFwcGluZyxcbiAgQ2hpbGRyZW5FeGVjdXRvcixcbiAgY29tcHV0ZU5vZGVUeXBlLFxuICBDb250aW51YXRpb25SZXNvbHZlcixcbiAgY3JlYXRlU3ViZmxvd0hhbmRsZXJEZXBzLFxuICBEZWNpZGVySGFuZGxlcixcbiAgREVGQVVMVF9NQVhfSVRFUkFUSU9OUyxcbiAgRXh0cmFjdG9yUnVubmVyLFxuICBleHRyYWN0UGFyZW50U2NvcGVWYWx1ZXMsXG4gIGdldEluaXRpYWxTY29wZVZhbHVlcyxcbiAgTm9kZVJlc29sdmVyLFxuICBSdW50aW1lU3RydWN0dXJlTWFuYWdlcixcbiAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSxcbiAgU2VsZWN0b3JIYW5kbGVyLFxuICBTdGFnZVJ1bm5lcixcbiAgU3ViZmxvd0V4ZWN1dG9yLFxufSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyBUcmFjZSB1dGlsaXRpZXMg4oCUIHJlLWV4cG9ydGVkIGhlcmUgZm9yIGNvbnZlbmllbmNlLiBDYW5vbmljYWwgcGF0aDogJ2Zvb3RwcmludGpzL3RyYWNlJ1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25Db3VudGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcbmV4cG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIsIHBhcnNlUnVudGltZVN0YWdlSWQgfSBmcm9tICcuL2xpYi9lbmdpbmUvcnVudGltZVN0YWdlSWQuanMnO1xuZXhwb3J0IHsgZmluZENvbW1pdCwgZmluZENvbW1pdHMsIGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi9saWIvbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmV4cG9ydCB7IEtleWVkUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9LZXllZFJlY29yZGVyLmpzJztcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Typed utilities for querying the commit log.
3
+ *
4
+ * The commitLog is an ordered array of CommitBundle — one per stage commit.
5
+ * These helpers provide type-safe queries without (b: any) casts.
6
+ */
7
+ /** Find the first commit by stageId, optionally filtering by a written key. */
8
+ export function findCommit(commitLog, stageId, key) {
9
+ return commitLog.find((b) => b.stageId === stageId && (!key || b.trace.some((t) => t.path === key)));
10
+ }
11
+ /** Find all commits by stageId. */
12
+ export function findCommits(commitLog, stageId) {
13
+ return commitLog.filter((b) => b.stageId === stageId);
14
+ }
15
+ /** Find the last commit that wrote a specific key (for backtracking). */
16
+ export function findLastWriter(commitLog, key, beforeIdx) {
17
+ const end = beforeIdx !== null && beforeIdx !== void 0 ? beforeIdx : commitLog.length;
18
+ for (let i = end - 1; i >= 0; i--) {
19
+ if (commitLog[i].trace.some((t) => t.path === key)) {
20
+ return commitLog[i];
21
+ }
22
+ }
23
+ return undefined;
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUlILCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsVUFBVSxDQUFDLFNBQXlCLEVBQUUsT0FBZSxFQUFFLEdBQVk7SUFDakYsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RyxDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLE1BQU0sVUFBVSxXQUFXLENBQUMsU0FBeUIsRUFBRSxPQUFlO0lBQ3BFLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxjQUFjLENBQUMsU0FBeUIsRUFBRSxHQUFXLEVBQUUsU0FBa0I7SUFDdkYsTUFBTSxHQUFHLEdBQUcsU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGVkIHV0aWxpdGllcyBmb3IgcXVlcnlpbmcgdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogVGhlIGNvbW1pdExvZyBpcyBhbiBvcmRlcmVkIGFycmF5IG9mIENvbW1pdEJ1bmRsZSDigJQgb25lIHBlciBzdGFnZSBjb21taXQuXG4gKiBUaGVzZSBoZWxwZXJzIHByb3ZpZGUgdHlwZS1zYWZlIHF1ZXJpZXMgd2l0aG91dCAoYjogYW55KSBjYXN0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogRmluZCB0aGUgZmlyc3QgY29tbWl0IGJ5IHN0YWdlSWQsIG9wdGlvbmFsbHkgZmlsdGVyaW5nIGJ5IGEgd3JpdHRlbiBrZXkuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbW1pdChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcsIGtleT86IHN0cmluZyk6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb21taXRMb2cuZmluZCgoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkICYmICgha2V5IHx8IGIudHJhY2Uuc29tZSgodCkgPT4gdC5wYXRoID09PSBrZXkpKSk7XG59XG5cbi8qKiBGaW5kIGFsbCBjb21taXRzIGJ5IHN0YWdlSWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbW1pdHMoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgc3RhZ2VJZDogc3RyaW5nKTogQ29tbWl0QnVuZGxlW10ge1xuICByZXR1cm4gY29tbWl0TG9nLmZpbHRlcigoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkKTtcbn1cblxuLyoqIEZpbmQgdGhlIGxhc3QgY29tbWl0IHRoYXQgd3JvdGUgYSBzcGVjaWZpYyBrZXkgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBiZWZvcmVJZHg/OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbmQgPSBiZWZvcmVJZHggPz8gY29tbWl0TG9nLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGNvbW1pdExvZ1tpXS50cmFjZS5zb21lKCh0KSA9PiB0LnBhdGggPT09IGtleSkpIHtcbiAgICAgIHJldHVybiBjb21taXRMb2dbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -0,0 +1,47 @@
1
+ /**
2
+ * KeyedRecorder<T> — base class for Map-based recorders keyed by runtimeStageId.
3
+ *
4
+ * Provides typed key-value storage with O(1) lookup, insertion-ordered iteration,
5
+ * and common accessors. Recorder implementations extend this and call store()
6
+ * from their event hooks.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * class TokenRecorder extends KeyedRecorder<LLMCallEntry> {
11
+ * onLLMCall(event: LLMCallEvent) {
12
+ * this.store(event.runtimeStageId, { model: event.model, ... });
13
+ * }
14
+ * getStats() { return aggregate(this.values()); }
15
+ * }
16
+ * ```
17
+ */
18
+ export class KeyedRecorder {
19
+ constructor() {
20
+ this.data = new Map();
21
+ }
22
+ /** Store an entry keyed by runtimeStageId. */
23
+ store(runtimeStageId, entry) {
24
+ this.data.set(runtimeStageId, entry);
25
+ }
26
+ /** O(1) lookup by runtimeStageId. */
27
+ getByKey(runtimeStageId) {
28
+ return this.data.get(runtimeStageId);
29
+ }
30
+ /** All entries as a read-only Map (insertion-ordered). */
31
+ getMap() {
32
+ return this.data;
33
+ }
34
+ /** All entries as an array (insertion-ordered). */
35
+ values() {
36
+ return [...this.data.values()];
37
+ }
38
+ /** Number of entries stored. */
39
+ get size() {
40
+ return this.data.size;
41
+ }
42
+ /** Clear all stored data. Called by executor before each run(). */
43
+ clear() {
44
+ this.data.clear();
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5ZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtJQUFuQztRQUdtQixTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztJQStCL0MsQ0FBQztJQTdCQyw4Q0FBOEM7SUFDcEMsS0FBSyxDQUFDLGNBQXNCLEVBQUUsS0FBUTtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxRQUFRLENBQUMsY0FBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsMERBQTBEO0lBQzFELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxNQUFNO1FBQ0osT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLEtBQUs7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2V5ZWRSZWNvcmRlcjxUPiDigJQgYmFzZSBjbGFzcyBmb3IgTWFwLWJhc2VkIHJlY29yZGVycyBrZXllZCBieSBydW50aW1lU3RhZ2VJZC5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBrZXktdmFsdWUgc3RvcmFnZSB3aXRoIE8oMSkgbG9va3VwLCBpbnNlcnRpb24tb3JkZXJlZCBpdGVyYXRpb24sXG4gKiBhbmQgY29tbW9uIGFjY2Vzc29ycy4gUmVjb3JkZXIgaW1wbGVtZW50YXRpb25zIGV4dGVuZCB0aGlzIGFuZCBjYWxsIHN0b3JlKClcbiAqIGZyb20gdGhlaXIgZXZlbnQgaG9va3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuUmVjb3JkZXIgZXh0ZW5kcyBLZXllZFJlY29yZGVyPExMTUNhbGxFbnRyeT4ge1xuICogICBvbkxMTUNhbGwoZXZlbnQ6IExMTUNhbGxFdmVudCkge1xuICogICAgIHRoaXMuc3RvcmUoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgbW9kZWw6IGV2ZW50Lm1vZGVsLCAuLi4gfSk7XG4gKiAgIH1cbiAqICAgZ2V0U3RhdHMoKSB7IHJldHVybiBhZ2dyZWdhdGUodGhpcy52YWx1ZXMoKSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgS2V5ZWRSZWNvcmRlcjxUPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG5cbiAgLyoqIFN0b3JlIGFuIGVudHJ5IGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcm90ZWN0ZWQgc3RvcmUocnVudGltZVN0YWdlSWQ6IHN0cmluZywgZW50cnk6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuc2V0KHJ1bnRpbWVTdGFnZUlkLCBlbnRyeSk7XG4gIH1cblxuICAvKiogTygxKSBsb29rdXAgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldChydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogQWxsIGVudHJpZXMgYXMgYSByZWFkLW9ubHkgTWFwIChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIGdldE1hcCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG5cbiAgLyoqIEFsbCBlbnRyaWVzIGFzIGFuIGFycmF5IChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIHZhbHVlcygpOiBUW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kYXRhLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgZW50cmllcyBzdG9yZWQuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaXplO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdG9yZWQgZGF0YS4gQ2FsbGVkIGJ5IGV4ZWN1dG9yIGJlZm9yZSBlYWNoIHJ1bigpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuY2xlYXIoKTtcbiAgfVxufVxuIl19
@@ -1,2 +1,3 @@
1
1
  export { CompositeRecorder } from './CompositeRecorder.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vQ29tcG9zaXRlUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbiJdfQ==
2
+ export { KeyedRecorder } from './KeyedRecorder.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9Db21wb3NpdGVSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBLZXllZFJlY29yZGVyIH0gZnJvbSAnLi9LZXllZFJlY29yZGVyLmpzJztcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ /**
2
+ * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
3
+ *
4
+ * Runtime stage IDs, commit log queries, and keyed recorder base class.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { parseRuntimeStageId, findLastWriter, KeyedRecorder } from 'footprintjs/trace';
9
+ *
10
+ * // Parse a runtimeStageId
11
+ * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
12
+ *
13
+ * // Backtrack: who wrote 'systemPrompt' before stage at idx 8?
14
+ * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
15
+ *
16
+ * // Build a keyed recorder
17
+ * class MyRecorder extends KeyedRecorder<MyEntry> { ... }
18
+ * ```
19
+ */
20
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/engine/runtimeStageId.js';
21
+ // Commit log queries — typed utilities for backtracking
22
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
23
+ // KeyedRecorder — base class for Map-based recorders
24
+ export { KeyedRecorder } from './lib/recorder/KeyedRecorder.js';
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUlILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxILHdEQUF3RDtBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV6RixxREFBcUQ7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBmb290cHJpbnRqcy90cmFjZSDigJQgRXhlY3V0aW9uIHRyYWNpbmcsIGRlYnVnZ2luZywgYW5kIGJhY2t0cmFja2luZyB1dGlsaXRpZXMuXG4gKlxuICogUnVudGltZSBzdGFnZSBJRHMsIGNvbW1pdCBsb2cgcXVlcmllcywgYW5kIGtleWVkIHJlY29yZGVyIGJhc2UgY2xhc3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHBhcnNlUnVudGltZVN0YWdlSWQsIGZpbmRMYXN0V3JpdGVyLCBLZXllZFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIC8vIFBhcnNlIGEgcnVudGltZVN0YWdlSWRcbiAqIGNvbnN0IHsgc3RhZ2VJZCwgZXhlY3V0aW9uSW5kZXggfSA9IHBhcnNlUnVudGltZVN0YWdlSWQoJ2NhbGwtbGxtIzUnKTtcbiAqXG4gKiAvLyBCYWNrdHJhY2s6IHdobyB3cm90ZSAnc3lzdGVtUHJvbXB0JyBiZWZvcmUgc3RhZ2UgYXQgaWR4IDg/XG4gKiBjb25zdCB3cml0ZXIgPSBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csICdzeXN0ZW1Qcm9tcHQnLCA4KTtcbiAqXG4gKiAvLyBCdWlsZCBhIGtleWVkIHJlY29yZGVyXG4gKiBjbGFzcyBNeVJlY29yZGVyIGV4dGVuZHMgS2V5ZWRSZWNvcmRlcjxNeUVudHJ5PiB7IC4uLiB9XG4gKiBgYGBcbiAqL1xuXG4vLyBSdW50aW1lIHN0YWdlIElEIOKAlCB1bmlxdWUgZXhlY3V0aW9uIHN0ZXAgaWRlbnRpZmllcnNcbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uQ291bnRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5leHBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkLCBjcmVhdGVFeGVjdXRpb25Db3VudGVyLCBwYXJzZVJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi9saWIvZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcblxuLy8gQ29tbWl0IGxvZyBxdWVyaWVzIOKAlCB0eXBlZCB1dGlsaXRpZXMgZm9yIGJhY2t0cmFja2luZ1xuZXhwb3J0IHsgZmluZENvbW1pdCwgZmluZENvbW1pdHMsIGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi9saWIvbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcblxuLy8gS2V5ZWRSZWNvcmRlciDigJQgYmFzZSBjbGFzcyBmb3IgTWFwLWJhc2VkIHJlY29yZGVyc1xuZXhwb3J0IHsgS2V5ZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL0tleWVkUmVjb3JkZXIuanMnO1xuIl19
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Typed utilities for querying the commit log.
4
+ *
5
+ * The commitLog is an ordered array of CommitBundle — one per stage commit.
6
+ * These helpers provide type-safe queries without (b: any) casts.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.findLastWriter = exports.findCommits = exports.findCommit = void 0;
10
+ /** Find the first commit by stageId, optionally filtering by a written key. */
11
+ function findCommit(commitLog, stageId, key) {
12
+ return commitLog.find((b) => b.stageId === stageId && (!key || b.trace.some((t) => t.path === key)));
13
+ }
14
+ exports.findCommit = findCommit;
15
+ /** Find all commits by stageId. */
16
+ function findCommits(commitLog, stageId) {
17
+ return commitLog.filter((b) => b.stageId === stageId);
18
+ }
19
+ exports.findCommits = findCommits;
20
+ /** Find the last commit that wrote a specific key (for backtracking). */
21
+ function findLastWriter(commitLog, key, beforeIdx) {
22
+ const end = beforeIdx !== null && beforeIdx !== void 0 ? beforeIdx : commitLog.length;
23
+ for (let i = end - 1; i >= 0; i--) {
24
+ if (commitLog[i].trace.some((t) => t.path === key)) {
25
+ return commitLog[i];
26
+ }
27
+ }
28
+ return undefined;
29
+ }
30
+ exports.findLastWriter = findLastWriter;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUlILCtFQUErRTtBQUMvRSxTQUFnQixVQUFVLENBQUMsU0FBeUIsRUFBRSxPQUFlLEVBQUUsR0FBWTtJQUNqRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFGRCxnQ0FFQztBQUVELG1DQUFtQztBQUNuQyxTQUFnQixXQUFXLENBQUMsU0FBeUIsRUFBRSxPQUFlO0lBQ3BFLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRkQsa0NBRUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBZ0IsY0FBYyxDQUFDLFNBQXlCLEVBQUUsR0FBVyxFQUFFLFNBQWtCO0lBQ3ZGLE1BQU0sR0FBRyxHQUFHLFNBQVMsYUFBVCxTQUFTLGNBQVQsU0FBUyxHQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBUkQsd0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGVkIHV0aWxpdGllcyBmb3IgcXVlcnlpbmcgdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogVGhlIGNvbW1pdExvZyBpcyBhbiBvcmRlcmVkIGFycmF5IG9mIENvbW1pdEJ1bmRsZSDigJQgb25lIHBlciBzdGFnZSBjb21taXQuXG4gKiBUaGVzZSBoZWxwZXJzIHByb3ZpZGUgdHlwZS1zYWZlIHF1ZXJpZXMgd2l0aG91dCAoYjogYW55KSBjYXN0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogRmluZCB0aGUgZmlyc3QgY29tbWl0IGJ5IHN0YWdlSWQsIG9wdGlvbmFsbHkgZmlsdGVyaW5nIGJ5IGEgd3JpdHRlbiBrZXkuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbW1pdChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcsIGtleT86IHN0cmluZyk6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb21taXRMb2cuZmluZCgoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkICYmICgha2V5IHx8IGIudHJhY2Uuc29tZSgodCkgPT4gdC5wYXRoID09PSBrZXkpKSk7XG59XG5cbi8qKiBGaW5kIGFsbCBjb21taXRzIGJ5IHN0YWdlSWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbW1pdHMoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgc3RhZ2VJZDogc3RyaW5nKTogQ29tbWl0QnVuZGxlW10ge1xuICByZXR1cm4gY29tbWl0TG9nLmZpbHRlcigoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkKTtcbn1cblxuLyoqIEZpbmQgdGhlIGxhc3QgY29tbWl0IHRoYXQgd3JvdGUgYSBzcGVjaWZpYyBrZXkgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBiZWZvcmVJZHg/OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbmQgPSBiZWZvcmVJZHggPz8gY29tbWl0TG9nLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGNvbW1pdExvZ1tpXS50cmFjZS5zb21lKCh0KSA9PiB0LnBhdGggPT09IGtleSkpIHtcbiAgICAgIHJldHVybiBjb21taXRMb2dbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KeyedRecorder = void 0;
4
+ /**
5
+ * KeyedRecorder<T> — base class for Map-based recorders keyed by runtimeStageId.
6
+ *
7
+ * Provides typed key-value storage with O(1) lookup, insertion-ordered iteration,
8
+ * and common accessors. Recorder implementations extend this and call store()
9
+ * from their event hooks.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * class TokenRecorder extends KeyedRecorder<LLMCallEntry> {
14
+ * onLLMCall(event: LLMCallEvent) {
15
+ * this.store(event.runtimeStageId, { model: event.model, ... });
16
+ * }
17
+ * getStats() { return aggregate(this.values()); }
18
+ * }
19
+ * ```
20
+ */
21
+ class KeyedRecorder {
22
+ constructor() {
23
+ this.data = new Map();
24
+ }
25
+ /** Store an entry keyed by runtimeStageId. */
26
+ store(runtimeStageId, entry) {
27
+ this.data.set(runtimeStageId, entry);
28
+ }
29
+ /** O(1) lookup by runtimeStageId. */
30
+ getByKey(runtimeStageId) {
31
+ return this.data.get(runtimeStageId);
32
+ }
33
+ /** All entries as a read-only Map (insertion-ordered). */
34
+ getMap() {
35
+ return this.data;
36
+ }
37
+ /** All entries as an array (insertion-ordered). */
38
+ values() {
39
+ return [...this.data.values()];
40
+ }
41
+ /** Number of entries stored. */
42
+ get size() {
43
+ return this.data.size;
44
+ }
45
+ /** Clear all stored data. Called by executor before each run(). */
46
+ clear() {
47
+ this.data.clear();
48
+ }
49
+ }
50
+ exports.KeyedRecorder = KeyedRecorder;
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5ZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQXNCLGFBQWE7SUFBbkM7UUFHbUIsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7SUErQi9DLENBQUM7SUE3QkMsOENBQThDO0lBQ3BDLEtBQUssQ0FBQyxjQUFzQixFQUFFLEtBQVE7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsUUFBUSxDQUFDLGNBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsTUFBTTtRQUNKLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFsQ0Qsc0NBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLZXllZFJlY29yZGVyPFQ+IOKAlCBiYXNlIGNsYXNzIGZvciBNYXAtYmFzZWQgcmVjb3JkZXJzIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIFByb3ZpZGVzIHR5cGVkIGtleS12YWx1ZSBzdG9yYWdlIHdpdGggTygxKSBsb29rdXAsIGluc2VydGlvbi1vcmRlcmVkIGl0ZXJhdGlvbixcbiAqIGFuZCBjb21tb24gYWNjZXNzb3JzLiBSZWNvcmRlciBpbXBsZW1lbnRhdGlvbnMgZXh0ZW5kIHRoaXMgYW5kIGNhbGwgc3RvcmUoKVxuICogZnJvbSB0aGVpciBldmVudCBob29rcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5SZWNvcmRlciBleHRlbmRzIEtleWVkUmVjb3JkZXI8TExNQ2FsbEVudHJ5PiB7XG4gKiAgIG9uTExNQ2FsbChldmVudDogTExNQ2FsbEV2ZW50KSB7XG4gKiAgICAgdGhpcy5zdG9yZShldmVudC5ydW50aW1lU3RhZ2VJZCwgeyBtb2RlbDogZXZlbnQubW9kZWwsIC4uLiB9KTtcbiAqICAgfVxuICogICBnZXRTdGF0cygpIHsgcmV0dXJuIGFnZ3JlZ2F0ZSh0aGlzLnZhbHVlcygpKTsgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBLZXllZFJlY29yZGVyPFQ+IHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcblxuICAvKiogU3RvcmUgYW4gZW50cnkga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIHByb3RlY3RlZCBzdG9yZShydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBlbnRyeTogVCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5zZXQocnVudGltZVN0YWdlSWQsIGVudHJ5KTtcbiAgfVxuXG4gIC8qKiBPKDEpIGxvb2t1cCBieSBydW50aW1lU3RhZ2VJZC4gKi9cbiAgZ2V0QnlLZXkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBBbGwgZW50cmllcyBhcyBhIHJlYWQtb25seSBNYXAgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgZ2V0TWFwKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgVD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICAvKiogQWxsIGVudHJpZXMgYXMgYW4gYXJyYXkgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgdmFsdWVzKCk6IFRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRhdGEudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBlbnRyaWVzIHN0b3JlZC4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnNpemU7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHN0b3JlZCBkYXRhLiBDYWxsZWQgYnkgZXhlY3V0b3IgYmVmb3JlIGVhY2ggcnVuKCkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5jbGVhcigpO1xuICB9XG59XG4iXX0=
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CompositeRecorder = void 0;
3
+ exports.KeyedRecorder = exports.CompositeRecorder = void 0;
4
4
  var CompositeRecorder_js_1 = require("./CompositeRecorder.js");
5
5
  Object.defineProperty(exports, "CompositeRecorder", { enumerable: true, get: function () { return CompositeRecorder_js_1.CompositeRecorder; } });
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9Db21wb3NpdGVSZWNvcmRlci5qcyc7XG4iXX0=
6
+ var KeyedRecorder_js_1 = require("./KeyedRecorder.js");
7
+ Object.defineProperty(exports, "KeyedRecorder", { enumerable: true, get: function () { return KeyedRecorder_js_1.KeyedRecorder; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQTtBQUMxQix1REFBbUQ7QUFBMUMsaUhBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vQ29tcG9zaXRlUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IEtleWVkUmVjb3JkZXIgfSBmcm9tICcuL0tleWVkUmVjb3JkZXIuanMnO1xuIl19
package/dist/trace.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
4
+ *
5
+ * Runtime stage IDs, commit log queries, and keyed recorder base class.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { parseRuntimeStageId, findLastWriter, KeyedRecorder } from 'footprintjs/trace';
10
+ *
11
+ * // Parse a runtimeStageId
12
+ * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
13
+ *
14
+ * // Backtrack: who wrote 'systemPrompt' before stage at idx 8?
15
+ * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
16
+ *
17
+ * // Build a keyed recorder
18
+ * class MyRecorder extends KeyedRecorder<MyEntry> { ... }
19
+ * ```
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.KeyedRecorder = exports.findLastWriter = exports.findCommits = exports.findCommit = exports.parseRuntimeStageId = exports.createExecutionCounter = exports.buildRuntimeStageId = void 0;
23
+ var runtimeStageId_js_1 = require("./lib/engine/runtimeStageId.js");
24
+ Object.defineProperty(exports, "buildRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.buildRuntimeStageId; } });
25
+ Object.defineProperty(exports, "createExecutionCounter", { enumerable: true, get: function () { return runtimeStageId_js_1.createExecutionCounter; } });
26
+ Object.defineProperty(exports, "parseRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.parseRuntimeStageId; } });
27
+ // Commit log queries — typed utilities for backtracking
28
+ var commitLogUtils_js_1 = require("./lib/memory/commitLogUtils.js");
29
+ Object.defineProperty(exports, "findCommit", { enumerable: true, get: function () { return commitLogUtils_js_1.findCommit; } });
30
+ Object.defineProperty(exports, "findCommits", { enumerable: true, get: function () { return commitLogUtils_js_1.findCommits; } });
31
+ Object.defineProperty(exports, "findLastWriter", { enumerable: true, get: function () { return commitLogUtils_js_1.findLastWriter; } });
32
+ // KeyedRecorder — base class for Map-based recorders
33
+ var KeyedRecorder_js_1 = require("./lib/recorder/KeyedRecorder.js");
34
+ Object.defineProperty(exports, "KeyedRecorder", { enumerable: true, get: function () { return KeyedRecorder_js_1.KeyedRecorder; } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7OztBQUlILG9FQUFrSDtBQUF6Ryx3SEFBQSxtQkFBbUIsT0FBQTtBQUFFLDJIQUFBLHNCQUFzQixPQUFBO0FBQUUsd0hBQUEsbUJBQW1CLE9BQUE7QUFFekUsd0RBQXdEO0FBQ3hELG9FQUF5RjtBQUFoRiwrR0FBQSxVQUFVLE9BQUE7QUFBRSxnSEFBQSxXQUFXLE9BQUE7QUFBRSxtSEFBQSxjQUFjLE9BQUE7QUFFaEQscURBQXFEO0FBQ3JELG9FQUFnRTtBQUF2RCxpSEFBQSxhQUFhLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL3RyYWNlIOKAlCBFeGVjdXRpb24gdHJhY2luZywgZGVidWdnaW5nLCBhbmQgYmFja3RyYWNraW5nIHV0aWxpdGllcy5cbiAqXG4gKiBSdW50aW1lIHN0YWdlIElEcywgY29tbWl0IGxvZyBxdWVyaWVzLCBhbmQga2V5ZWQgcmVjb3JkZXIgYmFzZSBjbGFzcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgcGFyc2VSdW50aW1lU3RhZ2VJZCwgZmluZExhc3RXcml0ZXIsIEtleWVkUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogLy8gUGFyc2UgYSBydW50aW1lU3RhZ2VJZFxuICogY29uc3QgeyBzdGFnZUlkLCBleGVjdXRpb25JbmRleCB9ID0gcGFyc2VSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0jNScpO1xuICpcbiAqIC8vIEJhY2t0cmFjazogd2hvIHdyb3RlICdzeXN0ZW1Qcm9tcHQnIGJlZm9yZSBzdGFnZSBhdCBpZHggOD9cbiAqIGNvbnN0IHdyaXRlciA9IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywgJ3N5c3RlbVByb21wdCcsIDgpO1xuICpcbiAqIC8vIEJ1aWxkIGEga2V5ZWQgcmVjb3JkZXJcbiAqIGNsYXNzIE15UmVjb3JkZXIgZXh0ZW5kcyBLZXllZFJlY29yZGVyPE15RW50cnk+IHsgLi4uIH1cbiAqIGBgYFxuICovXG5cbi8vIFJ1bnRpbWUgc3RhZ2UgSUQg4oCUIHVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyc1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25Db3VudGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcbmV4cG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIsIHBhcnNlUnVudGltZVN0YWdlSWQgfSBmcm9tICcuL2xpYi9lbmdpbmUvcnVudGltZVN0YWdlSWQuanMnO1xuXG4vLyBDb21taXQgbG9nIHF1ZXJpZXMg4oCUIHR5cGVkIHV0aWxpdGllcyBmb3IgYmFja3RyYWNraW5nXG5leHBvcnQgeyBmaW5kQ29tbWl0LCBmaW5kQ29tbWl0cywgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2xpYi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuXG4vLyBLZXllZFJlY29yZGVyIOKAlCBiYXNlIGNsYXNzIGZvciBNYXAtYmFzZWQgcmVjb3JkZXJzXG5leHBvcnQgeyBLZXllZFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci5qcyc7XG4iXX0=
@@ -48,3 +48,7 @@ export type { BranchResult, BranchResults, SerializedPipelineStructure as Engine
48
48
  export { NullControlFlowNarrativeGenerator } from './lib/engine/index.js';
49
49
  export type { CallExtractorFn, ExecuteNodeFn, GetStagePathFn, RunStageFn } from './lib/engine/index.js';
50
50
  export { applyOutputMapping, ChildrenExecutor, computeNodeType, ContinuationResolver, createSubflowHandlerDeps, DeciderHandler, DEFAULT_MAX_ITERATIONS, ExtractorRunner, extractParentScopeValues, getInitialScopeValues, NodeResolver, RuntimeStructureManager, seedSubflowGlobalStore, SelectorHandler, StageRunner, SubflowExecutor, } from './lib/engine/index.js';
51
+ export type { ExecutionCounter } from './lib/engine/runtimeStageId.js';
52
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/engine/runtimeStageId.js';
53
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
54
+ export { KeyedRecorder } from './lib/recorder/KeyedRecorder.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Typed utilities for querying the commit log.
3
+ *
4
+ * The commitLog is an ordered array of CommitBundle — one per stage commit.
5
+ * These helpers provide type-safe queries without (b: any) casts.
6
+ */
7
+ import type { CommitBundle } from './types.js';
8
+ /** Find the first commit by stageId, optionally filtering by a written key. */
9
+ export declare function findCommit(commitLog: CommitBundle[], stageId: string, key?: string): CommitBundle | undefined;
10
+ /** Find all commits by stageId. */
11
+ export declare function findCommits(commitLog: CommitBundle[], stageId: string): CommitBundle[];
12
+ /** Find the last commit that wrote a specific key (for backtracking). */
13
+ export declare function findLastWriter(commitLog: CommitBundle[], key: string, beforeIdx?: number): CommitBundle | undefined;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * KeyedRecorder<T> — base class for Map-based recorders keyed by runtimeStageId.
3
+ *
4
+ * Provides typed key-value storage with O(1) lookup, insertion-ordered iteration,
5
+ * and common accessors. Recorder implementations extend this and call store()
6
+ * from their event hooks.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * class TokenRecorder extends KeyedRecorder<LLMCallEntry> {
11
+ * onLLMCall(event: LLMCallEvent) {
12
+ * this.store(event.runtimeStageId, { model: event.model, ... });
13
+ * }
14
+ * getStats() { return aggregate(this.values()); }
15
+ * }
16
+ * ```
17
+ */
18
+ export declare abstract class KeyedRecorder<T> {
19
+ abstract readonly id: string;
20
+ private readonly data;
21
+ /** Store an entry keyed by runtimeStageId. */
22
+ protected store(runtimeStageId: string, entry: T): void;
23
+ /** O(1) lookup by runtimeStageId. */
24
+ getByKey(runtimeStageId: string): T | undefined;
25
+ /** All entries as a read-only Map (insertion-ordered). */
26
+ getMap(): ReadonlyMap<string, T>;
27
+ /** All entries as an array (insertion-ordered). */
28
+ values(): T[];
29
+ /** Number of entries stored. */
30
+ get size(): number;
31
+ /** Clear all stored data. Called by executor before each run(). */
32
+ clear(): void;
33
+ }
@@ -1,2 +1,3 @@
1
1
  export type { CompositeSnapshot } from './CompositeRecorder.js';
2
2
  export { CompositeRecorder } from './CompositeRecorder.js';
3
+ export { KeyedRecorder } from './KeyedRecorder.js';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
3
+ *
4
+ * Runtime stage IDs, commit log queries, and keyed recorder base class.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { parseRuntimeStageId, findLastWriter, KeyedRecorder } from 'footprintjs/trace';
9
+ *
10
+ * // Parse a runtimeStageId
11
+ * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
12
+ *
13
+ * // Backtrack: who wrote 'systemPrompt' before stage at idx 8?
14
+ * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
15
+ *
16
+ * // Build a keyed recorder
17
+ * class MyRecorder extends KeyedRecorder<MyEntry> { ... }
18
+ * ```
19
+ */
20
+ export type { ExecutionCounter } from './lib/engine/runtimeStageId.js';
21
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/engine/runtimeStageId.js';
22
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
23
+ export { KeyedRecorder } from './lib/recorder/KeyedRecorder.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "4.6.0",
3
+ "version": "4.7.0",
4
4
  "description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",
@@ -82,6 +82,11 @@
82
82
  "types": "./dist/types/recorders.d.ts",
83
83
  "import": "./dist/esm/recorders.js",
84
84
  "require": "./dist/recorders.js"
85
+ },
86
+ "./trace": {
87
+ "types": "./dist/types/trace.d.ts",
88
+ "import": "./dist/esm/trace.js",
89
+ "require": "./dist/trace.js"
85
90
  }
86
91
  },
87
92
  "lint-staged": {