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
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/** P7: one bounded, payload-free metric projection collected from traversal hooks. */
|
|
2
|
+
import { parseAttemptId } from 'foottrace';
|
|
3
|
+
import { matchesQuery, metricRow, metricWindow, ownDataRecord } from './attemptMetricRows.js';
|
|
4
|
+
import { aggregateAttempts, attemptRowKey, logicalKey, worst } from './attemptMetrics.js';
|
|
5
|
+
import { attemptOTel } from './attemptOTel.js';
|
|
6
|
+
import { KeyedStore } from './KeyedStore.js';
|
|
7
|
+
function option(value, fallback, max, name, zero = false) {
|
|
8
|
+
const n = value ?? fallback;
|
|
9
|
+
if (!Number.isSafeInteger(n) || n < (zero ? 0 : 1) || n > max)
|
|
10
|
+
throw new TypeError(`attempts: invalid ${name}`);
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
let nextRecorder = 0;
|
|
14
|
+
export class AttemptRecorder {
|
|
15
|
+
id = `attempts-${++nextRecorder}`;
|
|
16
|
+
rows = new KeyedStore();
|
|
17
|
+
logical = new Map();
|
|
18
|
+
starts = new Map();
|
|
19
|
+
reads = 0;
|
|
20
|
+
pending = new Set();
|
|
21
|
+
exemplars;
|
|
22
|
+
maxRows;
|
|
23
|
+
maxPending;
|
|
24
|
+
timeoutMs;
|
|
25
|
+
store;
|
|
26
|
+
failed = 0;
|
|
27
|
+
dropped = 0;
|
|
28
|
+
omittedRows = 0;
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.exemplars = option(options.exemplars, 10, 100, 'exemplars');
|
|
31
|
+
this.maxRows = option(options.maxRows, 10000, 100000, 'maxRows');
|
|
32
|
+
this.maxPending = option(options.maxPending, 8, 64, 'maxPending');
|
|
33
|
+
this.timeoutMs = option(options.storeTimeoutMs, 1000, 60000, 'storeTimeoutMs');
|
|
34
|
+
this.store = options.store;
|
|
35
|
+
}
|
|
36
|
+
onRunStart(event) {
|
|
37
|
+
const runId = event.traversalContext?.runId;
|
|
38
|
+
if (runId) {
|
|
39
|
+
const startedAt = Date.now();
|
|
40
|
+
if (this.starts.size >= this.maxRows && !this.starts.has(runId)) {
|
|
41
|
+
const oldest = this.starts.keys().next().value;
|
|
42
|
+
if (oldest !== undefined) {
|
|
43
|
+
if (this.starts.get(oldest)?.outcome === 'running')
|
|
44
|
+
this.omittedRows++;
|
|
45
|
+
this.starts.delete(oldest);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.starts.set(runId, { startedAt, outcome: 'running' });
|
|
49
|
+
this.collect({ kind: 'run', runId, startedAt, outcome: 'running' });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
onRunEnd(event) {
|
|
53
|
+
this.end(event, 'ok');
|
|
54
|
+
}
|
|
55
|
+
onPause(event) {
|
|
56
|
+
this.end(event, 'paused');
|
|
57
|
+
}
|
|
58
|
+
onRunFailed(event) {
|
|
59
|
+
this.end(event, 'failed');
|
|
60
|
+
}
|
|
61
|
+
end(event, outcome) {
|
|
62
|
+
const runId = event.traversalContext?.runId;
|
|
63
|
+
if (!runId)
|
|
64
|
+
return;
|
|
65
|
+
const prior = this.rows.get(attemptRowKey({ kind: 'run', runId, startedAt: 0, outcome: 'running' }));
|
|
66
|
+
const active = this.starts.get(runId) ?? (prior?.kind === 'run' ? prior : undefined);
|
|
67
|
+
if (active === undefined) {
|
|
68
|
+
this.omittedRows++;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Parallel children can each report a pause in one leg. It is one lifecycle fact, not a lost row.
|
|
72
|
+
// Keep the start until a real terminal event, so a later failure can supersede a child's pause.
|
|
73
|
+
if (outcome === 'paused' && active.outcome !== 'running')
|
|
74
|
+
return;
|
|
75
|
+
if (outcome !== 'paused' && (active.outcome === 'ok' || active.outcome === 'failed'))
|
|
76
|
+
return;
|
|
77
|
+
const startedAt = active.startedAt;
|
|
78
|
+
if (outcome === 'paused')
|
|
79
|
+
this.starts.set(runId, { startedAt, outcome });
|
|
80
|
+
else
|
|
81
|
+
this.starts.delete(runId);
|
|
82
|
+
this.collect({
|
|
83
|
+
kind: 'run',
|
|
84
|
+
runId,
|
|
85
|
+
startedAt,
|
|
86
|
+
endedAt: Date.now(),
|
|
87
|
+
outcome,
|
|
88
|
+
});
|
|
89
|
+
// Other parallel children may still finish after one child pauses. Keep their bounded identity links
|
|
90
|
+
// until a real terminal event, rather than dropping their later native decisions.
|
|
91
|
+
if (outcome !== 'paused')
|
|
92
|
+
for (const [key, row] of this.logical)
|
|
93
|
+
if (row.runId === runId)
|
|
94
|
+
this.logical.delete(key);
|
|
95
|
+
}
|
|
96
|
+
onAttempt(event) {
|
|
97
|
+
const ctx = event.traversalContext;
|
|
98
|
+
const record = event.record;
|
|
99
|
+
if (!ctx?.runId) {
|
|
100
|
+
this.omittedRows++;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const id = `${record.series}@${record.attempt}`;
|
|
104
|
+
if (id.length > 4096) {
|
|
105
|
+
this.omittedRows++;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const parsed = parseAttemptId(id);
|
|
109
|
+
if (!parsed) {
|
|
110
|
+
this.omittedRows++;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const row = metricRow({
|
|
114
|
+
kind: 'attempt',
|
|
115
|
+
id,
|
|
116
|
+
series: record.series,
|
|
117
|
+
runId: ctx.runId,
|
|
118
|
+
runtimeStageId: ctx.runtimeStageId,
|
|
119
|
+
target: record.target ?? event.stageId,
|
|
120
|
+
traceId: ctx.correlation?.traceId,
|
|
121
|
+
startedAt: record.startedAt,
|
|
122
|
+
durationMs: record.durationMs,
|
|
123
|
+
outcome: record.outcome,
|
|
124
|
+
category: record.category,
|
|
125
|
+
next: record.next,
|
|
126
|
+
reason: record.reason,
|
|
127
|
+
attemptKind: record.kind,
|
|
128
|
+
attempt: record.attempt,
|
|
129
|
+
of: record.of,
|
|
130
|
+
effect: record.effect,
|
|
131
|
+
retryLoop: record.retryLoop,
|
|
132
|
+
});
|
|
133
|
+
if (row?.kind !== 'attempt') {
|
|
134
|
+
this.omittedRows++;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.collect(row);
|
|
138
|
+
if (row.retryLoop?.phase === 'attempt') {
|
|
139
|
+
const key = logicalKey(row.runId, row.retryLoop.series, row.retryLoop.attempt);
|
|
140
|
+
if (!this.logical.has(key) && this.logical.size >= this.maxRows) {
|
|
141
|
+
const oldest = this.logical.keys().next().value;
|
|
142
|
+
if (oldest !== undefined)
|
|
143
|
+
this.logical.delete(oldest);
|
|
144
|
+
this.omittedRows++;
|
|
145
|
+
}
|
|
146
|
+
this.logical.set(key, row);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
onDecision(event) {
|
|
150
|
+
const logical = event.evidence?.retryLoop;
|
|
151
|
+
const runId = event.traversalContext?.runId;
|
|
152
|
+
if (!logical || !runId)
|
|
153
|
+
return;
|
|
154
|
+
const key = logicalKey(runId, logical.series, logical.attempt);
|
|
155
|
+
const physical = this.logical.get(key);
|
|
156
|
+
this.logical.delete(key);
|
|
157
|
+
if (!physical) {
|
|
158
|
+
this.omittedRows++;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const row = metricRow({
|
|
162
|
+
...logical,
|
|
163
|
+
kind: 'decision',
|
|
164
|
+
runId,
|
|
165
|
+
target: physical.target,
|
|
166
|
+
runtimeStageId: event.traversalContext?.runtimeStageId,
|
|
167
|
+
attemptId: physical.id,
|
|
168
|
+
startedAt: physical.startedAt,
|
|
169
|
+
});
|
|
170
|
+
if (row?.kind === 'decision')
|
|
171
|
+
this.collect(row);
|
|
172
|
+
else
|
|
173
|
+
this.omittedRows++;
|
|
174
|
+
}
|
|
175
|
+
collect(row) {
|
|
176
|
+
const key = attemptRowKey(row);
|
|
177
|
+
if (!this.rows.has(key) && this.rows.size >= this.maxRows) {
|
|
178
|
+
const oldest = this.rows.getMap().keys().next().value;
|
|
179
|
+
if (oldest !== undefined)
|
|
180
|
+
this.rows.delete(oldest);
|
|
181
|
+
this.omittedRows++;
|
|
182
|
+
}
|
|
183
|
+
this.rows.set(key, row);
|
|
184
|
+
if (!this.store)
|
|
185
|
+
return;
|
|
186
|
+
if (this.pending.size + this.reads >= this.maxPending) {
|
|
187
|
+
this.dropped++;
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// Hooks cannot await. Own every rejection immediately, with a bounded pool and no hidden retry queue.
|
|
191
|
+
try {
|
|
192
|
+
const result = this.store.append([structuredClone(row)]);
|
|
193
|
+
if (result !== undefined) {
|
|
194
|
+
const task = Promise.resolve(result)
|
|
195
|
+
.then(() => undefined, () => {
|
|
196
|
+
this.failed++;
|
|
197
|
+
})
|
|
198
|
+
.then(() => {
|
|
199
|
+
this.pending.delete(task);
|
|
200
|
+
});
|
|
201
|
+
this.pending.add(task);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
this.failed++;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
storage() {
|
|
209
|
+
return {
|
|
210
|
+
pending: this.pending.size + this.reads,
|
|
211
|
+
failed: this.failed,
|
|
212
|
+
dropped: this.dropped,
|
|
213
|
+
omittedRows: this.omittedRows,
|
|
214
|
+
incomplete: this.pending.size + this.reads + this.failed + this.dropped + this.omittedRows > 0,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
async flush() {
|
|
218
|
+
if (this.pending.size === 0)
|
|
219
|
+
return this.storage();
|
|
220
|
+
let timer;
|
|
221
|
+
try {
|
|
222
|
+
await Promise.race([
|
|
223
|
+
Promise.all([...this.pending]),
|
|
224
|
+
new Promise((resolve) => {
|
|
225
|
+
timer = setTimeout(resolve, this.timeoutMs);
|
|
226
|
+
}),
|
|
227
|
+
]);
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
if (timer !== undefined)
|
|
231
|
+
clearTimeout(timer);
|
|
232
|
+
}
|
|
233
|
+
return this.storage();
|
|
234
|
+
}
|
|
235
|
+
byTarget() {
|
|
236
|
+
return aggregateAttempts(this.rows.values(), this.exemplars, this.storage()).byTarget;
|
|
237
|
+
}
|
|
238
|
+
byRun() {
|
|
239
|
+
return aggregateAttempts(this.rows.values(), this.exemplars, this.storage()).byRun;
|
|
240
|
+
}
|
|
241
|
+
slowest(target, limit = this.exemplars) {
|
|
242
|
+
const cap = option(limit, this.exemplars, 100, 'limit', true);
|
|
243
|
+
return worst(this.rows.values().filter((row) => row.kind === 'attempt' && row.target === target), cap);
|
|
244
|
+
}
|
|
245
|
+
series(series, runId) {
|
|
246
|
+
const held = this.rows.values().filter((row) => runId === undefined || row.runId === runId);
|
|
247
|
+
const linked = new Set();
|
|
248
|
+
for (const row of held)
|
|
249
|
+
if (row.kind === 'attempt' && row.series === series && row.retryLoop !== undefined)
|
|
250
|
+
linked.add(JSON.stringify([row.runId, row.retryLoop.series]));
|
|
251
|
+
const rows = held.filter((row) => row.kind !== 'run' &&
|
|
252
|
+
(row.series === series ||
|
|
253
|
+
(row.kind === 'attempt' && row.retryLoop?.series === series) ||
|
|
254
|
+
linked.has(JSON.stringify([row.runId, row.kind === 'attempt' ? row.retryLoop?.series : row.series]))));
|
|
255
|
+
return structuredClone({
|
|
256
|
+
attempts: rows.filter((row) => row.kind === 'attempt'),
|
|
257
|
+
decisions: rows.filter((row) => row.kind === 'decision'),
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
async aggregate(supplied = {}) {
|
|
261
|
+
const admitted = ownDataRecord(supplied);
|
|
262
|
+
if (admitted === undefined)
|
|
263
|
+
throw new TypeError('attempts: invalid query');
|
|
264
|
+
const { since, until, target, runId } = admitted;
|
|
265
|
+
if ((since !== undefined && (!Number.isFinite(since) || since < 0)) ||
|
|
266
|
+
(until !== undefined && (!Number.isFinite(until) || until < 0)) ||
|
|
267
|
+
(since !== undefined && until !== undefined && since > until) ||
|
|
268
|
+
(target !== undefined && (typeof target !== 'string' || target.length === 0)) ||
|
|
269
|
+
(runId !== undefined && (typeof runId !== 'string' || runId.length === 0)))
|
|
270
|
+
throw new TypeError('attempts: invalid query');
|
|
271
|
+
const query = Object.freeze({ since, until, target, runId });
|
|
272
|
+
await this.flush();
|
|
273
|
+
const raw = this.store === undefined ? this.rows.values() : await this.readStored(query);
|
|
274
|
+
const rows = [];
|
|
275
|
+
const window = metricWindow(raw, this.maxRows);
|
|
276
|
+
let invalid = window.omitted;
|
|
277
|
+
for (const value of window.values) {
|
|
278
|
+
const row = metricRow(value);
|
|
279
|
+
if (row && matchesQuery(row, query))
|
|
280
|
+
rows.push(row);
|
|
281
|
+
else if (row === undefined)
|
|
282
|
+
invalid++;
|
|
283
|
+
}
|
|
284
|
+
const storage = this.storage();
|
|
285
|
+
let storeOmitted = 0;
|
|
286
|
+
let accountingUnknown = false;
|
|
287
|
+
if (this.store?.stats !== undefined) {
|
|
288
|
+
try {
|
|
289
|
+
const stats = ownDataRecord(this.store.stats());
|
|
290
|
+
if (stats === undefined ||
|
|
291
|
+
typeof stats.omittedRows !== 'number' ||
|
|
292
|
+
!Number.isSafeInteger(stats.omittedRows) ||
|
|
293
|
+
stats.omittedRows < 0)
|
|
294
|
+
accountingUnknown = true;
|
|
295
|
+
else
|
|
296
|
+
storeOmitted = stats.omittedRows;
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
accountingUnknown = true;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return aggregateAttempts(rows, this.exemplars, {
|
|
303
|
+
...storage,
|
|
304
|
+
omittedRows: storage.omittedRows + invalid + storeOmitted,
|
|
305
|
+
incomplete: storage.incomplete || invalid + storeOmitted > 0 || accountingUnknown,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
async readStored(query) {
|
|
309
|
+
if (this.reads + this.pending.size >= this.maxPending)
|
|
310
|
+
throw new Error('attempts: store read capacity reached');
|
|
311
|
+
const store = this.store;
|
|
312
|
+
if (store === undefined)
|
|
313
|
+
return this.rows.values();
|
|
314
|
+
this.reads++;
|
|
315
|
+
let timer;
|
|
316
|
+
let released = false;
|
|
317
|
+
const release = () => {
|
|
318
|
+
if (!released) {
|
|
319
|
+
released = true;
|
|
320
|
+
this.reads--;
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
// A timed-out I/O still owns its slot until it settles: a caller cannot create an unbounded pool of stuck reads.
|
|
324
|
+
const work = Promise.resolve()
|
|
325
|
+
.then(() => store.read(query))
|
|
326
|
+
.then((rows) => {
|
|
327
|
+
release();
|
|
328
|
+
if (!Array.isArray(rows))
|
|
329
|
+
throw new Error('attempts: invalid store rows');
|
|
330
|
+
return rows;
|
|
331
|
+
}, () => {
|
|
332
|
+
release();
|
|
333
|
+
throw new Error('attempts: store read failed');
|
|
334
|
+
});
|
|
335
|
+
try {
|
|
336
|
+
return await Promise.race([
|
|
337
|
+
work,
|
|
338
|
+
new Promise((_resolve, reject) => {
|
|
339
|
+
timer = setTimeout(() => reject(new Error('attempts: store read timed out')), this.timeoutMs);
|
|
340
|
+
}),
|
|
341
|
+
]);
|
|
342
|
+
}
|
|
343
|
+
finally {
|
|
344
|
+
if (timer !== undefined)
|
|
345
|
+
clearTimeout(timer);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
toSnapshot() {
|
|
349
|
+
const stats = aggregateAttempts(this.rows.values(), this.exemplars, this.storage());
|
|
350
|
+
return {
|
|
351
|
+
name: 'Attempts',
|
|
352
|
+
data: { byTarget: stats.byTarget, byRun: stats.byRun },
|
|
353
|
+
meta: {
|
|
354
|
+
projection: 'per-target',
|
|
355
|
+
exemplars: this.exemplars,
|
|
356
|
+
rows: this.rows.size,
|
|
357
|
+
maxRows: this.maxRows,
|
|
358
|
+
storage: stats.storage,
|
|
359
|
+
workTime: 'sum-of-attempt-durations',
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
toOTel() {
|
|
364
|
+
return attemptOTel(this.rows.values().filter((row) => row.kind === 'attempt'), this.byTarget(), this.exemplars);
|
|
365
|
+
}
|
|
366
|
+
/** Clear completed local projections; active/paused evidence and bounded ownership survive executor auto-clear. */
|
|
367
|
+
clear() {
|
|
368
|
+
const kept = this.rows.values().filter((row) => this.starts.has(row.runId));
|
|
369
|
+
this.rows.clear();
|
|
370
|
+
for (const row of kept)
|
|
371
|
+
this.rows.set(attemptRowKey(row), row);
|
|
372
|
+
for (const [key, row] of this.logical)
|
|
373
|
+
if (!this.starts.has(row.runId))
|
|
374
|
+
this.logical.delete(key);
|
|
375
|
+
if (this.starts.size === 0)
|
|
376
|
+
this.omittedRows = 0;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/** Bounded reference adapter for tests/local use; apps supply their own database adapter. */
|
|
380
|
+
export function memoryStore(options = {}) {
|
|
381
|
+
const max = option(options.maxRows, 10000, 100000, 'maxRows');
|
|
382
|
+
const rows = new Map();
|
|
383
|
+
let omitted = 0;
|
|
384
|
+
let ordinal = 0;
|
|
385
|
+
return {
|
|
386
|
+
append(incoming) {
|
|
387
|
+
const window = metricWindow(incoming, max);
|
|
388
|
+
omitted += window.omitted;
|
|
389
|
+
for (const value of window.values) {
|
|
390
|
+
const row = metricRow(value);
|
|
391
|
+
if (!row) {
|
|
392
|
+
omitted++;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
if (rows.size >= max) {
|
|
396
|
+
const oldest = rows.keys().next().value;
|
|
397
|
+
if (oldest !== undefined)
|
|
398
|
+
rows.delete(oldest);
|
|
399
|
+
omitted++;
|
|
400
|
+
}
|
|
401
|
+
rows.set(++ordinal, row);
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
async read(query) {
|
|
405
|
+
return [...rows.values()].filter((row) => matchesQuery(row, query)).map((row) => structuredClone(row));
|
|
406
|
+
},
|
|
407
|
+
stats() {
|
|
408
|
+
return { rows: rows.size, omittedRows: omitted };
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0ZW1wdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9BdHRlbXB0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsU0FBUyxNQUFNLENBQUMsS0FBeUIsRUFBRSxRQUFnQixFQUFFLEdBQVcsRUFBRSxJQUFZLEVBQUUsSUFBSSxHQUFHLEtBQUs7SUFDbEcsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixNQUFNLE9BQU8sZUFBZTtJQUNqQixFQUFFLEdBQUcsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQzFCLElBQUksR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO0lBQ3BD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Q0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ1QsT0FBTyxFQUFFLENBQUM7b0JBQ1YsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDeEMsSUFBSSxNQUFNLEtBQUssU0FBUzt3QkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM5QyxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDZCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFDRCxLQUFLO1lBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUDc6IG9uZSBib3VuZGVkLCBwYXlsb2FkLWZyZWUgbWV0cmljIHByb2plY3Rpb24gY29sbGVjdGVkIGZyb20gdHJhdmVyc2FsIGhvb2tzLiAqL1xuaW1wb3J0IHsgcGFyc2VBdHRlbXB0SWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93UGF1c2VFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbn0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBtYXRjaGVzUXVlcnksIG1ldHJpY1JvdywgbWV0cmljV2luZG93LCBvd25EYXRhUmVjb3JkIH0gZnJvbSAnLi9hdHRlbXB0TWV0cmljUm93cy5qcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVBdHRlbXB0cywgYXR0ZW1wdFJvd0tleSwgbG9naWNhbEtleSwgd29yc3QgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdEFnZ3JlZ2F0ZSxcbiAgQXR0ZW1wdERlY2lzaW9uUm93LFxuICBBdHRlbXB0UXVlcnksXG4gIEF0dGVtcHRSZWNvcmRlck9wdGlvbnMsXG4gIEF0dGVtcHRSb3csXG4gIEF0dGVtcHRTdG9yYWdlU3RhdHMsXG4gIEF0dGVtcHRTdG9yZSxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdE9UZWwgfSBmcm9tICcuL2F0dGVtcHRPVGVsLmpzJztcbmltcG9ydCB7IEtleWVkU3RvcmUgfSBmcm9tICcuL0tleWVkU3RvcmUuanMnO1xuXG5mdW5jdGlvbiBvcHRpb24odmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWF4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgemVybyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG4pIHx8IG4gPCAoemVybyA/IDAgOiAxKSB8fCBuID4gbWF4KSB0aHJvdyBuZXcgVHlwZUVycm9yKGBhdHRlbXB0czogaW52YWxpZCAke25hbWV9YCk7XG4gIHJldHVybiBuO1xufVxubGV0IG5leHRSZWNvcmRlciA9IDA7XG5leHBvcnQgY2xhc3MgQXR0ZW1wdFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQgPSBgYXR0ZW1wdHMtJHsrK25leHRSZWNvcmRlcn1gO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvd3MgPSBuZXcgS2V5ZWRTdG9yZTxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2ljYWwgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHN0YXJ0ZWRBdDogbnVtYmVyOyByZWFkb25seSBvdXRjb21lOiAncnVubmluZycgfCAncGF1c2VkJyB9PigpO1xuICBwcml2YXRlIHJlYWRzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IFNldDxQcm9taXNlPHZvaWQ+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZW1wbGFyczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhQZW5kaW5nOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU/OiBBdHRlbXB0U3RvcmU7XG4gIHByaXZhdGUgZmFpbGVkID0gMDtcbiAgcHJpdmF0ZSBkcm9wcGVkID0gMDtcbiAgcHJpdmF0ZSBvbWl0dGVkUm93cyA9IDA7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEF0dGVtcHRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZXhlbXBsYXJzID0gb3B0aW9uKG9wdGlvbnMuZXhlbXBsYXJzLCAxMCwgMTAwLCAnZXhlbXBsYXJzJyk7XG4gICAgdGhpcy5tYXhSb3dzID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgICB0aGlzLm1heFBlbmRpbmcgPSBvcHRpb24ob3B0aW9ucy5tYXhQZW5kaW5nLCA4LCA2NCwgJ21heFBlbmRpbmcnKTtcbiAgICB0aGlzLnRpbWVvdXRNcyA9IG9wdGlvbihvcHRpb25zLnN0b3JlVGltZW91dE1zLCAxMDAwLCA2MDAwMCwgJ3N0b3JlVGltZW91dE1zJyk7XG4gICAgdGhpcy5zdG9yZSA9IG9wdGlvbnMuc3RvcmU7XG4gIH1cblxuICBvblJ1blN0YXJ0KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmIChydW5JZCkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID49IHRoaXMubWF4Um93cyAmJiAhdGhpcy5zdGFydHMuaGFzKHJ1bklkKSkge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnN0YXJ0cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGFydHMuZ2V0KG9sZGVzdCk/Lm91dGNvbWUgPT09ICdydW5uaW5nJykgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgICAgIHRoaXMuc3RhcnRzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lOiAncnVubmluZycgfSk7XG4gICAgICB0aGlzLmNvbGxlY3QoeyBraW5kOiAncnVuJywgcnVuSWQsIHN0YXJ0ZWRBdCwgb3V0Y29tZTogJ3J1bm5pbmcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZChldmVudCwgJ29rJyk7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBGbG93UGF1c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW5kKGV2ZW50LCAncGF1c2VkJyk7XG4gIH1cblxuICBvblJ1bkZhaWxlZChldmVudDogRmxvd1J1bkZhaWxlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbmQoZXZlbnQsICdmYWlsZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kKGV2ZW50OiBGbG93UnVuRXZlbnQgfCBGbG93UnVuRmFpbGVkRXZlbnQgfCBGbG93UGF1c2VFdmVudCwgb3V0Y29tZTogJ29rJyB8ICdmYWlsZWQnIHwgJ3BhdXNlZCcpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmICghcnVuSWQpIHJldHVybjtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMucm93cy5nZXQoYXR0ZW1wdFJvd0tleSh7IGtpbmQ6ICdydW4nLCBydW5JZCwgc3RhcnRlZEF0OiAwLCBvdXRjb21lOiAncnVubmluZycgfSkpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuc3RhcnRzLmdldChydW5JZCkgPz8gKHByaW9yPy5raW5kID09PSAncnVuJyA/IHByaW9yIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFyYWxsZWwgY2hpbGRyZW4gY2FuIGVhY2ggcmVwb3J0IGEgcGF1c2UgaW4gb25lIGxlZy4gSXQgaXMgb25lIGxpZmVjeWNsZSBmYWN0LCBub3QgYSBsb3N0IHJvdy5cbiAgICAvLyBLZWVwIHRoZSBzdGFydCB1bnRpbCBhIHJlYWwgdGVybWluYWwgZXZlbnQsIHNvIGEgbGF0ZXIgZmFpbHVyZSBjYW4gc3VwZXJzZWRlIGEgY2hpbGQncyBwYXVzZS5cbiAgICBpZiAob3V0Y29tZSA9PT0gJ3BhdXNlZCcgJiYgYWN0aXZlLm91dGNvbWUgIT09ICdydW5uaW5nJykgcmV0dXJuO1xuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJyAmJiAoYWN0aXZlLm91dGNvbWUgPT09ICdvaycgfHwgYWN0aXZlLm91dGNvbWUgPT09ICdmYWlsZWQnKSkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IGFjdGl2ZS5zdGFydGVkQXQ7XG4gICAgaWYgKG91dGNvbWUgPT09ICdwYXVzZWQnKSB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lIH0pO1xuICAgIGVsc2UgdGhpcy5zdGFydHMuZGVsZXRlKHJ1bklkKTtcbiAgICB0aGlzLmNvbGxlY3Qoe1xuICAgICAga2luZDogJ3J1bicsXG4gICAgICBydW5JZCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGVuZGVkQXQ6IERhdGUubm93KCksXG4gICAgICBvdXRjb21lLFxuICAgIH0pO1xuICAgIC8vIE90aGVyIHBhcmFsbGVsIGNoaWxkcmVuIG1heSBzdGlsbCBmaW5pc2ggYWZ0ZXIgb25lIGNoaWxkIHBhdXNlcy4gS2VlcCB0aGVpciBib3VuZGVkIGlkZW50aXR5IGxpbmtzXG4gICAgLy8gdW50aWwgYSByZWFsIHRlcm1pbmFsIGV2ZW50LCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGVpciBsYXRlciBuYXRpdmUgZGVjaXNpb25zLlxuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJykgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKHJvdy5ydW5JZCA9PT0gcnVuSWQpIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgIGlmICghY3R4Py5ydW5JZCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGAke3JlY29yZC5zZXJpZXN9QCR7cmVjb3JkLmF0dGVtcHR9YDtcbiAgICBpZiAoaWQubGVuZ3RoID4gNDA5Nikge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUF0dGVtcHRJZChpZCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkLFxuICAgICAgc2VyaWVzOiByZWNvcmQuc2VyaWVzLFxuICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHgucnVudGltZVN0YWdlSWQsXG4gICAgICB0YXJnZXQ6IHJlY29yZC50YXJnZXQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHRyYWNlSWQ6IGN0eC5jb3JyZWxhdGlvbj8udHJhY2VJZCxcbiAgICAgIHN0YXJ0ZWRBdDogcmVjb3JkLnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHJlY29yZC5kdXJhdGlvbk1zLFxuICAgICAgb3V0Y29tZTogcmVjb3JkLm91dGNvbWUsXG4gICAgICBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5LFxuICAgICAgbmV4dDogcmVjb3JkLm5leHQsXG4gICAgICByZWFzb246IHJlY29yZC5yZWFzb24sXG4gICAgICBhdHRlbXB0S2luZDogcmVjb3JkLmtpbmQsXG4gICAgICBhdHRlbXB0OiByZWNvcmQuYXR0ZW1wdCxcbiAgICAgIG9mOiByZWNvcmQub2YsXG4gICAgICBlZmZlY3Q6IHJlY29yZC5lZmZlY3QsXG4gICAgICByZXRyeUxvb3A6IHJlY29yZC5yZXRyeUxvb3AsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCAhPT0gJ2F0dGVtcHQnKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29sbGVjdChyb3cpO1xuICAgIGlmIChyb3cucmV0cnlMb29wPy5waGFzZSA9PT0gJ2F0dGVtcHQnKSB7XG4gICAgICBjb25zdCBrZXkgPSBsb2dpY2FsS2V5KHJvdy5ydW5JZCwgcm93LnJldHJ5TG9vcC5zZXJpZXMsIHJvdy5yZXRyeUxvb3AuYXR0ZW1wdCk7XG4gICAgICBpZiAoIXRoaXMubG9naWNhbC5oYXMoa2V5KSAmJiB0aGlzLmxvZ2ljYWwuc2l6ZSA+PSB0aGlzLm1heFJvd3MpIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5sb2dpY2FsLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5sb2dpY2FsLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2ljYWwuc2V0KGtleSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2ljYWwgPSBldmVudC5ldmlkZW5jZT8ucmV0cnlMb29wO1xuICAgIGNvbnN0IHJ1bklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVuSWQ7XG4gICAgaWYgKCFsb2dpY2FsIHx8ICFydW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGxvZ2ljYWxLZXkocnVuSWQsIGxvZ2ljYWwuc2VyaWVzLCBsb2dpY2FsLmF0dGVtcHQpO1xuICAgIGNvbnN0IHBoeXNpY2FsID0gdGhpcy5sb2dpY2FsLmdldChrZXkpO1xuICAgIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgICBpZiAoIXBoeXNpY2FsKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IG1ldHJpY1Jvdyh7XG4gICAgICAuLi5sb2dpY2FsLFxuICAgICAga2luZDogJ2RlY2lzaW9uJyxcbiAgICAgIHJ1bklkLFxuICAgICAgdGFyZ2V0OiBwaHlzaWNhbC50YXJnZXQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBhdHRlbXB0SWQ6IHBoeXNpY2FsLmlkLFxuICAgICAgc3RhcnRlZEF0OiBwaHlzaWNhbC5zdGFydGVkQXQsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCA9PT0gJ2RlY2lzaW9uJykgdGhpcy5jb2xsZWN0KHJvdyk7XG4gICAgZWxzZSB0aGlzLm9taXR0ZWRSb3dzKys7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3Qocm93OiBBdHRlbXB0Um93KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYXR0ZW1wdFJvd0tleShyb3cpO1xuICAgIGlmICghdGhpcy5yb3dzLmhhcyhrZXkpICYmIHRoaXMucm93cy5zaXplID49IHRoaXMubWF4Um93cykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5yb3dzLmdldE1hcCgpLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHRoaXMucm93cy5kZWxldGUob2xkZXN0KTtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICB9XG4gICAgdGhpcy5yb3dzLnNldChrZXksIHJvdyk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSByZXR1cm47XG4gICAgaWYgKHRoaXMucGVuZGluZy5zaXplICsgdGhpcy5yZWFkcyA+PSB0aGlzLm1heFBlbmRpbmcpIHtcbiAgICAgIHRoaXMuZHJvcHBlZCsrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBIb29rcyBjYW5ub3QgYXdhaXQuIE93biBldmVyeSByZWplY3Rpb24gaW1tZWRpYXRlbHksIHdpdGggYSBib3VuZGVkIHBvb2wgYW5kIG5vIGhpZGRlbiByZXRyeSBxdWV1ZS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZS5hcHBlbmQoW3N0cnVjdHVyZWRDbG9uZShyb3cpXSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGFzazogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHRhc2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmcuYWRkKHRhc2spO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICBzdG9yYWdlKCk6IEF0dGVtcHRTdG9yYWdlU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMsXG4gICAgICBmYWlsZWQ6IHRoaXMuZmFpbGVkLFxuICAgICAgZHJvcHBlZDogdGhpcy5kcm9wcGVkLFxuICAgICAgb21pdHRlZFJvd3M6IHRoaXMub21pdHRlZFJvd3MsXG4gICAgICBpbmNvbXBsZXRlOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMgKyB0aGlzLmZhaWxlZCArIHRoaXMuZHJvcHBlZCArIHRoaXMub21pdHRlZFJvd3MgPiAwLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPEF0dGVtcHRTdG9yYWdlU3RhdHM+IHtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPT09IDApIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICBQcm9taXNlLmFsbChbLi4udGhpcy5wZW5kaW5nXSksXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KHJlc29sdmUsIHRoaXMudGltZW91dE1zKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgfVxuXG4gIGJ5VGFyZ2V0KCk6IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5VGFyZ2V0J10ge1xuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSkuYnlUYXJnZXQ7XG4gIH1cblxuICBieVJ1bigpOiBBdHRlbXB0QWdncmVnYXRlWydieVJ1biddIHtcbiAgICByZXR1cm4gYWdncmVnYXRlQXR0ZW1wdHModGhpcy5yb3dzLnZhbHVlcygpLCB0aGlzLmV4ZW1wbGFycywgdGhpcy5zdG9yYWdlKCkpLmJ5UnVuO1xuICB9XG5cbiAgc2xvd2VzdCh0YXJnZXQ6IHN0cmluZywgbGltaXQgPSB0aGlzLmV4ZW1wbGFycykge1xuICAgIGNvbnN0IGNhcCA9IG9wdGlvbihsaW1pdCwgdGhpcy5leGVtcGxhcnMsIDEwMCwgJ2xpbWl0JywgdHJ1ZSk7XG4gICAgcmV0dXJuIHdvcnN0KFxuICAgICAgdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnICYmIHJvdy50YXJnZXQgPT09IHRhcmdldCksXG4gICAgICBjYXAsXG4gICAgKTtcbiAgfVxuXG4gIHNlcmllcyhzZXJpZXM6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB7IGF0dGVtcHRzOiBQaHlzaWNhbEF0dGVtcHRSb3dbXTsgZGVjaXNpb25zOiBBdHRlbXB0RGVjaXNpb25Sb3dbXSB9IHtcbiAgICBjb25zdCBoZWxkID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiBydW5JZCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5ydW5JZCA9PT0gcnVuSWQpO1xuICAgIGNvbnN0IGxpbmtlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGhlbGQpXG4gICAgICBpZiAocm93LmtpbmQgPT09ICdhdHRlbXB0JyAmJiByb3cuc2VyaWVzID09PSBzZXJpZXMgJiYgcm93LnJldHJ5TG9vcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBsaW5rZWQuYWRkKEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5yZXRyeUxvb3Auc2VyaWVzXSkpO1xuICAgIGNvbnN0IHJvd3MgPSBoZWxkLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHJvdy5raW5kICE9PSAncnVuJyAmJlxuICAgICAgICAocm93LnNlcmllcyA9PT0gc2VyaWVzIHx8XG4gICAgICAgICAgKHJvdy5raW5kID09PSAnYXR0ZW1wdCcgJiYgcm93LnJldHJ5TG9vcD8uc2VyaWVzID09PSBzZXJpZXMpIHx8XG4gICAgICAgICAgbGlua2VkLmhhcyhKU09OLnN0cmluZ2lmeShbcm93LnJ1bklkLCByb3cua2luZCA9PT0gJ2F0dGVtcHQnID8gcm93LnJldHJ5TG9vcD8uc2VyaWVzIDogcm93LnNlcmllc10pKSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHtcbiAgICAgIGF0dGVtcHRzOiByb3dzLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKSxcbiAgICAgIGRlY2lzaW9uczogcm93cy5maWx0ZXIoKHJvdyk6IHJvdyBpcyBBdHRlbXB0RGVjaXNpb25Sb3cgPT4gcm93LmtpbmQgPT09ICdkZWNpc2lvbicpLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYWdncmVnYXRlKHN1cHBsaWVkOiBBdHRlbXB0UXVlcnkgPSB7fSk6IFByb21pc2U8QXR0ZW1wdEFnZ3JlZ2F0ZT4ge1xuICAgIGNvbnN0IGFkbWl0dGVkID0gb3duRGF0YVJlY29yZChzdXBwbGllZCk7XG4gICAgaWYgKGFkbWl0dGVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F0dGVtcHRzOiBpbnZhbGlkIHF1ZXJ5Jyk7XG4gICAgY29uc3QgeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSA9IGFkbWl0dGVkIGFzIEF0dGVtcHRRdWVyeTtcbiAgICBpZiAoXG4gICAgICAoc2luY2UgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZShzaW5jZSkgfHwgc2luY2UgPCAwKSkgfHxcbiAgICAgICh1bnRpbCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzRmluaXRlKHVudGlsKSB8fCB1bnRpbCA8IDApKSB8fFxuICAgICAgKHNpbmNlICE9PSB1bmRlZmluZWQgJiYgdW50aWwgIT09IHVuZGVmaW5lZCAmJiBzaW5jZSA+IHVudGlsKSB8fFxuICAgICAgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJyB8fCB0YXJnZXQubGVuZ3RoID09PSAwKSkgfHxcbiAgICAgIChydW5JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnIHx8IHJ1bklkLmxlbmd0aCA9PT0gMCkpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgcXVlcnknKTtcbiAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5mcmVlemUoeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSk7XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuc3RvcmUgPT09IHVuZGVmaW5lZCA/IHRoaXMucm93cy52YWx1ZXMoKSA6IGF3YWl0IHRoaXMucmVhZFN0b3JlZChxdWVyeSk7XG4gICAgY29uc3Qgcm93czogQXR0ZW1wdFJvd1tdID0gW107XG4gICAgY29uc3Qgd2luZG93ID0gbWV0cmljV2luZG93KHJhdywgdGhpcy5tYXhSb3dzKTtcbiAgICBsZXQgaW52YWxpZCA9IHdpbmRvdy5vbWl0dGVkO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygd2luZG93LnZhbHVlcykge1xuICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgIGlmIChyb3cgJiYgbWF0Y2hlc1F1ZXJ5KHJvdywgcXVlcnkpKSByb3dzLnB1c2gocm93KTtcbiAgICAgIGVsc2UgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSBpbnZhbGlkKys7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgc3RvcmVPbWl0dGVkID0gMDtcbiAgICBsZXQgYWNjb3VudGluZ1Vua25vd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zdG9yZT8uc3RhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBvd25EYXRhUmVjb3JkKHRoaXMuc3RvcmUuc3RhdHMoKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdGF0cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgdHlwZW9mIHN0YXRzLm9taXR0ZWRSb3dzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihzdGF0cy5vbWl0dGVkUm93cykgfHxcbiAgICAgICAgICBzdGF0cy5vbWl0dGVkUm93cyA8IDBcbiAgICAgICAgKVxuICAgICAgICAgIGFjY291bnRpbmdVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBzdG9yZU9taXR0ZWQgPSBzdGF0cy5vbWl0dGVkUm93cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhY2NvdW50aW5nVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyhyb3dzLCB0aGlzLmV4ZW1wbGFycywge1xuICAgICAgLi4uc3RvcmFnZSxcbiAgICAgIG9taXR0ZWRSb3dzOiBzdG9yYWdlLm9taXR0ZWRSb3dzICsgaW52YWxpZCArIHN0b3JlT21pdHRlZCxcbiAgICAgIGluY29tcGxldGU6IHN0b3JhZ2UuaW5jb21wbGV0ZSB8fCBpbnZhbGlkICsgc3RvcmVPbWl0dGVkID4gMCB8fCBhY2NvdW50aW5nVW5rbm93bixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFN0b3JlZChxdWVyeTogQXR0ZW1wdFF1ZXJ5KTogUHJvbWlzZTxyZWFkb25seSBBdHRlbXB0Um93W10+IHtcbiAgICBpZiAodGhpcy5yZWFkcyArIHRoaXMucGVuZGluZy5zaXplID49IHRoaXMubWF4UGVuZGluZykgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBjYXBhY2l0eSByZWFjaGVkJyk7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgIGlmIChzdG9yZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5yb3dzLnZhbHVlcygpO1xuICAgIHRoaXMucmVhZHMrKztcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXJlbGVhc2VkKSB7XG4gICAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWFkcy0tO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gQSB0aW1lZC1vdXQgSS9PIHN0aWxsIG93bnMgaXRzIHNsb3QgdW50aWwgaXQgc2V0dGxlczogYSBjYWxsZXIgY2Fubm90IGNyZWF0ZSBhbiB1bmJvdW5kZWQgcG9vbCBvZiBzdHVjayByZWFkcy5cbiAgICBjb25zdCB3b3JrID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHN0b3JlLnJlYWQocXVlcnkpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyb3dzKSA9PiB7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dzKSkgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogaW52YWxpZCBzdG9yZSByb3dzJyk7XG4gICAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICB3b3JrLFxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignYXR0ZW1wdHM6IHN0b3JlIHJlYWQgdGltZWQgb3V0JykpLCB0aGlzLnRpbWVvdXRNcyk7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxuXG4gIHRvU25hcHNob3QoKSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdBdHRlbXB0cycsXG4gICAgICBkYXRhOiB7IGJ5VGFyZ2V0OiBzdGF0cy5ieVRhcmdldCwgYnlSdW46IHN0YXRzLmJ5UnVuIH0sXG4gICAgICBtZXRhOiB7XG4gICAgICAgIHByb2plY3Rpb246ICdwZXItdGFyZ2V0JyxcbiAgICAgICAgZXhlbXBsYXJzOiB0aGlzLmV4ZW1wbGFycyxcbiAgICAgICAgcm93czogdGhpcy5yb3dzLnNpemUsXG4gICAgICAgIG1heFJvd3M6IHRoaXMubWF4Um93cyxcbiAgICAgICAgc3RvcmFnZTogc3RhdHMuc3RvcmFnZSxcbiAgICAgICAgd29ya1RpbWU6ICdzdW0tb2YtYXR0ZW1wdC1kdXJhdGlvbnMnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdG9PVGVsKCkge1xuICAgIHJldHVybiBhdHRlbXB0T1RlbChcbiAgICAgIHRoaXMucm93cy52YWx1ZXMoKS5maWx0ZXIoKHJvdyk6IHJvdyBpcyBQaHlzaWNhbEF0dGVtcHRSb3cgPT4gcm93LmtpbmQgPT09ICdhdHRlbXB0JyksXG4gICAgICB0aGlzLmJ5VGFyZ2V0KCksXG4gICAgICB0aGlzLmV4ZW1wbGFycyxcbiAgICApO1xuICB9XG5cbiAgLyoqIENsZWFyIGNvbXBsZXRlZCBsb2NhbCBwcm9qZWN0aW9uczsgYWN0aXZlL3BhdXNlZCBldmlkZW5jZSBhbmQgYm91bmRlZCBvd25lcnNoaXAgc3Vydml2ZSBleGVjdXRvciBhdXRvLWNsZWFyLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiB0aGlzLnN0YXJ0cy5oYXMocm93LnJ1bklkKSk7XG4gICAgdGhpcy5yb3dzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Yga2VwdCkgdGhpcy5yb3dzLnNldChhdHRlbXB0Um93S2V5KHJvdyksIHJvdyk7XG4gICAgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKCF0aGlzLnN0YXJ0cy5oYXMocm93LnJ1bklkKSkgdGhpcy5sb2dpY2FsLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID09PSAwKSB0aGlzLm9taXR0ZWRSb3dzID0gMDtcbiAgfVxufVxuXG4vKiogQm91bmRlZCByZWZlcmVuY2UgYWRhcHRlciBmb3IgdGVzdHMvbG9jYWwgdXNlOyBhcHBzIHN1cHBseSB0aGVpciBvd24gZGF0YWJhc2UgYWRhcHRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vcnlTdG9yZShcbiAgb3B0aW9uczogeyByZWFkb25seSBtYXhSb3dzPzogbnVtYmVyIH0gPSB7fSxcbik6IEF0dGVtcHRTdG9yZSAmIHsgc3RhdHMoKTogeyByb3dzOiBudW1iZXI7IG9taXR0ZWRSb3dzOiBudW1iZXIgfSB9IHtcbiAgY29uc3QgbWF4ID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgY29uc3Qgcm93cyA9IG5ldyBNYXA8bnVtYmVyLCBBdHRlbXB0Um93PigpO1xuICBsZXQgb21pdHRlZCA9IDA7XG4gIGxldCBvcmRpbmFsID0gMDtcbiAgcmV0dXJuIHtcbiAgICBhcHBlbmQoaW5jb21pbmcpIHtcbiAgICAgIGNvbnN0IHdpbmRvdyA9IG1ldHJpY1dpbmRvdyhpbmNvbWluZywgbWF4KTtcbiAgICAgIG9taXR0ZWQgKz0gd2luZG93Lm9taXR0ZWQ7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHdpbmRvdy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICBvbWl0dGVkKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvd3Muc2l6ZSA+PSBtYXgpIHtcbiAgICAgICAgICBjb25zdCBvbGRlc3QgPSByb3dzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSByb3dzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICAgIG9taXR0ZWQrKztcbiAgICAgICAgfVxuICAgICAgICByb3dzLnNldCgrK29yZGluYWwsIHJvdyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyByZWFkKHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gWy4uLnJvd3MudmFsdWVzKCldLmZpbHRlcigocm93KSA9PiBtYXRjaGVzUXVlcnkocm93LCBxdWVyeSkpLm1hcCgocm93KSA9PiBzdHJ1Y3R1cmVkQ2xvbmUocm93KSk7XG4gICAgfSxcbiAgICBzdGF0cygpIHtcbiAgICAgIHJldHVybiB7IHJvd3M6IHJvd3Muc2l6ZSwgb21pdHRlZFJvd3M6IG9taXR0ZWQgfTtcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -27,6 +27,17 @@
|
|
|
27
27
|
* completing consumes its slot via `onError`, so the post-fan-out
|
|
28
28
|
* convergence stage is never misattributed as a branch entry.
|
|
29
29
|
*
|
|
30
|
+
* 3. attempt stops (10.1) — `onAttempt`: a stage whose retry series STOPPED
|
|
31
|
+
* (it gave up, or a later attempt paused or was aborted; the shared
|
|
32
|
+
* predicate `recorder/attemptSeries.ts · isRetryEvidence`) made a decision of its
|
|
33
|
+
* own — the retry-or-stop decision, in the shape `decide()` produces. It
|
|
34
|
+
* is recorded beside the deciders as `kind: 'attempt-stop'`
|
|
35
|
+
* (`getDecisions()`, `getAttemptStop(id)`), `chosen: 'stop'`, the stop
|
|
36
|
+
* reason as its `ruleLabel`. It is NOT a branch entry: a control edge in
|
|
37
|
+
* `causalChain` links a stage to ANOTHER execution that governed it, and
|
|
38
|
+
* the stop governs the stage itself — so `lookup` is unchanged, and a
|
|
39
|
+
* reader walking a failed stage reads the stop off its decision record.
|
|
40
|
+
*
|
|
30
41
|
* `lookup(runtimeStageId)` then walks the ancestor chain from the stage
|
|
31
42
|
* upward; the first ancestor (or the stage itself) registered as a
|
|
32
43
|
* branch entry yields its governing decider — the NEAREST decision.
|
|
@@ -55,9 +66,15 @@ import { causalChain } from 'foottrace';
|
|
|
55
66
|
*/
|
|
56
67
|
import type { ControlDependency, ControlDepLookup } from 'foottrace';
|
|
57
68
|
import type { DecisionEvidence, SelectionEvidence } from '../decide/types.js';
|
|
58
|
-
import type { FlowDecisionEvent, FlowErrorEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent } from '../engine/narrative/types.js';
|
|
69
|
+
import type { FlowAttemptEvent, FlowDecisionEvent, FlowErrorEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent } from '../engine/narrative/types.js';
|
|
59
70
|
/** One recorded decision/selection event (RFC-003 D5). */
|
|
60
71
|
export interface ControlDecisionRecord {
|
|
72
|
+
/**
|
|
73
|
+
* `'attempt-stop'` for a stage's own retry-or-stop decision that STOPPED its series (10.1) — then
|
|
74
|
+
* `deciderRuntimeStageId` is the stage's execution, `chosen` is `'stop'`, `evidence` the attempt's decision and
|
|
75
|
+
* `ruleLabel` the stop reason. Absent for a decider / selector.
|
|
76
|
+
*/
|
|
77
|
+
kind?: 'attempt-stop';
|
|
61
78
|
/** runtimeStageId of the decider/selector execution step. */
|
|
62
79
|
deciderRuntimeStageId: string;
|
|
63
80
|
/** Chosen branch display name (decider) or selected names (selector). */
|
|
@@ -100,6 +117,7 @@ export declare class ControlDepRecorder implements FlowRecorder {
|
|
|
100
117
|
private lastRunId?;
|
|
101
118
|
constructor(options?: ControlDepRecorderOptions);
|
|
102
119
|
onDecision(event: FlowDecisionEvent): void;
|
|
120
|
+
onAttempt(event: FlowAttemptEvent): void;
|
|
103
121
|
onSelected(event: FlowSelectedEvent): void;
|
|
104
122
|
onStageExecuted(event: FlowStageEvent): void;
|
|
105
123
|
/**
|
|
@@ -118,8 +136,24 @@ export declare class ControlDepRecorder implements FlowRecorder {
|
|
|
118
136
|
lookup(runtimeStageId: string): ControlDependency | undefined;
|
|
119
137
|
/** The lookup as a bare function — plug into `causalChain(..., { controlDeps })`. */
|
|
120
138
|
asLookup(): ControlDepLookup;
|
|
121
|
-
/**
|
|
139
|
+
/** The attempt-stop decision of a stage execution whose retry series stopped, if it did. */
|
|
140
|
+
getAttemptStop(runtimeStageId: string): ControlDecisionRecord | undefined;
|
|
141
|
+
/** All decisions recorded for the current run, in event order — deciders, selectors and attempt stops. */
|
|
122
142
|
getDecisions(): ControlDecisionRecord[];
|
|
143
|
+
/**
|
|
144
|
+
* Current-run control evidence for the native snapshot. Project only the
|
|
145
|
+
* stage identities collected during traversal; never walk the execution tree.
|
|
146
|
+
* Parentless roots cannot have a governing control edge.
|
|
147
|
+
*/
|
|
148
|
+
toSnapshot(): {
|
|
149
|
+
name: string;
|
|
150
|
+
data: {
|
|
151
|
+
decisions: ControlDecisionRecord[];
|
|
152
|
+
controlDeps: {
|
|
153
|
+
[k: string]: ControlDependency;
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
};
|
|
123
157
|
/** Reset all state (also happens automatically on runId change). */
|
|
124
158
|
clear(): void;
|
|
125
159
|
/** Convention 4: a new runId means a new run — reset transient state. */
|