footprintjs 3.1.0 → 4.0.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/dist/advanced.js +20 -23
- package/dist/esm/advanced.js +2 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +39 -14
- package/dist/esm/lib/builder/typedFlowChart.js +10 -31
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/engine/handlers/NodeResolver.js +22 -7
- package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +17 -4
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +2 -2
- package/dist/esm/lib/engine/handlers/StageRunner.js +2 -2
- package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +2 -2
- package/dist/esm/lib/engine/index.js +1 -2
- package/dist/esm/lib/engine/narrative/CombinedNarrativeBuilder.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +2 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +41 -32
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +7 -12
- package/dist/esm/lib/engine/narrative/index.js +1 -2
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +42 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +1 -22
- package/dist/esm/lib/runner/FlowChartExecutor.js +24 -50
- package/dist/esm/lib/runner/RunnableChart.js +25 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +17 -27
- package/dist/esm/lib/scope/index.js +1 -1
- package/dist/esm/lib/scope/providers/types.js +1 -1
- package/dist/esm/lib/scope/recorders/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +39 -14
- package/dist/lib/builder/typedFlowChart.js +11 -33
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/engine/handlers/NodeResolver.js +22 -7
- package/dist/lib/engine/handlers/RuntimeStructureManager.js +17 -4
- package/dist/lib/engine/handlers/SelectorHandler.js +2 -2
- package/dist/lib/engine/handlers/StageRunner.js +2 -2
- package/dist/lib/engine/handlers/SubflowInputMapper.js +2 -2
- package/dist/lib/engine/index.js +2 -4
- package/dist/lib/engine/narrative/CombinedNarrativeBuilder.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +2 -2
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +41 -32
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +7 -12
- package/dist/lib/engine/narrative/index.js +2 -4
- package/dist/lib/engine/traversal/FlowchartTraverser.js +42 -10
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +1 -22
- package/dist/lib/runner/FlowChartExecutor.js +24 -50
- package/dist/lib/runner/RunnableChart.js +25 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +17 -27
- package/dist/lib/scope/index.js +1 -1
- package/dist/lib/scope/providers/types.js +1 -1
- package/dist/lib/scope/recorders/index.js +1 -1
- package/dist/types/advanced.d.ts +2 -3
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +2 -1
- package/dist/types/lib/builder/typedFlowChart.d.ts +9 -29
- package/dist/types/lib/builder/types.d.ts +4 -4
- package/dist/types/lib/engine/handlers/NodeResolver.d.ts +10 -3
- package/dist/types/lib/engine/handlers/RuntimeStructureManager.d.ts +1 -1
- package/dist/types/lib/engine/index.d.ts +0 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +1 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +0 -1
- package/dist/types/lib/engine/narrative/index.d.ts +0 -1
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +6 -0
- package/dist/types/lib/engine/types.d.ts +3 -3
- package/dist/types/lib/memory/StageContext.d.ts +0 -15
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +13 -37
- package/dist/types/lib/runner/RunnableChart.d.ts +2 -0
- package/dist/types/lib/scope/index.d.ts +0 -1
- package/dist/types/lib/scope/providers/types.d.ts +0 -6
- package/dist/types/lib/scope/recorders/index.d.ts +0 -1
- package/package.json +1 -1
- package/dist/esm/lib/engine/narrative/ControlFlowNarrativeGenerator.js +0 -112
- package/dist/esm/lib/scope/recorders/NarrativeRecorder.js +0 -149
- package/dist/lib/engine/narrative/ControlFlowNarrativeGenerator.js +0 -116
- package/dist/lib/scope/recorders/NarrativeRecorder.js +0 -153
- package/dist/types/lib/engine/narrative/ControlFlowNarrativeGenerator.d.ts +0 -31
- package/dist/types/lib/scope/recorders/NarrativeRecorder.d.ts +0 -50
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ControlFlowNarrativeGenerator — Active implementation of IControlFlowNarrative.
|
|
3
|
-
*
|
|
4
|
-
* Converts traversal events into plain-English sentences at traversal time.
|
|
5
|
-
* Produces a human-readable story as a first-class output, enabling any consumer
|
|
6
|
-
* (cheaper LLM, follow-up agent, logging system) to understand what happened
|
|
7
|
-
* without parsing technical structures.
|
|
8
|
-
*
|
|
9
|
-
* This is the FLOW narrative — it captures control flow decisions.
|
|
10
|
-
* The DATA narrative comes from scope/recorders/NarrativeRecorder.
|
|
11
|
-
* CombinedNarrativeBuilder merges both into one story.
|
|
12
|
-
*/
|
|
13
|
-
export class ControlFlowNarrativeGenerator {
|
|
14
|
-
constructor() {
|
|
15
|
-
this.sentences = [];
|
|
16
|
-
this.isFirstStage = true;
|
|
17
|
-
}
|
|
18
|
-
onStageExecuted(stageName, description) {
|
|
19
|
-
if (this.isFirstStage) {
|
|
20
|
-
if (description) {
|
|
21
|
-
this.sentences.push(`The process began: ${description}.`);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
this.sentences.push(`The process began with ${stageName}.`);
|
|
25
|
-
}
|
|
26
|
-
this.isFirstStage = false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
onNext(fromStage, toStage, description) {
|
|
30
|
-
if (description) {
|
|
31
|
-
this.sentences.push(`Next step: ${description}.`);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
this.sentences.push(`Next, it moved on to ${toStage}.`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
onDecision(deciderName, chosenBranch, rationale, deciderDescription, _traversalContext, evidence) {
|
|
38
|
-
const branchName = chosenBranch;
|
|
39
|
-
if (evidence) {
|
|
40
|
-
const matchedRule = evidence.rules.find((r) => r.matched);
|
|
41
|
-
if (matchedRule) {
|
|
42
|
-
const label = matchedRule.label ? ` "${matchedRule.label}"` : '';
|
|
43
|
-
if (matchedRule.type === 'filter') {
|
|
44
|
-
const parts = matchedRule.conditions.map((c) => `${c.key} ${c.actualSummary} ${c.op} ${JSON.stringify(c.threshold)} ${c.result ? '\u2713' : '\u2717'}`);
|
|
45
|
-
this.sentences.push(`It evaluated${label}: ${parts.join(', ')}, and chose ${branchName}.`);
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
const parts = matchedRule.inputs.map((i) => `${i.key}=${i.valueSummary}`);
|
|
49
|
-
this.sentences.push(`It examined${label}: ${parts.join(', ')}, and chose ${branchName}.`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
const erroredCount = evidence.rules.filter((r) => r.matchError !== undefined).length;
|
|
54
|
-
const errorNote = erroredCount > 0 ? ` (${erroredCount} rule${erroredCount > 1 ? 's' : ''} threw errors)` : '';
|
|
55
|
-
this.sentences.push(`No rules matched${errorNote}, fell back to default: ${branchName}.`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
else if (deciderDescription && rationale) {
|
|
59
|
-
this.sentences.push(`It ${deciderDescription}: ${rationale}, so it chose ${branchName}.`);
|
|
60
|
-
}
|
|
61
|
-
else if (deciderDescription) {
|
|
62
|
-
this.sentences.push(`It ${deciderDescription} and chose ${branchName}.`);
|
|
63
|
-
}
|
|
64
|
-
else if (rationale) {
|
|
65
|
-
this.sentences.push(`A decision was made: ${rationale}, so the path taken was ${branchName}.`);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
this.sentences.push(`A decision was made, and the path taken was ${branchName}.`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
onFork(parentStage, childNames) {
|
|
72
|
-
const names = childNames.join(', ');
|
|
73
|
-
this.sentences.push(`Forking into ${childNames.length} parallel paths: ${names}.`);
|
|
74
|
-
}
|
|
75
|
-
onSelected(parentStage, selectedNames, totalCount) {
|
|
76
|
-
const names = selectedNames.join(', ');
|
|
77
|
-
this.sentences.push(`${selectedNames.length} of ${totalCount} paths were selected: ${names}.`);
|
|
78
|
-
}
|
|
79
|
-
onSubflowEntry(subflowName, _subflowId, description) {
|
|
80
|
-
if (description) {
|
|
81
|
-
this.sentences.push(`Entering the ${subflowName} subflow: ${description}.`);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
this.sentences.push(`Entering the ${subflowName} subflow.`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
onSubflowExit(subflowName, _subflowId) {
|
|
88
|
-
this.sentences.push(`Exiting the ${subflowName} subflow.`);
|
|
89
|
-
}
|
|
90
|
-
onSubflowRegistered(_subflowId, _name, _description, _specStructure) {
|
|
91
|
-
// No narrative output for registration events
|
|
92
|
-
}
|
|
93
|
-
onLoop(targetStage, iteration, description) {
|
|
94
|
-
if (description) {
|
|
95
|
-
this.sentences.push(`On pass ${iteration}: ${description} again.`);
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
this.sentences.push(`On pass ${iteration} through ${targetStage}.`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
onBreak(stageName) {
|
|
102
|
-
this.sentences.push(`Execution stopped at ${stageName}.`);
|
|
103
|
-
}
|
|
104
|
-
onError(stageName, errorMessage, _error) {
|
|
105
|
-
this.sentences.push(`An error occurred at ${stageName}: ${errorMessage}.`);
|
|
106
|
-
}
|
|
107
|
-
/** Returns a defensive copy of accumulated sentences. */
|
|
108
|
-
getSentences() {
|
|
109
|
-
return [...this.sentences];
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFLSCxNQUFNLE9BQU8sNkJBQTZCO0lBQTFDO1FBQ1UsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6QixpQkFBWSxHQUFHLElBQUksQ0FBQztJQTBHOUIsQ0FBQztJQXhHQyxlQUFlLENBQUMsU0FBaUIsRUFBRSxXQUFvQjtRQUNyRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFdBQW9CO1FBQzdELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQ1IsV0FBbUIsRUFDbkIsWUFBb0IsRUFDcEIsU0FBa0IsRUFDbEIsa0JBQTJCLEVBQzNC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LFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsU0FBUyxLQUFLLFdBQVcsU0FBUyxDQUFDLENBQUM7UUFDckUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLFNBQVMsWUFBWSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxPQUFPLENBQUMsU0FBaUIsRUFBRSxZQUFvQixFQUFFLE1BQWU7UUFDOUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLFNBQVMsS0FBSyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsWUFBWTtRQUNWLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIOKAlCBBY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgSUNvbnRyb2xGbG93TmFycmF0aXZlLlxuICpcbiAqIENvbnZlcnRzIHRyYXZlcnNhbCBldmVudHMgaW50byBwbGFpbi1FbmdsaXNoIHNlbnRlbmNlcyBhdCB0cmF2ZXJzYWwgdGltZS5cbiAqIFByb2R1Y2VzIGEgaHVtYW4tcmVhZGFibGUgc3RvcnkgYXMgYSBmaXJzdC1jbGFzcyBvdXRwdXQsIGVuYWJsaW5nIGFueSBjb25zdW1lclxuICogKGNoZWFwZXIgTExNLCBmb2xsb3ctdXAgYWdlbnQsIGxvZ2dpbmcgc3lzdGVtKSB0byB1bmRlcnN0YW5kIHdoYXQgaGFwcGVuZWRcbiAqIHdpdGhvdXQgcGFyc2luZyB0ZWNobmljYWwgc3RydWN0dXJlcy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBGTE9XIG5hcnJhdGl2ZSDigJQgaXQgY2FwdHVyZXMgY29udHJvbCBmbG93IGRlY2lzaW9ucy5cbiAqIFRoZSBEQVRBIG5hcnJhdGl2ZSBjb21lcyBmcm9tIHNjb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlci5cbiAqIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciBtZXJnZXMgYm90aCBpbnRvIG9uZSBzdG9yeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERlY2lzaW9uRXZpZGVuY2UgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIGltcGxlbWVudHMgSUNvbnRyb2xGbG93TmFycmF0aXZlIHtcbiAgcHJpdmF0ZSBzZW50ZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaXNGaXJzdFN0YWdlID0gdHJ1ZTtcblxuICBvblN0YWdlRXhlY3V0ZWQoc3RhZ2VOYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdFN0YWdlKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgVGhlIHByb2Nlc3MgYmVnYW46ICR7ZGVzY3JpcHRpb259LmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgVGhlIHByb2Nlc3MgYmVnYW4gd2l0aCAke3N0YWdlTmFtZX0uYCk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzRmlyc3RTdGFnZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uTmV4dChmcm9tU3RhZ2U6IHN0cmluZywgdG9TdGFnZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgTmV4dCBzdGVwOiAke2Rlc2NyaXB0aW9ufS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgTmV4dCwgaXQgbW92ZWQgb24gdG8gJHt0b1N0YWdlfS5gKTtcbiAgICB9XG4gIH1cblxuICBvbkRlY2lzaW9uKFxuICAgIGRlY2lkZXJOYW1lOiBzdHJpbmcsXG4gICAgY2hvc2VuQnJhbmNoOiBzdHJpbmcsXG4gICAgcmF0aW9uYWxlPzogc3RyaW5nLFxuICAgIGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBfdHJhdmVyc2FsQ29udGV4dD86IHVua25vd24sXG4gICAgZXZpZGVuY2U/OiBEZWNpc2lvbkV2aWRlbmNlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBicmFuY2hOYW1lID0gY2hvc2VuQnJhbmNoO1xuICAgIGlmIChldmlkZW5jZSkge1xuICAgICAgY29uc3QgbWF0Y2hlZFJ1bGUgPSBldmlkZW5jZS5ydWxlcy5maW5kKChyKSA9PiByLm1hdGNoZWQpO1xuICAgICAgaWYgKG1hdGNoZWRSdWxlKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gbWF0Y2hlZFJ1bGUubGFiZWwgPyBgIFwiJHttYXRjaGVkUnVsZS5sYWJlbH1cImAgOiAnJztcbiAgICAgICAgaWYgKG1hdGNoZWRSdWxlLnR5cGUgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaGVkUnVsZS5jb25kaXRpb25zLm1hcChcbiAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICBgJHtjLmtleX0gJHtjLmFjdHVhbFN1bW1hcnl9ICR7Yy5vcH0gJHtKU09OLnN0cmluZ2lmeShjLnRocmVzaG9sZCl9ICR7Yy5yZXN1bHQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEl0IGV2YWx1YXRlZCR7bGFiZWx9OiAke3BhcnRzLmpvaW4oJywgJyl9LCBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWRSdWxlLmlucHV0cy5tYXAoKGkpID0+IGAke2kua2V5fT0ke2kudmFsdWVTdW1tYXJ5fWApO1xuICAgICAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEl0IGV4YW1pbmVkJHtsYWJlbH06ICR7cGFydHMuam9pbignLCAnKX0sIGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvcmVkQ291bnQgPSBldmlkZW5jZS5ydWxlcy5maWx0ZXIoKHIpID0+IHIubWF0Y2hFcnJvciAhPT0gdW5kZWZpbmVkKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVycm9yTm90ZSA9IGVycm9yZWRDb3VudCA+IDAgPyBgICgke2Vycm9yZWRDb3VudH0gcnVsZSR7ZXJyb3JlZENvdW50ID4gMSA/ICdzJyA6ICcnfSB0aHJldyBlcnJvcnMpYCA6ICcnO1xuICAgICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBObyBydWxlcyBtYXRjaGVkJHtlcnJvck5vdGV9LCBmZWxsIGJhY2sgdG8gZGVmYXVsdDogJHticmFuY2hOYW1lfS5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlY2lkZXJEZXNjcmlwdGlvbiAmJiByYXRpb25hbGUpIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEl0ICR7ZGVjaWRlckRlc2NyaXB0aW9ufTogJHtyYXRpb25hbGV9LCBzbyBpdCBjaG9zZSAke2JyYW5jaE5hbWV9LmApO1xuICAgIH0gZWxzZSBpZiAoZGVjaWRlckRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBJdCAke2RlY2lkZXJEZXNjcmlwdGlvbn0gYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYCk7XG4gICAgfSBlbHNlIGlmIChyYXRpb25hbGUpIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEEgZGVjaXNpb24gd2FzIG1hZGU6ICR7cmF0aW9uYWxlfSwgc28gdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEEgZGVjaXNpb24gd2FzIG1hZGUsIGFuZCB0aGUgcGF0aCB0YWtlbiB3YXMgJHticmFuY2hOYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICBvbkZvcmsocGFyZW50U3RhZ2U6IHN0cmluZywgY2hpbGROYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lcyA9IGNoaWxkTmFtZXMuam9pbignLCAnKTtcbiAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBGb3JraW5nIGludG8gJHtjaGlsZE5hbWVzLmxlbmd0aH0gcGFyYWxsZWwgcGF0aHM6ICR7bmFtZXN9LmApO1xuICB9XG5cbiAgb25TZWxlY3RlZChwYXJlbnRTdGFnZTogc3RyaW5nLCBzZWxlY3RlZE5hbWVzOiBzdHJpbmdbXSwgdG90YWxDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZXMgPSBzZWxlY3RlZE5hbWVzLmpvaW4oJywgJyk7XG4gICAgdGhpcy5zZW50ZW5jZXMucHVzaChgJHtzZWxlY3RlZE5hbWVzLmxlbmd0aH0gb2YgJHt0b3RhbENvdW50fSBwYXRocyB3ZXJlIHNlbGVjdGVkOiAke25hbWVzfS5gKTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KHN1YmZsb3dOYW1lOiBzdHJpbmcsIF9zdWJmbG93SWQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBFbnRlcmluZyB0aGUgJHtzdWJmbG93TmFtZX0gc3ViZmxvdzogJHtkZXNjcmlwdGlvbn0uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEVudGVyaW5nIHRoZSAke3N1YmZsb3dOYW1lfSBzdWJmbG93LmApO1xuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWU6IHN0cmluZywgX3N1YmZsb3dJZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEV4aXRpbmcgdGhlICR7c3ViZmxvd05hbWV9IHN1YmZsb3cuYCk7XG4gIH1cblxuICBvblN1YmZsb3dSZWdpc3RlcmVkKF9zdWJmbG93SWQ6IHN0cmluZywgX25hbWU6IHN0cmluZywgX2Rlc2NyaXB0aW9uPzogc3RyaW5nLCBfc3BlY1N0cnVjdHVyZT86IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBObyBuYXJyYXRpdmUgb3V0cHV0IGZvciByZWdpc3RyYXRpb24gZXZlbnRzXG4gIH1cblxuICBvbkxvb3AodGFyZ2V0U3RhZ2U6IHN0cmluZywgaXRlcmF0aW9uOiBudW1iZXIsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBPbiBwYXNzICR7aXRlcmF0aW9ufTogJHtkZXNjcmlwdGlvbn0gYWdhaW4uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYE9uIHBhc3MgJHtpdGVyYXRpb259IHRocm91Z2ggJHt0YXJnZXRTdGFnZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgb25CcmVhayhzdGFnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEV4ZWN1dGlvbiBzdG9wcGVkIGF0ICR7c3RhZ2VOYW1lfS5gKTtcbiAgfVxuXG4gIG9uRXJyb3Ioc3RhZ2VOYW1lOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogc3RyaW5nLCBfZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBBbiBlcnJvciBvY2N1cnJlZCBhdCAke3N0YWdlTmFtZX06ICR7ZXJyb3JNZXNzYWdlfS5gKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYWNjdW11bGF0ZWQgc2VudGVuY2VzLiAqL1xuICBnZXRTZW50ZW5jZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5zZW50ZW5jZXNdO1xuICB9XG59XG4iXX0=
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NarrativeRecorder — Captures per-stage scope reads/writes for narrative enrichment
|
|
3
|
-
*
|
|
4
|
-
* Bridges the gap between flow-level narrative (NarrativeGenerator) and data-level
|
|
5
|
-
* detail. Produces structured per-stage data and text sentences that can be merged
|
|
6
|
-
* with NarrativeGenerator output for the full picture: what happened AND what was produced.
|
|
7
|
-
*
|
|
8
|
-
* @deprecated Since 0.9.x — Superseded by {@link CombinedNarrativeRecorder} which implements
|
|
9
|
-
* both FlowRecorder and Recorder interfaces, building the combined narrative inline during
|
|
10
|
-
* traversal. This class is retained for backward compatibility with consumers that attach
|
|
11
|
-
* NarrativeRecorder directly. Will be removed in v1.0.
|
|
12
|
-
*/
|
|
13
|
-
import { summarizeValue } from './summarizeValue.js';
|
|
14
|
-
export class NarrativeRecorder {
|
|
15
|
-
constructor(options) {
|
|
16
|
-
var _a, _b, _c;
|
|
17
|
-
this.stages = new Map();
|
|
18
|
-
this.stageOrder = [];
|
|
19
|
-
this.id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : `narrative-recorder-${Date.now()}`;
|
|
20
|
-
this.detail = (_b = options === null || options === void 0 ? void 0 : options.detail) !== null && _b !== void 0 ? _b : 'full';
|
|
21
|
-
this.maxValueLength = (_c = options === null || options === void 0 ? void 0 : options.maxValueLength) !== null && _c !== void 0 ? _c : 80;
|
|
22
|
-
}
|
|
23
|
-
onRead(event) {
|
|
24
|
-
var _a;
|
|
25
|
-
const stageData = this.getOrCreateStageData(event.stageName);
|
|
26
|
-
const op = {
|
|
27
|
-
type: 'read',
|
|
28
|
-
key: (_a = event.key) !== null && _a !== void 0 ? _a : '',
|
|
29
|
-
valueSummary: summarizeValue(event.value, this.maxValueLength),
|
|
30
|
-
stepNumber: stageData.operations.length + 1,
|
|
31
|
-
};
|
|
32
|
-
stageData.reads.push(op);
|
|
33
|
-
stageData.operations.push(op);
|
|
34
|
-
}
|
|
35
|
-
onWrite(event) {
|
|
36
|
-
const stageData = this.getOrCreateStageData(event.stageName);
|
|
37
|
-
const op = {
|
|
38
|
-
type: 'write',
|
|
39
|
-
key: event.key,
|
|
40
|
-
valueSummary: summarizeValue(event.value, this.maxValueLength),
|
|
41
|
-
operation: event.operation,
|
|
42
|
-
stepNumber: stageData.operations.length + 1,
|
|
43
|
-
};
|
|
44
|
-
stageData.writes.push(op);
|
|
45
|
-
stageData.operations.push(op);
|
|
46
|
-
}
|
|
47
|
-
getStageData() {
|
|
48
|
-
const copy = new Map();
|
|
49
|
-
for (const [name, data] of this.stages) {
|
|
50
|
-
copy.set(name, {
|
|
51
|
-
stageName: data.stageName,
|
|
52
|
-
reads: [...data.reads],
|
|
53
|
-
writes: [...data.writes],
|
|
54
|
-
operations: [...data.operations],
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
return copy;
|
|
58
|
-
}
|
|
59
|
-
getStageDataFor(stageName) {
|
|
60
|
-
const data = this.stages.get(stageName);
|
|
61
|
-
if (!data)
|
|
62
|
-
return undefined;
|
|
63
|
-
return {
|
|
64
|
-
stageName: data.stageName,
|
|
65
|
-
reads: [...data.reads],
|
|
66
|
-
writes: [...data.writes],
|
|
67
|
-
operations: [...data.operations],
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
toSentences() {
|
|
71
|
-
const result = new Map();
|
|
72
|
-
for (const stageName of this.stageOrder) {
|
|
73
|
-
const data = this.stages.get(stageName);
|
|
74
|
-
if (!data)
|
|
75
|
-
continue;
|
|
76
|
-
const lines = [];
|
|
77
|
-
if (this.detail === 'summary') {
|
|
78
|
-
const parts = [];
|
|
79
|
-
if (data.reads.length > 0) {
|
|
80
|
-
parts.push(`read ${data.reads.length} value${data.reads.length > 1 ? 's' : ''}`);
|
|
81
|
-
}
|
|
82
|
-
if (data.writes.length > 0) {
|
|
83
|
-
parts.push(`wrote ${data.writes.length} value${data.writes.length > 1 ? 's' : ''}`);
|
|
84
|
-
}
|
|
85
|
-
if (parts.length > 0) {
|
|
86
|
-
lines.push(` - ${capitalize(parts.join(', '))}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
for (const op of data.operations) {
|
|
91
|
-
const stepPrefix = op.stepNumber ? `Step ${op.stepNumber}: ` : '';
|
|
92
|
-
if (op.type === 'read') {
|
|
93
|
-
lines.push(op.valueSummary
|
|
94
|
-
? ` - ${stepPrefix}Read: ${op.key} = ${op.valueSummary}`
|
|
95
|
-
: ` - ${stepPrefix}Read: ${op.key}`);
|
|
96
|
-
}
|
|
97
|
-
else if (op.operation === 'delete') {
|
|
98
|
-
lines.push(` - ${stepPrefix}Delete: ${op.key}`);
|
|
99
|
-
}
|
|
100
|
-
else if (op.operation === 'update') {
|
|
101
|
-
lines.push(` - ${stepPrefix}Update: ${op.key} = ${op.valueSummary}`);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
lines.push(` - ${stepPrefix}Write: ${op.key} = ${op.valueSummary}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (lines.length > 0) {
|
|
109
|
-
result.set(stageName, lines);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return result;
|
|
113
|
-
}
|
|
114
|
-
toFlatSentences() {
|
|
115
|
-
const result = [];
|
|
116
|
-
const perStage = this.toSentences();
|
|
117
|
-
for (const [stageName, lines] of perStage) {
|
|
118
|
-
for (const line of lines) {
|
|
119
|
-
const cleaned = line.replace(/^\s+-\s+/, '');
|
|
120
|
-
result.push(`${stageName}: ${cleaned}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return result;
|
|
124
|
-
}
|
|
125
|
-
clear() {
|
|
126
|
-
this.stages.clear();
|
|
127
|
-
this.stageOrder = [];
|
|
128
|
-
}
|
|
129
|
-
setDetail(level) {
|
|
130
|
-
this.detail = level;
|
|
131
|
-
}
|
|
132
|
-
getDetail() {
|
|
133
|
-
return this.detail;
|
|
134
|
-
}
|
|
135
|
-
getOrCreateStageData(stageName) {
|
|
136
|
-
let data = this.stages.get(stageName);
|
|
137
|
-
if (!data) {
|
|
138
|
-
data = { stageName, reads: [], writes: [], operations: [] };
|
|
139
|
-
this.stages.set(stageName, data);
|
|
140
|
-
this.stageOrder.push(stageName);
|
|
141
|
-
}
|
|
142
|
-
return data;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// ── Private Helpers ──────────────────────────────────────────────────────────
|
|
146
|
-
function capitalize(s) {
|
|
147
|
-
return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFycmF0aXZlUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUdILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQXlCckQsTUFBTSxPQUFPLGlCQUFpQjtJQU81QixZQUFZLE9BQWtDOztRQUx0QyxXQUFNLEdBQW9DLElBQUksR0FBRyxFQUFFLENBQUM7UUFDcEQsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUtoQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEVBQUUsbUNBQUksc0JBQXNCLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxNQUFNLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLG1DQUFJLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWdCOztRQUNyQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sRUFBRSxHQUF1QjtZQUM3QixJQUFJLEVBQUUsTUFBTTtZQUNaLEdBQUcsRUFBRSxNQUFBLEtBQUssQ0FBQyxHQUFHLG1DQUFJLEVBQUU7WUFDcEIsWUFBWSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDOUQsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFH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QztJQUN2QixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQXNCO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxTQUFpQjtRQUM1QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRUQsZ0ZBQWdGO0FBRWhGLFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFycmF0aXZlUmVjb3JkZXIg4oCUIENhcHR1cmVzIHBlci1zdGFnZSBzY29wZSByZWFkcy93cml0ZXMgZm9yIG5hcnJhdGl2ZSBlbnJpY2htZW50XG4gKlxuICogQnJpZGdlcyB0aGUgZ2FwIGJldHdlZW4gZmxvdy1sZXZlbCBuYXJyYXRpdmUgKE5hcnJhdGl2ZUdlbmVyYXRvcikgYW5kIGRhdGEtbGV2ZWxcbiAqIGRldGFpbC4gUHJvZHVjZXMgc3RydWN0dXJlZCBwZXItc3RhZ2UgZGF0YSBhbmQgdGV4dCBzZW50ZW5jZXMgdGhhdCBjYW4gYmUgbWVyZ2VkXG4gKiB3aXRoIE5hcnJhdGl2ZUdlbmVyYXRvciBvdXRwdXQgZm9yIHRoZSBmdWxsIHBpY3R1cmU6IHdoYXQgaGFwcGVuZWQgQU5EIHdoYXQgd2FzIHByb2R1Y2VkLlxuICpcbiAqIEBkZXByZWNhdGVkIFNpbmNlIDAuOS54IOKAlCBTdXBlcnNlZGVkIGJ5IHtAbGluayBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyfSB3aGljaCBpbXBsZW1lbnRzXG4gKiBib3RoIEZsb3dSZWNvcmRlciBhbmQgUmVjb3JkZXIgaW50ZXJmYWNlcywgYnVpbGRpbmcgdGhlIGNvbWJpbmVkIG5hcnJhdGl2ZSBpbmxpbmUgZHVyaW5nXG4gKiB0cmF2ZXJzYWwuIFRoaXMgY2xhc3MgaXMgcmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBjb25zdW1lcnMgdGhhdCBhdHRhY2hcbiAqIE5hcnJhdGl2ZVJlY29yZGVyIGRpcmVjdGx5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdjEuMC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlYWRFdmVudCwgUmVjb3JkZXIsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBzdW1tYXJpemVWYWx1ZSB9IGZyb20gJy4vc3VtbWFyaXplVmFsdWUuanMnO1xuXG5leHBvcnQgdHlwZSBOYXJyYXRpdmVEZXRhaWwgPSAnc3VtbWFyeScgfCAnZnVsbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFycmF0aXZlT3BlcmF0aW9uIHtcbiAgdHlwZTogJ3JlYWQnIHwgJ3dyaXRlJztcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlU3VtbWFyeTogc3RyaW5nO1xuICBvcGVyYXRpb24/OiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZSc7XG4gIHN0ZXBOdW1iZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VOYXJyYXRpdmVEYXRhIHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRzOiBOYXJyYXRpdmVPcGVyYXRpb25bXTtcbiAgd3JpdGVzOiBOYXJyYXRpdmVPcGVyYXRpb25bXTtcbiAgb3BlcmF0aW9uczogTmFycmF0aXZlT3BlcmF0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIGRldGFpbD86IE5hcnJhdGl2ZURldGFpbDtcbiAgbWF4VmFsdWVMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBOYXJyYXRpdmVSZWNvcmRlciBpbXBsZW1lbnRzIFJlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFnZXM6IE1hcDxzdHJpbmcsIFN0YWdlTmFycmF0aXZlRGF0YT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhZ2VPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBkZXRhaWw6IE5hcnJhdGl2ZURldGFpbDtcbiAgcHJpdmF0ZSBtYXhWYWx1ZUxlbmd0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBOYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgPz8gYG5hcnJhdGl2ZS1yZWNvcmRlci0ke0RhdGUubm93KCl9YDtcbiAgICB0aGlzLmRldGFpbCA9IG9wdGlvbnM/LmRldGFpbCA/PyAnZnVsbCc7XG4gICAgdGhpcy5tYXhWYWx1ZUxlbmd0aCA9IG9wdGlvbnM/Lm1heFZhbHVlTGVuZ3RoID8/IDgwO1xuICB9XG5cbiAgb25SZWFkKGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZURhdGEgPSB0aGlzLmdldE9yQ3JlYXRlU3RhZ2VEYXRhKGV2ZW50LnN0YWdlTmFtZSk7XG4gICAgY29uc3Qgb3A6IE5hcnJhdGl2ZU9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgIGtleTogZXZlbnQua2V5ID8/ICcnLFxuICAgICAgdmFsdWVTdW1tYXJ5OiBzdW1tYXJpemVWYWx1ZShldmVudC52YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCksXG4gICAgICBzdGVwTnVtYmVyOiBzdGFnZURhdGEub3BlcmF0aW9ucy5sZW5ndGggKyAxLFxuICAgIH07XG4gICAgc3RhZ2VEYXRhLnJlYWRzLnB1c2gob3ApO1xuICAgIHN0YWdlRGF0YS5vcGVyYXRpb25zLnB1c2gob3ApO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWdlRGF0YSA9IHRoaXMuZ2V0T3JDcmVhdGVTdGFnZURhdGEoZXZlbnQuc3RhZ2VOYW1lKTtcbiAgICBjb25zdCBvcDogTmFycmF0aXZlT3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ3dyaXRlJyxcbiAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgdmFsdWVTdW1tYXJ5OiBzdW1tYXJpemVWYWx1ZShldmVudC52YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCksXG4gICAgICBvcGVyYXRpb246IGV2ZW50Lm9wZXJhdGlvbixcbiAgICAgIHN0ZXBOdW1iZXI6IHN0YWdlRGF0YS5vcGVyYXRpb25zLmxlbmd0aCArIDEsXG4gICAgfTtcbiAgICBzdGFnZURhdGEud3JpdGVzLnB1c2gob3ApO1xuICAgIHN0YWdlRGF0YS5vcGVyYXRpb25zLnB1c2gob3ApO1xuICB9XG5cbiAgZ2V0U3RhZ2VEYXRhKCk6IE1hcDxzdHJpbmcsIFN0YWdlTmFycmF0aXZlRGF0YT4ge1xuICAgIGNvbnN0IGNvcHkgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOYXJyYXRpdmVEYXRhPigpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIHRoaXMuc3RhZ2VzKSB7XG4gICAgICBjb3B5LnNldChuYW1lLCB7XG4gICAgICAgIHN0YWdlTmFtZTogZGF0YS5zdGFnZU5hbWUsXG4gICAgICAgIHJlYWRzOiBbLi4uZGF0YS5yZWFkc10sXG4gICAgICAgIHdyaXRlczogWy4uLmRhdGEud3JpdGVzXSxcbiAgICAgICAgb3BlcmF0aW9uczogWy4uLmRhdGEub3BlcmF0aW9uc10sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICBnZXRTdGFnZURhdGFGb3Ioc3RhZ2VOYW1lOiBzdHJpbmcpOiBTdGFnZU5hcnJhdGl2ZURhdGEgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0YWdlcy5nZXQoc3RhZ2VOYW1lKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWdlTmFtZTogZGF0YS5zdGFnZU5hbWUsXG4gICAgICByZWFkczogWy4uLmRhdGEucmVhZHNdLFxuICAgICAgd3JpdGVzOiBbLi4uZGF0YS53cml0ZXNdLFxuICAgICAgb3BlcmF0aW9uczogWy4uLmRhdGEub3BlcmF0aW9uc10sXG4gICAgfTtcbiAgfVxuXG4gIHRvU2VudGVuY2VzKCk6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG4gICAgZm9yIChjb25zdCBzdGFnZU5hbWUgb2YgdGhpcy5zdGFnZU9yZGVyKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zdGFnZXMuZ2V0KHN0YWdlTmFtZSk7XG4gICAgICBpZiAoIWRhdGEpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKHRoaXMuZGV0YWlsID09PSAnc3VtbWFyeScpIHtcbiAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChkYXRhLnJlYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGByZWFkICR7ZGF0YS5yZWFkcy5sZW5ndGh9IHZhbHVlJHtkYXRhLnJlYWRzLmxlbmd0aCA+IDEgPyAncycgOiAnJ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS53cml0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goYHdyb3RlICR7ZGF0YS53cml0ZXMubGVuZ3RofSB2YWx1ZSR7ZGF0YS53cml0ZXMubGVuZ3RoID4gMSA/ICdzJyA6ICcnfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZXMucHVzaChgICAtICR7Y2FwaXRhbGl6ZShwYXJ0cy5qb2luKCcsICcpKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBvcCBvZiBkYXRhLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBzdGVwUHJlZml4ID0gb3Auc3RlcE51bWJlciA/IGBTdGVwICR7b3Auc3RlcE51bWJlcn06IGAgOiAnJztcbiAgICAgICAgICBpZiAob3AudHlwZSA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgICAgICBvcC52YWx1ZVN1bW1hcnlcbiAgICAgICAgICAgICAgICA/IGAgIC0gJHtzdGVwUHJlZml4fVJlYWQ6ICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICAgICAgICA6IGAgIC0gJHtzdGVwUHJlZml4fVJlYWQ6ICR7b3Aua2V5fWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3Aub3BlcmF0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAtICR7c3RlcFByZWZpeH1EZWxldGU6ICR7b3Aua2V5fWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3Aub3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAtICR7c3RlcFByZWZpeH1VcGRhdGU6ICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgIC0gJHtzdGVwUHJlZml4fVdyaXRlOiAke29wLmtleX0gPSAke29wLnZhbHVlU3VtbWFyeX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LnNldChzdGFnZU5hbWUsIGxpbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdG9GbGF0U2VudGVuY2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGVyU3RhZ2UgPSB0aGlzLnRvU2VudGVuY2VzKCk7XG4gICAgZm9yIChjb25zdCBbc3RhZ2VOYW1lLCBsaW5lc10gb2YgcGVyU3RhZ2UpIHtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gbGluZS5yZXBsYWNlKC9eXFxzKy1cXHMrLywgJycpO1xuICAgICAgICByZXN1bHQucHVzaChgJHtzdGFnZU5hbWV9OiAke2NsZWFuZWR9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YWdlcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhZ2VPcmRlciA9IFtdO1xuICB9XG5cbiAgc2V0RGV0YWlsKGxldmVsOiBOYXJyYXRpdmVEZXRhaWwpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbCA9IGxldmVsO1xuICB9XG5cbiAgZ2V0RGV0YWlsKCk6IE5hcnJhdGl2ZURldGFpbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV0YWlsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVN0YWdlRGF0YShzdGFnZU5hbWU6IHN0cmluZyk6IFN0YWdlTmFycmF0aXZlRGF0YSB7XG4gICAgbGV0IGRhdGEgPSB0aGlzLnN0YWdlcy5nZXQoc3RhZ2VOYW1lKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSB7IHN0YWdlTmFtZSwgcmVhZHM6IFtdLCB3cml0ZXM6IFtdLCBvcGVyYXRpb25zOiBbXSB9O1xuICAgICAgdGhpcy5zdGFnZXMuc2V0KHN0YWdlTmFtZSwgZGF0YSk7XG4gICAgICB0aGlzLnN0YWdlT3JkZXIucHVzaChzdGFnZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufVxuXG4vLyDilIDilIAgUHJpdmF0ZSBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBjYXBpdGFsaXplKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLmxlbmd0aCA9PT0gMCA/IHMgOiBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTtcbn1cbiJdfQ==
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* ControlFlowNarrativeGenerator — Active implementation of IControlFlowNarrative.
|
|
4
|
-
*
|
|
5
|
-
* Converts traversal events into plain-English sentences at traversal time.
|
|
6
|
-
* Produces a human-readable story as a first-class output, enabling any consumer
|
|
7
|
-
* (cheaper LLM, follow-up agent, logging system) to understand what happened
|
|
8
|
-
* without parsing technical structures.
|
|
9
|
-
*
|
|
10
|
-
* This is the FLOW narrative — it captures control flow decisions.
|
|
11
|
-
* The DATA narrative comes from scope/recorders/NarrativeRecorder.
|
|
12
|
-
* CombinedNarrativeBuilder merges both into one story.
|
|
13
|
-
*/
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.ControlFlowNarrativeGenerator = void 0;
|
|
16
|
-
class ControlFlowNarrativeGenerator {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.sentences = [];
|
|
19
|
-
this.isFirstStage = true;
|
|
20
|
-
}
|
|
21
|
-
onStageExecuted(stageName, description) {
|
|
22
|
-
if (this.isFirstStage) {
|
|
23
|
-
if (description) {
|
|
24
|
-
this.sentences.push(`The process began: ${description}.`);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
this.sentences.push(`The process began with ${stageName}.`);
|
|
28
|
-
}
|
|
29
|
-
this.isFirstStage = false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
onNext(fromStage, toStage, description) {
|
|
33
|
-
if (description) {
|
|
34
|
-
this.sentences.push(`Next step: ${description}.`);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
this.sentences.push(`Next, it moved on to ${toStage}.`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
onDecision(deciderName, chosenBranch, rationale, deciderDescription, _traversalContext, evidence) {
|
|
41
|
-
const branchName = chosenBranch;
|
|
42
|
-
if (evidence) {
|
|
43
|
-
const matchedRule = evidence.rules.find((r) => r.matched);
|
|
44
|
-
if (matchedRule) {
|
|
45
|
-
const label = matchedRule.label ? ` "${matchedRule.label}"` : '';
|
|
46
|
-
if (matchedRule.type === 'filter') {
|
|
47
|
-
const parts = matchedRule.conditions.map((c) => `${c.key} ${c.actualSummary} ${c.op} ${JSON.stringify(c.threshold)} ${c.result ? '\u2713' : '\u2717'}`);
|
|
48
|
-
this.sentences.push(`It evaluated${label}: ${parts.join(', ')}, and chose ${branchName}.`);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
const parts = matchedRule.inputs.map((i) => `${i.key}=${i.valueSummary}`);
|
|
52
|
-
this.sentences.push(`It examined${label}: ${parts.join(', ')}, and chose ${branchName}.`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
const erroredCount = evidence.rules.filter((r) => r.matchError !== undefined).length;
|
|
57
|
-
const errorNote = erroredCount > 0 ? ` (${erroredCount} rule${erroredCount > 1 ? 's' : ''} threw errors)` : '';
|
|
58
|
-
this.sentences.push(`No rules matched${errorNote}, fell back to default: ${branchName}.`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else if (deciderDescription && rationale) {
|
|
62
|
-
this.sentences.push(`It ${deciderDescription}: ${rationale}, so it chose ${branchName}.`);
|
|
63
|
-
}
|
|
64
|
-
else if (deciderDescription) {
|
|
65
|
-
this.sentences.push(`It ${deciderDescription} and chose ${branchName}.`);
|
|
66
|
-
}
|
|
67
|
-
else if (rationale) {
|
|
68
|
-
this.sentences.push(`A decision was made: ${rationale}, so the path taken was ${branchName}.`);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
this.sentences.push(`A decision was made, and the path taken was ${branchName}.`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
onFork(parentStage, childNames) {
|
|
75
|
-
const names = childNames.join(', ');
|
|
76
|
-
this.sentences.push(`Forking into ${childNames.length} parallel paths: ${names}.`);
|
|
77
|
-
}
|
|
78
|
-
onSelected(parentStage, selectedNames, totalCount) {
|
|
79
|
-
const names = selectedNames.join(', ');
|
|
80
|
-
this.sentences.push(`${selectedNames.length} of ${totalCount} paths were selected: ${names}.`);
|
|
81
|
-
}
|
|
82
|
-
onSubflowEntry(subflowName, _subflowId, description) {
|
|
83
|
-
if (description) {
|
|
84
|
-
this.sentences.push(`Entering the ${subflowName} subflow: ${description}.`);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.sentences.push(`Entering the ${subflowName} subflow.`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
onSubflowExit(subflowName, _subflowId) {
|
|
91
|
-
this.sentences.push(`Exiting the ${subflowName} subflow.`);
|
|
92
|
-
}
|
|
93
|
-
onSubflowRegistered(_subflowId, _name, _description, _specStructure) {
|
|
94
|
-
// No narrative output for registration events
|
|
95
|
-
}
|
|
96
|
-
onLoop(targetStage, iteration, description) {
|
|
97
|
-
if (description) {
|
|
98
|
-
this.sentences.push(`On pass ${iteration}: ${description} again.`);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this.sentences.push(`On pass ${iteration} through ${targetStage}.`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
onBreak(stageName) {
|
|
105
|
-
this.sentences.push(`Execution stopped at ${stageName}.`);
|
|
106
|
-
}
|
|
107
|
-
onError(stageName, errorMessage, _error) {
|
|
108
|
-
this.sentences.push(`An error occurred at ${stageName}: ${errorMessage}.`);
|
|
109
|
-
}
|
|
110
|
-
/** Returns a defensive copy of accumulated sentences. */
|
|
111
|
-
getSentences() {
|
|
112
|
-
return [...this.sentences];
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
exports.ControlFlowNarrativeGenerator = ControlFlowNarrativeGenerator;
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9uYXJyYXRpdmUvQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUFLSCxNQUFhLDZCQUE2QjtJQUExQztRQUNVLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFDekIsaUJBQVksR0FBRyxJQUFJLENBQUM7SUEwRzlCLENBQUM7SUF4R0MsZUFBZSxDQUFDLFNBQWlCLEVBQUUsV0FBb0I7UUFDckQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDNUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUEwQixTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFpQixFQUFFLE9BQWUsRUFBRSxXQUFvQjtRQUM3RCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUNSLFdBQW1CLEVBQ25CLFlBQW9CLEVBQ3BCLFNBQWtCLEVBQ2xCLGtCQUEyQixFQUMzQixpQkFB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LEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLFNBQVMsS0FBSyxXQUFXLFNBQVMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxTQUFTLFlBQVksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxTQUFpQjtRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsT0FBTyxDQUFDLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxNQUFlO1FBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixTQUFTLEtBQUssWUFBWSxHQUFHLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQseURBQXlEO0lBQ3pELFlBQVk7UUFDVixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBNUdELHNFQTRHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3Ig4oCUIEFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBJQ29udHJvbEZsb3dOYXJyYXRpdmUuXG4gKlxuICogQ29udmVydHMgdHJhdmVyc2FsIGV2ZW50cyBpbnRvIHBsYWluLUVuZ2xpc2ggc2VudGVuY2VzIGF0IHRyYXZlcnNhbCB0aW1lLlxuICogUHJvZHVjZXMgYSBodW1hbi1yZWFkYWJsZSBzdG9yeSBhcyBhIGZpcnN0LWNsYXNzIG91dHB1dCwgZW5hYmxpbmcgYW55IGNvbnN1bWVyXG4gKiAoY2hlYXBlciBMTE0sIGZvbGxvdy11cCBhZ2VudCwgbG9nZ2luZyBzeXN0ZW0pIHRvIHVuZGVyc3RhbmQgd2hhdCBoYXBwZW5lZFxuICogd2l0aG91dCBwYXJzaW5nIHRlY2huaWNhbCBzdHJ1Y3R1cmVzLlxuICpcbiAqIFRoaXMgaXMgdGhlIEZMT1cgbmFycmF0aXZlIOKAlCBpdCBjYXB0dXJlcyBjb250cm9sIGZsb3cgZGVjaXNpb25zLlxuICogVGhlIERBVEEgbmFycmF0aXZlIGNvbWVzIGZyb20gc2NvcGUvcmVjb3JkZXJzL05hcnJhdGl2ZVJlY29yZGVyLlxuICogQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyIG1lcmdlcyBib3RoIGludG8gb25lIHN0b3J5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVjaXNpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IElDb250cm9sRmxvd05hcnJhdGl2ZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgaW1wbGVtZW50cyBJQ29udHJvbEZsb3dOYXJyYXRpdmUge1xuICBwcml2YXRlIHNlbnRlbmNlczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBpc0ZpcnN0U3RhZ2UgPSB0cnVlO1xuXG4gIG9uU3RhZ2VFeGVjdXRlZChzdGFnZU5hbWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0U3RhZ2UpIHtcbiAgICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBUaGUgcHJvY2VzcyBiZWdhbjogJHtkZXNjcmlwdGlvbn0uYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBUaGUgcHJvY2VzcyBiZWdhbiB3aXRoICR7c3RhZ2VOYW1lfS5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXNGaXJzdFN0YWdlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb25OZXh0KGZyb21TdGFnZTogc3RyaW5nLCB0b1N0YWdlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBOZXh0IHN0ZXA6ICR7ZGVzY3JpcHRpb259LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGBOZXh0LCBpdCBtb3ZlZCBvbiB0byAke3RvU3RhZ2V9LmApO1xuICAgIH1cbiAgfVxuXG4gIG9uRGVjaXNpb24oXG4gICAgZGVjaWRlck5hbWU6IHN0cmluZyxcbiAgICBjaG9zZW5CcmFuY2g6IHN0cmluZyxcbiAgICByYXRpb25hbGU/OiBzdHJpbmcsXG4gICAgZGVjaWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIF90cmF2ZXJzYWxDb250ZXh0PzogdW5rbm93bixcbiAgICBldmlkZW5jZT86IERlY2lzaW9uRXZpZGVuY2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGJyYW5jaE5hbWUgPSBjaG9zZW5CcmFuY2g7XG4gICAgaWYgKGV2aWRlbmNlKSB7XG4gICAgICBjb25zdCBtYXRjaGVkUnVsZSA9IGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCk7XG4gICAgICBpZiAobWF0Y2hlZFJ1bGUpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBtYXRjaGVkUnVsZS5sYWJlbCA/IGAgXCIke21hdGNoZWRSdWxlLmxhYmVsfVwiYCA6ICcnO1xuICAgICAgICBpZiAobWF0Y2hlZFJ1bGUudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWRSdWxlLmNvbmRpdGlvbnMubWFwKFxuICAgICAgICAgICAgKGMpID0+XG4gICAgICAgICAgICAgIGAke2Mua2V5fSAke2MuYWN0dWFsU3VtbWFyeX0gJHtjLm9wfSAke0pTT04uc3RyaW5naWZ5KGMudGhyZXNob2xkKX0gJHtjLnJlc3VsdCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgSXQgZXZhbHVhdGVkJHtsYWJlbH06ICR7cGFydHMuam9pbignLCAnKX0sIGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZFJ1bGUuaW5wdXRzLm1hcCgoaSkgPT4gYCR7aS5rZXl9PSR7aS52YWx1ZVN1bW1hcnl9YCk7XG4gICAgICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgSXQgZXhhbWluZWQke2xhYmVsfTogJHtwYXJ0cy5qb2luKCcsICcpfSwgYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yZWRDb3VudCA9IGV2aWRlbmNlLnJ1bGVzLmZpbHRlcigocikgPT4gci5tYXRjaEVycm9yICE9PSB1bmRlZmluZWQpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZXJyb3JOb3RlID0gZXJyb3JlZENvdW50ID4gMCA/IGAgKCR7ZXJyb3JlZENvdW50fSBydWxlJHtlcnJvcmVkQ291bnQgPiAxID8gJ3MnIDogJyd9IHRocmV3IGVycm9ycylgIDogJyc7XG4gICAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYE5vIHJ1bGVzIG1hdGNoZWQke2Vycm9yTm90ZX0sIGZlbGwgYmFjayB0byBkZWZhdWx0OiAke2JyYW5jaE5hbWV9LmApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVjaWRlckRlc2NyaXB0aW9uICYmIHJhdGlvbmFsZSkge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgSXQgJHtkZWNpZGVyRGVzY3JpcHRpb259OiAke3JhdGlvbmFsZX0sIHNvIGl0IGNob3NlICR7YnJhbmNoTmFtZX0uYCk7XG4gICAgfSBlbHNlIGlmIChkZWNpZGVyRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEl0ICR7ZGVjaWRlckRlc2NyaXB0aW9ufSBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gKTtcbiAgICB9IGVsc2UgaWYgKHJhdGlvbmFsZSkge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgQSBkZWNpc2lvbiB3YXMgbWFkZTogJHtyYXRpb25hbGV9LCBzbyB0aGUgcGF0aCB0YWtlbiB3YXMgJHticmFuY2hOYW1lfS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgQSBkZWNpc2lvbiB3YXMgbWFkZSwgYW5kIHRoZSBwYXRoIHRha2VuIHdhcyAke2JyYW5jaE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIG9uRm9yayhwYXJlbnRTdGFnZTogc3RyaW5nLCBjaGlsZE5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWVzID0gY2hpbGROYW1lcy5qb2luKCcsICcpO1xuICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEZvcmtpbmcgaW50byAke2NoaWxkTmFtZXMubGVuZ3RofSBwYXJhbGxlbCBwYXRoczogJHtuYW1lc30uYCk7XG4gIH1cblxuICBvblNlbGVjdGVkKHBhcmVudFN0YWdlOiBzdHJpbmcsIHNlbGVjdGVkTmFtZXM6IHN0cmluZ1tdLCB0b3RhbENvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lcyA9IHNlbGVjdGVkTmFtZXMuam9pbignLCAnKTtcbiAgICB0aGlzLnNlbnRlbmNlcy5wdXNoKGAke3NlbGVjdGVkTmFtZXMubGVuZ3RofSBvZiAke3RvdGFsQ291bnR9IHBhdGhzIHdlcmUgc2VsZWN0ZWQ6ICR7bmFtZXN9LmApO1xuICB9XG5cbiAgb25TdWJmbG93RW50cnkoc3ViZmxvd05hbWU6IHN0cmluZywgX3N1YmZsb3dJZD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEVudGVyaW5nIHRoZSAke3N1YmZsb3dOYW1lfSBzdWJmbG93OiAke2Rlc2NyaXB0aW9ufS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgRW50ZXJpbmcgdGhlICR7c3ViZmxvd05hbWV9IHN1YmZsb3cuYCk7XG4gICAgfVxuICB9XG5cbiAgb25TdWJmbG93RXhpdChzdWJmbG93TmFtZTogc3RyaW5nLCBfc3ViZmxvd0lkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZW50ZW5jZXMucHVzaChgRXhpdGluZyB0aGUgJHtzdWJmbG93TmFtZX0gc3ViZmxvdy5gKTtcbiAgfVxuXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQoX3N1YmZsb3dJZDogc3RyaW5nLCBfbmFtZTogc3RyaW5nLCBfZGVzY3JpcHRpb24/OiBzdHJpbmcsIF9zcGVjU3RydWN0dXJlPzogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIE5vIG5hcnJhdGl2ZSBvdXRwdXQgZm9yIHJlZ2lzdHJhdGlvbiBldmVudHNcbiAgfVxuXG4gIG9uTG9vcCh0YXJnZXRTdGFnZTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlciwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYE9uIHBhc3MgJHtpdGVyYXRpb259OiAke2Rlc2NyaXB0aW9ufSBhZ2Fpbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW50ZW5jZXMucHVzaChgT24gcGFzcyAke2l0ZXJhdGlvbn0gdGhyb3VnaCAke3RhcmdldFN0YWdlfS5gKTtcbiAgICB9XG4gIH1cblxuICBvbkJyZWFrKHN0YWdlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZW50ZW5jZXMucHVzaChgRXhlY3V0aW9uIHN0b3BwZWQgYXQgJHtzdGFnZU5hbWV9LmApO1xuICB9XG5cbiAgb25FcnJvcihzdGFnZU5hbWU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcsIF9lcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuc2VudGVuY2VzLnB1c2goYEFuIGVycm9yIG9jY3VycmVkIGF0ICR7c3RhZ2VOYW1lfTogJHtlcnJvck1lc3NhZ2V9LmApO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhY2N1bXVsYXRlZCBzZW50ZW5jZXMuICovXG4gIGdldFNlbnRlbmNlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNlbnRlbmNlc107XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* NarrativeRecorder — Captures per-stage scope reads/writes for narrative enrichment
|
|
4
|
-
*
|
|
5
|
-
* Bridges the gap between flow-level narrative (NarrativeGenerator) and data-level
|
|
6
|
-
* detail. Produces structured per-stage data and text sentences that can be merged
|
|
7
|
-
* with NarrativeGenerator output for the full picture: what happened AND what was produced.
|
|
8
|
-
*
|
|
9
|
-
* @deprecated Since 0.9.x — Superseded by {@link CombinedNarrativeRecorder} which implements
|
|
10
|
-
* both FlowRecorder and Recorder interfaces, building the combined narrative inline during
|
|
11
|
-
* traversal. This class is retained for backward compatibility with consumers that attach
|
|
12
|
-
* NarrativeRecorder directly. Will be removed in v1.0.
|
|
13
|
-
*/
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.NarrativeRecorder = void 0;
|
|
16
|
-
const summarizeValue_js_1 = require("./summarizeValue.js");
|
|
17
|
-
class NarrativeRecorder {
|
|
18
|
-
constructor(options) {
|
|
19
|
-
var _a, _b, _c;
|
|
20
|
-
this.stages = new Map();
|
|
21
|
-
this.stageOrder = [];
|
|
22
|
-
this.id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : `narrative-recorder-${Date.now()}`;
|
|
23
|
-
this.detail = (_b = options === null || options === void 0 ? void 0 : options.detail) !== null && _b !== void 0 ? _b : 'full';
|
|
24
|
-
this.maxValueLength = (_c = options === null || options === void 0 ? void 0 : options.maxValueLength) !== null && _c !== void 0 ? _c : 80;
|
|
25
|
-
}
|
|
26
|
-
onRead(event) {
|
|
27
|
-
var _a;
|
|
28
|
-
const stageData = this.getOrCreateStageData(event.stageName);
|
|
29
|
-
const op = {
|
|
30
|
-
type: 'read',
|
|
31
|
-
key: (_a = event.key) !== null && _a !== void 0 ? _a : '',
|
|
32
|
-
valueSummary: (0, summarizeValue_js_1.summarizeValue)(event.value, this.maxValueLength),
|
|
33
|
-
stepNumber: stageData.operations.length + 1,
|
|
34
|
-
};
|
|
35
|
-
stageData.reads.push(op);
|
|
36
|
-
stageData.operations.push(op);
|
|
37
|
-
}
|
|
38
|
-
onWrite(event) {
|
|
39
|
-
const stageData = this.getOrCreateStageData(event.stageName);
|
|
40
|
-
const op = {
|
|
41
|
-
type: 'write',
|
|
42
|
-
key: event.key,
|
|
43
|
-
valueSummary: (0, summarizeValue_js_1.summarizeValue)(event.value, this.maxValueLength),
|
|
44
|
-
operation: event.operation,
|
|
45
|
-
stepNumber: stageData.operations.length + 1,
|
|
46
|
-
};
|
|
47
|
-
stageData.writes.push(op);
|
|
48
|
-
stageData.operations.push(op);
|
|
49
|
-
}
|
|
50
|
-
getStageData() {
|
|
51
|
-
const copy = new Map();
|
|
52
|
-
for (const [name, data] of this.stages) {
|
|
53
|
-
copy.set(name, {
|
|
54
|
-
stageName: data.stageName,
|
|
55
|
-
reads: [...data.reads],
|
|
56
|
-
writes: [...data.writes],
|
|
57
|
-
operations: [...data.operations],
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
return copy;
|
|
61
|
-
}
|
|
62
|
-
getStageDataFor(stageName) {
|
|
63
|
-
const data = this.stages.get(stageName);
|
|
64
|
-
if (!data)
|
|
65
|
-
return undefined;
|
|
66
|
-
return {
|
|
67
|
-
stageName: data.stageName,
|
|
68
|
-
reads: [...data.reads],
|
|
69
|
-
writes: [...data.writes],
|
|
70
|
-
operations: [...data.operations],
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
toSentences() {
|
|
74
|
-
const result = new Map();
|
|
75
|
-
for (const stageName of this.stageOrder) {
|
|
76
|
-
const data = this.stages.get(stageName);
|
|
77
|
-
if (!data)
|
|
78
|
-
continue;
|
|
79
|
-
const lines = [];
|
|
80
|
-
if (this.detail === 'summary') {
|
|
81
|
-
const parts = [];
|
|
82
|
-
if (data.reads.length > 0) {
|
|
83
|
-
parts.push(`read ${data.reads.length} value${data.reads.length > 1 ? 's' : ''}`);
|
|
84
|
-
}
|
|
85
|
-
if (data.writes.length > 0) {
|
|
86
|
-
parts.push(`wrote ${data.writes.length} value${data.writes.length > 1 ? 's' : ''}`);
|
|
87
|
-
}
|
|
88
|
-
if (parts.length > 0) {
|
|
89
|
-
lines.push(` - ${capitalize(parts.join(', '))}`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
for (const op of data.operations) {
|
|
94
|
-
const stepPrefix = op.stepNumber ? `Step ${op.stepNumber}: ` : '';
|
|
95
|
-
if (op.type === 'read') {
|
|
96
|
-
lines.push(op.valueSummary
|
|
97
|
-
? ` - ${stepPrefix}Read: ${op.key} = ${op.valueSummary}`
|
|
98
|
-
: ` - ${stepPrefix}Read: ${op.key}`);
|
|
99
|
-
}
|
|
100
|
-
else if (op.operation === 'delete') {
|
|
101
|
-
lines.push(` - ${stepPrefix}Delete: ${op.key}`);
|
|
102
|
-
}
|
|
103
|
-
else if (op.operation === 'update') {
|
|
104
|
-
lines.push(` - ${stepPrefix}Update: ${op.key} = ${op.valueSummary}`);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
lines.push(` - ${stepPrefix}Write: ${op.key} = ${op.valueSummary}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (lines.length > 0) {
|
|
112
|
-
result.set(stageName, lines);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return result;
|
|
116
|
-
}
|
|
117
|
-
toFlatSentences() {
|
|
118
|
-
const result = [];
|
|
119
|
-
const perStage = this.toSentences();
|
|
120
|
-
for (const [stageName, lines] of perStage) {
|
|
121
|
-
for (const line of lines) {
|
|
122
|
-
const cleaned = line.replace(/^\s+-\s+/, '');
|
|
123
|
-
result.push(`${stageName}: ${cleaned}`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return result;
|
|
127
|
-
}
|
|
128
|
-
clear() {
|
|
129
|
-
this.stages.clear();
|
|
130
|
-
this.stageOrder = [];
|
|
131
|
-
}
|
|
132
|
-
setDetail(level) {
|
|
133
|
-
this.detail = level;
|
|
134
|
-
}
|
|
135
|
-
getDetail() {
|
|
136
|
-
return this.detail;
|
|
137
|
-
}
|
|
138
|
-
getOrCreateStageData(stageName) {
|
|
139
|
-
let data = this.stages.get(stageName);
|
|
140
|
-
if (!data) {
|
|
141
|
-
data = { stageName, reads: [], writes: [], operations: [] };
|
|
142
|
-
this.stages.set(stageName, data);
|
|
143
|
-
this.stageOrder.push(stageName);
|
|
144
|
-
}
|
|
145
|
-
return data;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
exports.NarrativeRecorder = NarrativeRecorder;
|
|
149
|
-
// ── Private Helpers ──────────────────────────────────────────────────────────
|
|
150
|
-
function capitalize(s) {
|
|
151
|
-
return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1);
|
|
152
|
-
}
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFycmF0aXZlUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7OztBQUdILDJEQUFxRDtBQXlCckQsTUFBYSxpQkFBaUI7SUFPNUIsWUFBWSxPQUFrQzs7UUFMdEMsV0FBTSxHQUFvQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BELGVBQVUsR0FBYSxFQUFFLENBQUM7UUFLaEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxFQUFFLG1DQUFJLHNCQUFzQixJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sbUNBQUksTUFBTSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsY0FBYyxtQ0FBSSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFnQjs7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxNQUFNLEVBQUUsR0FBdUI7WUFDN0IsSUFBSSxFQUFFLE1BQU07WUFDWixHQUFHLEVBQUUsTUFBQSxLQUFLLENBQUMsR0FBRyxtQ0FBSSxFQUFFO1lBQ3BCLFlBQVksRUFBRSxJQUFBLGtDQUFjLEVBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzlELFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDO1NBQzVDLENBQUM7UUFDRixTQUFTLENB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Q0FBQyxLQUFzQjtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUI7UUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQS9JRCw4Q0ErSUM7QUFFRCxnRkFBZ0Y7QUFFaEYsU0FBUyxVQUFVLENBQUMsQ0FBUztJQUMzQixPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOYXJyYXRpdmVSZWNvcmRlciDigJQgQ2FwdHVyZXMgcGVyLXN0YWdlIHNjb3BlIHJlYWRzL3dyaXRlcyBmb3IgbmFycmF0aXZlIGVucmljaG1lbnRcbiAqXG4gKiBCcmlkZ2VzIHRoZSBnYXAgYmV0d2VlbiBmbG93LWxldmVsIG5hcnJhdGl2ZSAoTmFycmF0aXZlR2VuZXJhdG9yKSBhbmQgZGF0YS1sZXZlbFxuICogZGV0YWlsLiBQcm9kdWNlcyBzdHJ1Y3R1cmVkIHBlci1zdGFnZSBkYXRhIGFuZCB0ZXh0IHNlbnRlbmNlcyB0aGF0IGNhbiBiZSBtZXJnZWRcbiAqIHdpdGggTmFycmF0aXZlR2VuZXJhdG9yIG91dHB1dCBmb3IgdGhlIGZ1bGwgcGljdHVyZTogd2hhdCBoYXBwZW5lZCBBTkQgd2hhdCB3YXMgcHJvZHVjZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgU2luY2UgMC45Lngg4oCUIFN1cGVyc2VkZWQgYnkge0BsaW5rIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJ9IHdoaWNoIGltcGxlbWVudHNcbiAqIGJvdGggRmxvd1JlY29yZGVyIGFuZCBSZWNvcmRlciBpbnRlcmZhY2VzLCBidWlsZGluZyB0aGUgY29tYmluZWQgbmFycmF0aXZlIGlubGluZSBkdXJpbmdcbiAqIHRyYXZlcnNhbC4gVGhpcyBjbGFzcyBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbnN1bWVycyB0aGF0IGF0dGFjaFxuICogTmFycmF0aXZlUmVjb3JkZXIgZGlyZWN0bHkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MS4wLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBSZWNvcmRlciwgV3JpdGVFdmVudCB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi9zdW1tYXJpemVWYWx1ZS5qcyc7XG5cbmV4cG9ydCB0eXBlIE5hcnJhdGl2ZURldGFpbCA9ICdzdW1tYXJ5JyB8ICdmdWxsJztcblxuZXhwb3J0IGludGVyZmFjZSBOYXJyYXRpdmVPcGVyYXRpb24ge1xuICB0eXBlOiAncmVhZCcgfCAnd3JpdGUnO1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWVTdW1tYXJ5OiBzdHJpbmc7XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFnZU5hcnJhdGl2ZURhdGEge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgcmVhZHM6IE5hcnJhdGl2ZU9wZXJhdGlvbltdO1xuICB3cml0ZXM6IE5hcnJhdGl2ZU9wZXJhdGlvbltdO1xuICBvcGVyYXRpb25zOiBOYXJyYXRpdmVPcGVyYXRpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMge1xuICBpZD86IHN0cmluZztcbiAgZGV0YWlsPzogTmFycmF0aXZlRGV0YWlsO1xuICBtYXhWYWx1ZUxlbmd0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE5hcnJhdGl2ZVJlY29yZGVyIGltcGxlbWVudHMgUmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICBwcml2YXRlIHN0YWdlczogTWFwPHN0cmluZywgU3RhZ2VOYXJyYXRpdmVEYXRhPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGFnZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGRldGFpbDogTmFycmF0aXZlRGV0YWlsO1xuICBwcml2YXRlIG1heFZhbHVlTGVuZ3RoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCA/PyBgbmFycmF0aXZlLXJlY29yZGVyLSR7RGF0ZS5ub3coKX1gO1xuICAgIHRoaXMuZGV0YWlsID0gb3B0aW9ucz8uZGV0YWlsID8/ICdmdWxsJztcbiAgICB0aGlzLm1heFZhbHVlTGVuZ3RoID0gb3B0aW9ucz8ubWF4VmFsdWVMZW5ndGggPz8gODA7XG4gIH1cblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWdlRGF0YSA9IHRoaXMuZ2V0T3JDcmVhdGVTdGFnZURhdGEoZXZlbnQuc3RhZ2VOYW1lKTtcbiAgICBjb25zdCBvcDogTmFycmF0aXZlT3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAga2V5OiBldmVudC5rZXkgPz8gJycsXG4gICAgICB2YWx1ZVN1bW1hcnk6IHN1bW1hcml6ZVZhbHVlKGV2ZW50LnZhbHVlLCB0aGlzLm1heFZhbHVlTGVuZ3RoKSxcbiAgICAgIHN0ZXBOdW1iZXI6IHN0YWdlRGF0YS5vcGVyYXRpb25zLmxlbmd0aCArIDEsXG4gICAgfTtcbiAgICBzdGFnZURhdGEucmVhZHMucHVzaChvcCk7XG4gICAgc3RhZ2VEYXRhLm9wZXJhdGlvbnMucHVzaChvcCk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhZ2VEYXRhID0gdGhpcy5nZXRPckNyZWF0ZVN0YWdlRGF0YShldmVudC5zdGFnZU5hbWUpO1xuICAgIGNvbnN0IG9wOiBOYXJyYXRpdmVPcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAnd3JpdGUnLFxuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICB2YWx1ZVN1bW1hcnk6IHN1bW1hcml6ZVZhbHVlKGV2ZW50LnZhbHVlLCB0aGlzLm1heFZhbHVlTGVuZ3RoKSxcbiAgICAgIG9wZXJhdGlvbjogZXZlbnQub3BlcmF0aW9uLFxuICAgICAgc3RlcE51bWJlcjogc3RhZ2VEYXRhLm9wZXJhdGlvbnMubGVuZ3RoICsgMSxcbiAgICB9O1xuICAgIHN0YWdlRGF0YS53cml0ZXMucHVzaChvcCk7XG4gICAgc3RhZ2VEYXRhLm9wZXJhdGlvbnMucHVzaChvcCk7XG4gIH1cblxuICBnZXRTdGFnZURhdGEoKTogTWFwPHN0cmluZywgU3RhZ2VOYXJyYXRpdmVEYXRhPiB7XG4gICAgY29uc3QgY29weSA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZU5hcnJhdGl2ZURhdGE+KCk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgdGhpcy5zdGFnZXMpIHtcbiAgICAgIGNvcHkuc2V0KG5hbWUsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBkYXRhLnN0YWdlTmFtZSxcbiAgICAgICAgcmVhZHM6IFsuLi5kYXRhLnJlYWRzXSxcbiAgICAgICAgd3JpdGVzOiBbLi4uZGF0YS53cml0ZXNdLFxuICAgICAgICBvcGVyYXRpb25zOiBbLi4uZGF0YS5vcGVyYXRpb25zXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIGdldFN0YWdlRGF0YUZvcihzdGFnZU5hbWU6IHN0cmluZyk6IFN0YWdlTmFycmF0aXZlRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RhZ2VzLmdldChzdGFnZU5hbWUpO1xuICAgIGlmICghZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhZ2VOYW1lOiBkYXRhLnN0YWdlTmFtZSxcbiAgICAgIHJlYWRzOiBbLi4uZGF0YS5yZWFkc10sXG4gICAgICB3cml0ZXM6IFsuLi5kYXRhLndyaXRlc10sXG4gICAgICBvcGVyYXRpb25zOiBbLi4uZGF0YS5vcGVyYXRpb25zXSxcbiAgICB9O1xuICB9XG5cbiAgdG9TZW50ZW5jZXMoKTogTWFwPHN0cmluZywgc3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YWdlTmFtZSBvZiB0aGlzLnN0YWdlT3JkZXIpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0YWdlcy5nZXQoc3RhZ2VOYW1lKTtcbiAgICAgIGlmICghZGF0YSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAodGhpcy5kZXRhaWwgPT09ICdzdW1tYXJ5Jykge1xuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGRhdGEucmVhZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goYHJlYWQgJHtkYXRhLnJlYWRzLmxlbmd0aH0gdmFsdWUke2RhdGEucmVhZHMubGVuZ3RoID4gMSA/ICdzJyA6ICcnfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLndyaXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFydHMucHVzaChgd3JvdGUgJHtkYXRhLndyaXRlcy5sZW5ndGh9IHZhbHVlJHtkYXRhLndyaXRlcy5sZW5ndGggPiAxID8gJ3MnIDogJyd9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGAgIC0gJHtjYXBpdGFsaXplKHBhcnRzLmpvaW4oJywgJykpfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IG9wIG9mIGRhdGEub3BlcmF0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHN0ZXBQcmVmaXggPSBvcC5zdGVwTnVtYmVyID8gYFN0ZXAgJHtvcC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuICAgICAgICAgIGlmIChvcC50eXBlID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgICAgIG9wLnZhbHVlU3VtbWFyeVxuICAgICAgICAgICAgICAgID8gYCAgLSAke3N0ZXBQcmVmaXh9UmVhZDogJHtvcC5rZXl9ID0gJHtvcC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgICAgICAgIDogYCAgLSAke3N0ZXBQcmVmaXh9UmVhZDogJHtvcC5rZXl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcC5vcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgIC0gJHtzdGVwUHJlZml4fURlbGV0ZTogJHtvcC5rZXl9YCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcC5vcGVyYXRpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgIC0gJHtzdGVwUHJlZml4fVVwZGF0ZTogJHtvcC5rZXl9ID0gJHtvcC52YWx1ZVN1bW1hcnl9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYCAgLSAke3N0ZXBQcmVmaXh9V3JpdGU6ICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuc2V0KHN0YWdlTmFtZSwgbGluZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0b0ZsYXRTZW50ZW5jZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwZXJTdGFnZSA9IHRoaXMudG9TZW50ZW5jZXMoKTtcbiAgICBmb3IgKGNvbnN0IFtzdGFnZU5hbWUsIGxpbmVzXSBvZiBwZXJTdGFnZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IGNsZWFuZWQgPSBsaW5lLnJlcGxhY2UoL15cXHMrLVxccysvLCAnJyk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGAke3N0YWdlTmFtZX06ICR7Y2xlYW5lZH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhZ2VzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZU9yZGVyID0gW107XG4gIH1cblxuICBzZXREZXRhaWwobGV2ZWw6IE5hcnJhdGl2ZURldGFpbCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsID0gbGV2ZWw7XG4gIH1cblxuICBnZXREZXRhaWwoKTogTmFycmF0aXZlRGV0YWlsIHtcbiAgICByZXR1cm4gdGhpcy5kZXRhaWw7XG4gIH1cblxuICBwcml2YXRlIGdldE9yQ3JlYXRlU3RhZ2VEYXRhKHN0YWdlTmFtZTogc3RyaW5nKTogU3RhZ2VOYXJyYXRpdmVEYXRhIHtcbiAgICBsZXQgZGF0YSA9IHRoaXMuc3RhZ2VzLmdldChzdGFnZU5hbWUpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IHsgc3RhZ2VOYW1lLCByZWFkczogW10sIHdyaXRlczogW10sIG9wZXJhdGlvbnM6IFtdIH07XG4gICAgICB0aGlzLnN0YWdlcy5zZXQoc3RhZ2VOYW1lLCBkYXRhKTtcbiAgICAgIHRoaXMuc3RhZ2VPcmRlci5wdXNoKHN0YWdlTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbi8vIOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIGNhcGl0YWxpemUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMubGVuZ3RoID09PSAwID8gcyA6IHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpO1xufVxuIl19
|