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.
Files changed (74) hide show
  1. package/dist/advanced.js +20 -23
  2. package/dist/esm/advanced.js +2 -3
  3. package/dist/esm/lib/builder/FlowChartBuilder.js +39 -14
  4. package/dist/esm/lib/builder/typedFlowChart.js +10 -31
  5. package/dist/esm/lib/builder/types.js +1 -1
  6. package/dist/esm/lib/engine/handlers/NodeResolver.js +22 -7
  7. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +17 -4
  8. package/dist/esm/lib/engine/handlers/SelectorHandler.js +2 -2
  9. package/dist/esm/lib/engine/handlers/StageRunner.js +2 -2
  10. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +2 -2
  11. package/dist/esm/lib/engine/index.js +1 -2
  12. package/dist/esm/lib/engine/narrative/CombinedNarrativeBuilder.js +1 -1
  13. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +2 -2
  14. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +41 -32
  15. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +7 -12
  16. package/dist/esm/lib/engine/narrative/index.js +1 -2
  17. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +42 -10
  18. package/dist/esm/lib/engine/types.js +1 -1
  19. package/dist/esm/lib/memory/StageContext.js +1 -22
  20. package/dist/esm/lib/runner/FlowChartExecutor.js +24 -50
  21. package/dist/esm/lib/runner/RunnableChart.js +25 -1
  22. package/dist/esm/lib/runner/getSubtreeSnapshot.js +17 -27
  23. package/dist/esm/lib/scope/index.js +1 -1
  24. package/dist/esm/lib/scope/providers/types.js +1 -1
  25. package/dist/esm/lib/scope/recorders/index.js +1 -1
  26. package/dist/lib/builder/FlowChartBuilder.js +39 -14
  27. package/dist/lib/builder/typedFlowChart.js +11 -33
  28. package/dist/lib/builder/types.js +1 -1
  29. package/dist/lib/engine/handlers/NodeResolver.js +22 -7
  30. package/dist/lib/engine/handlers/RuntimeStructureManager.js +17 -4
  31. package/dist/lib/engine/handlers/SelectorHandler.js +2 -2
  32. package/dist/lib/engine/handlers/StageRunner.js +2 -2
  33. package/dist/lib/engine/handlers/SubflowInputMapper.js +2 -2
  34. package/dist/lib/engine/index.js +2 -4
  35. package/dist/lib/engine/narrative/CombinedNarrativeBuilder.js +1 -1
  36. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +2 -2
  37. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +41 -32
  38. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +7 -12
  39. package/dist/lib/engine/narrative/index.js +2 -4
  40. package/dist/lib/engine/traversal/FlowchartTraverser.js +42 -10
  41. package/dist/lib/engine/types.js +1 -1
  42. package/dist/lib/memory/StageContext.js +1 -22
  43. package/dist/lib/runner/FlowChartExecutor.js +24 -50
  44. package/dist/lib/runner/RunnableChart.js +25 -1
  45. package/dist/lib/runner/getSubtreeSnapshot.js +17 -27
  46. package/dist/lib/scope/index.js +1 -1
  47. package/dist/lib/scope/providers/types.js +1 -1
  48. package/dist/lib/scope/recorders/index.js +1 -1
  49. package/dist/types/advanced.d.ts +2 -3
  50. package/dist/types/lib/builder/FlowChartBuilder.d.ts +2 -1
  51. package/dist/types/lib/builder/typedFlowChart.d.ts +9 -29
  52. package/dist/types/lib/builder/types.d.ts +4 -4
  53. package/dist/types/lib/engine/handlers/NodeResolver.d.ts +10 -3
  54. package/dist/types/lib/engine/handlers/RuntimeStructureManager.d.ts +1 -1
  55. package/dist/types/lib/engine/index.d.ts +0 -1
  56. package/dist/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +1 -1
  57. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  58. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +0 -1
  59. package/dist/types/lib/engine/narrative/index.d.ts +0 -1
  60. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +6 -0
  61. package/dist/types/lib/engine/types.d.ts +3 -3
  62. package/dist/types/lib/memory/StageContext.d.ts +0 -15
  63. package/dist/types/lib/runner/FlowChartExecutor.d.ts +13 -37
  64. package/dist/types/lib/runner/RunnableChart.d.ts +2 -0
  65. package/dist/types/lib/scope/index.d.ts +0 -1
  66. package/dist/types/lib/scope/providers/types.d.ts +0 -6
  67. package/dist/types/lib/scope/recorders/index.d.ts +0 -1
  68. package/package.json +1 -1
  69. package/dist/esm/lib/engine/narrative/ControlFlowNarrativeGenerator.js +0 -112
  70. package/dist/esm/lib/scope/recorders/NarrativeRecorder.js +0 -149
  71. package/dist/lib/engine/narrative/ControlFlowNarrativeGenerator.js +0 -116
  72. package/dist/lib/scope/recorders/NarrativeRecorder.js +0 -153
  73. package/dist/types/lib/engine/narrative/ControlFlowNarrativeGenerator.d.ts +0 -31
  74. 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