footprintjs 10.0.1 → 10.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
* - **Accumulate**: progressive quality up to slider position
|
|
11
11
|
* - **Aggregate**: overall pipeline quality score
|
|
12
12
|
*
|
|
13
|
+
* Attempts (10.1): a stage whose retry series GAVE UP (exhausted, declined,
|
|
14
|
+
* no time left) or TIMED OUT is a quality drop at that stage — `drop:
|
|
15
|
+
* 'attempts'`, with the series' `attempts` summary and a factor naming why.
|
|
16
|
+
* A series that gave up never reached `onStageEnd` (the stage failed), so the
|
|
17
|
+
* recorder scores it itself: `0`, the floor, with the keys its last attempt
|
|
18
|
+
* read — which is what `qualityTrace()` walks to pair the drop with its
|
|
19
|
+
* causal parents. A series that timed out and recovered keeps the scoring
|
|
20
|
+
* function's score and gains the flag. Attempts reach a recorder on the FLOW
|
|
21
|
+
* channel (`onAttempt`): attach with `attachCombinedRecorder` to see them —
|
|
22
|
+
* `attachScopeRecorder` scores exactly as before.
|
|
23
|
+
*
|
|
13
24
|
* @example
|
|
14
25
|
* ```typescript
|
|
15
26
|
* const quality = new QualityRecorder((runtimeStageId, context) => {
|
|
@@ -30,6 +41,8 @@
|
|
|
30
41
|
* quality.getLowest(); // { runtimeStageId: 'call-llm#5', entry: { score: 0.7, ... } }
|
|
31
42
|
* ```
|
|
32
43
|
*/
|
|
44
|
+
import type { AttemptSummary } from '../attempt/types.js';
|
|
45
|
+
import type { FlowAttemptEvent } from '../engine/narrative/types.js';
|
|
33
46
|
import type { ReadEvent, ScopeRecorder, StageEvent, WriteEvent } from '../scope/types.js';
|
|
34
47
|
import type { RecorderOperation } from './RecorderOperation.js';
|
|
35
48
|
/** Per-step quality data stored by QualityRecorder. */
|
|
@@ -46,6 +59,10 @@ export interface QualityEntry {
|
|
|
46
59
|
keysRead: string[];
|
|
47
60
|
/** Keys written during this step (for backtracking). */
|
|
48
61
|
keysWritten: string[];
|
|
62
|
+
/** Present when the step's retry series gave up or timed out — a quality drop by attempts (10.1). */
|
|
63
|
+
drop?: 'attempts';
|
|
64
|
+
/** With `drop`: the series at a glance. */
|
|
65
|
+
attempts?: AttemptSummary;
|
|
49
66
|
}
|
|
50
67
|
/**
|
|
51
68
|
* Scoring function called at the end of each stage.
|
|
@@ -76,16 +93,26 @@ export declare class QualityRecorder implements ScopeRecorder {
|
|
|
76
93
|
/** 1:1 per-step storage (Convention 1 — composed, not inherited). */
|
|
77
94
|
private readonly store;
|
|
78
95
|
private readonly scoringFn;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Each execution in flight, by its OWN runtimeStageId (10.1) — every event owns its attribution, so parallel
|
|
98
|
+
* siblings never score under each other's id or with each other's keys (until 10.0 one shared "current stage"
|
|
99
|
+
* buffer did). A retried execution's entry restarts with each attempt: a series that gave up is scored with the
|
|
100
|
+
* keys its last attempt touched. Released at the stage's end, or when a drop consumes it.
|
|
101
|
+
*/
|
|
102
|
+
private readonly inFlight;
|
|
103
|
+
/** Per-series tallies of the series that retried, gave up or timed out. */
|
|
104
|
+
private readonly attemptBook;
|
|
84
105
|
constructor(scoringFn: QualityScoringFn, options?: QualityRecorderOptions);
|
|
85
106
|
onStageStart(event: StageEvent): void;
|
|
86
107
|
onRead(event: ReadEvent): void;
|
|
87
108
|
onWrite(event: WriteEvent): void;
|
|
88
109
|
onStageEnd(event: StageEvent): void;
|
|
110
|
+
/**
|
|
111
|
+
* A series that ended after giving up or timing out is a drop at its stage. `onAttempt` for the last attempt
|
|
112
|
+
* fires after that attempt's `onStageEnd` (when it returned), so a recovered series amends the scored entry; a
|
|
113
|
+
* series that gave up has none, and is scored here.
|
|
114
|
+
*/
|
|
115
|
+
onAttempt(event: FlowAttemptEvent): void;
|
|
89
116
|
/** Translate: quality entry for a specific runtimeStageId. */
|
|
90
117
|
getByKey(runtimeStageId: string): QualityEntry | undefined;
|
|
91
118
|
/** All per-step quality entries as a read-only Map (insertion-ordered). */
|
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
* - **Accumulate**: progressive quality up to slider position
|
|
11
11
|
* - **Aggregate**: overall pipeline quality score
|
|
12
12
|
*
|
|
13
|
+
* Attempts (10.1): a stage whose retry series GAVE UP (exhausted, declined,
|
|
14
|
+
* no time left) or TIMED OUT is a quality drop at that stage — `drop:
|
|
15
|
+
* 'attempts'`, with the series' `attempts` summary and a factor naming why.
|
|
16
|
+
* A series that gave up never reached `onStageEnd` (the stage failed), so the
|
|
17
|
+
* recorder scores it itself: `0`, the floor, with the keys its last attempt
|
|
18
|
+
* read — which is what `qualityTrace()` walks to pair the drop with its
|
|
19
|
+
* causal parents. A series that timed out and recovered keeps the scoring
|
|
20
|
+
* function's score and gains the flag. Attempts reach a recorder on the FLOW
|
|
21
|
+
* channel (`onAttempt`): attach with `attachCombinedRecorder` to see them —
|
|
22
|
+
* `attachScopeRecorder` scores exactly as before.
|
|
23
|
+
*
|
|
13
24
|
* @example
|
|
14
25
|
* ```typescript
|
|
15
26
|
* const quality = new QualityRecorder((runtimeStageId, context) => {
|
|
@@ -30,6 +41,7 @@
|
|
|
30
41
|
* quality.getLowest(); // { runtimeStageId: 'call-llm#5', entry: { score: 0.7, ... } }
|
|
31
42
|
* ```
|
|
32
43
|
*/
|
|
44
|
+
import { AttemptSeriesBook, gaveUp } from './attemptSeries.js';
|
|
33
45
|
import { KeyedStore } from './KeyedStore.js';
|
|
34
46
|
export class QualityRecorder {
|
|
35
47
|
static _counter = 0;
|
|
@@ -38,46 +50,95 @@ export class QualityRecorder {
|
|
|
38
50
|
/** 1:1 per-step storage (Convention 1 — composed, not inherited). */
|
|
39
51
|
store = new KeyedStore();
|
|
40
52
|
scoringFn;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Each execution in flight, by its OWN runtimeStageId (10.1) — every event owns its attribution, so parallel
|
|
55
|
+
* siblings never score under each other's id or with each other's keys (until 10.0 one shared "current stage"
|
|
56
|
+
* buffer did). A retried execution's entry restarts with each attempt: a series that gave up is scored with the
|
|
57
|
+
* keys its last attempt touched. Released at the stage's end, or when a drop consumes it.
|
|
58
|
+
*/
|
|
59
|
+
inFlight = new Map();
|
|
60
|
+
/** Per-series tallies of the series that retried, gave up or timed out. */
|
|
61
|
+
attemptBook = new AttemptSeriesBook();
|
|
47
62
|
constructor(scoringFn, options) {
|
|
48
63
|
this.scoringFn = scoringFn;
|
|
49
64
|
this.id = options?.id ?? `quality-${++QualityRecorder._counter}`;
|
|
50
65
|
this.preferredOperation = options?.preferredOperation ?? 'accumulate';
|
|
51
66
|
}
|
|
52
67
|
onStageStart(event) {
|
|
53
|
-
this.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
68
|
+
this.inFlight.set(event.runtimeStageId, {
|
|
69
|
+
stageId: event.stageId,
|
|
70
|
+
stageName: event.stageName,
|
|
71
|
+
keysRead: [],
|
|
72
|
+
keysWritten: [],
|
|
73
|
+
});
|
|
58
74
|
}
|
|
59
75
|
onRead(event) {
|
|
60
76
|
if (event.key)
|
|
61
|
-
this.
|
|
77
|
+
this.inFlight.get(event.runtimeStageId)?.keysRead.push(event.key);
|
|
62
78
|
}
|
|
63
79
|
onWrite(event) {
|
|
64
|
-
this.
|
|
80
|
+
this.inFlight.get(event.runtimeStageId)?.keysWritten.push(event.key);
|
|
65
81
|
}
|
|
66
82
|
onStageEnd(event) {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
stageId:
|
|
70
|
-
|
|
71
|
-
|
|
83
|
+
const id = event.runtimeStageId;
|
|
84
|
+
const step = this.inFlight.get(id) ?? {
|
|
85
|
+
stageId: event.stageId,
|
|
86
|
+
stageName: event.stageName,
|
|
87
|
+
keysRead: [],
|
|
88
|
+
keysWritten: [],
|
|
89
|
+
};
|
|
90
|
+
this.inFlight.delete(id);
|
|
91
|
+
const { score, factors } = this.scoringFn(id, {
|
|
92
|
+
stageName: step.stageName,
|
|
93
|
+
stageId: step.stageId,
|
|
94
|
+
keysRead: step.keysRead,
|
|
95
|
+
keysWritten: step.keysWritten,
|
|
72
96
|
duration: event.duration,
|
|
73
97
|
});
|
|
74
|
-
this.store.set(
|
|
75
|
-
stageName:
|
|
76
|
-
stageId:
|
|
98
|
+
this.store.set(id, {
|
|
99
|
+
stageName: step.stageName,
|
|
100
|
+
stageId: step.stageId,
|
|
77
101
|
score: Math.max(0, Math.min(1, score)),
|
|
78
102
|
factors: factors ?? [],
|
|
79
|
-
keysRead: [...
|
|
80
|
-
keysWritten: [...
|
|
103
|
+
keysRead: [...step.keysRead],
|
|
104
|
+
keysWritten: [...step.keysWritten],
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* A series that ended after giving up or timing out is a drop at its stage. `onAttempt` for the last attempt
|
|
109
|
+
* fires after that attempt's `onStageEnd` (when it returned), so a recovered series amends the scored entry; a
|
|
110
|
+
* series that gave up has none, and is scored here.
|
|
111
|
+
*/
|
|
112
|
+
onAttempt(event) {
|
|
113
|
+
const { record } = event;
|
|
114
|
+
const state = this.attemptBook.add(record);
|
|
115
|
+
const summary = state?.summary;
|
|
116
|
+
if (!summary || (summary.timeout === 0 && !gaveUp(record)))
|
|
117
|
+
return;
|
|
118
|
+
const factor = gaveUp(record)
|
|
119
|
+
? `attempts: gave up (${[record.reason, record.category].filter(Boolean).join(', ')}) after ${record.attempt} of ${record.of ?? record.attempt}`
|
|
120
|
+
: `attempts: ${summary.timeout} of ${summary.count} timed out`;
|
|
121
|
+
const scored = this.store.get(record.series);
|
|
122
|
+
if (scored) {
|
|
123
|
+
this.store.set(record.series, {
|
|
124
|
+
...scored,
|
|
125
|
+
factors: [...scored.factors, factor],
|
|
126
|
+
drop: 'attempts',
|
|
127
|
+
attempts: summary,
|
|
128
|
+
});
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const step = this.inFlight.get(record.series);
|
|
132
|
+
this.inFlight.delete(record.series);
|
|
133
|
+
this.store.set(record.series, {
|
|
134
|
+
stageName: event.stageName,
|
|
135
|
+
stageId: event.stageId,
|
|
136
|
+
score: 0,
|
|
137
|
+
factors: [factor],
|
|
138
|
+
keysRead: step ? [...step.keysRead] : [],
|
|
139
|
+
keysWritten: step ? [...step.keysWritten] : [],
|
|
140
|
+
drop: 'attempts',
|
|
141
|
+
attempts: summary,
|
|
81
142
|
});
|
|
82
143
|
}
|
|
83
144
|
// ── Per-step query API (delegates to the composed store) ───────────────
|
|
@@ -150,11 +211,8 @@ export class QualityRecorder {
|
|
|
150
211
|
}
|
|
151
212
|
clear() {
|
|
152
213
|
this.store.clear();
|
|
153
|
-
this.
|
|
154
|
-
this.
|
|
155
|
-
this.currentStageName = '';
|
|
156
|
-
this.currentKeysRead = [];
|
|
157
|
-
this.currentKeysWritten = [];
|
|
214
|
+
this.inFlight.clear();
|
|
215
|
+
this.attemptBook.clear();
|
|
158
216
|
}
|
|
159
217
|
}
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVhbGl0eVJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFHSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUEyQzdDLE1BQU0sT0FBTyxlQUFlO0lBQ2xCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLEVBQUUsQ0FBUztJQUNYLGtCQUFrQixDQUFvQjtJQUMvQyxxRUFBcUU7SUFDcEQsS0FBSyxHQUFHLElBQUksVUFBVSxFQUFnQixDQUFDO0lBQ3ZDLFNBQVMsQ0FBbUI7SUFFN0MsK0NBQStDO0lBQ3ZDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztJQUMzQixjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUN0QixlQUFlLEdBQWEsRUFBRSxDQUFDO0lBQy9CLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUUxQyxZQUFZLFNBQTJCLEVBQUUsT0FBZ0M7UUFDdkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxZQUFZLENBQUM7SUFDeEUsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFpQjtRQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FB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QUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFBRSw2REFBNkQ7WUFDMUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxJQUFJLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGNBQWM7Z0JBQzVDLEtBQUs7YUFDTjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVhbGl0eVJlY29yZGVyIOKAlCBwZXItc3RlcCBxdWFsaXR5IHNjb3Jpbmcga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQ29sbGVjdHMgcXVhbGl0eSBzY29yZXMgZHVyaW5nIHRyYXZlcnNhbCAoYWNjdW11bGF0ZSBwYXR0ZXJuKS5cbiAqIEFmdGVyIGV4ZWN1dGlvbiwgdXNlIHF1YWxpdHlUcmFjZSgpIHRvIGJhY2t0cmFjayBmcm9tIGFueSBsb3ctc2NvcmluZyBzdGVwLlxuICpcbiAqIENvbXBvc2VzIGEgYEtleWVkU3RvcmU8UXVhbGl0eUVudHJ5PmAgZm9yIE8oMSkgbG9va3VwIGFuZCBzdGFuZGFyZCBvcGVyYXRpb25zXG4gKiAoQ29udmVudGlvbiAxIOKAlCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpOlxuICogICAtICoqVHJhbnNsYXRlKio6IGBnZXRCeUtleSgnY2FsbC1sbG0jNScpYCDigJQgcXVhbGl0eSBhdCB0aGlzIHN0ZXBcbiAqICAgLSAqKkFjY3VtdWxhdGUqKjogcHJvZ3Jlc3NpdmUgcXVhbGl0eSB1cCB0byBzbGlkZXIgcG9zaXRpb25cbiAqICAgLSAqKkFnZ3JlZ2F0ZSoqOiBvdmVyYWxsIHBpcGVsaW5lIHF1YWxpdHkgc2NvcmVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVhbGl0eSA9IG5ldyBRdWFsaXR5UmVjb3JkZXIoKHJ1bnRpbWVTdGFnZUlkLCBjb250ZXh0KSA9PiB7XG4gKiAgIC8vIEN1c3RvbSBzY29yaW5nIGZ1bmN0aW9uIOKAlCByZXR1cm4geyBzY29yZTogMC4w4oCTMS4wLCBmYWN0b3JzPyB9XG4gKiAgIGlmIChjb250ZXh0LnN0YWdlTmFtZS5pbmNsdWRlcygnbGxtJykpIHJldHVybiB7IHNjb3JlOiAwLjcsIGZhY3RvcnM6IFsnbGxtIHN0YWdlJ10gfTtcbiAqICAgcmV0dXJuIHsgc2NvcmU6IDEuMCB9O1xuICogfSk7XG4gKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHF1YWxpdHkpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKCk7XG4gKlxuICogLy8gUGVyLXN0ZXAgc2NvcmVcbiAqIHF1YWxpdHkuZ2V0QnlLZXkoJ2NhbGwtbGxtIzUnKTsgIC8vIHsgc2NvcmU6IDAuNywgc3RhZ2VOYW1lOiAnQ2FsbExMTScsIGZhY3RvcnM6IFsuLi5dIH1cbiAqXG4gKiAvLyBPdmVyYWxsIHF1YWxpdHlcbiAqIHF1YWxpdHkuZ2V0T3ZlcmFsbFNjb3JlKCk7ICAvLyAwLjg1XG4gKlxuICogLy8gTG93ZXN0LXNjb3Jpbmcgc3RlcFxuICogcXVhbGl0eS5nZXRMb3dlc3QoKTsgIC8vIHsgcnVudGltZVN0YWdlSWQ6ICdjYWxsLWxsbSM1JywgZW50cnk6IHsgc2NvcmU6IDAuNywgLi4uIH0gfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWFkRXZlbnQsIFNjb3BlUmVjb3JkZXIsIFN0YWdlRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9LZXllZFN0b3JlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL1JlY29yZGVyT3BlcmF0aW9uLmpzJztcblxuLyoqIFBlci1zdGVwIHF1YWxpdHkgZGF0YSBzdG9yZWQgYnkgUXVhbGl0eVJlY29yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5RW50cnkge1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllci4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogUXVhbGl0eSBzY29yZSBmb3IgdGhpcyBzdGVwICgwLjAgPSB3b3JzdCwgMS4wID0gYmVzdCkuICovXG4gIHNjb3JlOiBudW1iZXI7XG4gIC8qKiBXaGF0IGNvbnRyaWJ1dGVkIHRvIHRoaXMgc2NvcmUuICovXG4gIGZhY3RvcnM6IHN0cmluZ1tdO1xuICAvKiogS2V5cyByZWFkIGR1cmluZyB0aGlzIHN0ZXAgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuICBrZXlzUmVhZDogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdyaXR0ZW4gZHVyaW5nIHRoaXMgc3RlcCAoZm9yIGJhY2t0cmFja2luZykuICovXG4gIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTY29yaW5nIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggc3RhZ2UuXG4gKiBSZWNlaXZlcyB0aGUgcnVudGltZVN0YWdlSWQsIHN0YWdlIGV2ZW50LCBhbmQgYSBzdW1tYXJ5IG9mIHJlYWRzL3dyaXRlcy5cbiAqIFJldHVybiBhIHNjb3JlICgwLjDigJMxLjApIGFuZCBvcHRpb25hbCBmYWN0b3JzIGV4cGxhaW5pbmcgdGhlIHNjb3JlLlxuICovXG5leHBvcnQgdHlwZSBRdWFsaXR5U2NvcmluZ0ZuID0gKFxuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nLFxuICBjb250ZXh0OiB7XG4gICAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gICAgc3RhZ2VJZDogc3RyaW5nO1xuICAgIGtleXNSZWFkOiBzdHJpbmdbXTtcbiAgICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gICAgZHVyYXRpb24/OiBudW1iZXI7XG4gIH0sXG4pID0+IHsgc2NvcmU6IG51bWJlcjsgZmFjdG9ycz86IHN0cmluZ1tdIH07XG5cbi8qKiBPcHRpb25zIGZvciBRdWFsaXR5UmVjb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1YWxpdHlSZWNvcmRlck9wdGlvbnMge1xuICAvKiogU2NvcGVSZWNvcmRlciBJRC4gRGVmYXVsdHMgdG8gYXV0by1pbmNyZW1lbnQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogUHJlZmVycmVkIFVJIG9wZXJhdGlvbi4gRGVmYXVsdHMgdG8gJ2FjY3VtdWxhdGUnIChwcm9ncmVzc2l2ZSBxdWFsaXR5KS4gKi9cbiAgcHJlZmVycmVkT3BlcmF0aW9uPzogUmVjb3JkZXJPcGVyYXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBRdWFsaXR5UmVjb3JkZXIgaW1wbGVtZW50cyBTY29wZVJlY29yZGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2NvdW50ZXIgPSAwO1xuXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWZlcnJlZE9wZXJhdGlvbjogUmVjb3JkZXJPcGVyYXRpb247XG4gIC8qKiAxOjEgcGVyLXN0ZXAgc3RvcmFnZSAoQ29udmVudGlvbiAxIOKAlCBjb21wb3NlZCwgbm90IGluaGVyaXRlZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBuZXcgS2V5ZWRTdG9yZTxRdWFsaXR5RW50cnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcmluZ0ZuOiBRdWFsaXR5U2NvcmluZ0ZuO1xuXG4gIC8vIFBlci1zdGFnZSBidWZmZXJzIChyZXNldCBvbiBlYWNoIHN0YWdlU3RhcnQpXG4gIHByaXZhdGUgY3VycmVudFJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFN0YWdlSWQgPSAnJztcbiAgcHJpdmF0ZSBjdXJyZW50U3RhZ2VOYW1lID0gJyc7XG4gIHByaXZhdGUgY3VycmVudEtleXNSZWFkOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnRLZXlzV3JpdHRlbjogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29yaW5nRm46IFF1YWxpdHlTY29yaW5nRm4sIG9wdGlvbnM/OiBRdWFsaXR5UmVjb3JkZXJPcHRpb25zKSB7XG4gICAgdGhpcy5zY29yaW5nRm4gPSBzY29yaW5nRm47XG4gICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkID8/IGBxdWFsaXR5LSR7KytRdWFsaXR5UmVjb3JkZXIuX2NvdW50ZXJ9YDtcbiAgICB0aGlzLnByZWZlcnJlZE9wZXJhdGlvbiA9IG9wdGlvbnM/LnByZWZlcnJlZE9wZXJhdGlvbiA/PyAnYWNjdW11bGF0ZSc7XG4gIH1cblxuICBvblN0YWdlU3RhcnQoZXZlbnQ6IFN0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9IGV2ZW50LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuY3VycmVudFN0YWdlSWQgPSBldmVudC5zdGFnZUlkO1xuICAgIHRoaXMuY3VycmVudFN0YWdlTmFtZSA9IGV2ZW50LnN0YWdlTmFtZTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzUmVhZCA9IFtdO1xuICAgIHRoaXMuY3VycmVudEtleXNXcml0dGVuID0gW107XG4gIH1cblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkpIHRoaXMuY3VycmVudEtleXNSZWFkLnB1c2goZXZlbnQua2V5KTtcbiAgfVxuXG4gIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbi5wdXNoKGV2ZW50LmtleSk7XG4gIH1cblxuICBvblN0YWdlRW5kKGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29yZSwgZmFjdG9ycyB9ID0gdGhpcy5zY29yaW5nRm4odGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5jdXJyZW50U3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5jdXJyZW50U3RhZ2VJZCxcbiAgICAgIGtleXNSZWFkOiB0aGlzLmN1cnJlbnRLZXlzUmVhZCxcbiAgICAgIGtleXNXcml0dGVuOiB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbixcbiAgICAgIGR1cmF0aW9uOiBldmVudC5kdXJhdGlvbixcbiAgICB9KTtcblxuICAgIHRoaXMuc3RvcmUuc2V0KHRoaXMuY3VycmVudFJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuY3VycmVudFN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuY3VycmVudFN0YWdlSWQsXG4gICAgICBzY29yZTogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc2NvcmUpKSxcbiAgICAgIGZhY3RvcnM6IGZhY3RvcnMgPz8gW10sXG4gICAgICBrZXlzUmVhZDogWy4uLnRoaXMuY3VycmVudEtleXNSZWFkXSxcbiAgICAgIGtleXNXcml0dGVuOiBbLi4udGhpcy5jdXJyZW50S2V5c1dyaXR0ZW5dLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBlci1zdGVwIHF1ZXJ5IEFQSSAoZGVsZWdhdGVzIHRvIHRoZSBjb21wb3NlZCBzdG9yZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRyYW5zbGF0ZTogcXVhbGl0eSBlbnRyeSBmb3IgYSBzcGVjaWZpYyBydW50aW1lU3RhZ2VJZC4gKi9cbiAgZ2V0QnlLZXkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFF1YWxpdHlFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBBbGwgcGVyLXN0ZXAgcXVhbGl0eSBlbnRyaWVzIGFzIGEgcmVhZC1vbmx5IE1hcCAoaW5zZXJ0aW9uLW9yZGVyZWQpLiAqL1xuICBnZXRNYXAoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBRdWFsaXR5RW50cnk+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRNYXAoKTtcbiAgfVxuXG4gIC8qKiBBbGwgcGVyLXN0ZXAgcXVhbGl0eSBlbnRyaWVzIChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIHZhbHVlcygpOiBRdWFsaXR5RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUudmFsdWVzKCk7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIHNjb3JlZCBzdGVwcy4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqIEFnZ3JlZ2F0ZTogcmVkdWNlIEFMTCBzY29yZWQgc3RlcHMgdG8gYSBzaW5nbGUgdmFsdWUuICovXG4gIGFnZ3JlZ2F0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFF1YWxpdHlFbnRyeSwga2V5OiBzdHJpbmcpID0+IFIsIGluaXRpYWw6IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5hZ2dyZWdhdGUoZm4sIGluaXRpYWwpO1xuICB9XG5cbiAgLyoqIEFjY3VtdWxhdGU6IHJlZHVjZSBzY29yZWQgc3RlcHMgdXAgdG8gYSBzbGlkZXIgcG9zaXRpb24uICovXG4gIGFjY3VtdWxhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBRdWFsaXR5RW50cnksIGtleTogc3RyaW5nKSA9PiBSLCBpbml0aWFsOiBSLCBrZXlzPzogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmFjY3VtdWxhdGUoZm4sIGluaXRpYWwsIGtleXMpO1xuICB9XG5cbiAgLyoqIE92ZXJhbGwgcXVhbGl0eSBzY29yZSDigJQgYXZlcmFnZSBvZiBhbGwgc3RlcCBzY29yZXMuICovXG4gIGdldE92ZXJhbGxTY29yZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnN0b3JlLnNpemUgPT09IDApIHJldHVybiAxLjA7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnN0b3JlLmFnZ3JlZ2F0ZSgoc3VtLCBlKSA9PiBzdW0gKyBlLnNjb3JlLCAwKTtcbiAgICByZXR1cm4gdG90YWwgLyB0aGlzLnN0b3JlLnNpemU7XG4gIH1cblxuICAvKiogRmluZCB0aGUgbG93ZXN0LXNjb3Jpbmcgc3RlcC4gKi9cbiAgZ2V0TG93ZXN0KCk6IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgZW50cnk6IFF1YWxpdHlFbnRyeSB9IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG93ZXN0OiB7IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7IGVudHJ5OiBRdWFsaXR5RW50cnkgfSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmdldE1hcCgpKSB7XG4gICAgICBpZiAoIWxvd2VzdCB8fCBlbnRyeS5zY29yZSA8IGxvd2VzdC5lbnRyeS5zY29yZSkge1xuICAgICAgICBsb3dlc3QgPSB7IHJ1bnRpbWVTdGFnZUlkOiBrZXksIGVudHJ5IH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3dlc3Q7XG4gIH1cblxuICAvKiogUHJvZ3Jlc3NpdmUgcXVhbGl0eSBzY29yZSB1cCB0byBhIHNsaWRlciBwb3NpdGlvbi4gKi9cbiAgZ2V0U2NvcmVVcFRvKHZpc2libGVLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+KTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5zdG9yZS5hY2N1bXVsYXRlKFxuICAgICAgKHN1bSwgZSkgPT4ge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm4gc3VtICsgZS5zY29yZTtcbiAgICAgIH0sXG4gICAgICAwLFxuICAgICAgdmlzaWJsZUtleXMsXG4gICAgKTtcbiAgICByZXR1cm4gY291bnQgPT09IDAgPyAxLjAgOiB0b3RhbCAvIGNvdW50O1xuICB9XG5cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBzdGVwczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnN0b3JlLmdldE1hcCgpKSB7XG4gICAgICBzdGVwc1trZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnUXVhbGl0eScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1F1YWxpdHkgc2NvcmVzIHBlciBleGVjdXRpb24gc3RlcCB3aXRoIGJhY2t0cmFja2luZyBzdXBwb3J0JyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogdGhpcy5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIG51bWVyaWNGaWVsZDogJ3Njb3JlJyxcbiAgICAgICAgb3ZlcmFsbFNjb3JlOiB0aGlzLmdldE92ZXJhbGxTY29yZSgpLFxuICAgICAgICBsb3dlc3RTdGVwOiB0aGlzLmdldExvd2VzdCgpPy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQgPSAnJztcbiAgICB0aGlzLmN1cnJlbnRTdGFnZUlkID0gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhZ2VOYW1lID0gJyc7XG4gICAgdGhpcy5jdXJyZW50S2V5c1JlYWQgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbiA9IFtdO1xuICB9XG59XG4iXX0=
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVhbGl0eVJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUtILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUF1RDdDLE1BQU0sT0FBTyxlQUFlO0lBQ2xCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLEVBQUUsQ0FBUztJQUNYLGtCQUFrQixDQUFvQjtJQUMvQyxxRUFBcUU7SUFDcEQsS0FBSyxHQUFHLElBQUksVUFBVSxFQUFnQixDQUFDO0lBQ3ZDLFNBQVMsQ0FBbUI7SUFFN0M7Ozs7O09BS0c7SUFDYyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDeEQsMkVBQTJFO0lBQzFELFdBQVcsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFFdkQsWUFBWSxTQUEyQixFQUFFLE9BQWdDO1FBQ3ZFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsSUFBSSxXQUFXLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLElBQUksWUFBWSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBaUI7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN0QyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsU0FBUyxFQUFFLEtBQUssQ0FB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QWtCO1lBQzNDLElBQUksRUFBRTtnQkFDSixZQUFZLEVBQUUsT0FBTztnQkFDckIsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsY0FBYztnQkFDNUMsS0FBSzthQUNOO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVhbGl0eVJlY29yZGVyIOKAlCBwZXItc3RlcCBxdWFsaXR5IHNjb3Jpbmcga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQ29sbGVjdHMgcXVhbGl0eSBzY29yZXMgZHVyaW5nIHRyYXZlcnNhbCAoYWNjdW11bGF0ZSBwYXR0ZXJuKS5cbiAqIEFmdGVyIGV4ZWN1dGlvbiwgdXNlIHF1YWxpdHlUcmFjZSgpIHRvIGJhY2t0cmFjayBmcm9tIGFueSBsb3ctc2NvcmluZyBzdGVwLlxuICpcbiAqIENvbXBvc2VzIGEgYEtleWVkU3RvcmU8UXVhbGl0eUVudHJ5PmAgZm9yIE8oMSkgbG9va3VwIGFuZCBzdGFuZGFyZCBvcGVyYXRpb25zXG4gKiAoQ29udmVudGlvbiAxIOKAlCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpOlxuICogICAtICoqVHJhbnNsYXRlKio6IGBnZXRCeUtleSgnY2FsbC1sbG0jNScpYCDigJQgcXVhbGl0eSBhdCB0aGlzIHN0ZXBcbiAqICAgLSAqKkFjY3VtdWxhdGUqKjogcHJvZ3Jlc3NpdmUgcXVhbGl0eSB1cCB0byBzbGlkZXIgcG9zaXRpb25cbiAqICAgLSAqKkFnZ3JlZ2F0ZSoqOiBvdmVyYWxsIHBpcGVsaW5lIHF1YWxpdHkgc2NvcmVcbiAqXG4gKiBBdHRlbXB0cyAoMTAuMSk6IGEgc3RhZ2Ugd2hvc2UgcmV0cnkgc2VyaWVzIEdBVkUgVVAgKGV4aGF1c3RlZCwgZGVjbGluZWQsXG4gKiBubyB0aW1lIGxlZnQpIG9yIFRJTUVEIE9VVCBpcyBhIHF1YWxpdHkgZHJvcCBhdCB0aGF0IHN0YWdlIOKAlCBgZHJvcDpcbiAqICdhdHRlbXB0cydgLCB3aXRoIHRoZSBzZXJpZXMnIGBhdHRlbXB0c2Agc3VtbWFyeSBhbmQgYSBmYWN0b3IgbmFtaW5nIHdoeS5cbiAqIEEgc2VyaWVzIHRoYXQgZ2F2ZSB1cCBuZXZlciByZWFjaGVkIGBvblN0YWdlRW5kYCAodGhlIHN0YWdlIGZhaWxlZCksIHNvIHRoZVxuICogcmVjb3JkZXIgc2NvcmVzIGl0IGl0c2VsZjogYDBgLCB0aGUgZmxvb3IsIHdpdGggdGhlIGtleXMgaXRzIGxhc3QgYXR0ZW1wdFxuICogcmVhZCDigJQgd2hpY2ggaXMgd2hhdCBgcXVhbGl0eVRyYWNlKClgIHdhbGtzIHRvIHBhaXIgdGhlIGRyb3Agd2l0aCBpdHNcbiAqIGNhdXNhbCBwYXJlbnRzLiBBIHNlcmllcyB0aGF0IHRpbWVkIG91dCBhbmQgcmVjb3ZlcmVkIGtlZXBzIHRoZSBzY29yaW5nXG4gKiBmdW5jdGlvbidzIHNjb3JlIGFuZCBnYWlucyB0aGUgZmxhZy4gQXR0ZW1wdHMgcmVhY2ggYSByZWNvcmRlciBvbiB0aGUgRkxPV1xuICogY2hhbm5lbCAoYG9uQXR0ZW1wdGApOiBhdHRhY2ggd2l0aCBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdG8gc2VlIHRoZW0g4oCUXG4gKiBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgc2NvcmVzIGV4YWN0bHkgYXMgYmVmb3JlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBxdWFsaXR5ID0gbmV3IFF1YWxpdHlSZWNvcmRlcigocnVudGltZVN0YWdlSWQsIGNvbnRleHQpID0+IHtcbiAqICAgLy8gQ3VzdG9tIHNjb3JpbmcgZnVuY3Rpb24g4oCUIHJldHVybiB7IHNjb3JlOiAwLjDigJMxLjAsIGZhY3RvcnM/IH1cbiAqICAgaWYgKGNvbnRleHQuc3RhZ2VOYW1lLmluY2x1ZGVzKCdsbG0nKSkgcmV0dXJuIHsgc2NvcmU6IDAuNywgZmFjdG9yczogWydsbG0gc3RhZ2UnXSB9O1xuICogICByZXR1cm4geyBzY29yZTogMS4wIH07XG4gKiB9KTtcbiAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIocXVhbGl0eSk7XG4gKiBhd2FpdCBleGVjdXRvci5ydW4oKTtcbiAqXG4gKiAvLyBQZXItc3RlcCBzY29yZVxuICogcXVhbGl0eS5nZXRCeUtleSgnY2FsbC1sbG0jNScpOyAgLy8geyBzY29yZTogMC43LCBzdGFnZU5hbWU6ICdDYWxsTExNJywgZmFjdG9yczogWy4uLl0gfVxuICpcbiAqIC8vIE92ZXJhbGwgcXVhbGl0eVxuICogcXVhbGl0eS5nZXRPdmVyYWxsU2NvcmUoKTsgIC8vIDAuODVcbiAqXG4gKiAvLyBMb3dlc3Qtc2NvcmluZyBzdGVwXG4gKiBxdWFsaXR5LmdldExvd2VzdCgpOyAgLy8geyBydW50aW1lU3RhZ2VJZDogJ2NhbGwtbGxtIzUnLCBlbnRyeTogeyBzY29yZTogMC43LCAuLi4gfSB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRTdW1tYXJ5IH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dBdHRlbXB0RXZlbnQgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBTY29wZVJlY29yZGVyLCBTdGFnZUV2ZW50LCBXcml0ZUV2ZW50IH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgQXR0ZW1wdFNlcmllc0Jvb2ssIGdhdmVVcCB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5pbXBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9LZXllZFN0b3JlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL1JlY29yZGVyT3BlcmF0aW9uLmpzJztcblxuLyoqIFBlci1zdGVwIHF1YWxpdHkgZGF0YSBzdG9yZWQgYnkgUXVhbGl0eVJlY29yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5RW50cnkge1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllci4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogUXVhbGl0eSBzY29yZSBmb3IgdGhpcyBzdGVwICgwLjAgPSB3b3JzdCwgMS4wID0gYmVzdCkuICovXG4gIHNjb3JlOiBudW1iZXI7XG4gIC8qKiBXaGF0IGNvbnRyaWJ1dGVkIHRvIHRoaXMgc2NvcmUuICovXG4gIGZhY3RvcnM6IHN0cmluZ1tdO1xuICAvKiogS2V5cyByZWFkIGR1cmluZyB0aGlzIHN0ZXAgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuICBrZXlzUmVhZDogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdyaXR0ZW4gZHVyaW5nIHRoaXMgc3RlcCAoZm9yIGJhY2t0cmFja2luZykuICovXG4gIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbiAgLyoqIFByZXNlbnQgd2hlbiB0aGUgc3RlcCdzIHJldHJ5IHNlcmllcyBnYXZlIHVwIG9yIHRpbWVkIG91dCDigJQgYSBxdWFsaXR5IGRyb3AgYnkgYXR0ZW1wdHMgKDEwLjEpLiAqL1xuICBkcm9wPzogJ2F0dGVtcHRzJztcbiAgLyoqIFdpdGggYGRyb3BgOiB0aGUgc2VyaWVzIGF0IGEgZ2xhbmNlLiAqL1xuICBhdHRlbXB0cz86IEF0dGVtcHRTdW1tYXJ5O1xufVxuXG4vKipcbiAqIFNjb3JpbmcgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBzdGFnZS5cbiAqIFJlY2VpdmVzIHRoZSBydW50aW1lU3RhZ2VJZCwgc3RhZ2UgZXZlbnQsIGFuZCBhIHN1bW1hcnkgb2YgcmVhZHMvd3JpdGVzLlxuICogUmV0dXJuIGEgc2NvcmUgKDAuMOKAkzEuMCkgYW5kIG9wdGlvbmFsIGZhY3RvcnMgZXhwbGFpbmluZyB0aGUgc2NvcmUuXG4gKi9cbmV4cG9ydCB0eXBlIFF1YWxpdHlTY29yaW5nRm4gPSAoXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsXG4gIGNvbnRleHQ6IHtcbiAgICBzdGFnZU5hbWU6IHN0cmluZztcbiAgICBzdGFnZUlkOiBzdHJpbmc7XG4gICAga2V5c1JlYWQ6IHN0cmluZ1tdO1xuICAgIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbiAgICBkdXJhdGlvbj86IG51bWJlcjtcbiAgfSxcbikgPT4geyBzY29yZTogbnVtYmVyOyBmYWN0b3JzPzogc3RyaW5nW10gfTtcblxuLyoqIE9uZSBleGVjdXRpb24gYmV0d2VlbiBpdHMgYG9uU3RhZ2VTdGFydGAgYW5kIGl0cyBgb25TdGFnZUVuZGAgKG9yIHRoZSBkcm9wIHRoYXQgc2NvcmVzIGl0KS4gKi9cbmludGVyZmFjZSBJbkZsaWdodCB7XG4gIHJlYWRvbmx5IHN0YWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtleXNSZWFkOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgUXVhbGl0eVJlY29yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgSUQuIERlZmF1bHRzIHRvIGF1dG8taW5jcmVtZW50LiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCBVSSBvcGVyYXRpb24uIERlZmF1bHRzIHRvICdhY2N1bXVsYXRlJyAocHJvZ3Jlc3NpdmUgcXVhbGl0eSkuICovXG4gIHByZWZlcnJlZE9wZXJhdGlvbj86IFJlY29yZGVyT3BlcmF0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUXVhbGl0eVJlY29yZGVyIGltcGxlbWVudHMgU2NvcGVSZWNvcmRlciB7XG4gIHByaXZhdGUgc3RhdGljIF9jb3VudGVyID0gMDtcblxuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBwcmVmZXJyZWRPcGVyYXRpb246IFJlY29yZGVyT3BlcmF0aW9uO1xuICAvKiogMToxIHBlci1zdGVwIHN0b3JhZ2UgKENvbnZlbnRpb24gMSDigJQgY29tcG9zZWQsIG5vdCBpbmhlcml0ZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gbmV3IEtleWVkU3RvcmU8UXVhbGl0eUVudHJ5PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjb3JpbmdGbjogUXVhbGl0eVNjb3JpbmdGbjtcblxuICAvKipcbiAgICogRWFjaCBleGVjdXRpb24gaW4gZmxpZ2h0LCBieSBpdHMgT1dOIHJ1bnRpbWVTdGFnZUlkICgxMC4xKSDigJQgZXZlcnkgZXZlbnQgb3ducyBpdHMgYXR0cmlidXRpb24sIHNvIHBhcmFsbGVsXG4gICAqIHNpYmxpbmdzIG5ldmVyIHNjb3JlIHVuZGVyIGVhY2ggb3RoZXIncyBpZCBvciB3aXRoIGVhY2ggb3RoZXIncyBrZXlzICh1bnRpbCAxMC4wIG9uZSBzaGFyZWQgXCJjdXJyZW50IHN0YWdlXCJcbiAgICogYnVmZmVyIGRpZCkuIEEgcmV0cmllZCBleGVjdXRpb24ncyBlbnRyeSByZXN0YXJ0cyB3aXRoIGVhY2ggYXR0ZW1wdDogYSBzZXJpZXMgdGhhdCBnYXZlIHVwIGlzIHNjb3JlZCB3aXRoIHRoZVxuICAgKiBrZXlzIGl0cyBsYXN0IGF0dGVtcHQgdG91Y2hlZC4gUmVsZWFzZWQgYXQgdGhlIHN0YWdlJ3MgZW5kLCBvciB3aGVuIGEgZHJvcCBjb25zdW1lcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgSW5GbGlnaHQ+KCk7XG4gIC8qKiBQZXItc2VyaWVzIHRhbGxpZXMgb2YgdGhlIHNlcmllcyB0aGF0IHJldHJpZWQsIGdhdmUgdXAgb3IgdGltZWQgb3V0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGVtcHRCb29rID0gbmV3IEF0dGVtcHRTZXJpZXNCb29rKCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcmluZ0ZuOiBRdWFsaXR5U2NvcmluZ0ZuLCBvcHRpb25zPzogUXVhbGl0eVJlY29yZGVyT3B0aW9ucykge1xuICAgIHRoaXMuc2NvcmluZ0ZuID0gc2NvcmluZ0ZuO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCA/PyBgcXVhbGl0eS0keysrUXVhbGl0eVJlY29yZGVyLl9jb3VudGVyfWA7XG4gICAgdGhpcy5wcmVmZXJyZWRPcGVyYXRpb24gPSBvcHRpb25zPy5wcmVmZXJyZWRPcGVyYXRpb24gPz8gJ2FjY3VtdWxhdGUnO1xuICB9XG5cbiAgb25TdGFnZVN0YXJ0KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pbkZsaWdodC5zZXQoZXZlbnQucnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIGtleXNSZWFkOiBbXSxcbiAgICAgIGtleXNXcml0dGVuOiBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUmVhZChldmVudDogUmVhZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSkgdGhpcy5pbkZsaWdodC5nZXQoZXZlbnQucnVudGltZVN0YWdlSWQpPy5rZXlzUmVhZC5wdXNoKGV2ZW50LmtleSk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pbkZsaWdodC5nZXQoZXZlbnQucnVudGltZVN0YWdlSWQpPy5rZXlzV3JpdHRlbi5wdXNoKGV2ZW50LmtleSk7XG4gIH1cblxuICBvblN0YWdlRW5kKGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBldmVudC5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5pbkZsaWdodC5nZXQoaWQpID8/IHtcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIGtleXNSZWFkOiBbXSxcbiAgICAgIGtleXNXcml0dGVuOiBbXSxcbiAgICB9O1xuICAgIHRoaXMuaW5GbGlnaHQuZGVsZXRlKGlkKTtcbiAgICBjb25zdCB7IHNjb3JlLCBmYWN0b3JzIH0gPSB0aGlzLnNjb3JpbmdGbihpZCwge1xuICAgICAgc3RhZ2VOYW1lOiBzdGVwLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHN0ZXAuc3RhZ2VJZCxcbiAgICAgIGtleXNSZWFkOiBzdGVwLmtleXNSZWFkLFxuICAgICAga2V5c1dyaXR0ZW46IHN0ZXAua2V5c1dyaXR0ZW4sXG4gICAgICBkdXJhdGlvbjogZXZlbnQuZHVyYXRpb24sXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JlLnNldChpZCwge1xuICAgICAgc3RhZ2VOYW1lOiBzdGVwLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHN0ZXAuc3RhZ2VJZCxcbiAgICAgIHNjb3JlOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBzY29yZSkpLFxuICAgICAgZmFjdG9yczogZmFjdG9ycyA/PyBbXSxcbiAgICAgIGtleXNSZWFkOiBbLi4uc3RlcC5rZXlzUmVhZF0sXG4gICAgICBrZXlzV3JpdHRlbjogWy4uLnN0ZXAua2V5c1dyaXR0ZW5dLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2VyaWVzIHRoYXQgZW5kZWQgYWZ0ZXIgZ2l2aW5nIHVwIG9yIHRpbWluZyBvdXQgaXMgYSBkcm9wIGF0IGl0cyBzdGFnZS4gYG9uQXR0ZW1wdGAgZm9yIHRoZSBsYXN0IGF0dGVtcHRcbiAgICogZmlyZXMgYWZ0ZXIgdGhhdCBhdHRlbXB0J3MgYG9uU3RhZ2VFbmRgICh3aGVuIGl0IHJldHVybmVkKSwgc28gYSByZWNvdmVyZWQgc2VyaWVzIGFtZW5kcyB0aGUgc2NvcmVkIGVudHJ5OyBhXG4gICAqIHNlcmllcyB0aGF0IGdhdmUgdXAgaGFzIG5vbmUsIGFuZCBpcyBzY29yZWQgaGVyZS5cbiAgICovXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBldmVudDtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYXR0ZW1wdEJvb2suYWRkKHJlY29yZCk7XG4gICAgY29uc3Qgc3VtbWFyeSA9IHN0YXRlPy5zdW1tYXJ5O1xuICAgIGlmICghc3VtbWFyeSB8fCAoc3VtbWFyeS50aW1lb3V0ID09PSAwICYmICFnYXZlVXAocmVjb3JkKSkpIHJldHVybjtcbiAgICBjb25zdCBmYWN0b3IgPSBnYXZlVXAocmVjb3JkKVxuICAgICAgPyBgYXR0ZW1wdHM6IGdhdmUgdXAgKCR7W3JlY29yZC5yZWFzb24sIHJlY29yZC5jYXRlZ29yeV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyl9KSBhZnRlciAke1xuICAgICAgICAgIHJlY29yZC5hdHRlbXB0XG4gICAgICAgIH0gb2YgJHtyZWNvcmQub2YgPz8gcmVjb3JkLmF0dGVtcHR9YFxuICAgICAgOiBgYXR0ZW1wdHM6ICR7c3VtbWFyeS50aW1lb3V0fSBvZiAke3N1bW1hcnkuY291bnR9IHRpbWVkIG91dGA7XG4gICAgY29uc3Qgc2NvcmVkID0gdGhpcy5zdG9yZS5nZXQocmVjb3JkLnNlcmllcyk7XG4gICAgaWYgKHNjb3JlZCkge1xuICAgICAgdGhpcy5zdG9yZS5zZXQocmVjb3JkLnNlcmllcywge1xuICAgICAgICAuLi5zY29yZWQsXG4gICAgICAgIGZhY3RvcnM6IFsuLi5zY29yZWQuZmFjdG9ycywgZmFjdG9yXSxcbiAgICAgICAgZHJvcDogJ2F0dGVtcHRzJyxcbiAgICAgICAgYXR0ZW1wdHM6IHN1bW1hcnksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuaW5GbGlnaHQuZ2V0KHJlY29yZC5zZXJpZXMpO1xuICAgIHRoaXMuaW5GbGlnaHQuZGVsZXRlKHJlY29yZC5zZXJpZXMpO1xuICAgIHRoaXMuc3RvcmUuc2V0KHJlY29yZC5zZXJpZXMsIHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHNjb3JlOiAwLFxuICAgICAgZmFjdG9yczogW2ZhY3Rvcl0sXG4gICAgICBrZXlzUmVhZDogc3RlcCA/IFsuLi5zdGVwLmtleXNSZWFkXSA6IFtdLFxuICAgICAga2V5c1dyaXR0ZW46IHN0ZXAgPyBbLi4uc3RlcC5rZXlzV3JpdHRlbl0gOiBbXSxcbiAgICAgIGRyb3A6ICdhdHRlbXB0cycsXG4gICAgICBhdHRlbXB0czogc3VtbWFyeSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc3RlcCBxdWVyeSBBUEkgKGRlbGVnYXRlcyB0byB0aGUgY29tcG9zZWQgc3RvcmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUcmFuc2xhdGU6IHF1YWxpdHkgZW50cnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBRdWFsaXR5RW50cnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogQWxsIHBlci1zdGVwIHF1YWxpdHkgZW50cmllcyBhcyBhIHJlYWQtb25seSBNYXAgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgZ2V0TWFwKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgUXVhbGl0eUVudHJ5PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0TWFwKCk7XG4gIH1cblxuICAvKiogQWxsIHBlci1zdGVwIHF1YWxpdHkgZW50cmllcyAoaW5zZXJ0aW9uLW9yZGVyZWQpLiAqL1xuICB2YWx1ZXMoKTogUXVhbGl0eUVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnZhbHVlcygpO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBzY29yZWQgc3RlcHMuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKiBBZ2dyZWdhdGU6IHJlZHVjZSBBTEwgc2NvcmVkIHN0ZXBzIHRvIGEgc2luZ2xlIHZhbHVlLiAqL1xuICBhZ2dyZWdhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBRdWFsaXR5RW50cnksIGtleTogc3RyaW5nKSA9PiBSLCBpbml0aWFsOiBSKTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWdncmVnYXRlKGZuLCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKiBBY2N1bXVsYXRlOiByZWR1Y2Ugc2NvcmVkIHN0ZXBzIHVwIHRvIGEgc2xpZGVyIHBvc2l0aW9uLiAqL1xuICBhY2N1bXVsYXRlPFI+KGZuOiAoYWNjOiBSLCBlbnRyeTogUXVhbGl0eUVudHJ5LCBrZXk6IHN0cmluZykgPT4gUiwgaW5pdGlhbDogUiwga2V5cz86IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBSIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5hY2N1bXVsYXRlKGZuLCBpbml0aWFsLCBrZXlzKTtcbiAgfVxuXG4gIC8qKiBPdmVyYWxsIHF1YWxpdHkgc2NvcmUg4oCUIGF2ZXJhZ2Ugb2YgYWxsIHN0ZXAgc2NvcmVzLiAqL1xuICBnZXRPdmVyYWxsU2NvcmUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zdG9yZS5zaXplID09PSAwKSByZXR1cm4gMS4wO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5zdG9yZS5hZ2dyZWdhdGUoKHN1bSwgZSkgPT4gc3VtICsgZS5zY29yZSwgMCk7XG4gICAgcmV0dXJuIHRvdGFsIC8gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxvd2VzdC1zY29yaW5nIHN0ZXAuICovXG4gIGdldExvd2VzdCgpOiB7IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7IGVudHJ5OiBRdWFsaXR5RW50cnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvd2VzdDogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBlbnRyeTogUXVhbGl0eUVudHJ5IH0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5nZXRNYXAoKSkge1xuICAgICAgaWYgKCFsb3dlc3QgfHwgZW50cnkuc2NvcmUgPCBsb3dlc3QuZW50cnkuc2NvcmUpIHtcbiAgICAgICAgbG93ZXN0ID0geyBydW50aW1lU3RhZ2VJZDoga2V5LCBlbnRyeSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG93ZXN0O1xuICB9XG5cbiAgLyoqIFByb2dyZXNzaXZlIHF1YWxpdHkgc2NvcmUgdXAgdG8gYSBzbGlkZXIgcG9zaXRpb24uICovXG4gIGdldFNjb3JlVXBUbyh2aXNpYmxlS2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuc3RvcmUuYWNjdW11bGF0ZShcbiAgICAgIChzdW0sIGUpID0+IHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIHN1bSArIGUuc2NvcmU7XG4gICAgICB9LFxuICAgICAgMCxcbiAgICAgIHZpc2libGVLZXlzLFxuICAgICk7XG4gICAgcmV0dXJuIGNvdW50ID09PSAwID8gMS4wIDogdG90YWwgLyBjb3VudDtcbiAgfVxuXG4gIHRvU25hcHNob3QoKSB7XG4gICAgY29uc3Qgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zdG9yZS5nZXRNYXAoKSkge1xuICAgICAgc3RlcHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ1F1YWxpdHknLFxuICAgICAgZGVzY3JpcHRpb246ICdRdWFsaXR5IHNjb3JlcyBwZXIgZXhlY3V0aW9uIHN0ZXAgd2l0aCBiYWNrdHJhY2tpbmcgc3VwcG9ydCcsXG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHRoaXMucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgZGF0YToge1xuICAgICAgICBudW1lcmljRmllbGQ6ICdzY29yZScsXG4gICAgICAgIG92ZXJhbGxTY29yZTogdGhpcy5nZXRPdmVyYWxsU2NvcmUoKSxcbiAgICAgICAgbG93ZXN0U3RlcDogdGhpcy5nZXRMb3dlc3QoKT8ucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5jbGVhcigpO1xuICAgIHRoaXMuaW5GbGlnaHQuY2xlYXIoKTtcbiAgICB0aGlzLmF0dGVtcHRCb29rLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -15,10 +15,16 @@
|
|
|
15
15
|
* three primitive channels, one live graph, queryable at any moment during
|
|
16
16
|
* or after a run.
|
|
17
17
|
*
|
|
18
|
-
* What it records —
|
|
18
|
+
* What it records — FOUR node kinds for complete composition coverage:
|
|
19
19
|
* 1. 'subflow' — via onSubflowEntry (a mounted subflow boundary)
|
|
20
20
|
* 2. 'fork-branch' — via onFork (one node per child, synthesized)
|
|
21
21
|
* 3. 'decision-branch' — via onDecision (the chosen branch, synthesized)
|
|
22
|
+
* 4. 'attempt-series' — via onAttempt (10.1): a stage execution that
|
|
23
|
+
* RETRIED, GAVE UP or TIMED OUT (`recorder/attemptSeries.ts · isRetryEvidence`), with its
|
|
24
|
+
* `attemptSummary` and its ordered `attempts`. A retry is a loop, so each
|
|
25
|
+
* retry decision is a self-edge of kind 'retry' on the node — the way
|
|
26
|
+
* onLoop draws 'loop-iteration'. A stage that ran once (with or without a
|
|
27
|
+
* policy) is no node, as before.
|
|
22
28
|
*
|
|
23
29
|
* When a fork-branch or decision-branch target IS ALSO a subflow, the
|
|
24
30
|
* subsequent onSubflowEntry creates a subflow CHILD of the synthetic node.
|
|
@@ -48,11 +54,13 @@
|
|
|
48
54
|
* topo.getSubflowNodes(); // only mounted subflows
|
|
49
55
|
* ```
|
|
50
56
|
*/
|
|
51
|
-
import type {
|
|
57
|
+
import type { AttemptSummary } from '../attempt/types.js';
|
|
58
|
+
import type { FlowAttemptEvent, FlowDecisionEvent, FlowForkEvent, FlowLoopEvent, FlowRecorder, FlowSubflowEvent } from '../engine/narrative/types.js';
|
|
59
|
+
import type { AttemptRef } from './attemptSeries.js';
|
|
52
60
|
/** The kind of composition unit a node represents. */
|
|
53
|
-
export type TopologyNodeKind = 'subflow' | 'fork-branch' | 'decision-branch';
|
|
61
|
+
export type TopologyNodeKind = 'subflow' | 'fork-branch' | 'decision-branch' | 'attempt-series';
|
|
54
62
|
/** How the traversal reached this node — drives consumer layout decisions. */
|
|
55
|
-
export type TopologyIncomingKind = 'root' | 'next' | 'fork-branch' | 'decision-branch' | 'loop-iteration';
|
|
63
|
+
export type TopologyIncomingKind = 'root' | 'next' | 'fork-branch' | 'decision-branch' | 'loop-iteration' | 'retry';
|
|
56
64
|
/** A composition-significant point in the graph. */
|
|
57
65
|
export interface TopologyNode {
|
|
58
66
|
/** Unique id. Subflows use their subflowId (with `#n` suffix on re-entry).
|
|
@@ -76,8 +84,16 @@ export interface TopologyNode {
|
|
|
76
84
|
/** runtimeStageId when the corresponding subflow exited. Only meaningful
|
|
77
85
|
* for kind='subflow'; fork/decision-branch nodes are instantaneous. */
|
|
78
86
|
exitedAt?: string;
|
|
79
|
-
/** Kind-specific extras: forkParent, decider, rationale, description. */
|
|
87
|
+
/** Kind-specific extras: forkParent, decider, rationale, description; stageId for an attempt series. */
|
|
80
88
|
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
89
|
+
/**
|
|
90
|
+
* kind='attempt-series' only: the series at a glance — equal to the stage's
|
|
91
|
+
* `StageSnapshot.attemptSummary`. Absent while the series is in flight (or
|
|
92
|
+
* when the run's signal cut its wait: no record says how it ended).
|
|
93
|
+
*/
|
|
94
|
+
readonly attemptSummary?: AttemptSummary;
|
|
95
|
+
/** kind='attempt-series' only: the series' attempts, in order. */
|
|
96
|
+
readonly attempts?: readonly AttemptRef[];
|
|
81
97
|
}
|
|
82
98
|
/** A traversal transition between two nodes. */
|
|
83
99
|
export interface TopologyEdge {
|
|
@@ -135,12 +151,26 @@ export declare class TopologyRecorder implements FlowRecorder {
|
|
|
135
151
|
* TopologyRecorder is supposed to expose.
|
|
136
152
|
*/
|
|
137
153
|
private readonly previousSubflowInScope;
|
|
154
|
+
/** Open subflow node id by its path-prefixed subflowId — where a stage's attempt series hangs. */
|
|
155
|
+
private readonly openSubflowByPath;
|
|
156
|
+
/** Per-series tallies of the series that are evidence (retried, gave up or timed out). */
|
|
157
|
+
private readonly attemptBook;
|
|
138
158
|
constructor(options?: TopologyRecorderOptions);
|
|
139
159
|
onSubflowEntry(event: FlowSubflowEvent): void;
|
|
140
160
|
onSubflowExit(event: FlowSubflowEvent): void;
|
|
141
161
|
onFork(event: FlowForkEvent): void;
|
|
142
162
|
onDecision(event: FlowDecisionEvent): void;
|
|
143
163
|
onLoop(event: FlowLoopEvent): void;
|
|
164
|
+
onAttempt(event: FlowAttemptEvent): void;
|
|
165
|
+
/**
|
|
166
|
+
* A new series node, under its parent: the pending fork-branch / decision-
|
|
167
|
+
* branch of the same name (a fork child or a chosen branch that is a plain
|
|
168
|
+
* stage), else the open subflow the stage runs in (read off its
|
|
169
|
+
* runtimeStageId — the stack top can be a parallel sibling), else the top
|
|
170
|
+
* level. One edge from
|
|
171
|
+
* the parent, as for every composition child.
|
|
172
|
+
*/
|
|
173
|
+
private placeSeries;
|
|
144
174
|
/** Called by the executor before each `run()` — resets all state. */
|
|
145
175
|
clear(): void;
|
|
146
176
|
/** Live snapshot of the composition graph. Safe during or after a run. */
|