footprintjs 10.0.0 → 10.1.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 +43 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +60 -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 +31 -0
- package/dist/esm/lib/attempt/category.js +107 -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 +155 -0
- package/dist/esm/lib/attempt/runner.js +503 -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 +224 -16
- 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/ResumeEntry.js +3 -1
- 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 +20 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/stageError.js +11 -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 +2 -0
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +14 -1
- 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 +70 -4
- 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 +182 -114
- 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/{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 +109 -3
- package/dist/esm/lib/memory/StageContext.js +214 -4
- 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 +30 -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 +22 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +33 -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/recorder/qualityTrace.d.ts +4 -1
- package/dist/esm/lib/recorder/qualityTrace.js +14 -6
- 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 +42 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +238 -45
- 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 +111 -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 +510 -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 +224 -16
- 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/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +20 -4
- package/dist/lib/engine/handlers/stageError.js +13 -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 +14 -1
- 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 +181 -113
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +215 -5
- 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 +33 -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/recorder/qualityTrace.js +14 -6
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +238 -45
- 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 +60 -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 +31 -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 +155 -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/stageError.d.ts +7 -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 +2 -0
- 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 +70 -4
- 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/{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 +109 -3
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +30 -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 +22 -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/recorder/qualityTrace.d.ts +4 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +42 -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 +17 -3
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AttemptQuery, AttemptRow } from './attemptMetricsTypes.js';
|
|
2
|
+
/** Decode plain own data only; external data never gets to run getters or coercion hooks. */
|
|
3
|
+
export declare function ownDataRecord(value: unknown): Record<string, unknown> | undefined;
|
|
4
|
+
/** Read an external array window by descriptors, never by executing an index accessor or iterator. */
|
|
5
|
+
export declare function metricWindow(value: unknown, maxRows: number): {
|
|
6
|
+
values: unknown[];
|
|
7
|
+
omitted: number;
|
|
8
|
+
};
|
|
9
|
+
/** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
|
|
10
|
+
export declare function metricRow(value: unknown): AttemptRow | undefined;
|
|
11
|
+
export declare function matchesQuery(row: AttemptRow, query: AttemptQuery): boolean;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { parseAttemptId } from 'foottrace';
|
|
2
|
+
// Fixed named fields: a huge unknown envelope is never enumerated just to discard it.
|
|
3
|
+
const DATA_FIELDS = [
|
|
4
|
+
'kind',
|
|
5
|
+
'runId',
|
|
6
|
+
'startedAt',
|
|
7
|
+
'endedAt',
|
|
8
|
+
'outcome',
|
|
9
|
+
'target',
|
|
10
|
+
'runtimeStageId',
|
|
11
|
+
'attemptId',
|
|
12
|
+
'id',
|
|
13
|
+
'series',
|
|
14
|
+
'attempt',
|
|
15
|
+
'of',
|
|
16
|
+
'effect',
|
|
17
|
+
'reconciled',
|
|
18
|
+
'next',
|
|
19
|
+
'reason',
|
|
20
|
+
'attemptKind',
|
|
21
|
+
'durationMs',
|
|
22
|
+
'category',
|
|
23
|
+
'traceId',
|
|
24
|
+
'retryLoop',
|
|
25
|
+
'phase',
|
|
26
|
+
'since',
|
|
27
|
+
'until',
|
|
28
|
+
'omittedRows',
|
|
29
|
+
];
|
|
30
|
+
/** Decode plain own data only; external data never gets to run getters or coercion hooks. */
|
|
31
|
+
export function ownDataRecord(value) {
|
|
32
|
+
try {
|
|
33
|
+
if (value === null || typeof value !== 'object' || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
|
|
34
|
+
return undefined;
|
|
35
|
+
const data = Object.create(null);
|
|
36
|
+
for (const key of DATA_FIELDS) {
|
|
37
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
38
|
+
if (descriptor === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
if (!Object.hasOwn(descriptor, 'value'))
|
|
41
|
+
return undefined;
|
|
42
|
+
data[key] = descriptor.value;
|
|
43
|
+
}
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Read an external array window by descriptors, never by executing an index accessor or iterator. */
|
|
51
|
+
export function metricWindow(value, maxRows) {
|
|
52
|
+
try {
|
|
53
|
+
if (!Array.isArray(value))
|
|
54
|
+
return { values: [], omitted: 1 };
|
|
55
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
56
|
+
if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
|
|
57
|
+
return { values: [], omitted: 1 };
|
|
58
|
+
const start = Math.max(0, length - maxRows);
|
|
59
|
+
const values = [];
|
|
60
|
+
let omitted = start;
|
|
61
|
+
for (let index = start; index < length; index++) {
|
|
62
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
63
|
+
if (descriptor === undefined || !Object.hasOwn(descriptor, 'value'))
|
|
64
|
+
omitted++;
|
|
65
|
+
else
|
|
66
|
+
values.push(descriptor.value);
|
|
67
|
+
}
|
|
68
|
+
return { values, omitted };
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return { values: [], omitted: 1 };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const outcomes = new Set(['ok', 'failed', 'timeout', 'aborted', 'paused']);
|
|
75
|
+
const categories = new Set(['timeout', 'rate-limited', 'server', 'network', 'auth', 'permanent', 'unknown']);
|
|
76
|
+
const reasons = new Set(['succeeded', 'paused', 'aborted', 'exhausted', 'declined', 'no-time-left', 'retryable']);
|
|
77
|
+
const nexts = new Set(['retry', 'done', 'stop']);
|
|
78
|
+
const effects = new Set(['none', 'applied', 'unknown']);
|
|
79
|
+
const number = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER;
|
|
80
|
+
const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 4096;
|
|
81
|
+
const count = (value) => number(value) && Number.isSafeInteger(value) && value >= 1;
|
|
82
|
+
function loopOf(value) {
|
|
83
|
+
if (value === undefined)
|
|
84
|
+
return undefined;
|
|
85
|
+
const v = ownDataRecord(value);
|
|
86
|
+
if (v === undefined)
|
|
87
|
+
throw new TypeError('invalid attempt loop');
|
|
88
|
+
if (!text(v.id) ||
|
|
89
|
+
!text(v.series) ||
|
|
90
|
+
!parseAttemptId(`${v.series}@1`) ||
|
|
91
|
+
!count(v.attempt) ||
|
|
92
|
+
!count(v.of) ||
|
|
93
|
+
v.attempt > v.of ||
|
|
94
|
+
(v.phase !== 'attempt' && v.phase !== 'reconcile'))
|
|
95
|
+
throw new TypeError('invalid attempt loop');
|
|
96
|
+
return { id: v.id, series: v.series, attempt: v.attempt, of: v.of, phase: v.phase };
|
|
97
|
+
}
|
|
98
|
+
/** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
|
|
99
|
+
export function metricRow(value) {
|
|
100
|
+
try {
|
|
101
|
+
const v = ownDataRecord(value);
|
|
102
|
+
if (v === undefined)
|
|
103
|
+
return undefined;
|
|
104
|
+
if (!text(v.runId) || !number(v.startedAt))
|
|
105
|
+
return undefined;
|
|
106
|
+
if (v.kind === 'run') {
|
|
107
|
+
if (!['running', 'ok', 'failed', 'paused'].includes(v.outcome) ||
|
|
108
|
+
(v.endedAt !== undefined && !number(v.endedAt)))
|
|
109
|
+
return undefined;
|
|
110
|
+
return {
|
|
111
|
+
kind: 'run',
|
|
112
|
+
runId: v.runId,
|
|
113
|
+
startedAt: v.startedAt,
|
|
114
|
+
...(v.endedAt === undefined ? {} : { endedAt: v.endedAt }),
|
|
115
|
+
outcome: v.outcome,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (!text(v.target) || !text(v.runtimeStageId) || !parseAttemptId(`${v.runtimeStageId}@1`))
|
|
119
|
+
return undefined;
|
|
120
|
+
if (v.kind === 'decision') {
|
|
121
|
+
const parsed = text(v.attemptId) ? parseAttemptId(v.attemptId) : undefined;
|
|
122
|
+
if (!parsed ||
|
|
123
|
+
!text(v.id) ||
|
|
124
|
+
!text(v.series) ||
|
|
125
|
+
!parseAttemptId(`${v.series}@1`) ||
|
|
126
|
+
!count(v.attempt) ||
|
|
127
|
+
!count(v.of) ||
|
|
128
|
+
v.attempt > v.of ||
|
|
129
|
+
!effects.has(v.effect) ||
|
|
130
|
+
typeof v.reconciled !== 'boolean' ||
|
|
131
|
+
!nexts.has(v.next) ||
|
|
132
|
+
!reasons.has(v.reason))
|
|
133
|
+
return undefined;
|
|
134
|
+
return {
|
|
135
|
+
kind: 'decision',
|
|
136
|
+
id: v.id,
|
|
137
|
+
series: v.series,
|
|
138
|
+
attempt: v.attempt,
|
|
139
|
+
of: v.of,
|
|
140
|
+
effect: v.effect,
|
|
141
|
+
reconciled: v.reconciled,
|
|
142
|
+
next: v.next,
|
|
143
|
+
reason: v.reason,
|
|
144
|
+
runId: v.runId,
|
|
145
|
+
target: v.target,
|
|
146
|
+
runtimeStageId: v.runtimeStageId,
|
|
147
|
+
attemptId: v.attemptId,
|
|
148
|
+
startedAt: v.startedAt,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const parsed = text(v.id) ? parseAttemptId(v.id) : undefined;
|
|
152
|
+
if (v.kind !== 'attempt' ||
|
|
153
|
+
!parsed ||
|
|
154
|
+
parsed.runtimeStageId !== v.runtimeStageId ||
|
|
155
|
+
!text(v.series) ||
|
|
156
|
+
!count(v.attempt) ||
|
|
157
|
+
v.id !== `${v.series}@${v.attempt}` ||
|
|
158
|
+
(v.of !== undefined && (!count(v.of) || v.attempt > v.of)) ||
|
|
159
|
+
!number(v.durationMs) ||
|
|
160
|
+
!outcomes.has(v.outcome) ||
|
|
161
|
+
!['stage', 'call', 'observed'].includes(v.attemptKind) ||
|
|
162
|
+
!nexts.has(v.next) ||
|
|
163
|
+
!reasons.has(v.reason) ||
|
|
164
|
+
(v.category !== undefined && !categories.has(v.category)) ||
|
|
165
|
+
(v.effect !== undefined && !effects.has(v.effect)) ||
|
|
166
|
+
(v.traceId !== undefined && !text(v.traceId)))
|
|
167
|
+
return undefined;
|
|
168
|
+
const retryLoop = loopOf(v.retryLoop);
|
|
169
|
+
if (retryLoop !== undefined && v.attemptKind !== 'call')
|
|
170
|
+
return undefined;
|
|
171
|
+
return {
|
|
172
|
+
kind: 'attempt',
|
|
173
|
+
id: v.id,
|
|
174
|
+
series: v.series,
|
|
175
|
+
runId: v.runId,
|
|
176
|
+
runtimeStageId: v.runtimeStageId,
|
|
177
|
+
target: v.target,
|
|
178
|
+
...(v.traceId === undefined ? {} : { traceId: v.traceId }),
|
|
179
|
+
startedAt: v.startedAt,
|
|
180
|
+
durationMs: v.durationMs,
|
|
181
|
+
outcome: v.outcome,
|
|
182
|
+
...(v.category === undefined ? {} : { category: v.category }),
|
|
183
|
+
next: v.next,
|
|
184
|
+
reason: v.reason,
|
|
185
|
+
attemptKind: v.attemptKind,
|
|
186
|
+
attempt: v.attempt,
|
|
187
|
+
...(v.of === undefined ? {} : { of: v.of }),
|
|
188
|
+
...(v.effect === undefined ? {} : { effect: v.effect }),
|
|
189
|
+
...(retryLoop === undefined ? {} : { retryLoop }),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export function matchesQuery(row, query) {
|
|
197
|
+
return ((query.since === undefined || row.startedAt >= query.since) &&
|
|
198
|
+
(query.until === undefined || row.startedAt <= query.until) &&
|
|
199
|
+
(query.runId === undefined || row.runId === query.runId) &&
|
|
200
|
+
(query.target === undefined || (row.kind !== 'run' && row.target === query.target)));
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY1Jvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRNZXRyaWNSb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZM0Msc0ZBQXNGO0FBQ3RGLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsSUFBSTtJQUNKLFFBQVE7SUFDUixTQUFTO0lBQ1QsSUFBSTtJQUNKLFFBQVE7SUFDUixZQUFZO0lBQ1osTUFBTTtJQUNOLFFBQVE7SUFDUixhQUFhO0lBQ2IsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLGFBQWE7Q0FDTCxDQUFDO0FBQ1gsNkZBQTZGO0FBQzdGLE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYztJQUMxQyxJQUFJLENBQUM7UUFDSCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pILE9BQU8sU0FBUyxDQUFDO1FBQ25CLE1BQU0sSUFBSSxHQUE0QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvRCxJQUFJLFVBQVUsS0FBSyxTQUFT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TSxVQUFVLFlBQVksQ0FBQyxHQUFlLEVBQUUsS0FBbUI7SUFDL0QsT0FBTyxDQUNMLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hELENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNwRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBOYW1lZC1maWVsZCBhZG1pc3Npb24gZm9yIG1ldHJpYyByb3dzLCBzaGFyZWQgYnkgbGl2ZSBjb2xsZWN0aW9uIGFuZCBleHRlcm5hbCBzdG9yZSByZWFkcy4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9yZXRyeUxvb3BUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRDYXRlZ29yeSwgQXR0ZW1wdEtpbmQsIEF0dGVtcHROZXh0LCBBdHRlbXB0T3V0Y29tZSwgQXR0ZW1wdFJlYXNvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0RGVjaXNpb25Sb3csXG4gIEF0dGVtcHRRdWVyeSxcbiAgQXR0ZW1wdFJvdyxcbiAgQXR0ZW1wdFJ1blJvdyxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuXG4vLyBGaXhlZCBuYW1lZCBmaWVsZHM6IGEgaHVnZSB1bmtub3duIGVudmVsb3BlIGlzIG5ldmVyIGVudW1lcmF0ZWQganVzdCB0byBkaXNjYXJkIGl0LlxuY29uc3QgREFUQV9GSUVMRFMgPSBbXG4gICdraW5kJyxcbiAgJ3J1bklkJyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICdlbmRlZEF0JyxcbiAgJ291dGNvbWUnLFxuICAndGFyZ2V0JyxcbiAgJ3J1bnRpbWVTdGFnZUlkJyxcbiAgJ2F0dGVtcHRJZCcsXG4gICdpZCcsXG4gICdzZXJpZXMnLFxuICAnYXR0ZW1wdCcsXG4gICdvZicsXG4gICdlZmZlY3QnLFxuICAncmVjb25jaWxlZCcsXG4gICduZXh0JyxcbiAgJ3JlYXNvbicsXG4gICdhdHRlbXB0S2luZCcsXG4gICdkdXJhdGlvbk1zJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ3RyYWNlSWQnLFxuICAncmV0cnlMb29wJyxcbiAgJ3BoYXNlJyxcbiAgJ3NpbmNlJyxcbiAgJ3VudGlsJyxcbiAgJ29taXR0ZWRSb3dzJyxcbl0gYXMgY29uc3Q7XG4vKiogRGVjb2RlIHBsYWluIG93biBkYXRhIG9ubHk7IGV4dGVybmFsIGRhdGEgbmV2ZXIgZ2V0cyB0byBydW4gZ2V0dGVycyBvciBjb2VyY2lvbiBob29rcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25EYXRhUmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICFbT2JqZWN0LnByb3RvdHlwZSwgbnVsbF0uaW5jbHVkZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBEQVRBX0ZJRUxEUykge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSk7XG4gICAgICBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGRhdGFba2V5XSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBSZWFkIGFuIGV4dGVybmFsIGFycmF5IHdpbmRvdyBieSBkZXNjcmlwdG9ycywgbmV2ZXIgYnkgZXhlY3V0aW5nIGFuIGluZGV4IGFjY2Vzc29yIG9yIGl0ZXJhdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY1dpbmRvdyh2YWx1ZTogdW5rbm93biwgbWF4Um93czogbnVtYmVyKTogeyB2YWx1ZXM6IHVua25vd25bXTsgb21pdHRlZDogbnVtYmVyIH0ge1xuICB0cnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgICBjb25zdCBsZW5ndGggPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnbGVuZ3RoJyk/LnZhbHVlIGFzIHVua25vd247XG4gICAgaWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA8IDApIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIG1heFJvd3MpO1xuICAgIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gW107XG4gICAgbGV0IG9taXR0ZWQgPSBzdGFydDtcbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIFN0cmluZyhpbmRleCkpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCB8fCAhT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkgb21pdHRlZCsrO1xuICAgICAgZWxzZSB2YWx1ZXMucHVzaChkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBvbWl0dGVkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgfVxufVxuXG5jb25zdCBvdXRjb21lcyA9IG5ldyBTZXQoWydvaycsICdmYWlsZWQnLCAndGltZW91dCcsICdhYm9ydGVkJywgJ3BhdXNlZCddKTtcbmNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgU2V0KFsndGltZW91dCcsICdyYXRlLWxpbWl0ZWQnLCAnc2VydmVyJywgJ25ldHdvcmsnLCAnYXV0aCcsICdwZXJtYW5lbnQnLCAndW5rbm93biddKTtcbmNvbnN0IHJlYXNvbnMgPSBuZXcgU2V0KFsnc3VjY2VlZGVkJywgJ3BhdXNlZCcsICdhYm9ydGVkJywgJ2V4aGF1c3RlZCcsICdkZWNsaW5lZCcsICduby10aW1lLWxlZnQnLCAncmV0cnlhYmxlJ10pO1xuY29uc3QgbmV4dHMgPSBuZXcgU2V0KFsncmV0cnknLCAnZG9uZScsICdzdG9wJ10pO1xuY29uc3QgZWZmZWN0cyA9IG5ldyBTZXQoWydub25lJywgJ2FwcGxpZWQnLCAndW5rbm93biddKTtcbmNvbnN0IG51bWJlciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbmNvbnN0IHRleHQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8PSA0MDk2O1xuY29uc3QgY291bnQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgPT4gbnVtYmVyKHZhbHVlKSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMTtcbmZ1bmN0aW9uIGxvb3BPZih2YWx1ZTogdW5rbm93bik6IFJldHJ5TG9vcENhbGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdiA9IG93bkRhdGFSZWNvcmQodmFsdWUpO1xuICBpZiAodiA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGF0dGVtcHQgbG9vcCcpO1xuICBpZiAoXG4gICAgIXRleHQodi5pZCkgfHxcbiAgICAhdGV4dCh2LnNlcmllcykgfHxcbiAgICAhcGFyc2VBdHRlbXB0SWQoYCR7di5zZXJpZXN9QDFgKSB8fFxuICAgICFjb3VudCh2LmF0dGVtcHQpIHx8XG4gICAgIWNvdW50KHYub2YpIHx8XG4gICAgdi5hdHRlbXB0ID4gdi5vZiB8fFxuICAgICh2LnBoYXNlICE9PSAnYXR0ZW1wdCcgJiYgdi5waGFzZSAhPT0gJ3JlY29uY2lsZScpXG4gIClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGF0dGVtcHQgbG9vcCcpO1xuICByZXR1cm4geyBpZDogdi5pZCwgc2VyaWVzOiB2LnNlcmllcywgYXR0ZW1wdDogdi5hdHRlbXB0LCBvZjogdi5vZiwgcGhhc2U6IHYucGhhc2UgfTtcbn1cbi8qKiBJbnZhbGlkIHN0b3JlZCBkYXRhIGlzIG9taXR0ZWQgYW5kIGFjY291bnRlZCwgbmV2ZXIgY29waWVkIGFzIGFuIGFyYml0cmFyeSBlbnZlbG9wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNSb3codmFsdWU6IHVua25vd24pOiBBdHRlbXB0Um93IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gb3duRGF0YVJlY29yZCh2YWx1ZSk7XG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIXRleHQodi5ydW5JZCkgfHwgIW51bWJlcih2LnN0YXJ0ZWRBdCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHYua2luZCA9PT0gJ3J1bicpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIVsncnVubmluZycsICdvaycsICdmYWlsZWQnLCAncGF1c2VkJ10uaW5jbHVkZXModi5vdXRjb21lIGFzIHN0cmluZykgfHxcbiAgICAgICAgKHYuZW5kZWRBdCAhPT0gdW5kZWZpbmVkICYmICFudW1iZXIodi5lbmRlZEF0KSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdydW4nLFxuICAgICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiB2LnN0YXJ0ZWRBdCxcbiAgICAgICAgLi4uKHYuZW5kZWRBdCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVuZGVkQXQ6IHYuZW5kZWRBdCBhcyBudW1iZXIgfSksXG4gICAgICAgIG91dGNvbWU6IHYub3V0Y29tZSBhcyBBdHRlbXB0UnVuUm93WydvdXRjb21lJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRleHQodi50YXJnZXQpIHx8ICF0ZXh0KHYucnVudGltZVN0YWdlSWQpIHx8ICFwYXJzZUF0dGVtcHRJZChgJHt2LnJ1bnRpbWVTdGFnZUlkfUAxYCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHYua2luZCA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGV4dCh2LmF0dGVtcHRJZCkgPyBwYXJzZUF0dGVtcHRJZCh2LmF0dGVtcHRJZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgICFwYXJzZWQgfHxcbiAgICAgICAgIXRleHQodi5pZCkgfHxcbiAgICAgICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgICAgICFwYXJzZUF0dGVtcHRJZChgJHt2LnNlcmllc31AMWApIHx8XG4gICAgICAgICFjb3VudCh2LmF0dGVtcHQpIHx8XG4gICAgICAgICFjb3VudCh2Lm9mKSB8fFxuICAgICAgICB2LmF0dGVtcHQgPiB2Lm9mIHx8XG4gICAgICAgICFlZmZlY3RzLmhhcyh2LmVmZmVjdCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHR5cGVvZiB2LnJlY29uY2lsZWQgIT09ICdib29sZWFuJyB8fFxuICAgICAgICAhbmV4dHMuaGFzKHYubmV4dCBhcyBzdHJpbmcpIHx8XG4gICAgICAgICFyZWFzb25zLmhhcyh2LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZGVjaXNpb24nLFxuICAgICAgICBpZDogdi5pZCxcbiAgICAgICAgc2VyaWVzOiB2LnNlcmllcyxcbiAgICAgICAgYXR0ZW1wdDogdi5hdHRlbXB0LFxuICAgICAgICBvZjogdi5vZixcbiAgICAgICAgZWZmZWN0OiB2LmVmZmVjdCBhcyBBdHRlbXB0RGVjaXNpb25Sb3dbJ2VmZmVjdCddLFxuICAgICAgICByZWNvbmNpbGVkOiB2LnJlY29uY2lsZWQsXG4gICAgICAgIG5leHQ6IHYubmV4dCBhcyBBdHRlbXB0TmV4dCxcbiAgICAgICAgcmVhc29uOiB2LnJlYXNvbiBhcyBzdHJpbmcsXG4gICAgICAgIHJ1bklkOiB2LnJ1bklkLFxuICAgICAgICB0YXJnZXQ6IHYudGFyZ2V0LFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdi5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgYXR0ZW1wdElkOiB2LmF0dGVtcHRJZCBhcyBBdHRlbXB0SWQsXG4gICAgICAgIHN0YXJ0ZWRBdDogdi5zdGFydGVkQXQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSB0ZXh0KHYuaWQpID8gcGFyc2VBdHRlbXB0SWQodi5pZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdi5raW5kICE9PSAnYXR0ZW1wdCcgfHxcbiAgICAgICFwYXJzZWQgfHxcbiAgICAgIHBhcnNlZC5ydW50aW1lU3RhZ2VJZCAhPT0gdi5ydW50aW1lU3RhZ2VJZCB8fFxuICAgICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgICAhY291bnQodi5hdHRlbXB0KSB8fFxuICAgICAgdi5pZCAhPT0gYCR7di5zZXJpZXN9QCR7di5hdHRlbXB0fWAgfHxcbiAgICAgICh2Lm9mICE9PSB1bmRlZmluZWQgJiYgKCFjb3VudCh2Lm9mKSB8fCB2LmF0dGVtcHQgPiB2Lm9mKSkgfHxcbiAgICAgICFudW1iZXIodi5kdXJhdGlvbk1zKSB8fFxuICAgICAgIW91dGNvbWVzLmhhcyh2Lm91dGNvbWUgYXMgc3RyaW5nKSB8fFxuICAgICAgIVsnc3RhZ2UnLCAnY2FsbCcsICdvYnNlcnZlZCddLmluY2x1ZGVzKHYuYXR0ZW1wdEtpbmQgYXMgc3RyaW5nKSB8fFxuICAgICAgIW5leHRzLmhhcyh2Lm5leHQgYXMgc3RyaW5nKSB8fFxuICAgICAgIXJlYXNvbnMuaGFzKHYucmVhc29uIGFzIHN0cmluZykgfHxcbiAgICAgICh2LmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgIWNhdGVnb3JpZXMuaGFzKHYuY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICh2LmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmICFlZmZlY3RzLmhhcyh2LmVmZmVjdCBhcyBzdHJpbmcpKSB8fFxuICAgICAgKHYudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmICF0ZXh0KHYudHJhY2VJZCkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRyeUxvb3AgPSBsb29wT2Yodi5yZXRyeUxvb3ApO1xuICAgIGlmIChyZXRyeUxvb3AgIT09IHVuZGVmaW5lZCAmJiB2LmF0dGVtcHRLaW5kICE9PSAnY2FsbCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkOiB2LmlkIGFzIEF0dGVtcHRJZCxcbiAgICAgIHNlcmllczogdi5zZXJpZXMsXG4gICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB2LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgdGFyZ2V0OiB2LnRhcmdldCxcbiAgICAgIC4uLih2LnRyYWNlSWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0cmFjZUlkOiB2LnRyYWNlSWQgYXMgc3RyaW5nIH0pLFxuICAgICAgc3RhcnRlZEF0OiB2LnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHYuZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IHYub3V0Y29tZSBhcyBBdHRlbXB0T3V0Y29tZSxcbiAgICAgIC4uLih2LmNhdGVnb3J5ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY2F0ZWdvcnk6IHYuY2F0ZWdvcnkgYXMgQXR0ZW1wdENhdGVnb3J5IH0pLFxuICAgICAgbmV4dDogdi5uZXh0IGFzIEF0dGVtcHROZXh0LFxuICAgICAgcmVhc29uOiB2LnJlYXNvbiBhcyBBdHRlbXB0UmVhc29uLFxuICAgICAgYXR0ZW1wdEtpbmQ6IHYuYXR0ZW1wdEtpbmQgYXMgQXR0ZW1wdEtpbmQsXG4gICAgICBhdHRlbXB0OiB2LmF0dGVtcHQsXG4gICAgICAuLi4odi5vZiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG9mOiB2Lm9mIGFzIG51bWJlciB9KSxcbiAgICAgIC4uLih2LmVmZmVjdCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVmZmVjdDogdi5lZmZlY3QgYXMgUGh5c2ljYWxBdHRlbXB0Um93WydlZmZlY3QnXSB9KSxcbiAgICAgIC4uLihyZXRyeUxvb3AgPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZXRyeUxvb3AgfSksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNRdWVyeShyb3c6IEF0dGVtcHRSb3csIHF1ZXJ5OiBBdHRlbXB0UXVlcnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAocXVlcnkuc2luY2UgPT09IHVuZGVmaW5lZCB8fCByb3cuc3RhcnRlZEF0ID49IHF1ZXJ5LnNpbmNlKSAmJlxuICAgIChxdWVyeS51bnRpbCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5zdGFydGVkQXQgPD0gcXVlcnkudW50aWwpICYmXG4gICAgKHF1ZXJ5LnJ1bklkID09PSB1bmRlZmluZWQgfHwgcm93LnJ1bklkID09PSBxdWVyeS5ydW5JZCkgJiZcbiAgICAocXVlcnkudGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgKHJvdy5raW5kICE9PSAncnVuJyAmJiByb3cudGFyZ2V0ID09PSBxdWVyeS50YXJnZXQpKVxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AttemptAggregate, AttemptMetricRef, AttemptRow, AttemptStorageStats, PhysicalAttemptRow } from './attemptMetricsTypes.js';
|
|
2
|
+
export declare const attemptRowKey: (row: AttemptRow) => string;
|
|
3
|
+
export declare const logicalKey: (runId: string, series: string, attempt: number) => string;
|
|
4
|
+
export declare const seriesKey: (runId: string, series: string) => string;
|
|
5
|
+
export declare function reference(row: PhysicalAttemptRow): AttemptMetricRef;
|
|
6
|
+
export declare function worst(rows: readonly PhysicalAttemptRow[], limit: number): AttemptMetricRef[];
|
|
7
|
+
export declare function aggregateAttempts(rows: readonly AttemptRow[], exemplars: number, storage: AttemptStorageStats): AttemptAggregate;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { gaveUp } from './attemptSeries.js';
|
|
2
|
+
export const attemptRowKey = (row) => JSON.stringify(row.kind === 'attempt'
|
|
3
|
+
? [row.kind, row.runId, row.id]
|
|
4
|
+
: row.kind === 'decision'
|
|
5
|
+
? [row.kind, row.runId, row.series, row.attempt]
|
|
6
|
+
: [row.kind, row.runId]);
|
|
7
|
+
export const logicalKey = (runId, series, attempt) => JSON.stringify([runId, series, attempt]);
|
|
8
|
+
export const seriesKey = (runId, series) => JSON.stringify([runId, series]);
|
|
9
|
+
export function reference(row) {
|
|
10
|
+
const { id, series, runId, runtimeStageId, attemptKind, target, traceId, startedAt, durationMs, outcome, category, next, reason, retryLoop, } = row;
|
|
11
|
+
return {
|
|
12
|
+
id,
|
|
13
|
+
series,
|
|
14
|
+
runId,
|
|
15
|
+
runtimeStageId,
|
|
16
|
+
attemptKind,
|
|
17
|
+
target,
|
|
18
|
+
...(traceId === undefined ? {} : { traceId }),
|
|
19
|
+
startedAt,
|
|
20
|
+
durationMs,
|
|
21
|
+
outcome,
|
|
22
|
+
...(category === undefined ? {} : { category }),
|
|
23
|
+
next,
|
|
24
|
+
reason,
|
|
25
|
+
...(retryLoop === undefined ? {} : { retryLoop: { ...retryLoop } }),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const order = (a, b) => b.durationMs - a.durationMs || b.startedAt - a.startedAt || a.id.localeCompare(b.id);
|
|
29
|
+
export function worst(rows, limit) {
|
|
30
|
+
return [...rows].sort(order).slice(0, limit).map(reference);
|
|
31
|
+
}
|
|
32
|
+
function summarized(target, rows, decisions, exemplars) {
|
|
33
|
+
const byKind = { stage: 0, call: 0, observed: 0 };
|
|
34
|
+
const byOutcome = { ok: 0, failed: 0, timeout: 0, aborted: 0, paused: 0 };
|
|
35
|
+
const byCategory = { timeout: 0, 'rate-limited': 0, server: 0, network: 0, auth: 0, permanent: 0, unknown: 0 };
|
|
36
|
+
let retries = 0;
|
|
37
|
+
const retried = new Set();
|
|
38
|
+
const gave = new Set();
|
|
39
|
+
const stopped = new Set();
|
|
40
|
+
for (const row of rows) {
|
|
41
|
+
byKind[row.attemptKind]++;
|
|
42
|
+
byOutcome[row.outcome]++;
|
|
43
|
+
if (row.category !== undefined)
|
|
44
|
+
byCategory[row.category]++;
|
|
45
|
+
// A reconciliation wire call is work, but its one-call stop is not a logical workflow give-up.
|
|
46
|
+
if (row.retryLoop?.phase === 'reconcile')
|
|
47
|
+
continue;
|
|
48
|
+
const logical = row.retryLoop;
|
|
49
|
+
const decision = logical === undefined ? row : decisions.get(logicalKey(row.runId, logical.series, logical.attempt));
|
|
50
|
+
if (decision === undefined ||
|
|
51
|
+
(logical !== undefined && (decision.kind !== 'decision' || decision.attemptId !== row.id)))
|
|
52
|
+
continue; // A logical verdict belongs only to the exact physical attempt it cites.
|
|
53
|
+
const key = seriesKey(row.runId, logical?.series ?? row.series);
|
|
54
|
+
if (decision.next === 'retry') {
|
|
55
|
+
retries++;
|
|
56
|
+
retried.add(key);
|
|
57
|
+
}
|
|
58
|
+
if (gaveUp({ next: decision.next, reason: decision.reason })) {
|
|
59
|
+
gave.add(key);
|
|
60
|
+
stopped.add(row);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const sorted = [...rows].sort(order);
|
|
64
|
+
const n = sorted.length;
|
|
65
|
+
const rank = (p) => (n === 0 ? 0 : sorted[n - Math.ceil(n * p)].durationMs);
|
|
66
|
+
const refs = (include) => sorted.filter(include).slice(0, exemplars).map(reference);
|
|
67
|
+
const used = rows.reduce((n, row) => n + row.durationMs, 0);
|
|
68
|
+
return {
|
|
69
|
+
target,
|
|
70
|
+
count: n,
|
|
71
|
+
byKind,
|
|
72
|
+
byOutcome,
|
|
73
|
+
byCategory,
|
|
74
|
+
retries,
|
|
75
|
+
seriesRetried: retried.size,
|
|
76
|
+
gaveUp: gave.size,
|
|
77
|
+
effectUnknown: rows.filter((row) => row.effect === 'unknown').length,
|
|
78
|
+
latencyMs: {
|
|
79
|
+
p50: rank(0.5),
|
|
80
|
+
p90: rank(0.9),
|
|
81
|
+
p95: rank(0.95),
|
|
82
|
+
max: n === 0 ? 0 : sorted[0].durationMs,
|
|
83
|
+
mean: n === 0 ? 0 : used / n,
|
|
84
|
+
},
|
|
85
|
+
budgetUsedMs: used,
|
|
86
|
+
exemplars: {
|
|
87
|
+
slowest: refs(() => true),
|
|
88
|
+
timeout: refs((row) => row.outcome === 'timeout'),
|
|
89
|
+
failed: refs((row) => row.outcome === 'failed' || row.outcome === 'aborted'),
|
|
90
|
+
unknown: refs((row) => row.effect === 'unknown'),
|
|
91
|
+
gaveUp: refs((row) => stopped.has(row)),
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export function aggregateAttempts(rows, exemplars, storage) {
|
|
96
|
+
// Append stores may contain multiple lifecycle versions; the last row is the recorded current fact.
|
|
97
|
+
const unique = new Map(rows.map((row) => [attemptRowKey(row), row]));
|
|
98
|
+
const all = [...unique.values()];
|
|
99
|
+
const decisions = new Map();
|
|
100
|
+
const physical = new Map(all
|
|
101
|
+
.filter((row) => row.kind === 'attempt')
|
|
102
|
+
.map((row) => [JSON.stringify([row.runId, row.id]), row]));
|
|
103
|
+
let unsupported = 0;
|
|
104
|
+
const grouped = new Map();
|
|
105
|
+
for (const row of all)
|
|
106
|
+
if (row.kind === 'decision') {
|
|
107
|
+
const source = physical.get(JSON.stringify([row.runId, row.attemptId]));
|
|
108
|
+
const loop = source?.retryLoop;
|
|
109
|
+
if (source === undefined ||
|
|
110
|
+
source.target !== row.target ||
|
|
111
|
+
loop?.phase !== 'attempt' ||
|
|
112
|
+
loop.id !== row.id ||
|
|
113
|
+
loop.series !== row.series ||
|
|
114
|
+
loop.attempt !== row.attempt ||
|
|
115
|
+
loop.of !== row.of) {
|
|
116
|
+
unsupported++;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
decisions.set(logicalKey(row.runId, row.series, row.attempt), row);
|
|
120
|
+
}
|
|
121
|
+
for (const row of all)
|
|
122
|
+
if (row.kind === 'attempt') {
|
|
123
|
+
const bucket = grouped.get(row.target) ?? [];
|
|
124
|
+
bucket.push(row);
|
|
125
|
+
grouped.set(row.target, bucket);
|
|
126
|
+
}
|
|
127
|
+
const byTarget = new Map([...grouped].map(([target, entries]) => [target, summarized(target, entries, decisions, exemplars)]));
|
|
128
|
+
const runs = new Map();
|
|
129
|
+
for (const row of all) {
|
|
130
|
+
const bucket = runs.get(row.runId) ?? [];
|
|
131
|
+
bucket.push(row);
|
|
132
|
+
runs.set(row.runId, bucket);
|
|
133
|
+
}
|
|
134
|
+
const byRun = new Map();
|
|
135
|
+
for (const [runId, own] of runs) {
|
|
136
|
+
const attempts = own.filter((row) => row.kind === 'attempt');
|
|
137
|
+
const perTarget = new Map();
|
|
138
|
+
for (const row of attempts) {
|
|
139
|
+
const bucket = perTarget.get(row.target) ?? [];
|
|
140
|
+
bucket.push(row);
|
|
141
|
+
perTarget.set(row.target, bucket);
|
|
142
|
+
}
|
|
143
|
+
const stats = [...perTarget].map(([target, entries]) => summarized(target, entries, decisions, 0));
|
|
144
|
+
const run = own.find((row) => row.kind === 'run');
|
|
145
|
+
byRun.set(runId, {
|
|
146
|
+
runId,
|
|
147
|
+
attempts: attempts.length,
|
|
148
|
+
retries: stats.reduce((n, s) => n + s.retries, 0),
|
|
149
|
+
gaveUp: stats.reduce((n, s) => n + s.gaveUp, 0),
|
|
150
|
+
budgetUsedMs: stats.reduce((n, s) => n + s.budgetUsedMs, 0),
|
|
151
|
+
exemplars: worst(attempts, exemplars),
|
|
152
|
+
outcome: run?.kind === 'run' ? run.outcome : 'incomplete',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
byTarget,
|
|
157
|
+
byRun,
|
|
158
|
+
storage: {
|
|
159
|
+
...storage,
|
|
160
|
+
omittedRows: storage.omittedRows + unsupported,
|
|
161
|
+
incomplete: storage.incomplete || unsupported > 0,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRNZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFlLEVBQVUsRUFBRSxDQUN2RCxJQUFJLENBQUMsU0FBUyxDQUNaLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUztJQUNwQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUMvQixDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVO1FBQ3pCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQzFCLENBQUM7QUFDSixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLE9BQWUsRUFBVSxFQUFFLENBQ25GLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBdUI7SUFDL0MsTUFBTSxFQUNKLEVBQUUsRUFDRixN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QUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzNELFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztZQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVk7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU87UUFDTCxRQUFRO1FBQ1IsS0FBSztRQUNMLE9BQU8sRUFBRTtZQUNQLEdBQUcsT0FBTztZQUNWLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVc7WUFDOUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxHQUFHLENBQUM7U0FDbEQ7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBBZ2dyZWdhdGUgcmVjb3JkZWQgZmFjdHM7IG5vIGV4ZWN1dGlvbi10cmVlIHdhbGsgYW5kIG5vIHJlY29uc3RydWN0aW9uIG9mIGxvZ2ljYWwgcmV0cmllcyBmcm9tIGV2ZW50IGNvdW50cy4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdFJlYXNvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0QWdncmVnYXRlLFxuICBBdHRlbXB0RGVjaXNpb25Sb3csXG4gIEF0dGVtcHRNZXRyaWNSZWYsXG4gIEF0dGVtcHRSb3csXG4gIEF0dGVtcHRTdGF0cyxcbiAgQXR0ZW1wdFN0b3JhZ2VTdGF0cyxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2F2ZVVwIH0gZnJvbSAnLi9hdHRlbXB0U2VyaWVzLmpzJztcblxuZXhwb3J0IGNvbnN0IGF0dGVtcHRSb3dLZXkgPSAocm93OiBBdHRlbXB0Um93KTogc3RyaW5nID0+XG4gIEpTT04uc3RyaW5naWZ5KFxuICAgIHJvdy5raW5kID09PSAnYXR0ZW1wdCdcbiAgICAgID8gW3Jvdy5raW5kLCByb3cucnVuSWQsIHJvdy5pZF1cbiAgICAgIDogcm93LmtpbmQgPT09ICdkZWNpc2lvbidcbiAgICAgID8gW3Jvdy5raW5kLCByb3cucnVuSWQsIHJvdy5zZXJpZXMsIHJvdy5hdHRlbXB0XVxuICAgICAgOiBbcm93LmtpbmQsIHJvdy5ydW5JZF0sXG4gICk7XG5leHBvcnQgY29uc3QgbG9naWNhbEtleSA9IChydW5JZDogc3RyaW5nLCBzZXJpZXM6IHN0cmluZywgYXR0ZW1wdDogbnVtYmVyKTogc3RyaW5nID0+XG4gIEpTT04uc3RyaW5naWZ5KFtydW5JZCwgc2VyaWVzLCBhdHRlbXB0XSk7XG5leHBvcnQgY29uc3Qgc2VyaWVzS2V5ID0gKHJ1bklkOiBzdHJpbmcsIHNlcmllczogc3RyaW5nKTogc3RyaW5nID0+IEpTT04uc3RyaW5naWZ5KFtydW5JZCwgc2VyaWVzXSk7XG5leHBvcnQgZnVuY3Rpb24gcmVmZXJlbmNlKHJvdzogUGh5c2ljYWxBdHRlbXB0Um93KTogQXR0ZW1wdE1ldHJpY1JlZiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICBzZXJpZXMsXG4gICAgcnVuSWQsXG4gICAgcnVudGltZVN0YWdlSWQsXG4gICAgYXR0ZW1wdEtpbmQsXG4gICAgdGFyZ2V0LFxuICAgIHRyYWNlSWQsXG4gICAgc3RhcnRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgb3V0Y29tZSxcbiAgICBjYXRlZ29yeSxcbiAgICBuZXh0LFxuICAgIHJlYXNvbixcbiAgICByZXRyeUxvb3AsXG4gIH0gPSByb3c7XG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgc2VyaWVzLFxuICAgIHJ1bklkLFxuICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgIGF0dGVtcHRLaW5kLFxuICAgIHRhcmdldCxcbiAgICAuLi4odHJhY2VJZCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHRyYWNlSWQgfSksXG4gICAgc3RhcnRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgb3V0Y29tZSxcbiAgICAuLi4oY2F0ZWdvcnkgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBjYXRlZ29yeSB9KSxcbiAgICBuZXh0LFxuICAgIHJlYXNvbixcbiAgICAuLi4ocmV0cnlMb29wID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcmV0cnlMb29wOiB7IC4uLnJldHJ5TG9vcCB9IH0pLFxuICB9O1xufVxuY29uc3Qgb3JkZXIgPSAoYTogUGh5c2ljYWxBdHRlbXB0Um93LCBiOiBQaHlzaWNhbEF0dGVtcHRSb3cpID0+XG4gIGIuZHVyYXRpb25NcyAtIGEuZHVyYXRpb25NcyB8fCBiLnN0YXJ0ZWRBdCAtIGEuc3RhcnRlZEF0IHx8IGEuaWQubG9jYWxlQ29tcGFyZShiLmlkKTtcbmV4cG9ydCBmdW5jdGlvbiB3b3JzdChyb3dzOiByZWFkb25seSBQaHlzaWNhbEF0dGVtcHRSb3dbXSwgbGltaXQ6IG51bWJlcik6IEF0dGVtcHRNZXRyaWNSZWZbXSB7XG4gIHJldHVybiBbLi4ucm93c10uc29ydChvcmRlcikuc2xpY2UoMCwgbGltaXQpLm1hcChyZWZlcmVuY2UpO1xufVxuZnVuY3Rpb24gc3VtbWFyaXplZChcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIHJvd3M6IHJlYWRvbmx5IFBoeXNpY2FsQXR0ZW1wdFJvd1tdLFxuICBkZWNpc2lvbnM6IE1hcDxzdHJpbmcsIEF0dGVtcHREZWNpc2lvblJvdz4sXG4gIGV4ZW1wbGFyczogbnVtYmVyLFxuKTogQXR0ZW1wdFN0YXRzIHtcbiAgY29uc3QgYnlLaW5kID0geyBzdGFnZTogMCwgY2FsbDogMCwgb2JzZXJ2ZWQ6IDAgfTtcbiAgY29uc3QgYnlPdXRjb21lID0geyBvazogMCwgZmFpbGVkOiAwLCB0aW1lb3V0OiAwLCBhYm9ydGVkOiAwLCBwYXVzZWQ6IDAgfTtcbiAgY29uc3QgYnlDYXRlZ29yeSA9IHsgdGltZW91dDogMCwgJ3JhdGUtbGltaXRlZCc6IDAsIHNlcnZlcjogMCwgbmV0d29yazogMCwgYXV0aDogMCwgcGVybWFuZW50OiAwLCB1bmtub3duOiAwIH07XG4gIGxldCByZXRyaWVzID0gMDtcbiAgY29uc3QgcmV0cmllZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBnYXZlID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHN0b3BwZWQgPSBuZXcgU2V0PFBoeXNpY2FsQXR0ZW1wdFJvdz4oKTtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGJ5S2luZFtyb3cuYXR0ZW1wdEtpbmRdKys7XG4gICAgYnlPdXRjb21lW3Jvdy5vdXRjb21lXSsrO1xuICAgIGlmIChyb3cuY2F0ZWdvcnkgIT09IHVuZGVmaW5lZCkgYnlDYXRlZ29yeVtyb3cuY2F0ZWdvcnldKys7XG4gICAgLy8gQSByZWNvbmNpbGlhdGlvbiB3aXJlIGNhbGwgaXMgd29yaywgYnV0IGl0cyBvbmUtY2FsbCBzdG9wIGlzIG5vdCBhIGxvZ2ljYWwgd29ya2Zsb3cgZ2l2ZS11cC5cbiAgICBpZiAocm93LnJldHJ5TG9vcD8ucGhhc2UgPT09ICdyZWNvbmNpbGUnKSBjb250aW51ZTtcbiAgICBjb25zdCBsb2dpY2FsID0gcm93LnJldHJ5TG9vcDtcbiAgICBjb25zdCBkZWNpc2lvbiA9XG4gICAgICBsb2dpY2FsID09PSB1bmRlZmluZWQgPyByb3cgOiBkZWNpc2lvbnMuZ2V0KGxvZ2ljYWxLZXkocm93LnJ1bklkLCBsb2dpY2FsLnNlcmllcywgbG9naWNhbC5hdHRlbXB0KSk7XG4gICAgaWYgKFxuICAgICAgZGVjaXNpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgKGxvZ2ljYWwgIT09IHVuZGVmaW5lZCAmJiAoZGVjaXNpb24ua2luZCAhPT0gJ2RlY2lzaW9uJyB8fCBkZWNpc2lvbi5hdHRlbXB0SWQgIT09IHJvdy5pZCkpXG4gICAgKVxuICAgICAgY29udGludWU7IC8vIEEgbG9naWNhbCB2ZXJkaWN0IGJlbG9uZ3Mgb25seSB0byB0aGUgZXhhY3QgcGh5c2ljYWwgYXR0ZW1wdCBpdCBjaXRlcy5cbiAgICBjb25zdCBrZXkgPSBzZXJpZXNLZXkocm93LnJ1bklkLCBsb2dpY2FsPy5zZXJpZXMgPz8gcm93LnNlcmllcyk7XG4gICAgaWYgKGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScpIHtcbiAgICAgIHJldHJpZXMrKztcbiAgICAgIHJldHJpZWQuYWRkKGtleSk7XG4gICAgfVxuICAgIGlmIChnYXZlVXAoeyBuZXh0OiBkZWNpc2lvbi5uZXh0LCByZWFzb246IGRlY2lzaW9uLnJlYXNvbiBhcyBBdHRlbXB0UmVhc29uIH0pKSB7XG4gICAgICBnYXZlLmFkZChrZXkpO1xuICAgICAgc3RvcHBlZC5hZGQocm93KTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc29ydGVkID0gWy4uLnJvd3NdLnNvcnQob3JkZXIpO1xuICBjb25zdCBuID0gc29ydGVkLmxlbmd0aDtcbiAgY29uc3QgcmFuayA9IChwOiBudW1iZXIpID0+IChuID09PSAwID8gMCA6IHNvcnRlZFtuIC0gTWF0aC5jZWlsKG4gKiBwKV0uZHVyYXRpb25Ncyk7XG4gIGNvbnN0IHJlZnMgPSAoaW5jbHVkZTogKHJvdzogUGh5c2ljYWxBdHRlbXB0Um93KSA9PiBib29sZWFuKSA9PlxuICAgIHNvcnRlZC5maWx0ZXIoaW5jbHVkZSkuc2xpY2UoMCwgZXhlbXBsYXJzKS5tYXAocmVmZXJlbmNlKTtcbiAgY29uc3QgdXNlZCA9IHJvd3MucmVkdWNlKChuLCByb3cpID0+IG4gKyByb3cuZHVyYXRpb25NcywgMCk7XG4gIHJldHVybiB7XG4gICAgdGFyZ2V0LFxuICAgIGNvdW50OiBuLFxuICAgIGJ5S2luZCxcbiAgICBieU91dGNvbWUsXG4gICAgYnlDYXRlZ29yeSxcbiAgICByZXRyaWVzLFxuICAgIHNlcmllc1JldHJpZWQ6IHJldHJpZWQuc2l6ZSxcbiAgICBnYXZlVXA6IGdhdmUuc2l6ZSxcbiAgICBlZmZlY3RVbmtub3duOiByb3dzLmZpbHRlcigocm93KSA9PiByb3cuZWZmZWN0ID09PSAndW5rbm93bicpLmxlbmd0aCxcbiAgICBsYXRlbmN5TXM6IHtcbiAgICAgIHA1MDogcmFuaygwLjUpLFxuICAgICAgcDkwOiByYW5rKDAuOSksXG4gICAgICBwOTU6IHJhbmsoMC45NSksXG4gICAgICBtYXg6IG4gPT09IDAgPyAwIDogc29ydGVkWzBdLmR1cmF0aW9uTXMsXG4gICAgICBtZWFuOiBuID09PSAwID8gMCA6IHVzZWQgLyBuLFxuICAgIH0sXG4gICAgYnVkZ2V0VXNlZE1zOiB1c2VkLFxuICAgIGV4ZW1wbGFyczoge1xuICAgICAgc2xvd2VzdDogcmVmcygoKSA9PiB0cnVlKSxcbiAgICAgIHRpbWVvdXQ6IHJlZnMoKHJvdykgPT4gcm93Lm91dGNvbWUgPT09ICd0aW1lb3V0JyksXG4gICAgICBmYWlsZWQ6IHJlZnMoKHJvdykgPT4gcm93Lm91dGNvbWUgPT09ICdmYWlsZWQnIHx8IHJvdy5vdXRjb21lID09PSAnYWJvcnRlZCcpLFxuICAgICAgdW5rbm93bjogcmVmcygocm93KSA9PiByb3cuZWZmZWN0ID09PSAndW5rbm93bicpLFxuICAgICAgZ2F2ZVVwOiByZWZzKChyb3cpID0+IHN0b3BwZWQuaGFzKHJvdykpLFxuICAgIH0sXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlQXR0ZW1wdHMoXG4gIHJvd3M6IHJlYWRvbmx5IEF0dGVtcHRSb3dbXSxcbiAgZXhlbXBsYXJzOiBudW1iZXIsXG4gIHN0b3JhZ2U6IEF0dGVtcHRTdG9yYWdlU3RhdHMsXG4pOiBBdHRlbXB0QWdncmVnYXRlIHtcbiAgLy8gQXBwZW5kIHN0b3JlcyBtYXkgY29udGFpbiBtdWx0aXBsZSBsaWZlY3ljbGUgdmVyc2lvbnM7IHRoZSBsYXN0IHJvdyBpcyB0aGUgcmVjb3JkZWQgY3VycmVudCBmYWN0LlxuICBjb25zdCB1bmlxdWUgPSBuZXcgTWFwKHJvd3MubWFwKChyb3cpID0+IFthdHRlbXB0Um93S2V5KHJvdyksIHJvd10pKTtcbiAgY29uc3QgYWxsID0gWy4uLnVuaXF1ZS52YWx1ZXMoKV07XG4gIGNvbnN0IGRlY2lzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBBdHRlbXB0RGVjaXNpb25Sb3c+KCk7XG4gIGNvbnN0IHBoeXNpY2FsID0gbmV3IE1hcChcbiAgICBhbGxcbiAgICAgIC5maWx0ZXIoKHJvdyk6IHJvdyBpcyBQaHlzaWNhbEF0dGVtcHRSb3cgPT4gcm93LmtpbmQgPT09ICdhdHRlbXB0JylcbiAgICAgIC5tYXAoKHJvdykgPT4gW0pTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5pZF0pLCByb3ddKSxcbiAgKTtcbiAgbGV0IHVuc3VwcG9ydGVkID0gMDtcbiAgY29uc3QgZ3JvdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBQaHlzaWNhbEF0dGVtcHRSb3dbXT4oKTtcbiAgZm9yIChjb25zdCByb3cgb2YgYWxsKVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgY29uc3Qgc291cmNlID0gcGh5c2ljYWwuZ2V0KEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5hdHRlbXB0SWRdKSk7XG4gICAgICBjb25zdCBsb29wID0gc291cmNlPy5yZXRyeUxvb3A7XG4gICAgICBpZiAoXG4gICAgICAgIHNvdXJjZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHNvdXJjZS50YXJnZXQgIT09IHJvdy50YXJnZXQgfHxcbiAgICAgICAgbG9vcD8ucGhhc2UgIT09ICdhdHRlbXB0JyB8fFxuICAgICAgICBsb29wLmlkICE9PSByb3cuaWQgfHxcbiAgICAgICAgbG9vcC5zZXJpZXMgIT09IHJvdy5zZXJpZXMgfHxcbiAgICAgICAgbG9vcC5hdHRlbXB0ICE9PSByb3cuYXR0ZW1wdCB8fFxuICAgICAgICBsb29wLm9mICE9PSByb3cub2ZcbiAgICAgICkge1xuICAgICAgICB1bnN1cHBvcnRlZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlY2lzaW9ucy5zZXQobG9naWNhbEtleShyb3cucnVuSWQsIHJvdy5zZXJpZXMsIHJvdy5hdHRlbXB0KSwgcm93KTtcbiAgICB9XG4gIGZvciAoY29uc3Qgcm93IG9mIGFsbClcbiAgICBpZiAocm93LmtpbmQgPT09ICdhdHRlbXB0Jykge1xuICAgICAgY29uc3QgYnVja2V0ID0gZ3JvdXBlZC5nZXQocm93LnRhcmdldCkgPz8gW107XG4gICAgICBidWNrZXQucHVzaChyb3cpO1xuICAgICAgZ3JvdXBlZC5zZXQocm93LnRhcmdldCwgYnVja2V0KTtcbiAgICB9XG4gIGNvbnN0IGJ5VGFyZ2V0ID0gbmV3IE1hcChcbiAgICBbLi4uZ3JvdXBlZF0ubWFwKChbdGFyZ2V0LCBlbnRyaWVzXSkgPT4gW3RhcmdldCwgc3VtbWFyaXplZCh0YXJnZXQsIGVudHJpZXMsIGRlY2lzaW9ucywgZXhlbXBsYXJzKV0pLFxuICApO1xuICBjb25zdCBydW5zID0gbmV3IE1hcDxzdHJpbmcsIEF0dGVtcHRSb3dbXT4oKTtcbiAgZm9yIChjb25zdCByb3cgb2YgYWxsKSB7XG4gICAgY29uc3QgYnVja2V0ID0gcnVucy5nZXQocm93LnJ1bklkKSA/PyBbXTtcbiAgICBidWNrZXQucHVzaChyb3cpO1xuICAgIHJ1bnMuc2V0KHJvdy5ydW5JZCwgYnVja2V0KTtcbiAgfVxuICBjb25zdCBieVJ1bjogQXR0ZW1wdEFnZ3JlZ2F0ZVsnYnlSdW4nXSA9IG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBbcnVuSWQsIG93bl0gb2YgcnVucykge1xuICAgIGNvbnN0IGF0dGVtcHRzID0gb3duLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKTtcbiAgICBjb25zdCBwZXJUYXJnZXQgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93W10+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXR0ZW1wdHMpIHtcbiAgICAgIGNvbnN0IGJ1Y2tldCA9IHBlclRhcmdldC5nZXQocm93LnRhcmdldCkgPz8gW107XG4gICAgICBidWNrZXQucHVzaChyb3cpO1xuICAgICAgcGVyVGFyZ2V0LnNldChyb3cudGFyZ2V0LCBidWNrZXQpO1xuICAgIH1cbiAgICBjb25zdCBzdGF0cyA9IFsuLi5wZXJUYXJnZXRdLm1hcCgoW3RhcmdldCwgZW50cmllc10pID0+IHN1bW1hcml6ZWQodGFyZ2V0LCBlbnRyaWVzLCBkZWNpc2lvbnMsIDApKTtcbiAgICBjb25zdCBydW4gPSBvd24uZmluZCgocm93KSA9PiByb3cua2luZCA9PT0gJ3J1bicpO1xuICAgIGJ5UnVuLnNldChydW5JZCwge1xuICAgICAgcnVuSWQsXG4gICAgICBhdHRlbXB0czogYXR0ZW1wdHMubGVuZ3RoLFxuICAgICAgcmV0cmllczogc3RhdHMucmVkdWNlKChuLCBzKSA9PiBuICsgcy5yZXRyaWVzLCAwKSxcbiAgICAgIGdhdmVVcDogc3RhdHMucmVkdWNlKChuLCBzKSA9PiBuICsgcy5nYXZlVXAsIDApLFxuICAgICAgYnVkZ2V0VXNlZE1zOiBzdGF0cy5yZWR1Y2UoKG4sIHMpID0+IG4gKyBzLmJ1ZGdldFVzZWRNcywgMCksXG4gICAgICBleGVtcGxhcnM6IHdvcnN0KGF0dGVtcHRzLCBleGVtcGxhcnMpLFxuICAgICAgb3V0Y29tZTogcnVuPy5raW5kID09PSAncnVuJyA/IHJ1bi5vdXRjb21lIDogJ2luY29tcGxldGUnLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgYnlUYXJnZXQsXG4gICAgYnlSdW4sXG4gICAgc3RvcmFnZToge1xuICAgICAgLi4uc3RvcmFnZSxcbiAgICAgIG9taXR0ZWRSb3dzOiBzdG9yYWdlLm9taXR0ZWRSb3dzICsgdW5zdXBwb3J0ZWQsXG4gICAgICBpbmNvbXBsZXRlOiBzdG9yYWdlLmluY29tcGxldGUgfHwgdW5zdXBwb3J0ZWQgPiAwLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** Payload-free P7 rows and public metric projections. Store adapters receive named facts, never errors or keys. */
|
|
2
|
+
import type { AttemptId } from 'foottrace';
|
|
3
|
+
import type { RetryLoopCall, RetryLoopDecision } from '../attempt/retryLoopTypes.js';
|
|
4
|
+
import type { AttemptCategory, AttemptEffect, AttemptKind, AttemptNext, AttemptOutcome, AttemptReason } from '../attempt/types.js';
|
|
5
|
+
export interface AttemptMetricRef {
|
|
6
|
+
readonly id: AttemptId;
|
|
7
|
+
readonly series: string;
|
|
8
|
+
readonly runId: string;
|
|
9
|
+
readonly runtimeStageId: string;
|
|
10
|
+
readonly attemptKind: AttemptKind;
|
|
11
|
+
readonly retryLoop?: RetryLoopCall;
|
|
12
|
+
readonly target: string;
|
|
13
|
+
readonly traceId?: string;
|
|
14
|
+
readonly startedAt: number;
|
|
15
|
+
readonly durationMs: number;
|
|
16
|
+
readonly outcome: AttemptOutcome;
|
|
17
|
+
readonly category?: AttemptCategory;
|
|
18
|
+
readonly next: AttemptNext;
|
|
19
|
+
readonly reason: AttemptReason;
|
|
20
|
+
}
|
|
21
|
+
export interface PhysicalAttemptRow extends AttemptMetricRef {
|
|
22
|
+
readonly kind: 'attempt';
|
|
23
|
+
readonly attemptKind: AttemptKind;
|
|
24
|
+
readonly attempt: number;
|
|
25
|
+
readonly of?: number;
|
|
26
|
+
readonly effect?: AttemptEffect;
|
|
27
|
+
readonly retryLoop?: RetryLoopCall;
|
|
28
|
+
}
|
|
29
|
+
export interface AttemptDecisionRow extends RetryLoopDecision {
|
|
30
|
+
readonly kind: 'decision';
|
|
31
|
+
readonly runId: string;
|
|
32
|
+
readonly target: string;
|
|
33
|
+
readonly runtimeStageId: string;
|
|
34
|
+
readonly attemptId: AttemptId;
|
|
35
|
+
readonly startedAt: number;
|
|
36
|
+
}
|
|
37
|
+
export interface AttemptRunRow {
|
|
38
|
+
readonly kind: 'run';
|
|
39
|
+
readonly runId: string;
|
|
40
|
+
readonly startedAt: number;
|
|
41
|
+
readonly endedAt?: number;
|
|
42
|
+
readonly outcome: 'running' | 'ok' | 'failed' | 'paused';
|
|
43
|
+
}
|
|
44
|
+
export type AttemptRow = PhysicalAttemptRow | AttemptDecisionRow | AttemptRunRow;
|
|
45
|
+
export interface AttemptQuery {
|
|
46
|
+
readonly since?: number;
|
|
47
|
+
readonly until?: number;
|
|
48
|
+
readonly target?: string;
|
|
49
|
+
readonly runId?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface AttemptStore {
|
|
52
|
+
append(rows: readonly AttemptRow[]): void | Promise<void>;
|
|
53
|
+
read(query: AttemptQuery): Promise<readonly AttemptRow[]>;
|
|
54
|
+
/** Optional known retention accounting; omitted evidence must not appear complete. */
|
|
55
|
+
stats?(): {
|
|
56
|
+
readonly omittedRows: number;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export interface AttemptStorageStats {
|
|
60
|
+
readonly pending: number;
|
|
61
|
+
readonly failed: number;
|
|
62
|
+
readonly dropped: number;
|
|
63
|
+
readonly omittedRows: number;
|
|
64
|
+
readonly incomplete: boolean;
|
|
65
|
+
}
|
|
66
|
+
export interface AttemptStats {
|
|
67
|
+
readonly target: string;
|
|
68
|
+
readonly count: number;
|
|
69
|
+
readonly byKind: Record<AttemptKind, number>;
|
|
70
|
+
readonly byOutcome: Record<AttemptOutcome, number>;
|
|
71
|
+
readonly byCategory: Record<AttemptCategory, number>;
|
|
72
|
+
readonly retries: number;
|
|
73
|
+
readonly seriesRetried: number;
|
|
74
|
+
readonly gaveUp: number;
|
|
75
|
+
readonly effectUnknown: number;
|
|
76
|
+
readonly latencyMs: {
|
|
77
|
+
readonly p50: number;
|
|
78
|
+
readonly p90: number;
|
|
79
|
+
readonly p95: number;
|
|
80
|
+
readonly max: number;
|
|
81
|
+
readonly mean: number;
|
|
82
|
+
};
|
|
83
|
+
/** Sum of attempt durations (work time), which can overlap or nest; not elapsed run time. */
|
|
84
|
+
readonly budgetUsedMs: number;
|
|
85
|
+
readonly exemplars: {
|
|
86
|
+
readonly slowest: AttemptMetricRef[];
|
|
87
|
+
readonly timeout: AttemptMetricRef[];
|
|
88
|
+
readonly failed: AttemptMetricRef[];
|
|
89
|
+
readonly unknown: AttemptMetricRef[];
|
|
90
|
+
readonly gaveUp: AttemptMetricRef[];
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export interface AttemptRunStats {
|
|
94
|
+
readonly runId: string;
|
|
95
|
+
readonly attempts: number;
|
|
96
|
+
readonly retries: number;
|
|
97
|
+
readonly gaveUp: number;
|
|
98
|
+
readonly budgetUsedMs: number;
|
|
99
|
+
readonly budgetMs?: number;
|
|
100
|
+
readonly exemplars: AttemptMetricRef[];
|
|
101
|
+
readonly outcome: AttemptRunRow['outcome'] | 'incomplete';
|
|
102
|
+
}
|
|
103
|
+
export interface AttemptAggregate {
|
|
104
|
+
readonly byTarget: Map<string, AttemptStats>;
|
|
105
|
+
readonly byRun: Map<string, AttemptRunStats>;
|
|
106
|
+
readonly storage: AttemptStorageStats;
|
|
107
|
+
}
|
|
108
|
+
export interface AttemptRecorderOptions {
|
|
109
|
+
readonly exemplars?: number;
|
|
110
|
+
readonly maxRows?: number;
|
|
111
|
+
readonly maxPending?: number;
|
|
112
|
+
readonly storeTimeoutMs?: number;
|
|
113
|
+
readonly store?: AttemptStore;
|
|
114
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY3NUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvYXR0ZW1wdE1ldHJpY3NUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFBheWxvYWQtZnJlZSBQNyByb3dzIGFuZCBwdWJsaWMgbWV0cmljIHByb2plY3Rpb25zLiBTdG9yZSBhZGFwdGVycyByZWNlaXZlIG5hbWVkIGZhY3RzLCBuZXZlciBlcnJvcnMgb3Iga2V5cy4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsLCBSZXRyeUxvb3BEZWNpc2lvbiB9IGZyb20gJy4uL2F0dGVtcHQvcmV0cnlMb29wVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0Q2F0ZWdvcnksXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0TmV4dCxcbiAgQXR0ZW1wdE91dGNvbWUsXG4gIEF0dGVtcHRSZWFzb24sXG59IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRNZXRyaWNSZWYge1xuICByZWFkb25seSBpZDogQXR0ZW1wdElkO1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW1wdEtpbmQ6IEF0dGVtcHRLaW5kO1xuICByZWFkb25seSByZXRyeUxvb3A/OiBSZXRyeUxvb3BDYWxsO1xuICByZWFkb25seSB0YXJnZXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdHJhY2VJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3V0Y29tZTogQXR0ZW1wdE91dGNvbWU7XG4gIHJlYWRvbmx5IGNhdGVnb3J5PzogQXR0ZW1wdENhdGVnb3J5O1xuICByZWFkb25seSBuZXh0OiBBdHRlbXB0TmV4dDtcbiAgcmVhZG9ubHkgcmVhc29uOiBBdHRlbXB0UmVhc29uO1xufVxuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbEF0dGVtcHRSb3cgZXh0ZW5kcyBBdHRlbXB0TWV0cmljUmVmIHtcbiAgcmVhZG9ubHkga2luZDogJ2F0dGVtcHQnO1xuICByZWFkb25seSBhdHRlbXB0S2luZDogQXR0ZW1wdEtpbmQ7XG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Y/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVmZmVjdD86IEF0dGVtcHRFZmZlY3Q7XG4gIHJlYWRvbmx5IHJldHJ5TG9vcD86IFJldHJ5TG9vcENhbGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHREZWNpc2lvblJvdyBleHRlbmRzIFJldHJ5TG9vcERlY2lzaW9uIHtcbiAgcmVhZG9ubHkga2luZDogJ2RlY2lzaW9uJztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF0dGVtcHRJZDogQXR0ZW1wdElkO1xuICByZWFkb25seSBzdGFydGVkQXQ6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXR0ZW1wdFJ1blJvdyB7XG4gIHJlYWRvbmx5IGtpbmQ6ICdydW4nO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZW5kZWRBdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3V0Y29tZTogJ3J1bm5pbmcnIHwgJ29rJyB8ICdmYWlsZWQnIHwgJ3BhdXNlZCc7XG59XG5leHBvcnQgdHlwZSBBdHRlbXB0Um93ID0gUGh5c2ljYWxBdHRlbXB0Um93IHwgQXR0ZW1wdERlY2lzaW9uUm93IHwgQXR0ZW1wdFJ1blJvdztcbmV4cG9ydCBpbnRlcmZhY2UgQXR0ZW1wdFF1ZXJ5IHtcbiAgcmVhZG9ubHkgc2luY2U/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVudGlsPzogbnVtYmVyO1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bklkPzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3RvcmUge1xuICBhcHBlbmQocm93czogcmVhZG9ubHkgQXR0ZW1wdFJvd1tdKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHJlYWQocXVlcnk6IEF0dGVtcHRRdWVyeSk6IFByb21pc2U8cmVhZG9ubHkgQXR0ZW1wdFJvd1tdPjtcbiAgLyoqIE9wdGlvbmFsIGtub3duIHJldGVudGlvbiBhY2NvdW50aW5nOyBvbWl0dGVkIGV2aWRlbmNlIG11c3Qgbm90IGFwcGVhciBjb21wbGV0ZS4gKi9cbiAgc3RhdHM/KCk6IHsgcmVhZG9ubHkgb21pdHRlZFJvd3M6IG51bWJlciB9O1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3RvcmFnZVN0YXRzIHtcbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xuICByZWFkb25seSBmYWlsZWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZHJvcHBlZDogbnVtYmVyO1xuICByZWFkb25seSBvbWl0dGVkUm93czogbnVtYmVyO1xuICByZWFkb25seSBpbmNvbXBsZXRlOiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3RhdHMge1xuICByZWFkb25seSB0YXJnZXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnlLaW5kOiBSZWNvcmQ8QXR0ZW1wdEtpbmQsIG51bWJlcj47XG4gIHJlYWRvbmx5IGJ5T3V0Y29tZTogUmVjb3JkPEF0dGVtcHRPdXRjb21lLCBudW1iZXI+O1xuICByZWFkb25seSBieUNhdGVnb3J5OiBSZWNvcmQ8QXR0ZW1wdENhdGVnb3J5LCBudW1iZXI+O1xuICByZWFkb25seSByZXRyaWVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcmllc1JldHJpZWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZ2F2ZVVwOiBudW1iZXI7XG4gIHJlYWRvbmx5IGVmZmVjdFVua25vd246IG51bWJlcjtcbiAgcmVhZG9ubHkgbGF0ZW5jeU1zOiB7XG4gICAgcmVhZG9ubHkgcDUwOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcDkwOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcDk1OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbWVhbjogbnVtYmVyO1xuICB9O1xuICAvKiogU3VtIG9mIGF0dGVtcHQgZHVyYXRpb25zICh3b3JrIHRpbWUpLCB3aGljaCBjYW4gb3ZlcmxhcCBvciBuZXN0OyBub3QgZWxhcHNlZCBydW4gdGltZS4gKi9cbiAgcmVhZG9ubHkgYnVkZ2V0VXNlZE1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IGV4ZW1wbGFyczoge1xuICAgIHJlYWRvbmx5IHNsb3dlc3Q6IEF0dGVtcHRNZXRyaWNSZWZbXTtcbiAgICByZWFkb25seSB0aW1lb3V0OiBBdHRlbXB0TWV0cmljUmVmW107XG4gICAgcmVhZG9ubHkgZmFpbGVkOiBBdHRlbXB0TWV0cmljUmVmW107XG4gICAgcmVhZG9ubHkgdW5rbm93bjogQXR0ZW1wdE1ldHJpY1JlZltdO1xuICAgIHJlYWRvbmx5IGdhdmVVcDogQXR0ZW1wdE1ldHJpY1JlZltdO1xuICB9O1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0UnVuU3RhdHMge1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBhdHRlbXB0czogbnVtYmVyO1xuICByZWFkb25seSByZXRyaWVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGdhdmVVcDogbnVtYmVyO1xuICByZWFkb25seSBidWRnZXRVc2VkTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnVkZ2V0TXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV4ZW1wbGFyczogQXR0ZW1wdE1ldHJpY1JlZltdO1xuICByZWFkb25seSBvdXRjb21lOiBBdHRlbXB0UnVuUm93WydvdXRjb21lJ10gfCAnaW5jb21wbGV0ZSc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRBZ2dyZWdhdGUge1xuICByZWFkb25seSBieVRhcmdldDogTWFwPHN0cmluZywgQXR0ZW1wdFN0YXRzPjtcbiAgcmVhZG9ubHkgYnlSdW46IE1hcDxzdHJpbmcsIEF0dGVtcHRSdW5TdGF0cz47XG4gIHJlYWRvbmx5IHN0b3JhZ2U6IEF0dGVtcHRTdG9yYWdlU3RhdHM7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSZWNvcmRlck9wdGlvbnMge1xuICByZWFkb25seSBleGVtcGxhcnM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heFJvd3M/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heFBlbmRpbmc/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0b3JlVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzdG9yZT86IEF0dGVtcHRTdG9yZTtcbn1cbiJdfQ==
|