footprintjs 0.2.3 → 0.4.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 (94) hide show
  1. package/README.md +125 -285
  2. package/dist/esm/index.js +13 -1
  3. package/dist/esm/lib/builder/FlowChartBuilder.js +19 -1
  4. package/dist/esm/lib/builder/types.js +1 -1
  5. package/dist/esm/lib/contract/defineContract.js +32 -0
  6. package/dist/esm/lib/contract/index.js +18 -0
  7. package/dist/esm/lib/contract/openapi.js +120 -0
  8. package/dist/esm/lib/contract/schema.js +199 -0
  9. package/dist/esm/lib/contract/types.js +9 -0
  10. package/dist/esm/lib/engine/index.js +12 -1
  11. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +187 -0
  12. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +89 -0
  13. package/dist/esm/lib/engine/narrative/index.js +12 -1
  14. package/dist/esm/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +48 -0
  15. package/dist/esm/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +41 -0
  16. package/dist/esm/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +54 -0
  17. package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +74 -0
  18. package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +55 -0
  19. package/dist/esm/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +50 -0
  20. package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +82 -0
  21. package/dist/esm/lib/engine/narrative/recorders/index.js +9 -0
  22. package/dist/esm/lib/engine/narrative/types.js +1 -1
  23. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +28 -6
  24. package/dist/esm/lib/runner/FlowChartExecutor.js +21 -1
  25. package/dist/esm/types/index.d.ts +13 -0
  26. package/dist/esm/types/lib/builder/FlowChartBuilder.d.ts +9 -0
  27. package/dist/esm/types/lib/builder/types.d.ts +6 -0
  28. package/dist/esm/types/lib/contract/defineContract.d.ts +18 -0
  29. package/dist/esm/types/lib/contract/index.d.ts +14 -0
  30. package/dist/esm/types/lib/contract/openapi.d.ts +12 -0
  31. package/dist/esm/types/lib/contract/schema.d.ts +14 -0
  32. package/dist/esm/types/lib/contract/types.d.ts +94 -0
  33. package/dist/esm/types/lib/engine/index.d.ts +10 -0
  34. package/dist/esm/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +38 -0
  35. package/dist/esm/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +31 -0
  36. package/dist/esm/types/lib/engine/narrative/index.d.ts +10 -0
  37. package/dist/esm/types/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.d.ts +25 -0
  38. package/dist/esm/types/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.d.ts +24 -0
  39. package/dist/esm/types/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.d.ts +30 -0
  40. package/dist/esm/types/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.d.ts +25 -0
  41. package/dist/esm/types/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.d.ts +32 -0
  42. package/dist/esm/types/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.d.ts +25 -0
  43. package/dist/esm/types/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.d.ts +29 -0
  44. package/dist/esm/types/lib/engine/narrative/recorders/index.d.ts +7 -0
  45. package/dist/esm/types/lib/engine/narrative/types.d.ts +79 -0
  46. package/dist/esm/types/lib/engine/traversal/FlowchartTraverser.d.ts +7 -0
  47. package/dist/esm/types/lib/runner/FlowChartExecutor.d.ts +12 -0
  48. package/dist/index.js +26 -2
  49. package/dist/lib/builder/FlowChartBuilder.js +19 -1
  50. package/dist/lib/builder/types.js +1 -1
  51. package/dist/lib/contract/defineContract.js +36 -0
  52. package/dist/lib/contract/index.js +26 -0
  53. package/dist/lib/contract/openapi.js +124 -0
  54. package/dist/lib/contract/schema.js +205 -0
  55. package/dist/lib/contract/types.js +10 -0
  56. package/dist/lib/engine/index.js +22 -2
  57. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +191 -0
  58. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +93 -0
  59. package/dist/lib/engine/narrative/index.js +22 -2
  60. package/dist/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +52 -0
  61. package/dist/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +45 -0
  62. package/dist/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +58 -0
  63. package/dist/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +78 -0
  64. package/dist/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +59 -0
  65. package/dist/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +54 -0
  66. package/dist/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +86 -0
  67. package/dist/lib/engine/narrative/recorders/index.js +19 -0
  68. package/dist/lib/engine/narrative/types.js +1 -1
  69. package/dist/lib/engine/traversal/FlowchartTraverser.js +28 -6
  70. package/dist/lib/runner/FlowChartExecutor.js +21 -1
  71. package/dist/types/index.d.ts +13 -0
  72. package/dist/types/lib/builder/FlowChartBuilder.d.ts +9 -0
  73. package/dist/types/lib/builder/types.d.ts +6 -0
  74. package/dist/types/lib/contract/defineContract.d.ts +18 -0
  75. package/dist/types/lib/contract/index.d.ts +14 -0
  76. package/dist/types/lib/contract/openapi.d.ts +12 -0
  77. package/dist/types/lib/contract/schema.d.ts +14 -0
  78. package/dist/types/lib/contract/types.d.ts +94 -0
  79. package/dist/types/lib/engine/index.d.ts +10 -0
  80. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +38 -0
  81. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +31 -0
  82. package/dist/types/lib/engine/narrative/index.d.ts +10 -0
  83. package/dist/types/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.d.ts +25 -0
  84. package/dist/types/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.d.ts +24 -0
  85. package/dist/types/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.d.ts +30 -0
  86. package/dist/types/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.d.ts +25 -0
  87. package/dist/types/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.d.ts +32 -0
  88. package/dist/types/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.d.ts +25 -0
  89. package/dist/types/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.d.ts +29 -0
  90. package/dist/types/lib/engine/narrative/recorders/index.d.ts +7 -0
  91. package/dist/types/lib/engine/narrative/types.d.ts +79 -0
  92. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +7 -0
  93. package/dist/types/lib/runner/FlowChartExecutor.d.ts +12 -0
  94. package/package.json +1 -1
@@ -17,6 +17,7 @@ const ExecutionRuntime_1 = require("./ExecutionRuntime");
17
17
  class FlowChartExecutor {
18
18
  constructor(flowChart, scopeFactory, defaultValuesForContext, initialContext, readOnlyContext, throttlingErrorChecker, streamHandlers, scopeProtectionMode, enrichSnapshots) {
19
19
  this.narrativeEnabled = false;
20
+ this.flowRecorders = [];
20
21
  this.flowChartArgs = {
21
22
  flowChart,
22
23
  scopeFactory,
@@ -70,11 +71,30 @@ class FlowChartExecutor {
70
71
  buildTimeStructure: fc.buildTimeStructure,
71
72
  logger: (_c = fc.logger) !== null && _c !== void 0 ? _c : types_1.defaultLogger,
72
73
  signal,
74
+ flowRecorders: this.flowRecorders.length > 0 ? this.flowRecorders : undefined,
73
75
  });
74
76
  }
75
77
  enableNarrative() {
76
78
  this.narrativeEnabled = true;
77
79
  }
80
+ // ─── FlowRecorder Management ───
81
+ /**
82
+ * Attach a FlowRecorder to observe control flow events.
83
+ * Automatically enables narrative if not already enabled.
84
+ * Must be called before run() — recorders are passed to the traverser at creation time.
85
+ */
86
+ attachFlowRecorder(recorder) {
87
+ this.flowRecorders.push(recorder);
88
+ this.narrativeEnabled = true;
89
+ }
90
+ /** Detach all FlowRecorders with the given ID. */
91
+ detachFlowRecorder(id) {
92
+ this.flowRecorders = this.flowRecorders.filter((r) => r.id !== id);
93
+ }
94
+ /** Returns a defensive copy of attached FlowRecorders. */
95
+ getFlowRecorders() {
96
+ return [...this.flowRecorders];
97
+ }
78
98
  /**
79
99
  * Returns the execution narrative.
80
100
  *
@@ -159,4 +179,4 @@ class FlowChartExecutor {
159
179
  }
160
180
  }
161
181
  exports.FlowChartExecutor = FlowChartExecutor;
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBR0gsMkZBQXdGO0FBQ3hGLCtFQUE0RTtBQUM1RSwyQ0FXeUI7QUFFekIsNEVBQXlFO0FBQ3pFLHlEQUFzRDtBQUV0RCxNQUFhLGlCQUFpQjtJQWlCNUIsWUFDRSxTQUFrQyxFQUNsQyxZQUFrQyxFQUNsQyx1QkFBaUMsRUFDakMsY0FBd0IsRUFDeEIsZUFBeUIsRUFDekIsc0JBQW9ELEVBQ3BELGNBQStCLEVBQy9CLG1CQUF5QyxFQUN6QyxlQUF5QjtRQXhCbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBMEIvQixJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLFNBQVM7WUFDVCxZQUFZO1lBQ1osdUJBQXVCO1lBQ3ZCLGNBQWM7WUFDZCxlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsZUFBZTtTQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFvQjs7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE1BQUEsRUFBRSxDQUFDLGVBQWUsbUNBQUksS0FBSyxDQUFDLENBQUM7UUFFN0UsMEVBQTBFO1FBQzFFLG1FQUFtRTtRQUNuRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3JDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFH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QUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQVcsQ0FBQztJQUN2RCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBVyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBN0xELDhDQTZMQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIFBhaXJzIHdpdGggRmxvd0NoYXJ0QnVpbGRlcjpcbiAqICAgY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQoJ2VudHJ5JywgZW50cnlGbikuYWRkRnVuY3Rpb24oJ3Byb2Nlc3MnLCBwcm9jZXNzRm4pLmJ1aWxkKCk7XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpO1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oKTtcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlcic7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlcic7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlcic7XG5pbXBvcnQge1xuICB0eXBlIEV4dHJhY3RvckVycm9yLFxuICB0eXBlIEZsb3dDaGFydCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlcic7XG5pbXBvcnQgeyBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lJztcblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgbmFycmF0aXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIG5hcnJhdGl2ZVJlY29yZGVyOiBOYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IHtcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+O1xuICAgIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gICAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICBlbnJpY2hTbmFwc2hvdHM/OiBib29sZWFuO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPixcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd24sXG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duLFxuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd24sXG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbixcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzLFxuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgaW5pdGlhbENvbnRleHQsXG4gICAgICByZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgZW5yaWNoU25hcHNob3RzLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyBXaGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLCBjcmVhdGUgYSByZWNvcmRlciBhbmQgd3JhcCB0aGUgc2NvcGUgZmFjdG9yeVxuICAgIC8vIHRvIGF1dG8tYXR0YWNoIGl0IHRvIGV2ZXJ5IHNjb3BlIHRoYXQgc3VwcG9ydHMgYXR0YWNoUmVjb3JkZXIoKS5cbiAgICBsZXQgc2NvcGVGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgaWYgKG5hcnJhdGl2ZUZsYWcpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlUmVjb3JkZXIgPSBuZXcgTmFycmF0aXZlUmVjb3JkZXIoKTtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5uYXJyYXRpdmVSZWNvcmRlcjtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRmFjdG9yeSA9IGFyZ3Muc2NvcGVGYWN0b3J5O1xuICAgICAgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IG9yaWdpbmFsRmFjdG9yeShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHkpO1xuICAgICAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIChzY29wZSBhcyBhbnkpLmF0dGFjaFJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgKHNjb3BlIGFzIGFueSkuYXR0YWNoUmVjb3JkZXIocmVjb3JkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY29wZTtcbiAgICAgIH0pIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZVJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShmYy5yb290Lm5hbWUsIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsIGFyZ3MuaW5pdGlhbENvbnRleHQpO1xuXG4gICAgcmV0dXJuIG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICByb290OiBmYy5yb290LFxuICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIGV4dHJhY3RvcjogZmMuZXh0cmFjdG9yLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgICAgZW5yaWNoU25hcHNob3RzOiBhcmdzLmVucmljaFNuYXBzaG90cyA/PyBmYy5lbnJpY2hTbmFwc2hvdHMsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKCk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogV2hlbiB1c2luZyBTY29wZUZhY2FkZS1iYXNlZCBzY29wZXMsIHJldHVybnMgYSBjb21iaW5lZCBuYXJyYXRpdmUgdGhhdFxuICAgKiBpbnRlcmxlYXZlcyBmbG93IGV2ZW50cyAoc3RhZ2VzLCBkZWNpc2lvbnMsIGZvcmtzKSB3aXRoIGRhdGEgb3BlcmF0aW9uc1xuICAgKiAocmVhZHMsIHdyaXRlcywgdXBkYXRlcykuIEZvciBwbGFpbiBzY29wZXMgd2l0aG91dCBhdHRhY2hSZWNvcmRlciBzdXBwb3J0LFxuICAgKiByZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzLlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgaWYgKHRoaXMubmFycmF0aXZlUmVjb3JkZXIgJiYgdGhpcy5uYXJyYXRpdmVSZWNvcmRlci5nZXRTdGFnZURhdGEoKS5zaXplID4gMCkge1xuICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIoKS5idWlsZChmbG93U2VudGVuY2VzLCB0aGlzLm5hcnJhdGl2ZVJlY29yZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIGZvciBwcm9ncmFtbWF0aWMgY29uc3VtcHRpb24uXG4gICAqIEVhY2ggZW50cnkgaGFzIGEgdHlwZSAoc3RhZ2UsIHN0ZXAsIGNvbmRpdGlvbiwgZm9yaywgZXRjLiksIHRleHQsIGFuZCBkZXB0aC5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgaWYgKHRoaXMubmFycmF0aXZlUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiBuZXcgQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyKCkuYnVpbGRFbnRyaWVzKGZsb3dTZW50ZW5jZXMsIHRoaXMubmFycmF0aXZlUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzICh3aXRob3V0IGRhdGEgb3BlcmF0aW9ucykuXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG9ubHkgd2FudCBjb250cm9sIGZsb3cgZGVzY3JpcHRpb25zLlxuICAgKi9cbiAgZ2V0Rmxvd05hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihzaWduYWwpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGltZW91dElkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIGdldFNuYXBzaG90KCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpO1xuICB9XG5cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy50cmF2ZXJzZXIuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lU3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICBnZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQgPSB1bmtub3duPigpOiBNYXA8c3RyaW5nLCBUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdD4oKTtcbiAgfVxuXG4gIGdldEVucmljaGVkUmVzdWx0czxUUmVzdWx0ID0gdW5rbm93bj4oKTogTWFwPHN0cmluZywgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQ+KCk7XG4gIH1cblxuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RvckVycm9ycygpO1xuICB9XG59XG4iXX0=
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBR0gsMkZBQXdGO0FBRXhGLCtFQUE0RTtBQUM1RSwyQ0FXeUI7QUFFekIsNEVBQXlFO0FBQ3pFLHlEQUFzRDtBQUV0RCxNQUFhLGlCQUFpQjtJQWtCNUIsWUFDRSxTQUFrQyxFQUNsQyxZQUFrQyxFQUNsQyx1QkFBaUMsRUFDakMsY0FBd0IsRUFDeEIsZUFBeUIsRUFDekIsc0JBQW9ELEVBQ3BELGNBQStCLEVBQy9CLG1CQUF5QyxFQUN6QyxlQUF5QjtRQXpCbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQXlCekMsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixTQUFTO1lBQ1QsWUFBWTtZQUNaLHVCQUF1QjtZQUN2QixjQUFjO1lBQ2QsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixjQUFjO1lBQ2QsbUJBQW1CO1lBQ25CLGVBQWU7U0FDaEIsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBb0I7O1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFBLEVBQUUsQ0FBQyxlQUFlLG1DQUFJLEtBQUssQ0FBQyxDQUFDO1FBRTdFLDBFQUEwRTtRQUMxRSxtRUFBbUU7UUFDbkUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNyQyxJQUFJLGFBQWEsRUFBRSxDQUFD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QUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBVyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFXLENBQUM7SUFDdkQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFyTkQsOENBcU5DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gUGFpcnMgd2l0aCBGbG93Q2hhcnRCdWlsZGVyOlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSk7XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyJztcbmltcG9ydCB7IENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlcic7XG5pbXBvcnQge1xuICB0eXBlIEV4dHJhY3RvckVycm9yLFxuICB0eXBlIEZsb3dDaGFydCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlcic7XG5pbXBvcnQgeyBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lJztcblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgbmFycmF0aXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIG5hcnJhdGl2ZVJlY29yZGVyOiBOYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW47XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+LFxuICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bixcbiAgICBpbml0aWFsQ29udGV4dD86IHVua25vd24sXG4gICAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bixcbiAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuLFxuICAgIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnMsXG4gICAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzID0ge1xuICAgICAgZmxvd0NoYXJ0LFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBlbnJpY2hTbmFwc2hvdHMsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihzaWduYWw/OiBBYm9ydFNpZ25hbCk6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5mbG93Q2hhcnRBcmdzO1xuICAgIGNvbnN0IGZjID0gYXJncy5mbG93Q2hhcnQ7XG4gICAgY29uc3QgbmFycmF0aXZlRmxhZyA9IHRoaXMubmFycmF0aXZlRW5hYmxlZCB8fCAoZmMuZW5hYmxlTmFycmF0aXZlID8/IGZhbHNlKTtcblxuICAgIC8vIFdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQsIGNyZWF0ZSBhIHJlY29yZGVyIGFuZCB3cmFwIHRoZSBzY29wZSBmYWN0b3J5XG4gICAgLy8gdG8gYXV0by1hdHRhY2ggaXQgdG8gZXZlcnkgc2NvcGUgdGhhdCBzdXBwb3J0cyBhdHRhY2hSZWNvcmRlcigpLlxuICAgIGxldCBzY29wZUZhY3RvcnkgPSBhcmdzLnNjb3BlRmFjdG9yeTtcbiAgICBpZiAobmFycmF0aXZlRmxhZykge1xuICAgICAgdGhpcy5uYXJyYXRpdmVSZWNvcmRlciA9IG5ldyBOYXJyYXRpdmVSZWNvcmRlcigpO1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLm5hcnJhdGl2ZVJlY29yZGVyO1xuICAgICAgY29uc3Qgb3JpZ2luYWxGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgICBzY29wZUZhY3RvcnkgPSAoKGN0eDogYW55LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHk/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gb3JpZ2luYWxGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSk7XG4gICAgICAgIGlmIChzY29wZSAmJiB0eXBlb2YgKHNjb3BlIGFzIGFueSkuYXR0YWNoUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoc2NvcGUgYXMgYW55KS5hdHRhY2hSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmFycmF0aXZlUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKGZjLnJvb3QubmFtZSwgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCwgYXJncy5pbml0aWFsQ29udGV4dCk7XG5cbiAgICByZXR1cm4gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICBzY29wZUZhY3RvcnksXG4gICAgICBleGVjdXRpb25SdW50aW1lOiBydW50aW1lLFxuICAgICAgcmVhZE9ubHlDb250ZXh0OiBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IGFyZ3MudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBhcmdzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgZXh0cmFjdG9yOiBmYy5leHRyYWN0b3IsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBlbnJpY2hTbmFwc2hvdHM6IGFyZ3MuZW5yaWNoU25hcHNob3RzID8/IGZjLmVucmljaFNuYXBzaG90cyxcbiAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICBzaWduYWwsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCA/IHRoaXMuZmxvd1JlY29yZGVycyA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZsb3dSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLlxuICAgKiBBdXRvbWF0aWNhbGx5IGVuYWJsZXMgbmFycmF0aXZlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKSDigJQgcmVjb3JkZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHRyYXZlcnNlciBhdCBjcmVhdGlvbiB0aW1lLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVyc107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogV2hlbiB1c2luZyBTY29wZUZhY2FkZS1iYXNlZCBzY29wZXMsIHJldHVybnMgYSBjb21iaW5lZCBuYXJyYXRpdmUgdGhhdFxuICAgKiBpbnRlcmxlYXZlcyBmbG93IGV2ZW50cyAoc3RhZ2VzLCBkZWNpc2lvbnMsIGZvcmtzKSB3aXRoIGRhdGEgb3BlcmF0aW9uc1xuICAgKiAocmVhZHMsIHdyaXRlcywgdXBkYXRlcykuIEZvciBwbGFpbiBzY29wZXMgd2l0aG91dCBhdHRhY2hSZWNvcmRlciBzdXBwb3J0LFxuICAgKiByZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzLlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgaWYgKHRoaXMubmFycmF0aXZlUmVjb3JkZXIgJiYgdGhpcy5uYXJyYXRpdmVSZWNvcmRlci5nZXRTdGFnZURhdGEoKS5zaXplID4gMCkge1xuICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIoKS5idWlsZChmbG93U2VudGVuY2VzLCB0aGlzLm5hcnJhdGl2ZVJlY29yZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIGZvciBwcm9ncmFtbWF0aWMgY29uc3VtcHRpb24uXG4gICAqIEVhY2ggZW50cnkgaGFzIGEgdHlwZSAoc3RhZ2UsIHN0ZXAsIGNvbmRpdGlvbiwgZm9yaywgZXRjLiksIHRleHQsIGFuZCBkZXB0aC5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgaWYgKHRoaXMubmFycmF0aXZlUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiBuZXcgQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyKCkuYnVpbGRFbnRyaWVzKGZsb3dTZW50ZW5jZXMsIHRoaXMubmFycmF0aXZlUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzICh3aXRob3V0IGRhdGEgb3BlcmF0aW9ucykuXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG9ubHkgd2FudCBjb250cm9sIGZsb3cgZGVzY3JpcHRpb25zLlxuICAgKi9cbiAgZ2V0Rmxvd05hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihzaWduYWwpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGltZW91dElkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIGdldFNuYXBzaG90KCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpO1xuICB9XG5cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy50cmF2ZXJzZXIuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lU3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICBnZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQgPSB1bmtub3duPigpOiBNYXA8c3RyaW5nLCBUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdD4oKTtcbiAgfVxuXG4gIGdldEVucmljaGVkUmVzdWx0czxUUmVzdWx0ID0gdW5rbm93bj4oKTogTWFwPHN0cmluZywgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQ+KCk7XG4gIH1cblxuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RvckVycm9ycygpO1xuICB9XG59XG4iXX0=
@@ -19,5 +19,18 @@ export type { CommitEvent, ErrorEvent, ReadEvent, Recorder, WriteEvent } from '.
19
19
  export { defineScopeFromZod } from './lib/scope';
20
20
  export type { CombinedNarrativeEntry } from './lib/engine';
21
21
  export { CombinedNarrativeBuilder } from './lib/engine';
22
+ export type { FlowLoopEvent, FlowRecorder } from './lib/engine';
23
+ export { NarrativeFlowRecorder } from './lib/engine';
24
+ export { AdaptiveNarrativeFlowRecorder } from './lib/engine';
25
+ export { MilestoneNarrativeFlowRecorder } from './lib/engine';
26
+ export { ProgressiveNarrativeFlowRecorder } from './lib/engine';
27
+ export { RLENarrativeFlowRecorder } from './lib/engine';
28
+ export { SeparateNarrativeFlowRecorder } from './lib/engine';
29
+ export { SilentNarrativeFlowRecorder } from './lib/engine';
30
+ export { WindowedNarrativeFlowRecorder } from './lib/engine';
22
31
  export type { RunOptions } from './lib/engine';
23
32
  export type { ScopeFactory } from './lib/memory';
33
+ export type { FlowChartContract, FlowChartContractOptions, JsonSchema, OpenAPIOptions, OpenAPISpec, } from './lib/contract';
34
+ export { defineContract } from './lib/contract';
35
+ export { normalizeSchema, zodToJsonSchema } from './lib/contract';
36
+ export { generateOpenAPI } from './lib/contract';
@@ -77,11 +77,20 @@ export declare class FlowChartBuilder<TOut = any, TScope = any> {
77
77
  private _stepCounter;
78
78
  private _stageDescriptions;
79
79
  private _stageStepMap;
80
+ private _inputSchema?;
81
+ private _outputSchema?;
82
+ private _outputMapper?;
80
83
  constructor(buildTimeExtractor?: BuildTimeExtractor<any>);
81
84
  private _appendDescriptionLine;
82
85
  private _appendSubflowDescription;
83
86
  setEnableNarrative(): this;
84
87
  setLogger(logger: ILogger): this;
88
+ /** Declare the input schema (readOnlyContext shape). Accepts Zod schema or JSON Schema. */
89
+ setInputSchema(schema: unknown): this;
90
+ /** Declare the output schema (response shape). Accepts Zod schema or JSON Schema. */
91
+ setOutputSchema(schema: unknown): this;
92
+ /** Set the output mapper that extracts the response from final scope. */
93
+ setOutputMapper(mapper: (finalScope: Record<string, unknown>) => unknown): this;
85
94
  start(name: string, fn?: PipelineStageFunction<TOut, TScope>, id?: string, description?: string): this;
86
95
  addFunction(name: string, fn?: PipelineStageFunction<TOut, TScope>, id?: string, description?: string): this;
87
96
  addStreamingFunction(name: string, streamId?: string, fn?: PipelineStageFunction<TOut, TScope>, id?: string, description?: string): this;
@@ -126,6 +126,12 @@ export type FlowChart<TOut = any, TScope = any> = {
126
126
  logger?: ILogger;
127
127
  description: string;
128
128
  stageDescriptions: Map<string, string>;
129
+ /** Input schema (Zod or JSON Schema) — declared via setInputSchema(). */
130
+ inputSchema?: unknown;
131
+ /** Output schema (Zod or JSON Schema) — declared via setOutputSchema(). */
132
+ outputSchema?: unknown;
133
+ /** Output mapper — extracts response from final scope. */
134
+ outputMapper?: (finalScope: Record<string, unknown>) => unknown;
129
135
  };
130
136
  export type SimplifiedParallelSpec<TOut = any, TScope = any> = {
131
137
  id: string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * contract/defineContract.ts — Factory for creating a FlowChartContract.
3
+ *
4
+ * Wraps a compiled FlowChart with I/O schemas and an output mapper,
5
+ * using the same pattern as SubflowMountOptions (inputMapper/outputMapper).
6
+ *
7
+ * Usage:
8
+ * const contract = defineContract(chart, {
9
+ * inputSchema: z.object({ name: z.string() }),
10
+ * outputSchema: z.object({ greeting: z.string() }),
11
+ * outputMapper: (scope) => ({ greeting: scope.message as string }),
12
+ * });
13
+ *
14
+ * const openapi = contract.toOpenAPI();
15
+ */
16
+ import type { FlowChart } from '../builder/types';
17
+ import type { FlowChartContract, FlowChartContractOptions } from './types';
18
+ export declare function defineContract<TInput = unknown, TOutput = unknown>(chart: FlowChart, options: FlowChartContractOptions<TInput, TOutput>): FlowChartContract<TInput, TOutput>;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * contract/ — FlowChart I/O contract and OpenAPI generation layer.
3
+ *
4
+ * Standalone library: wraps a compiled FlowChart with input/output schemas
5
+ * and generates OpenAPI 3.1 specs. Uses the same inputMapper/outputMapper
6
+ * pattern as subflow mounting.
7
+ *
8
+ * Zero runtime deps on Zod — Zod schemas detected via duck-typing and
9
+ * converted to JSON Schema at contract creation time.
10
+ */
11
+ export { defineContract } from './defineContract';
12
+ export { isZodSchema, normalizeSchema, zodToJsonSchema } from './schema';
13
+ export { generateOpenAPI } from './openapi';
14
+ export type { FlowChartContract, FlowChartContractOptions, JsonSchema, OpenAPIOptions, OpenAPISpec, SchemaInput, } from './types';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * contract/openapi.ts — OpenAPI 3.1 spec generator.
3
+ *
4
+ * Generates an OpenAPI spec from a FlowChartContract by combining:
5
+ * - chart.description → operation description
6
+ * - chart.stageDescriptions → step-by-step detail
7
+ * - inputSchema → requestBody
8
+ * - outputSchema → response
9
+ * - chart.buildTimeStructure → operation metadata (branches, forks, etc.)
10
+ */
11
+ import type { FlowChartContract, OpenAPIOptions, OpenAPISpec } from './types';
12
+ export declare function generateOpenAPI(contract: FlowChartContract, options?: OpenAPIOptions): OpenAPISpec;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * contract/schema.ts — Schema normalization utilities.
3
+ *
4
+ * Converts Zod schemas or raw JSON Schema objects into a normalized
5
+ * JsonSchema format. Zod detection uses duck-typing (checks for `_def`).
6
+ *
7
+ * Standalone: no dependency on Zod at import time.
8
+ * Compatible with Zod v4 internals.
9
+ */
10
+ import type { JsonSchema, SchemaInput } from './types';
11
+ export declare function isZodSchema(input: unknown): boolean;
12
+ /** Convert a Zod schema object to JSON Schema. */
13
+ export declare function zodToJsonSchema(zodSchema: Record<string, unknown>): JsonSchema;
14
+ export declare function normalizeSchema(input: SchemaInput): JsonSchema;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * contract/types.ts — Types for the FlowChart contract layer.
3
+ *
4
+ * Defines the I/O boundary for a flowchart: input schema, output schema,
5
+ * and output mapper. Uses the same pattern as SubflowMountOptions
6
+ * (inputMapper/outputMapper) but at the top-level flowchart boundary.
7
+ */
8
+ import type { FlowChart } from '../builder/types';
9
+ export type JsonSchema = {
10
+ type?: string | string[];
11
+ properties?: Record<string, JsonSchema>;
12
+ required?: string[];
13
+ items?: JsonSchema;
14
+ enum?: unknown[];
15
+ description?: string;
16
+ default?: unknown;
17
+ format?: string;
18
+ additionalProperties?: boolean | JsonSchema;
19
+ oneOf?: JsonSchema[];
20
+ anyOf?: JsonSchema[];
21
+ allOf?: JsonSchema[];
22
+ $ref?: string;
23
+ [key: string]: unknown;
24
+ };
25
+ /** Anything with a `def` (Zod v4) or `_def` (Zod v3) property is treated as a Zod schema. */
26
+ export type SchemaInput = JsonSchema | {
27
+ def: unknown;
28
+ [key: string]: unknown;
29
+ };
30
+ export interface FlowChartContractOptions<_TInput = unknown, TOutput = unknown> {
31
+ /** Schema describing the input (readOnlyContext) shape. Zod or JSON Schema. */
32
+ inputSchema?: SchemaInput;
33
+ /** Schema describing the output shape. Zod or JSON Schema. */
34
+ outputSchema?: SchemaInput;
35
+ /** Maps the final scope state into the response shape. */
36
+ outputMapper?: (finalScope: Record<string, unknown>) => TOutput;
37
+ }
38
+ export interface FlowChartContract<_TInput = unknown, TOutput = unknown> {
39
+ /** The compiled flowchart. */
40
+ chart: FlowChart;
41
+ /** JSON Schema for the input (normalized from Zod or raw). */
42
+ inputSchema?: JsonSchema;
43
+ /** JSON Schema for the output (normalized from Zod or raw). */
44
+ outputSchema?: JsonSchema;
45
+ /** Maps the final scope state into the response shape. */
46
+ outputMapper?: (finalScope: Record<string, unknown>) => TOutput;
47
+ /** Auto-generated OpenAPI spec. */
48
+ toOpenAPI(options?: OpenAPIOptions): OpenAPISpec;
49
+ }
50
+ export interface OpenAPIOptions {
51
+ /** API version string (default: "1.0.0"). */
52
+ version?: string;
53
+ /** Base path prefix (default: "/"). */
54
+ basePath?: string;
55
+ /** HTTP method for the execute endpoint (default: "post"). */
56
+ method?: string;
57
+ }
58
+ export interface OpenAPISpec {
59
+ openapi: '3.1.0';
60
+ info: {
61
+ title: string;
62
+ description: string;
63
+ version: string;
64
+ };
65
+ paths: Record<string, Record<string, OpenAPIOperation>>;
66
+ components?: {
67
+ schemas?: Record<string, JsonSchema>;
68
+ };
69
+ }
70
+ export interface OpenAPIOperation {
71
+ operationId: string;
72
+ summary: string;
73
+ description: string;
74
+ requestBody?: {
75
+ required: boolean;
76
+ content: {
77
+ 'application/json': {
78
+ schema: JsonSchema | {
79
+ $ref: string;
80
+ };
81
+ };
82
+ };
83
+ };
84
+ responses: Record<string, {
85
+ description: string;
86
+ content?: {
87
+ 'application/json': {
88
+ schema: JsonSchema | {
89
+ $ref: string;
90
+ };
91
+ };
92
+ };
93
+ }>;
94
+ }
@@ -14,3 +14,13 @@ export { CombinedNarrativeBuilder } from './narrative/CombinedNarrativeBuilder';
14
14
  export { ControlFlowNarrativeGenerator } from './narrative/ControlFlowNarrativeGenerator';
15
15
  export { NullControlFlowNarrativeGenerator } from './narrative/NullControlFlowNarrativeGenerator';
16
16
  export type { IControlFlowNarrative } from './narrative/types';
17
+ export { FlowRecorderDispatcher } from './narrative/FlowRecorderDispatcher';
18
+ export { NarrativeFlowRecorder } from './narrative/NarrativeFlowRecorder';
19
+ export type { FlowBreakEvent, FlowDecisionEvent, FlowErrorEvent, FlowForkEvent, FlowLoopEvent, FlowNextEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent, FlowSubflowEvent, } from './narrative/types';
20
+ export { AdaptiveNarrativeFlowRecorder } from './narrative/recorders/AdaptiveNarrativeFlowRecorder';
21
+ export { MilestoneNarrativeFlowRecorder } from './narrative/recorders/MilestoneNarrativeFlowRecorder';
22
+ export { ProgressiveNarrativeFlowRecorder } from './narrative/recorders/ProgressiveNarrativeFlowRecorder';
23
+ export { RLENarrativeFlowRecorder } from './narrative/recorders/RLENarrativeFlowRecorder';
24
+ export { SeparateNarrativeFlowRecorder } from './narrative/recorders/SeparateNarrativeFlowRecorder';
25
+ export { SilentNarrativeFlowRecorder } from './narrative/recorders/SilentNarrativeFlowRecorder';
26
+ export { WindowedNarrativeFlowRecorder } from './narrative/recorders/WindowedNarrativeFlowRecorder';
@@ -0,0 +1,38 @@
1
+ /**
2
+ * FlowRecorderDispatcher — Fans out control flow events to N attached FlowRecorders.
3
+ *
4
+ * Implements IControlFlowNarrative so it can replace the single
5
+ * ControlFlowNarrativeGenerator in the traverser's HandlerDeps.
6
+ *
7
+ * Design mirrors ScopeFacade._invokeHook: iterate recorders, call optional
8
+ * hooks, swallow errors so a failing recorder never breaks execution.
9
+ *
10
+ * When no recorders are attached, every method is a fast no-op (empty array check).
11
+ */
12
+ import type { FlowRecorder, IControlFlowNarrative } from './types';
13
+ export declare class FlowRecorderDispatcher implements IControlFlowNarrative {
14
+ private recorders;
15
+ /** Attach a FlowRecorder. Duplicate IDs are allowed (same as scope Recorder). */
16
+ attach(recorder: FlowRecorder): void;
17
+ /** Detach all FlowRecorders with the given ID. */
18
+ detach(id: string): void;
19
+ /** Returns a defensive copy of attached recorders. */
20
+ getRecorders(): FlowRecorder[];
21
+ /** Find a recorder by ID. Useful for retrieving built-in recorders like NarrativeFlowRecorder. */
22
+ getRecorderById<T extends FlowRecorder = FlowRecorder>(id: string): T | undefined;
23
+ onStageExecuted(stageName: string, description?: string): void;
24
+ onNext(fromStage: string, toStage: string, description?: string): void;
25
+ onDecision(deciderName: string, chosenBranch: string, rationale?: string, deciderDescription?: string): void;
26
+ onFork(parentStage: string, childNames: string[]): void;
27
+ onSelected(parentStage: string, selectedNames: string[], totalCount: number): void;
28
+ onSubflowEntry(subflowName: string): void;
29
+ onSubflowExit(subflowName: string): void;
30
+ onLoop(targetStage: string, iteration: number, description?: string): void;
31
+ onBreak(stageName: string): void;
32
+ onError(stageName: string, errorMessage: string): void;
33
+ /**
34
+ * Returns sentences from the first attached recorder that provides them.
35
+ * By convention, NarrativeFlowRecorder exposes getSentences().
36
+ */
37
+ getSentences(): string[];
38
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * NarrativeFlowRecorder — Default FlowRecorder that generates plain-English narrative.
3
+ *
4
+ * This is the FlowRecorder equivalent of ControlFlowNarrativeGenerator.
5
+ * Produces the same sentences, same format, same behavior — but as a
6
+ * pluggable FlowRecorder that can be swapped, extended, or composed.
7
+ *
8
+ * Consumers who want different narrative behavior (windowed loops, adaptive
9
+ * summarization, etc.) can replace this with a different FlowRecorder.
10
+ */
11
+ import type { FlowBreakEvent, FlowDecisionEvent, FlowErrorEvent, FlowForkEvent, FlowLoopEvent, FlowNextEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent, FlowSubflowEvent } from './types';
12
+ export declare class NarrativeFlowRecorder implements FlowRecorder {
13
+ readonly id: string;
14
+ private sentences;
15
+ private isFirstStage;
16
+ constructor(id?: string);
17
+ onStageExecuted(event: FlowStageEvent): void;
18
+ onNext(event: FlowNextEvent): void;
19
+ onDecision(event: FlowDecisionEvent): void;
20
+ onFork(event: FlowForkEvent): void;
21
+ onSelected(event: FlowSelectedEvent): void;
22
+ onSubflowEntry(event: FlowSubflowEvent): void;
23
+ onSubflowExit(event: FlowSubflowEvent): void;
24
+ onLoop(event: FlowLoopEvent): void;
25
+ onBreak(event: FlowBreakEvent): void;
26
+ onError(event: FlowErrorEvent): void;
27
+ /** Returns a defensive copy of accumulated sentences. */
28
+ getSentences(): string[];
29
+ /** Clears accumulated sentences. Useful for reuse across runs. */
30
+ clear(): void;
31
+ }
@@ -3,3 +3,13 @@ export { CombinedNarrativeBuilder } from './CombinedNarrativeBuilder';
3
3
  export { ControlFlowNarrativeGenerator } from './ControlFlowNarrativeGenerator';
4
4
  export { NullControlFlowNarrativeGenerator } from './NullControlFlowNarrativeGenerator';
5
5
  export type { IControlFlowNarrative } from './types';
6
+ export { FlowRecorderDispatcher } from './FlowRecorderDispatcher';
7
+ export { NarrativeFlowRecorder } from './NarrativeFlowRecorder';
8
+ export type { FlowBreakEvent, FlowDecisionEvent, FlowErrorEvent, FlowForkEvent, FlowLoopEvent, FlowNextEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent, FlowSubflowEvent, } from './types';
9
+ export { AdaptiveNarrativeFlowRecorder } from './recorders/AdaptiveNarrativeFlowRecorder';
10
+ export { MilestoneNarrativeFlowRecorder } from './recorders/MilestoneNarrativeFlowRecorder';
11
+ export { ProgressiveNarrativeFlowRecorder } from './recorders/ProgressiveNarrativeFlowRecorder';
12
+ export { RLENarrativeFlowRecorder } from './recorders/RLENarrativeFlowRecorder';
13
+ export { SeparateNarrativeFlowRecorder } from './recorders/SeparateNarrativeFlowRecorder';
14
+ export { SilentNarrativeFlowRecorder } from './recorders/SilentNarrativeFlowRecorder';
15
+ export { WindowedNarrativeFlowRecorder } from './recorders/WindowedNarrativeFlowRecorder';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * AdaptiveNarrativeFlowRecorder — Full detail until threshold, then samples every Nth.
3
+ *
4
+ * Best for: Unknown loop counts where you want full detail for short loops
5
+ * but automatic compression for long ones.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Full detail for first 5, then every 10th iteration
10
+ * executor.attachFlowRecorder(new AdaptiveNarrativeFlowRecorder(5, 10));
11
+ * ```
12
+ */
13
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
14
+ import type { FlowLoopEvent } from '../types';
15
+ export declare class AdaptiveNarrativeFlowRecorder extends NarrativeFlowRecorder {
16
+ private readonly threshold;
17
+ private readonly sampleRate;
18
+ private totalPerTarget;
19
+ private suppressedCount;
20
+ constructor(threshold?: number, sampleRate?: number, id?: string);
21
+ onLoop(event: FlowLoopEvent): void;
22
+ /** Returns the number of suppressed loop sentences. */
23
+ getSuppressedCount(): number;
24
+ clear(): void;
25
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * MilestoneNarrativeFlowRecorder — Emits every Nth iteration (milestones only).
3
+ *
4
+ * Best for: High-iteration loops where you want regular progress markers
5
+ * without caring about individual iterations.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Emit every 10th iteration
10
+ * executor.attachFlowRecorder(new MilestoneNarrativeFlowRecorder(10));
11
+ * ```
12
+ */
13
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
14
+ import type { FlowLoopEvent } from '../types';
15
+ export declare class MilestoneNarrativeFlowRecorder extends NarrativeFlowRecorder {
16
+ private readonly interval;
17
+ private readonly alwaysEmitFirst;
18
+ private suppressedCount;
19
+ constructor(interval?: number, alwaysEmitFirst?: boolean, id?: string);
20
+ onLoop(event: FlowLoopEvent): void;
21
+ /** Returns the number of suppressed loop sentences. */
22
+ getSuppressedCount(): number;
23
+ clear(): void;
24
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * ProgressiveNarrativeFlowRecorder — Exponentially decreasing detail as iterations grow.
3
+ *
4
+ * Emits at exponentially increasing intervals: 1, 2, 4, 8, 16, 32, ...
5
+ * Gives rich detail for early iterations and progressively less as the loop continues.
6
+ *
7
+ * Best for: Convergence-style loops (gradient descent, iterative refinement)
8
+ * where early iterations are most informative.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * executor.attachFlowRecorder(new ProgressiveNarrativeFlowRecorder());
13
+ * // Emits: pass 1, 2, 4, 8, 16, 32, 64, 128...
14
+ * ```
15
+ */
16
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
17
+ import type { FlowLoopEvent } from '../types';
18
+ export declare class ProgressiveNarrativeFlowRecorder extends NarrativeFlowRecorder {
19
+ private readonly base;
20
+ private suppressedCount;
21
+ /**
22
+ * @param base - The exponential base. Default 2 means emit at 1, 2, 4, 8, 16...
23
+ */
24
+ constructor(base?: number, id?: string);
25
+ onLoop(event: FlowLoopEvent): void;
26
+ private shouldEmit;
27
+ /** Returns the number of suppressed loop sentences. */
28
+ getSuppressedCount(): number;
29
+ clear(): void;
30
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * RLENarrativeFlowRecorder — Run-Length Encoding for consecutive identical loop targets.
3
+ *
4
+ * Instead of emitting one sentence per iteration, collapses consecutive loops
5
+ * through the same target into a single "Looped N times through X" sentence.
6
+ *
7
+ * Best for: Simple retry loops where every iteration looks the same.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * executor.attachFlowRecorder(new RLENarrativeFlowRecorder());
12
+ * // Instead of 50 "On pass N..." lines:
13
+ * // "Looped through AskLLM 50 times (passes 1–50)."
14
+ * ```
15
+ */
16
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
17
+ import type { FlowLoopEvent } from '../types';
18
+ export declare class RLENarrativeFlowRecorder extends NarrativeFlowRecorder {
19
+ private currentRun;
20
+ private completedRuns;
21
+ constructor(id?: string);
22
+ onLoop(event: FlowLoopEvent): void;
23
+ getSentences(): string[];
24
+ clear(): void;
25
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * SeparateNarrativeFlowRecorder — Collects loop iterations in a separate channel.
3
+ *
4
+ * Keeps the main narrative clean (no loop sentences) while preserving full
5
+ * iteration detail in a separate accessor for consumers who need it.
6
+ *
7
+ * Best for: UIs or reports where loop detail is in a collapsible section,
8
+ * or LLM pipelines where loop context should be available but not in the main prompt.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const recorder = new SeparateNarrativeFlowRecorder();
13
+ * executor.attachFlowRecorder(recorder);
14
+ * await executor.run();
15
+ *
16
+ * const mainNarrative = executor.getNarrative(); // No loop sentences
17
+ * const loopDetail = recorder.getLoopSentences(); // All loop detail
18
+ * ```
19
+ */
20
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
21
+ import type { FlowLoopEvent } from '../types';
22
+ export declare class SeparateNarrativeFlowRecorder extends NarrativeFlowRecorder {
23
+ private loopSentences;
24
+ private loopCounts;
25
+ constructor(id?: string);
26
+ onLoop(event: FlowLoopEvent): void;
27
+ /** Returns all loop iteration sentences (the separate channel). */
28
+ getLoopSentences(): string[];
29
+ /** Returns total loop count per target. */
30
+ getLoopCounts(): Map<string, number>;
31
+ clear(): void;
32
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SilentNarrativeFlowRecorder — Suppresses all per-iteration loop sentences,
3
+ * emits a single summary sentence at the end.
4
+ *
5
+ * Best for: Loops where iteration details are irrelevant and you only care
6
+ * about the total count.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * executor.attachFlowRecorder(new SilentNarrativeFlowRecorder());
11
+ * // Produces: "Looped 50 times through AskLLM."
12
+ * ```
13
+ */
14
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
15
+ import type { FlowLoopEvent } from '../types';
16
+ export declare class SilentNarrativeFlowRecorder extends NarrativeFlowRecorder {
17
+ private loopCounts;
18
+ private loopOrder;
19
+ constructor(id?: string);
20
+ onLoop(event: FlowLoopEvent): void;
21
+ getSentences(): string[];
22
+ /** Returns the total loop count per target. */
23
+ getLoopCounts(): Map<string, number>;
24
+ clear(): void;
25
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * WindowedNarrativeFlowRecorder — Shows first N and last M loop iterations, skips the middle.
3
+ *
4
+ * Best for: Moderate loops (10–200 iterations) where you want to see how it started
5
+ * and how it ended, without the noise in between.
6
+ *
7
+ * When total iterations <= head + tail, all iterations are emitted (no compression).
8
+ * When total > head + tail, the middle is replaced with a summary line.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Show first 3 and last 2 iterations
13
+ * executor.attachFlowRecorder(new WindowedNarrativeFlowRecorder(3, 2));
14
+ * ```
15
+ */
16
+ import { NarrativeFlowRecorder } from '../NarrativeFlowRecorder';
17
+ import type { FlowLoopEvent } from '../types';
18
+ export declare class WindowedNarrativeFlowRecorder extends NarrativeFlowRecorder {
19
+ private readonly head;
20
+ private readonly tail;
21
+ private loopEvents;
22
+ constructor(head?: number, tail?: number, id?: string);
23
+ onLoop(event: FlowLoopEvent): void;
24
+ getSentences(): string[];
25
+ /** Returns the number of suppressed loop sentences. */
26
+ getSuppressedCount(): number;
27
+ clear(): void;
28
+ private formatLoopSentence;
29
+ }
@@ -0,0 +1,7 @@
1
+ export { AdaptiveNarrativeFlowRecorder } from './AdaptiveNarrativeFlowRecorder';
2
+ export { MilestoneNarrativeFlowRecorder } from './MilestoneNarrativeFlowRecorder';
3
+ export { ProgressiveNarrativeFlowRecorder } from './ProgressiveNarrativeFlowRecorder';
4
+ export { RLENarrativeFlowRecorder } from './RLENarrativeFlowRecorder';
5
+ export { SeparateNarrativeFlowRecorder } from './SeparateNarrativeFlowRecorder';
6
+ export { SilentNarrativeFlowRecorder } from './SilentNarrativeFlowRecorder';
7
+ export { WindowedNarrativeFlowRecorder } from './WindowedNarrativeFlowRecorder';