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,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.matchesQuery = exports.metricRow = exports.metricWindow = exports.ownDataRecord = void 0;
|
|
4
|
+
const foottrace_1 = require("foottrace");
|
|
5
|
+
// Fixed named fields: a huge unknown envelope is never enumerated just to discard it.
|
|
6
|
+
const DATA_FIELDS = [
|
|
7
|
+
'kind',
|
|
8
|
+
'runId',
|
|
9
|
+
'startedAt',
|
|
10
|
+
'endedAt',
|
|
11
|
+
'outcome',
|
|
12
|
+
'target',
|
|
13
|
+
'runtimeStageId',
|
|
14
|
+
'attemptId',
|
|
15
|
+
'id',
|
|
16
|
+
'series',
|
|
17
|
+
'attempt',
|
|
18
|
+
'of',
|
|
19
|
+
'effect',
|
|
20
|
+
'reconciled',
|
|
21
|
+
'next',
|
|
22
|
+
'reason',
|
|
23
|
+
'attemptKind',
|
|
24
|
+
'durationMs',
|
|
25
|
+
'category',
|
|
26
|
+
'traceId',
|
|
27
|
+
'retryLoop',
|
|
28
|
+
'phase',
|
|
29
|
+
'since',
|
|
30
|
+
'until',
|
|
31
|
+
'omittedRows',
|
|
32
|
+
];
|
|
33
|
+
/** Decode plain own data only; external data never gets to run getters or coercion hooks. */
|
|
34
|
+
function ownDataRecord(value) {
|
|
35
|
+
try {
|
|
36
|
+
if (value === null || typeof value !== 'object' || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
|
|
37
|
+
return undefined;
|
|
38
|
+
const data = Object.create(null);
|
|
39
|
+
for (const key of DATA_FIELDS) {
|
|
40
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
41
|
+
if (descriptor === undefined)
|
|
42
|
+
continue;
|
|
43
|
+
if (!Object.hasOwn(descriptor, 'value'))
|
|
44
|
+
return undefined;
|
|
45
|
+
data[key] = descriptor.value;
|
|
46
|
+
}
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.ownDataRecord = ownDataRecord;
|
|
54
|
+
/** Read an external array window by descriptors, never by executing an index accessor or iterator. */
|
|
55
|
+
function metricWindow(value, maxRows) {
|
|
56
|
+
try {
|
|
57
|
+
if (!Array.isArray(value))
|
|
58
|
+
return { values: [], omitted: 1 };
|
|
59
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
60
|
+
if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
|
|
61
|
+
return { values: [], omitted: 1 };
|
|
62
|
+
const start = Math.max(0, length - maxRows);
|
|
63
|
+
const values = [];
|
|
64
|
+
let omitted = start;
|
|
65
|
+
for (let index = start; index < length; index++) {
|
|
66
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
67
|
+
if (descriptor === undefined || !Object.hasOwn(descriptor, 'value'))
|
|
68
|
+
omitted++;
|
|
69
|
+
else
|
|
70
|
+
values.push(descriptor.value);
|
|
71
|
+
}
|
|
72
|
+
return { values, omitted };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { values: [], omitted: 1 };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.metricWindow = metricWindow;
|
|
79
|
+
const outcomes = new Set(['ok', 'failed', 'timeout', 'aborted', 'paused']);
|
|
80
|
+
const categories = new Set(['timeout', 'rate-limited', 'server', 'network', 'auth', 'permanent', 'unknown']);
|
|
81
|
+
const reasons = new Set(['succeeded', 'paused', 'aborted', 'exhausted', 'declined', 'no-time-left', 'retryable']);
|
|
82
|
+
const nexts = new Set(['retry', 'done', 'stop']);
|
|
83
|
+
const effects = new Set(['none', 'applied', 'unknown']);
|
|
84
|
+
const number = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER;
|
|
85
|
+
const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 4096;
|
|
86
|
+
const count = (value) => number(value) && Number.isSafeInteger(value) && value >= 1;
|
|
87
|
+
function loopOf(value) {
|
|
88
|
+
if (value === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
const v = ownDataRecord(value);
|
|
91
|
+
if (v === undefined)
|
|
92
|
+
throw new TypeError('invalid attempt loop');
|
|
93
|
+
if (!text(v.id) ||
|
|
94
|
+
!text(v.series) ||
|
|
95
|
+
!(0, foottrace_1.parseAttemptId)(`${v.series}@1`) ||
|
|
96
|
+
!count(v.attempt) ||
|
|
97
|
+
!count(v.of) ||
|
|
98
|
+
v.attempt > v.of ||
|
|
99
|
+
(v.phase !== 'attempt' && v.phase !== 'reconcile'))
|
|
100
|
+
throw new TypeError('invalid attempt loop');
|
|
101
|
+
return { id: v.id, series: v.series, attempt: v.attempt, of: v.of, phase: v.phase };
|
|
102
|
+
}
|
|
103
|
+
/** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
|
|
104
|
+
function metricRow(value) {
|
|
105
|
+
try {
|
|
106
|
+
const v = ownDataRecord(value);
|
|
107
|
+
if (v === undefined)
|
|
108
|
+
return undefined;
|
|
109
|
+
if (!text(v.runId) || !number(v.startedAt))
|
|
110
|
+
return undefined;
|
|
111
|
+
if (v.kind === 'run') {
|
|
112
|
+
if (!['running', 'ok', 'failed', 'paused'].includes(v.outcome) ||
|
|
113
|
+
(v.endedAt !== undefined && !number(v.endedAt)))
|
|
114
|
+
return undefined;
|
|
115
|
+
return {
|
|
116
|
+
kind: 'run',
|
|
117
|
+
runId: v.runId,
|
|
118
|
+
startedAt: v.startedAt,
|
|
119
|
+
...(v.endedAt === undefined ? {} : { endedAt: v.endedAt }),
|
|
120
|
+
outcome: v.outcome,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (!text(v.target) || !text(v.runtimeStageId) || !(0, foottrace_1.parseAttemptId)(`${v.runtimeStageId}@1`))
|
|
124
|
+
return undefined;
|
|
125
|
+
if (v.kind === 'decision') {
|
|
126
|
+
const parsed = text(v.attemptId) ? (0, foottrace_1.parseAttemptId)(v.attemptId) : undefined;
|
|
127
|
+
if (!parsed ||
|
|
128
|
+
!text(v.id) ||
|
|
129
|
+
!text(v.series) ||
|
|
130
|
+
!(0, foottrace_1.parseAttemptId)(`${v.series}@1`) ||
|
|
131
|
+
!count(v.attempt) ||
|
|
132
|
+
!count(v.of) ||
|
|
133
|
+
v.attempt > v.of ||
|
|
134
|
+
!effects.has(v.effect) ||
|
|
135
|
+
typeof v.reconciled !== 'boolean' ||
|
|
136
|
+
!nexts.has(v.next) ||
|
|
137
|
+
!reasons.has(v.reason))
|
|
138
|
+
return undefined;
|
|
139
|
+
return {
|
|
140
|
+
kind: 'decision',
|
|
141
|
+
id: v.id,
|
|
142
|
+
series: v.series,
|
|
143
|
+
attempt: v.attempt,
|
|
144
|
+
of: v.of,
|
|
145
|
+
effect: v.effect,
|
|
146
|
+
reconciled: v.reconciled,
|
|
147
|
+
next: v.next,
|
|
148
|
+
reason: v.reason,
|
|
149
|
+
runId: v.runId,
|
|
150
|
+
target: v.target,
|
|
151
|
+
runtimeStageId: v.runtimeStageId,
|
|
152
|
+
attemptId: v.attemptId,
|
|
153
|
+
startedAt: v.startedAt,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const parsed = text(v.id) ? (0, foottrace_1.parseAttemptId)(v.id) : undefined;
|
|
157
|
+
if (v.kind !== 'attempt' ||
|
|
158
|
+
!parsed ||
|
|
159
|
+
parsed.runtimeStageId !== v.runtimeStageId ||
|
|
160
|
+
!text(v.series) ||
|
|
161
|
+
!count(v.attempt) ||
|
|
162
|
+
v.id !== `${v.series}@${v.attempt}` ||
|
|
163
|
+
(v.of !== undefined && (!count(v.of) || v.attempt > v.of)) ||
|
|
164
|
+
!number(v.durationMs) ||
|
|
165
|
+
!outcomes.has(v.outcome) ||
|
|
166
|
+
!['stage', 'call', 'observed'].includes(v.attemptKind) ||
|
|
167
|
+
!nexts.has(v.next) ||
|
|
168
|
+
!reasons.has(v.reason) ||
|
|
169
|
+
(v.category !== undefined && !categories.has(v.category)) ||
|
|
170
|
+
(v.effect !== undefined && !effects.has(v.effect)) ||
|
|
171
|
+
(v.traceId !== undefined && !text(v.traceId)))
|
|
172
|
+
return undefined;
|
|
173
|
+
const retryLoop = loopOf(v.retryLoop);
|
|
174
|
+
if (retryLoop !== undefined && v.attemptKind !== 'call')
|
|
175
|
+
return undefined;
|
|
176
|
+
return {
|
|
177
|
+
kind: 'attempt',
|
|
178
|
+
id: v.id,
|
|
179
|
+
series: v.series,
|
|
180
|
+
runId: v.runId,
|
|
181
|
+
runtimeStageId: v.runtimeStageId,
|
|
182
|
+
target: v.target,
|
|
183
|
+
...(v.traceId === undefined ? {} : { traceId: v.traceId }),
|
|
184
|
+
startedAt: v.startedAt,
|
|
185
|
+
durationMs: v.durationMs,
|
|
186
|
+
outcome: v.outcome,
|
|
187
|
+
...(v.category === undefined ? {} : { category: v.category }),
|
|
188
|
+
next: v.next,
|
|
189
|
+
reason: v.reason,
|
|
190
|
+
attemptKind: v.attemptKind,
|
|
191
|
+
attempt: v.attempt,
|
|
192
|
+
...(v.of === undefined ? {} : { of: v.of }),
|
|
193
|
+
...(v.effect === undefined ? {} : { effect: v.effect }),
|
|
194
|
+
...(retryLoop === undefined ? {} : { retryLoop }),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.metricRow = metricRow;
|
|
202
|
+
function matchesQuery(row, query) {
|
|
203
|
+
return ((query.since === undefined || row.startedAt >= query.since) &&
|
|
204
|
+
(query.until === undefined || row.startedAt <= query.until) &&
|
|
205
|
+
(query.runId === undefined || row.runId === query.runId) &&
|
|
206
|
+
(query.target === undefined || (row.kind !== 'run' && row.target === query.target)));
|
|
207
|
+
}
|
|
208
|
+
exports.matchesQuery = matchesQuery;
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY1Jvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRNZXRyaWNSb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHlDQUEyQztBQVkzQyxzRkFBc0Y7QUFDdEYsTUFBTSxXQUFXLEdBQUc7SUFDbEIsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxJQUFJO0lBQ0osUUFBUTtJQUNSLFNBQVM7SUFDVCxJQUFJO0lBQ0osUUFBUTtJQUNSLFlBQVk7SUFDWixNQUFNO0lBQ04sUUFBUTtJQUNSLGFBQWE7SUFDYixZQUFZO0lBQ1osVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsYUFBYTtDQUNMLENBQUM7QUFDWCw2RkFBNkY7QUFDN0YsU0FBZ0IsYUFBYSxDQUFDLEtBQWM7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqSCxPQUFPLFNBQVMsQ0FBQztRQUNuQixNQUFNLElBQUksR0FBNEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0QsSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxTQUFTO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBZkQsc0NBZUM7QUFFRCxzR0FBc0c7QUFDdEcsU0FBZ0IsWUFBWSxDQUFDLEtBQWMsRUFBRSxPQUFlO0lBQzFELElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQWdCLENBQUM7UUFDbEYsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2pILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBYyxFQUFFLENBQUM7UUFDN0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQzs7Z0JBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFqQkQsb0NBaUJDO0FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMzRSxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDN0csTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ2xILE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3hELE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBYyxFQUFtQixFQUFFLENBQ2pELE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN4RyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQWMsRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztBQUN4SCxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQWMsRUFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDOUcsU0FBUyxNQUFNLENBQUMsS0FBYztJQUM1QixJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDMUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDakUsSUFDRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1gsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNmLENBQUMsSUFBQSwwQkFBYyxFQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQ2hDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDakIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDaEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQztRQUVsRCxNQUFNLElBQUksU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDOUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDdEYsQ0FBQztBQUNELDJGQUEyRjtBQUMzRixTQUFnQixTQUFTLENBQUMsS0FBYztJQUN0QyxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM3RCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDckIsSUFDRSxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFpQixDQUFDO2dCQUNwRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFL0MsT0FBTyxTQUFTLENBQUM7WUFDbkIsT0FBTztnQkFDTCxJQUFJLEVBQUUsS0FBSztnQkFDWCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2dCQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQWlCLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFtQzthQUMvQyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUEsMEJBQWMsRUFBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLDBCQUFjLEVBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0UsSUFDRSxDQUFDLE1BQU07Z0JBQ1AsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNmLENBQUMsSUFBQSwwQkFBYyxFQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUNoQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNqQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNaLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBZ0IsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLENBQUMsVUFBVSxLQUFLLFNBQVM7Z0JBQ2pDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBYyxDQUFDO2dCQUM1QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQWdCLENBQUM7Z0JBRWhDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDUixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztnQkFDbEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBc0M7Z0JBQ2hELFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtnQkFDeEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFtQjtnQkFDM0IsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFnQjtnQkFDMUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtnQkFDaEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO2dCQUNoQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQXNCO2dCQUNuQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVM7YUFDdkIsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLDBCQUFjLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0QsSUFDRSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFDcEIsQ0FBQyxNQUFNO1lBQ1AsTUFBTSxDQUFDLGNBQWMsS0FBSyxDQUFDLENBQUMsY0FBYztZQUMxQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2YsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQ25DLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNyQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQWlCLENBQUM7WUFDbEMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFxQixDQUFDO1lBQ2hFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBYyxDQUFDO1lBQzVCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBZ0IsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBa0IsQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFnQixDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0MsT0FBTyxTQUFTLENBQUM7UUFDbkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLFdBQVcsS0FBSyxNQUFNO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDMUUsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1lBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFlO1lBQ3JCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7WUFDZCxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7WUFDaEMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO1lBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBaUIsRUFBRSxDQUFDO1lBQ3BFLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztZQUN0QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUF5QjtZQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQTJCLEVBQUUsQ0FBQztZQUNoRixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQW1CO1lBQzNCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBdUI7WUFDakMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUEwQjtZQUN6QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFZLEVBQUUsQ0FBQztZQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQXNDLEVBQUUsQ0FBQztZQUN2RixHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFqR0QsOEJBaUdDO0FBQ0QsU0FBZ0IsWUFBWSxDQUFDLEdBQWUsRUFBRSxLQUFtQjtJQUMvRCxPQUFPLENBQ0wsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDM0QsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDM0QsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDeEQsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ3BGLENBQUM7QUFDSixDQUFDO0FBUEQsb0NBT0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogTmFtZWQtZmllbGQgYWRtaXNzaW9uIGZvciBtZXRyaWMgcm93cywgc2hhcmVkIGJ5IGxpdmUgY29sbGVjdGlvbiBhbmQgZXh0ZXJuYWwgc3RvcmUgcmVhZHMuICovXG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgeyBwYXJzZUF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlMb29wQ2FsbCB9IGZyb20gJy4uL2F0dGVtcHQvcmV0cnlMb29wVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRlbXB0Q2F0ZWdvcnksIEF0dGVtcHRLaW5kLCBBdHRlbXB0TmV4dCwgQXR0ZW1wdE91dGNvbWUsIEF0dGVtcHRSZWFzb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdERlY2lzaW9uUm93LFxuICBBdHRlbXB0UXVlcnksXG4gIEF0dGVtcHRSb3csXG4gIEF0dGVtcHRSdW5Sb3csXG4gIFBoeXNpY2FsQXR0ZW1wdFJvdyxcbn0gZnJvbSAnLi9hdHRlbXB0TWV0cmljc1R5cGVzLmpzJztcblxuLy8gRml4ZWQgbmFtZWQgZmllbGRzOiBhIGh1Z2UgdW5rbm93biBlbnZlbG9wZSBpcyBuZXZlciBlbnVtZXJhdGVkIGp1c3QgdG8gZGlzY2FyZCBpdC5cbmNvbnN0IERBVEFfRklFTERTID0gW1xuICAna2luZCcsXG4gICdydW5JZCcsXG4gICdzdGFydGVkQXQnLFxuICAnZW5kZWRBdCcsXG4gICdvdXRjb21lJyxcbiAgJ3RhcmdldCcsXG4gICdydW50aW1lU3RhZ2VJZCcsXG4gICdhdHRlbXB0SWQnLFxuICAnaWQnLFxuICAnc2VyaWVzJyxcbiAgJ2F0dGVtcHQnLFxuICAnb2YnLFxuICAnZWZmZWN0JyxcbiAgJ3JlY29uY2lsZWQnLFxuICAnbmV4dCcsXG4gICdyZWFzb24nLFxuICAnYXR0ZW1wdEtpbmQnLFxuICAnZHVyYXRpb25NcycsXG4gICdjYXRlZ29yeScsXG4gICd0cmFjZUlkJyxcbiAgJ3JldHJ5TG9vcCcsXG4gICdwaGFzZScsXG4gICdzaW5jZScsXG4gICd1bnRpbCcsXG4gICdvbWl0dGVkUm93cycsXG5dIGFzIGNvbnN0O1xuLyoqIERlY29kZSBwbGFpbiBvd24gZGF0YSBvbmx5OyBleHRlcm5hbCBkYXRhIG5ldmVyIGdldHMgdG8gcnVuIGdldHRlcnMgb3IgY29lcmNpb24gaG9va3MuICovXG5leHBvcnQgZnVuY3Rpb24gb3duRGF0YVJlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhW09iamVjdC5wcm90b3R5cGUsIG51bGxdLmluY2x1ZGVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkpKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgREFUQV9GSUVMRFMpIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBkYXRhW2tleV0gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogUmVhZCBhbiBleHRlcm5hbCBhcnJheSB3aW5kb3cgYnkgZGVzY3JpcHRvcnMsIG5ldmVyIGJ5IGV4ZWN1dGluZyBhbiBpbmRleCBhY2Nlc3NvciBvciBpdGVyYXRvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNXaW5kb3codmFsdWU6IHVua25vd24sIG1heFJvd3M6IG51bWJlcik6IHsgdmFsdWVzOiB1bmtub3duW107IG9taXR0ZWQ6IG51bWJlciB9IHtcbiAgdHJ5IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4geyB2YWx1ZXM6IFtdLCBvbWl0dGVkOiAxIH07XG4gICAgY29uc3QgbGVuZ3RoID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwgJ2xlbmd0aCcpPy52YWx1ZSBhcyB1bmtub3duO1xuICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIobGVuZ3RoKSB8fCBsZW5ndGggPCAwKSByZXR1cm4geyB2YWx1ZXM6IFtdLCBvbWl0dGVkOiAxIH07XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBsZW5ndGggLSBtYXhSb3dzKTtcbiAgICBjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuICAgIGxldCBvbWl0dGVkID0gc3RhcnQ7XG4gICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgIGlmIChkZXNjcmlwdG9yID09PSB1bmRlZmluZWQgfHwgIU9iamVjdC5oYXNPd24oZGVzY3JpcHRvciwgJ3ZhbHVlJykpIG9taXR0ZWQrKztcbiAgICAgIGVsc2UgdmFsdWVzLnB1c2goZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7IHZhbHVlcywgb21pdHRlZCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyB2YWx1ZXM6IFtdLCBvbWl0dGVkOiAxIH07XG4gIH1cbn1cblxuY29uc3Qgb3V0Y29tZXMgPSBuZXcgU2V0KFsnb2snLCAnZmFpbGVkJywgJ3RpbWVvdXQnLCAnYWJvcnRlZCcsICdwYXVzZWQnXSk7XG5jb25zdCBjYXRlZ29yaWVzID0gbmV3IFNldChbJ3RpbWVvdXQnLCAncmF0ZS1saW1pdGVkJywgJ3NlcnZlcicsICduZXR3b3JrJywgJ2F1dGgnLCAncGVybWFuZW50JywgJ3Vua25vd24nXSk7XG5jb25zdCByZWFzb25zID0gbmV3IFNldChbJ3N1Y2NlZWRlZCcsICdwYXVzZWQnLCAnYWJvcnRlZCcsICdleGhhdXN0ZWQnLCAnZGVjbGluZWQnLCAnbm8tdGltZS1sZWZ0JywgJ3JldHJ5YWJsZSddKTtcbmNvbnN0IG5leHRzID0gbmV3IFNldChbJ3JldHJ5JywgJ2RvbmUnLCAnc3RvcCddKTtcbmNvbnN0IGVmZmVjdHMgPSBuZXcgU2V0KFsnbm9uZScsICdhcHBsaWVkJywgJ3Vua25vd24nXSk7XG5jb25zdCBudW1iZXIgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5jb25zdCB0ZXh0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPD0gNDA5NjtcbmNvbnN0IGNvdW50ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVtYmVyID0+IG51bWJlcih2YWx1ZSkgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDE7XG5mdW5jdGlvbiBsb29wT2YodmFsdWU6IHVua25vd24pOiBSZXRyeUxvb3BDYWxsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHYgPSBvd25EYXRhUmVjb3JkKHZhbHVlKTtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBhdHRlbXB0IGxvb3AnKTtcbiAgaWYgKFxuICAgICF0ZXh0KHYuaWQpIHx8XG4gICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgIXBhcnNlQXR0ZW1wdElkKGAke3Yuc2VyaWVzfUAxYCkgfHxcbiAgICAhY291bnQodi5hdHRlbXB0KSB8fFxuICAgICFjb3VudCh2Lm9mKSB8fFxuICAgIHYuYXR0ZW1wdCA+IHYub2YgfHxcbiAgICAodi5waGFzZSAhPT0gJ2F0dGVtcHQnICYmIHYucGhhc2UgIT09ICdyZWNvbmNpbGUnKVxuICApXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBhdHRlbXB0IGxvb3AnKTtcbiAgcmV0dXJuIHsgaWQ6IHYuaWQsIHNlcmllczogdi5zZXJpZXMsIGF0dGVtcHQ6IHYuYXR0ZW1wdCwgb2Y6IHYub2YsIHBoYXNlOiB2LnBoYXNlIH07XG59XG4vKiogSW52YWxpZCBzdG9yZWQgZGF0YSBpcyBvbWl0dGVkIGFuZCBhY2NvdW50ZWQsIG5ldmVyIGNvcGllZCBhcyBhbiBhcmJpdHJhcnkgZW52ZWxvcGUuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0cmljUm93KHZhbHVlOiB1bmtub3duKTogQXR0ZW1wdFJvdyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgdiA9IG93bkRhdGFSZWNvcmQodmFsdWUpO1xuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0ZXh0KHYucnVuSWQpIHx8ICFudW1iZXIodi5zdGFydGVkQXQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2LmtpbmQgPT09ICdydW4nKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFbJ3J1bm5pbmcnLCAnb2snLCAnZmFpbGVkJywgJ3BhdXNlZCddLmluY2x1ZGVzKHYub3V0Y29tZSBhcyBzdHJpbmcpIHx8XG4gICAgICAgICh2LmVuZGVkQXQgIT09IHVuZGVmaW5lZCAmJiAhbnVtYmVyKHYuZW5kZWRBdCkpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAncnVuJyxcbiAgICAgICAgcnVuSWQ6IHYucnVuSWQsXG4gICAgICAgIHN0YXJ0ZWRBdDogdi5zdGFydGVkQXQsXG4gICAgICAgIC4uLih2LmVuZGVkQXQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBlbmRlZEF0OiB2LmVuZGVkQXQgYXMgbnVtYmVyIH0pLFxuICAgICAgICBvdXRjb21lOiB2Lm91dGNvbWUgYXMgQXR0ZW1wdFJ1blJvd1snb3V0Y29tZSddLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0ZXh0KHYudGFyZ2V0KSB8fCAhdGV4dCh2LnJ1bnRpbWVTdGFnZUlkKSB8fCAhcGFyc2VBdHRlbXB0SWQoYCR7di5ydW50aW1lU3RhZ2VJZH1AMWApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2LmtpbmQgPT09ICdkZWNpc2lvbicpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRleHQodi5hdHRlbXB0SWQpID8gcGFyc2VBdHRlbXB0SWQodi5hdHRlbXB0SWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyc2VkIHx8XG4gICAgICAgICF0ZXh0KHYuaWQpIHx8XG4gICAgICAgICF0ZXh0KHYuc2VyaWVzKSB8fFxuICAgICAgICAhcGFyc2VBdHRlbXB0SWQoYCR7di5zZXJpZXN9QDFgKSB8fFxuICAgICAgICAhY291bnQodi5hdHRlbXB0KSB8fFxuICAgICAgICAhY291bnQodi5vZikgfHxcbiAgICAgICAgdi5hdHRlbXB0ID4gdi5vZiB8fFxuICAgICAgICAhZWZmZWN0cy5oYXModi5lZmZlY3QgYXMgc3RyaW5nKSB8fFxuICAgICAgICB0eXBlb2Ygdi5yZWNvbmNpbGVkICE9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIW5leHRzLmhhcyh2Lm5leHQgYXMgc3RyaW5nKSB8fFxuICAgICAgICAhcmVhc29ucy5oYXModi5yZWFzb24gYXMgc3RyaW5nKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2RlY2lzaW9uJyxcbiAgICAgICAgaWQ6IHYuaWQsXG4gICAgICAgIHNlcmllczogdi5zZXJpZXMsXG4gICAgICAgIGF0dGVtcHQ6IHYuYXR0ZW1wdCxcbiAgICAgICAgb2Y6IHYub2YsXG4gICAgICAgIGVmZmVjdDogdi5lZmZlY3QgYXMgQXR0ZW1wdERlY2lzaW9uUm93WydlZmZlY3QnXSxcbiAgICAgICAgcmVjb25jaWxlZDogdi5yZWNvbmNpbGVkLFxuICAgICAgICBuZXh0OiB2Lm5leHQgYXMgQXR0ZW1wdE5leHQsXG4gICAgICAgIHJlYXNvbjogdi5yZWFzb24gYXMgc3RyaW5nLFxuICAgICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgICAgdGFyZ2V0OiB2LnRhcmdldCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHYucnVudGltZVN0YWdlSWQsXG4gICAgICAgIGF0dGVtcHRJZDogdi5hdHRlbXB0SWQgYXMgQXR0ZW1wdElkLFxuICAgICAgICBzdGFydGVkQXQ6IHYuc3RhcnRlZEF0LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0gdGV4dCh2LmlkKSA/IHBhcnNlQXR0ZW1wdElkKHYuaWQpIDogdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIHYua2luZCAhPT0gJ2F0dGVtcHQnIHx8XG4gICAgICAhcGFyc2VkIHx8XG4gICAgICBwYXJzZWQucnVudGltZVN0YWdlSWQgIT09IHYucnVudGltZVN0YWdlSWQgfHxcbiAgICAgICF0ZXh0KHYuc2VyaWVzKSB8fFxuICAgICAgIWNvdW50KHYuYXR0ZW1wdCkgfHxcbiAgICAgIHYuaWQgIT09IGAke3Yuc2VyaWVzfUAke3YuYXR0ZW1wdH1gIHx8XG4gICAgICAodi5vZiAhPT0gdW5kZWZpbmVkICYmICghY291bnQodi5vZikgfHwgdi5hdHRlbXB0ID4gdi5vZikpIHx8XG4gICAgICAhbnVtYmVyKHYuZHVyYXRpb25NcykgfHxcbiAgICAgICFvdXRjb21lcy5oYXModi5vdXRjb21lIGFzIHN0cmluZykgfHxcbiAgICAgICFbJ3N0YWdlJywgJ2NhbGwnLCAnb2JzZXJ2ZWQnXS5pbmNsdWRlcyh2LmF0dGVtcHRLaW5kIGFzIHN0cmluZykgfHxcbiAgICAgICFuZXh0cy5oYXModi5uZXh0IGFzIHN0cmluZykgfHxcbiAgICAgICFyZWFzb25zLmhhcyh2LnJlYXNvbiBhcyBzdHJpbmcpIHx8XG4gICAgICAodi5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkICYmICFjYXRlZ29yaWVzLmhhcyh2LmNhdGVnb3J5IGFzIHN0cmluZykpIHx8XG4gICAgICAodi5lZmZlY3QgIT09IHVuZGVmaW5lZCAmJiAhZWZmZWN0cy5oYXModi5lZmZlY3QgYXMgc3RyaW5nKSkgfHxcbiAgICAgICh2LnRyYWNlSWQgIT09IHVuZGVmaW5lZCAmJiAhdGV4dCh2LnRyYWNlSWQpKVxuICAgIClcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmV0cnlMb29wID0gbG9vcE9mKHYucmV0cnlMb29wKTtcbiAgICBpZiAocmV0cnlMb29wICE9PSB1bmRlZmluZWQgJiYgdi5hdHRlbXB0S2luZCAhPT0gJ2NhbGwnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnYXR0ZW1wdCcsXG4gICAgICBpZDogdi5pZCBhcyBBdHRlbXB0SWQsXG4gICAgICBzZXJpZXM6IHYuc2VyaWVzLFxuICAgICAgcnVuSWQ6IHYucnVuSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdi5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHRhcmdldDogdi50YXJnZXQsXG4gICAgICAuLi4odi50cmFjZUlkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdHJhY2VJZDogdi50cmFjZUlkIGFzIHN0cmluZyB9KSxcbiAgICAgIHN0YXJ0ZWRBdDogdi5zdGFydGVkQXQsXG4gICAgICBkdXJhdGlvbk1zOiB2LmR1cmF0aW9uTXMsXG4gICAgICBvdXRjb21lOiB2Lm91dGNvbWUgYXMgQXR0ZW1wdE91dGNvbWUsXG4gICAgICAuLi4odi5jYXRlZ29yeSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGNhdGVnb3J5OiB2LmNhdGVnb3J5IGFzIEF0dGVtcHRDYXRlZ29yeSB9KSxcbiAgICAgIG5leHQ6IHYubmV4dCBhcyBBdHRlbXB0TmV4dCxcbiAgICAgIHJlYXNvbjogdi5yZWFzb24gYXMgQXR0ZW1wdFJlYXNvbixcbiAgICAgIGF0dGVtcHRLaW5kOiB2LmF0dGVtcHRLaW5kIGFzIEF0dGVtcHRLaW5kLFxuICAgICAgYXR0ZW1wdDogdi5hdHRlbXB0LFxuICAgICAgLi4uKHYub2YgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBvZjogdi5vZiBhcyBudW1iZXIgfSksXG4gICAgICAuLi4odi5lZmZlY3QgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBlZmZlY3Q6IHYuZWZmZWN0IGFzIFBoeXNpY2FsQXR0ZW1wdFJvd1snZWZmZWN0J10gfSksXG4gICAgICAuLi4ocmV0cnlMb29wID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcmV0cnlMb29wIH0pLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzUXVlcnkocm93OiBBdHRlbXB0Um93LCBxdWVyeTogQXR0ZW1wdFF1ZXJ5KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgKHF1ZXJ5LnNpbmNlID09PSB1bmRlZmluZWQgfHwgcm93LnN0YXJ0ZWRBdCA+PSBxdWVyeS5zaW5jZSkgJiZcbiAgICAocXVlcnkudW50aWwgPT09IHVuZGVmaW5lZCB8fCByb3cuc3RhcnRlZEF0IDw9IHF1ZXJ5LnVudGlsKSAmJlxuICAgIChxdWVyeS5ydW5JZCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5ydW5JZCA9PT0gcXVlcnkucnVuSWQpICYmXG4gICAgKHF1ZXJ5LnRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IChyb3cua2luZCAhPT0gJ3J1bicgJiYgcm93LnRhcmdldCA9PT0gcXVlcnkudGFyZ2V0KSlcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aggregateAttempts = exports.worst = exports.reference = exports.seriesKey = exports.logicalKey = exports.attemptRowKey = void 0;
|
|
4
|
+
const attemptSeries_js_1 = require("./attemptSeries.js");
|
|
5
|
+
const attemptRowKey = (row) => JSON.stringify(row.kind === 'attempt'
|
|
6
|
+
? [row.kind, row.runId, row.id]
|
|
7
|
+
: row.kind === 'decision'
|
|
8
|
+
? [row.kind, row.runId, row.series, row.attempt]
|
|
9
|
+
: [row.kind, row.runId]);
|
|
10
|
+
exports.attemptRowKey = attemptRowKey;
|
|
11
|
+
const logicalKey = (runId, series, attempt) => JSON.stringify([runId, series, attempt]);
|
|
12
|
+
exports.logicalKey = logicalKey;
|
|
13
|
+
const seriesKey = (runId, series) => JSON.stringify([runId, series]);
|
|
14
|
+
exports.seriesKey = seriesKey;
|
|
15
|
+
function reference(row) {
|
|
16
|
+
const { id, series, runId, runtimeStageId, attemptKind, target, traceId, startedAt, durationMs, outcome, category, next, reason, retryLoop, } = row;
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
series,
|
|
20
|
+
runId,
|
|
21
|
+
runtimeStageId,
|
|
22
|
+
attemptKind,
|
|
23
|
+
target,
|
|
24
|
+
...(traceId === undefined ? {} : { traceId }),
|
|
25
|
+
startedAt,
|
|
26
|
+
durationMs,
|
|
27
|
+
outcome,
|
|
28
|
+
...(category === undefined ? {} : { category }),
|
|
29
|
+
next,
|
|
30
|
+
reason,
|
|
31
|
+
...(retryLoop === undefined ? {} : { retryLoop: { ...retryLoop } }),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
exports.reference = reference;
|
|
35
|
+
const order = (a, b) => b.durationMs - a.durationMs || b.startedAt - a.startedAt || a.id.localeCompare(b.id);
|
|
36
|
+
function worst(rows, limit) {
|
|
37
|
+
return [...rows].sort(order).slice(0, limit).map(reference);
|
|
38
|
+
}
|
|
39
|
+
exports.worst = worst;
|
|
40
|
+
function summarized(target, rows, decisions, exemplars) {
|
|
41
|
+
const byKind = { stage: 0, call: 0, observed: 0 };
|
|
42
|
+
const byOutcome = { ok: 0, failed: 0, timeout: 0, aborted: 0, paused: 0 };
|
|
43
|
+
const byCategory = { timeout: 0, 'rate-limited': 0, server: 0, network: 0, auth: 0, permanent: 0, unknown: 0 };
|
|
44
|
+
let retries = 0;
|
|
45
|
+
const retried = new Set();
|
|
46
|
+
const gave = new Set();
|
|
47
|
+
const stopped = new Set();
|
|
48
|
+
for (const row of rows) {
|
|
49
|
+
byKind[row.attemptKind]++;
|
|
50
|
+
byOutcome[row.outcome]++;
|
|
51
|
+
if (row.category !== undefined)
|
|
52
|
+
byCategory[row.category]++;
|
|
53
|
+
// A reconciliation wire call is work, but its one-call stop is not a logical workflow give-up.
|
|
54
|
+
if (row.retryLoop?.phase === 'reconcile')
|
|
55
|
+
continue;
|
|
56
|
+
const logical = row.retryLoop;
|
|
57
|
+
const decision = logical === undefined ? row : decisions.get((0, exports.logicalKey)(row.runId, logical.series, logical.attempt));
|
|
58
|
+
if (decision === undefined ||
|
|
59
|
+
(logical !== undefined && (decision.kind !== 'decision' || decision.attemptId !== row.id)))
|
|
60
|
+
continue; // A logical verdict belongs only to the exact physical attempt it cites.
|
|
61
|
+
const key = (0, exports.seriesKey)(row.runId, logical?.series ?? row.series);
|
|
62
|
+
if (decision.next === 'retry') {
|
|
63
|
+
retries++;
|
|
64
|
+
retried.add(key);
|
|
65
|
+
}
|
|
66
|
+
if ((0, attemptSeries_js_1.gaveUp)({ next: decision.next, reason: decision.reason })) {
|
|
67
|
+
gave.add(key);
|
|
68
|
+
stopped.add(row);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const sorted = [...rows].sort(order);
|
|
72
|
+
const n = sorted.length;
|
|
73
|
+
const rank = (p) => (n === 0 ? 0 : sorted[n - Math.ceil(n * p)].durationMs);
|
|
74
|
+
const refs = (include) => sorted.filter(include).slice(0, exemplars).map(reference);
|
|
75
|
+
const used = rows.reduce((n, row) => n + row.durationMs, 0);
|
|
76
|
+
return {
|
|
77
|
+
target,
|
|
78
|
+
count: n,
|
|
79
|
+
byKind,
|
|
80
|
+
byOutcome,
|
|
81
|
+
byCategory,
|
|
82
|
+
retries,
|
|
83
|
+
seriesRetried: retried.size,
|
|
84
|
+
gaveUp: gave.size,
|
|
85
|
+
effectUnknown: rows.filter((row) => row.effect === 'unknown').length,
|
|
86
|
+
latencyMs: {
|
|
87
|
+
p50: rank(0.5),
|
|
88
|
+
p90: rank(0.9),
|
|
89
|
+
p95: rank(0.95),
|
|
90
|
+
max: n === 0 ? 0 : sorted[0].durationMs,
|
|
91
|
+
mean: n === 0 ? 0 : used / n,
|
|
92
|
+
},
|
|
93
|
+
budgetUsedMs: used,
|
|
94
|
+
exemplars: {
|
|
95
|
+
slowest: refs(() => true),
|
|
96
|
+
timeout: refs((row) => row.outcome === 'timeout'),
|
|
97
|
+
failed: refs((row) => row.outcome === 'failed' || row.outcome === 'aborted'),
|
|
98
|
+
unknown: refs((row) => row.effect === 'unknown'),
|
|
99
|
+
gaveUp: refs((row) => stopped.has(row)),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function aggregateAttempts(rows, exemplars, storage) {
|
|
104
|
+
// Append stores may contain multiple lifecycle versions; the last row is the recorded current fact.
|
|
105
|
+
const unique = new Map(rows.map((row) => [(0, exports.attemptRowKey)(row), row]));
|
|
106
|
+
const all = [...unique.values()];
|
|
107
|
+
const decisions = new Map();
|
|
108
|
+
const physical = new Map(all
|
|
109
|
+
.filter((row) => row.kind === 'attempt')
|
|
110
|
+
.map((row) => [JSON.stringify([row.runId, row.id]), row]));
|
|
111
|
+
let unsupported = 0;
|
|
112
|
+
const grouped = new Map();
|
|
113
|
+
for (const row of all)
|
|
114
|
+
if (row.kind === 'decision') {
|
|
115
|
+
const source = physical.get(JSON.stringify([row.runId, row.attemptId]));
|
|
116
|
+
const loop = source?.retryLoop;
|
|
117
|
+
if (source === undefined ||
|
|
118
|
+
source.target !== row.target ||
|
|
119
|
+
loop?.phase !== 'attempt' ||
|
|
120
|
+
loop.id !== row.id ||
|
|
121
|
+
loop.series !== row.series ||
|
|
122
|
+
loop.attempt !== row.attempt ||
|
|
123
|
+
loop.of !== row.of) {
|
|
124
|
+
unsupported++;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
decisions.set((0, exports.logicalKey)(row.runId, row.series, row.attempt), row);
|
|
128
|
+
}
|
|
129
|
+
for (const row of all)
|
|
130
|
+
if (row.kind === 'attempt') {
|
|
131
|
+
const bucket = grouped.get(row.target) ?? [];
|
|
132
|
+
bucket.push(row);
|
|
133
|
+
grouped.set(row.target, bucket);
|
|
134
|
+
}
|
|
135
|
+
const byTarget = new Map([...grouped].map(([target, entries]) => [target, summarized(target, entries, decisions, exemplars)]));
|
|
136
|
+
const runs = new Map();
|
|
137
|
+
for (const row of all) {
|
|
138
|
+
const bucket = runs.get(row.runId) ?? [];
|
|
139
|
+
bucket.push(row);
|
|
140
|
+
runs.set(row.runId, bucket);
|
|
141
|
+
}
|
|
142
|
+
const byRun = new Map();
|
|
143
|
+
for (const [runId, own] of runs) {
|
|
144
|
+
const attempts = own.filter((row) => row.kind === 'attempt');
|
|
145
|
+
const perTarget = new Map();
|
|
146
|
+
for (const row of attempts) {
|
|
147
|
+
const bucket = perTarget.get(row.target) ?? [];
|
|
148
|
+
bucket.push(row);
|
|
149
|
+
perTarget.set(row.target, bucket);
|
|
150
|
+
}
|
|
151
|
+
const stats = [...perTarget].map(([target, entries]) => summarized(target, entries, decisions, 0));
|
|
152
|
+
const run = own.find((row) => row.kind === 'run');
|
|
153
|
+
byRun.set(runId, {
|
|
154
|
+
runId,
|
|
155
|
+
attempts: attempts.length,
|
|
156
|
+
retries: stats.reduce((n, s) => n + s.retries, 0),
|
|
157
|
+
gaveUp: stats.reduce((n, s) => n + s.gaveUp, 0),
|
|
158
|
+
budgetUsedMs: stats.reduce((n, s) => n + s.budgetUsedMs, 0),
|
|
159
|
+
exemplars: worst(attempts, exemplars),
|
|
160
|
+
outcome: run?.kind === 'run' ? run.outcome : 'incomplete',
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
byTarget,
|
|
165
|
+
byRun,
|
|
166
|
+
storage: {
|
|
167
|
+
...storage,
|
|
168
|
+
omittedRows: storage.omittedRows + unsupported,
|
|
169
|
+
incomplete: storage.incomplete || unsupported > 0,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
exports.aggregateAttempts = aggregateAttempts;
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRNZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVdBLHlEQUE0QztBQUVyQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQWUsRUFBVSxFQUFFLENBQ3ZELElBQUksQ0FBQyxTQUFTLENBQ1osR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTO0lBQ3BCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQy9CLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVU7UUFDekIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FDMUIsQ0FBQztBQVBTLFFBQUEsYUFBYSxpQkFPdEI7QUFDRyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsT0FBZSxFQUFVLEVBQUUsQ0FDbkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUQ5QixRQUFBLFVBQVUsY0FDb0I7QUFDcEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFBdkYsUUFBQSxTQUFTLGFBQThFO0FBQ3BHLFNBQWdCLFNBQVMsQ0FBQyxHQUF1QjtJQUMvQyxNQUFNLEVBQ0osRUFBRSxFQUNG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LENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzNELFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztZQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVk7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU87UUFDTCxRQUFRO1FBQ1IsS0FBSztRQUNMLE9BQU8sRUFBRTtZQUNQLEdBQUcsT0FBTztZQUNWLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVc7WUFDOUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxHQUFHLENBQUM7U0FDbEQ7S0FDRixDQUFDO0FBQ0osQ0FBQztBQS9FRCw4Q0ErRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQWdncmVnYXRlIHJlY29yZGVkIGZhY3RzOyBubyBleGVjdXRpb24tdHJlZSB3YWxrIGFuZCBubyByZWNvbnN0cnVjdGlvbiBvZiBsb2dpY2FsIHJldHJpZXMgZnJvbSBldmVudCBjb3VudHMuICovXG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRSZWFzb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdEFnZ3JlZ2F0ZSxcbiAgQXR0ZW1wdERlY2lzaW9uUm93LFxuICBBdHRlbXB0TWV0cmljUmVmLFxuICBBdHRlbXB0Um93LFxuICBBdHRlbXB0U3RhdHMsXG4gIEF0dGVtcHRTdG9yYWdlU3RhdHMsXG4gIFBoeXNpY2FsQXR0ZW1wdFJvdyxcbn0gZnJvbSAnLi9hdHRlbXB0TWV0cmljc1R5cGVzLmpzJztcbmltcG9ydCB7IGdhdmVVcCB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5cbmV4cG9ydCBjb25zdCBhdHRlbXB0Um93S2V5ID0gKHJvdzogQXR0ZW1wdFJvdyk6IHN0cmluZyA9PlxuICBKU09OLnN0cmluZ2lmeShcbiAgICByb3cua2luZCA9PT0gJ2F0dGVtcHQnXG4gICAgICA/IFtyb3cua2luZCwgcm93LnJ1bklkLCByb3cuaWRdXG4gICAgICA6IHJvdy5raW5kID09PSAnZGVjaXNpb24nXG4gICAgICA/IFtyb3cua2luZCwgcm93LnJ1bklkLCByb3cuc2VyaWVzLCByb3cuYXR0ZW1wdF1cbiAgICAgIDogW3Jvdy5raW5kLCByb3cucnVuSWRdLFxuICApO1xuZXhwb3J0IGNvbnN0IGxvZ2ljYWxLZXkgPSAocnVuSWQ6IHN0cmluZywgc2VyaWVzOiBzdHJpbmcsIGF0dGVtcHQ6IG51bWJlcik6IHN0cmluZyA9PlxuICBKU09OLnN0cmluZ2lmeShbcnVuSWQsIHNlcmllcywgYXR0ZW1wdF0pO1xuZXhwb3J0IGNvbnN0IHNlcmllc0tleSA9IChydW5JZDogc3RyaW5nLCBzZXJpZXM6IHN0cmluZyk6IHN0cmluZyA9PiBKU09OLnN0cmluZ2lmeShbcnVuSWQsIHNlcmllc10pO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZShyb3c6IFBoeXNpY2FsQXR0ZW1wdFJvdyk6IEF0dGVtcHRNZXRyaWNSZWYge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgc2VyaWVzLFxuICAgIHJ1bklkLFxuICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgIGF0dGVtcHRLaW5kLFxuICAgIHRhcmdldCxcbiAgICB0cmFjZUlkLFxuICAgIHN0YXJ0ZWRBdCxcbiAgICBkdXJhdGlvbk1zLFxuICAgIG91dGNvbWUsXG4gICAgY2F0ZWdvcnksXG4gICAgbmV4dCxcbiAgICByZWFzb24sXG4gICAgcmV0cnlMb29wLFxuICB9ID0gcm93O1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHNlcmllcyxcbiAgICBydW5JZCxcbiAgICBydW50aW1lU3RhZ2VJZCxcbiAgICBhdHRlbXB0S2luZCxcbiAgICB0YXJnZXQsXG4gICAgLi4uKHRyYWNlSWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0cmFjZUlkIH0pLFxuICAgIHN0YXJ0ZWRBdCxcbiAgICBkdXJhdGlvbk1zLFxuICAgIG91dGNvbWUsXG4gICAgLi4uKGNhdGVnb3J5ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY2F0ZWdvcnkgfSksXG4gICAgbmV4dCxcbiAgICByZWFzb24sXG4gICAgLi4uKHJldHJ5TG9vcCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHJldHJ5TG9vcDogeyAuLi5yZXRyeUxvb3AgfSB9KSxcbiAgfTtcbn1cbmNvbnN0IG9yZGVyID0gKGE6IFBoeXNpY2FsQXR0ZW1wdFJvdywgYjogUGh5c2ljYWxBdHRlbXB0Um93KSA9PlxuICBiLmR1cmF0aW9uTXMgLSBhLmR1cmF0aW9uTXMgfHwgYi5zdGFydGVkQXQgLSBhLnN0YXJ0ZWRBdCB8fCBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCk7XG5leHBvcnQgZnVuY3Rpb24gd29yc3Qocm93czogcmVhZG9ubHkgUGh5c2ljYWxBdHRlbXB0Um93W10sIGxpbWl0OiBudW1iZXIpOiBBdHRlbXB0TWV0cmljUmVmW10ge1xuICByZXR1cm4gWy4uLnJvd3NdLnNvcnQob3JkZXIpLnNsaWNlKDAsIGxpbWl0KS5tYXAocmVmZXJlbmNlKTtcbn1cbmZ1bmN0aW9uIHN1bW1hcml6ZWQoXG4gIHRhcmdldDogc3RyaW5nLFxuICByb3dzOiByZWFkb25seSBQaHlzaWNhbEF0dGVtcHRSb3dbXSxcbiAgZGVjaXNpb25zOiBNYXA8c3RyaW5nLCBBdHRlbXB0RGVjaXNpb25Sb3c+LFxuICBleGVtcGxhcnM6IG51bWJlcixcbik6IEF0dGVtcHRTdGF0cyB7XG4gIGNvbnN0IGJ5S2luZCA9IHsgc3RhZ2U6IDAsIGNhbGw6IDAsIG9ic2VydmVkOiAwIH07XG4gIGNvbnN0IGJ5T3V0Y29tZSA9IHsgb2s6IDAsIGZhaWxlZDogMCwgdGltZW91dDogMCwgYWJvcnRlZDogMCwgcGF1c2VkOiAwIH07XG4gIGNvbnN0IGJ5Q2F0ZWdvcnkgPSB7IHRpbWVvdXQ6IDAsICdyYXRlLWxpbWl0ZWQnOiAwLCBzZXJ2ZXI6IDAsIG5ldHdvcms6IDAsIGF1dGg6IDAsIHBlcm1hbmVudDogMCwgdW5rbm93bjogMCB9O1xuICBsZXQgcmV0cmllcyA9IDA7XG4gIGNvbnN0IHJldHJpZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZ2F2ZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzdG9wcGVkID0gbmV3IFNldDxQaHlzaWNhbEF0dGVtcHRSb3c+KCk7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBieUtpbmRbcm93LmF0dGVtcHRLaW5kXSsrO1xuICAgIGJ5T3V0Y29tZVtyb3cub3V0Y29tZV0rKztcbiAgICBpZiAocm93LmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIGJ5Q2F0ZWdvcnlbcm93LmNhdGVnb3J5XSsrO1xuICAgIC8vIEEgcmVjb25jaWxpYXRpb24gd2lyZSBjYWxsIGlzIHdvcmssIGJ1dCBpdHMgb25lLWNhbGwgc3RvcCBpcyBub3QgYSBsb2dpY2FsIHdvcmtmbG93IGdpdmUtdXAuXG4gICAgaWYgKHJvdy5yZXRyeUxvb3A/LnBoYXNlID09PSAncmVjb25jaWxlJykgY29udGludWU7XG4gICAgY29uc3QgbG9naWNhbCA9IHJvdy5yZXRyeUxvb3A7XG4gICAgY29uc3QgZGVjaXNpb24gPVxuICAgICAgbG9naWNhbCA9PT0gdW5kZWZpbmVkID8gcm93IDogZGVjaXNpb25zLmdldChsb2dpY2FsS2V5KHJvdy5ydW5JZCwgbG9naWNhbC5zZXJpZXMsIGxvZ2ljYWwuYXR0ZW1wdCkpO1xuICAgIGlmIChcbiAgICAgIGRlY2lzaW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgIChsb2dpY2FsICE9PSB1bmRlZmluZWQgJiYgKGRlY2lzaW9uLmtpbmQgIT09ICdkZWNpc2lvbicgfHwgZGVjaXNpb24uYXR0ZW1wdElkICE9PSByb3cuaWQpKVxuICAgIClcbiAgICAgIGNvbnRpbnVlOyAvLyBBIGxvZ2ljYWwgdmVyZGljdCBiZWxvbmdzIG9ubHkgdG8gdGhlIGV4YWN0IHBoeXNpY2FsIGF0dGVtcHQgaXQgY2l0ZXMuXG4gICAgY29uc3Qga2V5ID0gc2VyaWVzS2V5KHJvdy5ydW5JZCwgbG9naWNhbD8uc2VyaWVzID8/IHJvdy5zZXJpZXMpO1xuICAgIGlmIChkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknKSB7XG4gICAgICByZXRyaWVzKys7XG4gICAgICByZXRyaWVkLmFkZChrZXkpO1xuICAgIH1cbiAgICBpZiAoZ2F2ZVVwKHsgbmV4dDogZGVjaXNpb24ubmV4dCwgcmVhc29uOiBkZWNpc2lvbi5yZWFzb24gYXMgQXR0ZW1wdFJlYXNvbiB9KSkge1xuICAgICAgZ2F2ZS5hZGQoa2V5KTtcbiAgICAgIHN0b3BwZWQuYWRkKHJvdyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5yb3dzXS5zb3J0KG9yZGVyKTtcbiAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGg7XG4gIGNvbnN0IHJhbmsgPSAocDogbnVtYmVyKSA9PiAobiA9PT0gMCA/IDAgOiBzb3J0ZWRbbiAtIE1hdGguY2VpbChuICogcCldLmR1cmF0aW9uTXMpO1xuICBjb25zdCByZWZzID0gKGluY2x1ZGU6IChyb3c6IFBoeXNpY2FsQXR0ZW1wdFJvdykgPT4gYm9vbGVhbikgPT5cbiAgICBzb3J0ZWQuZmlsdGVyKGluY2x1ZGUpLnNsaWNlKDAsIGV4ZW1wbGFycykubWFwKHJlZmVyZW5jZSk7XG4gIGNvbnN0IHVzZWQgPSByb3dzLnJlZHVjZSgobiwgcm93KSA9PiBuICsgcm93LmR1cmF0aW9uTXMsIDApO1xuICByZXR1cm4ge1xuICAgIHRhcmdldCxcbiAgICBjb3VudDogbixcbiAgICBieUtpbmQsXG4gICAgYnlPdXRjb21lLFxuICAgIGJ5Q2F0ZWdvcnksXG4gICAgcmV0cmllcyxcbiAgICBzZXJpZXNSZXRyaWVkOiByZXRyaWVkLnNpemUsXG4gICAgZ2F2ZVVwOiBnYXZlLnNpemUsXG4gICAgZWZmZWN0VW5rbm93bjogcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmVmZmVjdCA9PT0gJ3Vua25vd24nKS5sZW5ndGgsXG4gICAgbGF0ZW5jeU1zOiB7XG4gICAgICBwNTA6IHJhbmsoMC41KSxcbiAgICAgIHA5MDogcmFuaygwLjkpLFxuICAgICAgcDk1OiByYW5rKDAuOTUpLFxuICAgICAgbWF4OiBuID09PSAwID8gMCA6IHNvcnRlZFswXS5kdXJhdGlvbk1zLFxuICAgICAgbWVhbjogbiA9PT0gMCA/IDAgOiB1c2VkIC8gbixcbiAgICB9LFxuICAgIGJ1ZGdldFVzZWRNczogdXNlZCxcbiAgICBleGVtcGxhcnM6IHtcbiAgICAgIHNsb3dlc3Q6IHJlZnMoKCkgPT4gdHJ1ZSksXG4gICAgICB0aW1lb3V0OiByZWZzKChyb3cpID0+IHJvdy5vdXRjb21lID09PSAndGltZW91dCcpLFxuICAgICAgZmFpbGVkOiByZWZzKChyb3cpID0+IHJvdy5vdXRjb21lID09PSAnZmFpbGVkJyB8fCByb3cub3V0Y29tZSA9PT0gJ2Fib3J0ZWQnKSxcbiAgICAgIHVua25vd246IHJlZnMoKHJvdykgPT4gcm93LmVmZmVjdCA9PT0gJ3Vua25vd24nKSxcbiAgICAgIGdhdmVVcDogcmVmcygocm93KSA9PiBzdG9wcGVkLmhhcyhyb3cpKSxcbiAgICB9LFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZUF0dGVtcHRzKFxuICByb3dzOiByZWFkb25seSBBdHRlbXB0Um93W10sXG4gIGV4ZW1wbGFyczogbnVtYmVyLFxuICBzdG9yYWdlOiBBdHRlbXB0U3RvcmFnZVN0YXRzLFxuKTogQXR0ZW1wdEFnZ3JlZ2F0ZSB7XG4gIC8vIEFwcGVuZCBzdG9yZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbGlmZWN5Y2xlIHZlcnNpb25zOyB0aGUgbGFzdCByb3cgaXMgdGhlIHJlY29yZGVkIGN1cnJlbnQgZmFjdC5cbiAgY29uc3QgdW5pcXVlID0gbmV3IE1hcChyb3dzLm1hcCgocm93KSA9PiBbYXR0ZW1wdFJvd0tleShyb3cpLCByb3ddKSk7XG4gIGNvbnN0IGFsbCA9IFsuLi51bmlxdWUudmFsdWVzKCldO1xuICBjb25zdCBkZWNpc2lvbnMgPSBuZXcgTWFwPHN0cmluZywgQXR0ZW1wdERlY2lzaW9uUm93PigpO1xuICBjb25zdCBwaHlzaWNhbCA9IG5ldyBNYXAoXG4gICAgYWxsXG4gICAgICAuZmlsdGVyKChyb3cpOiByb3cgaXMgUGh5c2ljYWxBdHRlbXB0Um93ID0+IHJvdy5raW5kID09PSAnYXR0ZW1wdCcpXG4gICAgICAubWFwKChyb3cpID0+IFtKU09OLnN0cmluZ2lmeShbcm93LnJ1bklkLCByb3cuaWRdKSwgcm93XSksXG4gICk7XG4gIGxldCB1bnN1cHBvcnRlZCA9IDA7XG4gIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93W10+KCk7XG4gIGZvciAoY29uc3Qgcm93IG9mIGFsbClcbiAgICBpZiAocm93LmtpbmQgPT09ICdkZWNpc2lvbicpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBoeXNpY2FsLmdldChKU09OLnN0cmluZ2lmeShbcm93LnJ1bklkLCByb3cuYXR0ZW1wdElkXSkpO1xuICAgICAgY29uc3QgbG9vcCA9IHNvdXJjZT8ucmV0cnlMb29wO1xuICAgICAgaWYgKFxuICAgICAgICBzb3VyY2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBzb3VyY2UudGFyZ2V0ICE9PSByb3cudGFyZ2V0IHx8XG4gICAgICAgIGxvb3A/LnBoYXNlICE9PSAnYXR0ZW1wdCcgfHxcbiAgICAgICAgbG9vcC5pZCAhPT0gcm93LmlkIHx8XG4gICAgICAgIGxvb3Auc2VyaWVzICE9PSByb3cuc2VyaWVzIHx8XG4gICAgICAgIGxvb3AuYXR0ZW1wdCAhPT0gcm93LmF0dGVtcHQgfHxcbiAgICAgICAgbG9vcC5vZiAhPT0gcm93Lm9mXG4gICAgICApIHtcbiAgICAgICAgdW5zdXBwb3J0ZWQrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZWNpc2lvbnMuc2V0KGxvZ2ljYWxLZXkocm93LnJ1bklkLCByb3cuc2VyaWVzLCByb3cuYXR0ZW1wdCksIHJvdyk7XG4gICAgfVxuICBmb3IgKGNvbnN0IHJvdyBvZiBhbGwpXG4gICAgaWYgKHJvdy5raW5kID09PSAnYXR0ZW1wdCcpIHtcbiAgICAgIGNvbnN0IGJ1Y2tldCA9IGdyb3VwZWQuZ2V0KHJvdy50YXJnZXQpID8/IFtdO1xuICAgICAgYnVja2V0LnB1c2gocm93KTtcbiAgICAgIGdyb3VwZWQuc2V0KHJvdy50YXJnZXQsIGJ1Y2tldCk7XG4gICAgfVxuICBjb25zdCBieVRhcmdldCA9IG5ldyBNYXAoXG4gICAgWy4uLmdyb3VwZWRdLm1hcCgoW3RhcmdldCwgZW50cmllc10pID0+IFt0YXJnZXQsIHN1bW1hcml6ZWQodGFyZ2V0LCBlbnRyaWVzLCBkZWNpc2lvbnMsIGV4ZW1wbGFycyldKSxcbiAgKTtcbiAgY29uc3QgcnVucyA9IG5ldyBNYXA8c3RyaW5nLCBBdHRlbXB0Um93W10+KCk7XG4gIGZvciAoY29uc3Qgcm93IG9mIGFsbCkge1xuICAgIGNvbnN0IGJ1Y2tldCA9IHJ1bnMuZ2V0KHJvdy5ydW5JZCkgPz8gW107XG4gICAgYnVja2V0LnB1c2gocm93KTtcbiAgICBydW5zLnNldChyb3cucnVuSWQsIGJ1Y2tldCk7XG4gIH1cbiAgY29uc3QgYnlSdW46IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5UnVuJ10gPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgW3J1bklkLCBvd25dIG9mIHJ1bnMpIHtcbiAgICBjb25zdCBhdHRlbXB0cyA9IG93bi5maWx0ZXIoKHJvdyk6IHJvdyBpcyBQaHlzaWNhbEF0dGVtcHRSb3cgPT4gcm93LmtpbmQgPT09ICdhdHRlbXB0Jyk7XG4gICAgY29uc3QgcGVyVGFyZ2V0ID0gbmV3IE1hcDxzdHJpbmcsIFBoeXNpY2FsQXR0ZW1wdFJvd1tdPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGF0dGVtcHRzKSB7XG4gICAgICBjb25zdCBidWNrZXQgPSBwZXJUYXJnZXQuZ2V0KHJvdy50YXJnZXQpID8/IFtdO1xuICAgICAgYnVja2V0LnB1c2gocm93KTtcbiAgICAgIHBlclRhcmdldC5zZXQocm93LnRhcmdldCwgYnVja2V0KTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdHMgPSBbLi4ucGVyVGFyZ2V0XS5tYXAoKFt0YXJnZXQsIGVudHJpZXNdKSA9PiBzdW1tYXJpemVkKHRhcmdldCwgZW50cmllcywgZGVjaXNpb25zLCAwKSk7XG4gICAgY29uc3QgcnVuID0gb3duLmZpbmQoKHJvdykgPT4gcm93LmtpbmQgPT09ICdydW4nKTtcbiAgICBieVJ1bi5zZXQocnVuSWQsIHtcbiAgICAgIHJ1bklkLFxuICAgICAgYXR0ZW1wdHM6IGF0dGVtcHRzLmxlbmd0aCxcbiAgICAgIHJldHJpZXM6IHN0YXRzLnJlZHVjZSgobiwgcykgPT4gbiArIHMucmV0cmllcywgMCksXG4gICAgICBnYXZlVXA6IHN0YXRzLnJlZHVjZSgobiwgcykgPT4gbiArIHMuZ2F2ZVVwLCAwKSxcbiAgICAgIGJ1ZGdldFVzZWRNczogc3RhdHMucmVkdWNlKChuLCBzKSA9PiBuICsgcy5idWRnZXRVc2VkTXMsIDApLFxuICAgICAgZXhlbXBsYXJzOiB3b3JzdChhdHRlbXB0cywgZXhlbXBsYXJzKSxcbiAgICAgIG91dGNvbWU6IHJ1bj8ua2luZCA9PT0gJ3J1bicgPyBydW4ub3V0Y29tZSA6ICdpbmNvbXBsZXRlJyxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJ5VGFyZ2V0LFxuICAgIGJ5UnVuLFxuICAgIHN0b3JhZ2U6IHtcbiAgICAgIC4uLnN0b3JhZ2UsXG4gICAgICBvbWl0dGVkUm93czogc3RvcmFnZS5vbWl0dGVkUm93cyArIHVuc3VwcG9ydGVkLFxuICAgICAgaW5jb21wbGV0ZTogc3RvcmFnZS5pbmNvbXBsZXRlIHx8IHVuc3VwcG9ydGVkID4gMCxcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY3NUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvYXR0ZW1wdE1ldHJpY3NUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFBheWxvYWQtZnJlZSBQNyByb3dzIGFuZCBwdWJsaWMgbWV0cmljIHByb2plY3Rpb25zLiBTdG9yZSBhZGFwdGVycyByZWNlaXZlIG5hbWVkIGZhY3RzLCBuZXZlciBlcnJvcnMgb3Iga2V5cy4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsLCBSZXRyeUxvb3BEZWNpc2lvbiB9IGZyb20gJy4uL2F0dGVtcHQvcmV0cnlMb29wVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0Q2F0ZWdvcnksXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0TmV4dCxcbiAgQXR0ZW1wdE91dGNvbWUsXG4gIEF0dGVtcHRSZWFzb24sXG59IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRNZXRyaWNSZWYge1xuICByZWFkb25seSBpZDogQXR0ZW1wdElkO1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW1wdEtpbmQ6IEF0dGVtcHRLaW5kO1xuICByZWFkb25seSByZXRyeUxvb3A/OiBSZXRyeUxvb3BDYWxsO1xuICByZWFkb25seSB0YXJnZXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdHJhY2VJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3V0Y29tZTogQXR0ZW1wdE91dGNvbWU7XG4gIHJlYWRvbmx5IGNhdGVnb3J5PzogQXR0ZW1wdENhdGVnb3J5O1xuICByZWFkb25seSBuZXh0OiBBdHRlbXB0TmV4dDtcbiAgcmVhZG9ubHkgcmVhc29uOiBBdHRlbXB0UmVhc29uO1xufVxuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbEF0dGVtcHRSb3cgZXh0ZW5kcyBBdHRlbXB0TWV0cmljUmVmIHtcbiAgcmVhZG9ubHkga2luZDogJ2F0dGVtcHQnO1xuICByZWFkb25seSBhdHRlbXB0S2luZDogQXR0ZW1wdEtpbmQ7XG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Y/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVmZmVjdD86IEF0dGVtcHRFZmZlY3Q7XG4gIHJlYWRvbmx5IHJldHJ5TG9vcD86IFJldHJ5TG9vcENhbGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHREZWNpc2lvblJvdyBleHRlbmRzIFJldHJ5TG9vcERlY2lzaW9uIHtcbiAgcmVhZG9ubHkga2luZDogJ2RlY2lzaW9uJztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF0dGVtcHRJZDogQXR0ZW1wdElkO1xuICByZWFkb25seSBzdGFydGVkQXQ6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXR0ZW1wdFJ1blJvdyB7XG4gIHJlYWRvbmx5IGtpbmQ6ICdydW4nO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZW5kZWRBdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3V0Y29tZTogJ3J1bm5pbmcnIHwgJ29rJyB8ICdmYWlsZWQnIHwgJ3BhdXNlZCc7XG59XG5leHBvcnQgdHlwZSBBdHRlbXB0Um93ID0gUGh5c2ljYWxBdHRlbXB0Um93IHwgQXR0ZW1wdERlY2lzaW9uUm93IHwgQXR0ZW1wdFJ1blJvdztcbmV4cG9ydCBpbnRlcmZhY2UgQXR0ZW1wdFF1ZXJ5IHtcbiAgcmVhZG9ubHkgc2luY2U/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVudGlsPzogbnVtYmVyO1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bklkPzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3RvcmUge1xuICBhcHBlbmQocm93czogcmVhZG9ubHkgQXR0ZW1wdFJvd1tdKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHJlYWQocXVlcnk6IEF0dGVtcHRRdWVyeSk6IFByb21pc2U8cmVhZG9ubHkgQXR0ZW1wdFJvd1tdPjtcbiAgLyoqIE9wdGlvbmFsIGtub3duIHJldGVudGlvbiBhY2NvdW50aW5nOyBvbWl0dGVkIGV2aWRlbmNlIG11c3Qgbm90IGFwcGVhciBjb21wbGV0ZS4gKi9cbiAgc3RhdHM/KCk6IHsgcmVhZG9ubHkgb21pdHRlZFJvd3M6IG51bWJlciB9O1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3RvcmFnZVN0YXRzIHtcbiAgcmVhZG9ubHkgcGVuZGluZzogbnVtYmVyO1xuICByZWFkb25seSBmYWlsZWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZHJvcHBlZDogbnVtYmVyO1xuICByZWFkb25seSBvbWl0dGVkUm93czogbnVtYmVyO1xuICByZWFkb25seSBpbmNvbXBsZXRlOiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0U3RhdHMge1xuICByZWFkb25seSB0YXJnZXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnlLaW5kOiBSZWNvcmQ8QXR0ZW1wdEtpbmQsIG51bWJlcj47XG4gIHJlYWRvbmx5IGJ5T3V0Y29tZTogUmVjb3JkPEF0dGVtcHRPdXRjb21lLCBudW1iZXI+O1xuICByZWFkb25seSBieUNhdGVnb3J5OiBSZWNvcmQ8QXR0ZW1wdENhdGVnb3J5LCBudW1iZXI+O1xuICByZWFkb25seSByZXRyaWVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcmllc1JldHJpZWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgZ2F2ZVVwOiBudW1iZXI7XG4gIHJlYWRvbmx5IGVmZmVjdFVua25vd246IG51bWJlcjtcbiAgcmVhZG9ubHkgbGF0ZW5jeU1zOiB7XG4gICAgcmVhZG9ubHkgcDUwOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcDkwOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcDk1OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbWVhbjogbnVtYmVyO1xuICB9O1xuICAvKiogU3VtIG9mIGF0dGVtcHQgZHVyYXRpb25zICh3b3JrIHRpbWUpLCB3aGljaCBjYW4gb3ZlcmxhcCBvciBuZXN0OyBub3QgZWxhcHNlZCBydW4gdGltZS4gKi9cbiAgcmVhZG9ubHkgYnVkZ2V0VXNlZE1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IGV4ZW1wbGFyczoge1xuICAgIHJlYWRvbmx5IHNsb3dlc3Q6IEF0dGVtcHRNZXRyaWNSZWZbXTtcbiAgICByZWFkb25seSB0aW1lb3V0OiBBdHRlbXB0TWV0cmljUmVmW107XG4gICAgcmVhZG9ubHkgZmFpbGVkOiBBdHRlbXB0TWV0cmljUmVmW107XG4gICAgcmVhZG9ubHkgdW5rbm93bjogQXR0ZW1wdE1ldHJpY1JlZltdO1xuICAgIHJlYWRvbmx5IGdhdmVVcDogQXR0ZW1wdE1ldHJpY1JlZltdO1xuICB9O1xufVxuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0UnVuU3RhdHMge1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBhdHRlbXB0czogbnVtYmVyO1xuICByZWFkb25seSByZXRyaWVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGdhdmVVcDogbnVtYmVyO1xuICByZWFkb25seSBidWRnZXRVc2VkTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnVkZ2V0TXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV4ZW1wbGFyczogQXR0ZW1wdE1ldHJpY1JlZltdO1xuICByZWFkb25seSBvdXRjb21lOiBBdHRlbXB0UnVuUm93WydvdXRjb21lJ10gfCAnaW5jb21wbGV0ZSc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRBZ2dyZWdhdGUge1xuICByZWFkb25seSBieVRhcmdldDogTWFwPHN0cmluZywgQXR0ZW1wdFN0YXRzPjtcbiAgcmVhZG9ubHkgYnlSdW46IE1hcDxzdHJpbmcsIEF0dGVtcHRSdW5TdGF0cz47XG4gIHJlYWRvbmx5IHN0b3JhZ2U6IEF0dGVtcHRTdG9yYWdlU3RhdHM7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSZWNvcmRlck9wdGlvbnMge1xuICByZWFkb25seSBleGVtcGxhcnM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heFJvd3M/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heFBlbmRpbmc/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0b3JlVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzdG9yZT86IEF0dGVtcHRTdG9yZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.attemptOTel = void 0;
|
|
4
|
+
/** OTLP JSON metrics: exact histogram bucket counts and real bounded physical-attempt exemplars. */
|
|
5
|
+
const attemptMetrics_js_1 = require("./attemptMetrics.js");
|
|
6
|
+
const BOUNDS = [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000];
|
|
7
|
+
const attribute = (key, value) => ({ key, value: { stringValue: value } });
|
|
8
|
+
const nano = (ms) => (BigInt(Math.trunc(ms)) * 1000000n).toString();
|
|
9
|
+
function exemplars(refs, value = 'duration') {
|
|
10
|
+
return refs.map((ref) => ({
|
|
11
|
+
asDouble: value === 'count' ? 1 : ref.durationMs,
|
|
12
|
+
timeUnixNano: nano(ref.startedAt),
|
|
13
|
+
filteredAttributes: [
|
|
14
|
+
attribute('footprint.attempt.kind', ref.attemptKind),
|
|
15
|
+
attribute('footprint.attempt.id', ref.id),
|
|
16
|
+
attribute('footprint.runtime_stage_id', ref.runtimeStageId),
|
|
17
|
+
attribute('footprint.series', ref.series),
|
|
18
|
+
attribute('footprint.run_id', ref.runId),
|
|
19
|
+
...(ref.traceId === undefined ? [] : [attribute('footprint.trace_id', ref.traceId)]),
|
|
20
|
+
...(ref.retryLoop === undefined
|
|
21
|
+
? []
|
|
22
|
+
: [
|
|
23
|
+
attribute('footprint.retry_loop.series', ref.retryLoop.series),
|
|
24
|
+
attribute('footprint.retry_loop.phase', ref.retryLoop.phase),
|
|
25
|
+
]),
|
|
26
|
+
],
|
|
27
|
+
...(/^[a-f0-9]{32}$/.test(ref.traceId ?? '') && !/^0+$/.test(ref.traceId ?? '') ? { traceId: ref.traceId } : {}),
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
function attemptOTel(rows, byTarget, limit) {
|
|
31
|
+
const grouped = new Map();
|
|
32
|
+
for (const row of rows) {
|
|
33
|
+
const key = JSON.stringify([row.target, row.outcome, row.category ?? null, row.attemptKind]);
|
|
34
|
+
const bucket = grouped.get(key) ?? [];
|
|
35
|
+
bucket.push(row);
|
|
36
|
+
grouped.set(key, bucket);
|
|
37
|
+
}
|
|
38
|
+
const histograms = [...grouped.values()].map((group) => {
|
|
39
|
+
const first = group[0];
|
|
40
|
+
const buckets = Array(BOUNDS.length + 1).fill(0);
|
|
41
|
+
for (const row of group) {
|
|
42
|
+
const at = BOUNDS.findIndex((bound) => row.durationMs <= bound);
|
|
43
|
+
buckets[at < 0 ? BOUNDS.length : at]++;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
attributes: [
|
|
47
|
+
attribute('footprint.target', first.target),
|
|
48
|
+
attribute('footprint.outcome', first.outcome),
|
|
49
|
+
attribute('footprint.attempt.kind', first.attemptKind),
|
|
50
|
+
...(first.category === undefined ? [] : [attribute('footprint.category', first.category)]),
|
|
51
|
+
],
|
|
52
|
+
startTimeUnixNano: nano(group.reduce((n, row) => Math.min(n, row.startedAt), Infinity)),
|
|
53
|
+
timeUnixNano: nano(group.reduce((n, row) => Math.max(n, row.startedAt + row.durationMs), 0)),
|
|
54
|
+
count: String(group.length),
|
|
55
|
+
sum: group.reduce((n, row) => n + row.durationMs, 0),
|
|
56
|
+
explicitBounds: [...BOUNDS],
|
|
57
|
+
bucketCounts: buckets.map(String),
|
|
58
|
+
exemplars: exemplars((0, attemptMetrics_js_1.worst)(group, limit)),
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
const counts = histograms.map(({ attributes, startTimeUnixNano, timeUnixNano, count, exemplars: refs }) => ({
|
|
62
|
+
attributes,
|
|
63
|
+
startTimeUnixNano,
|
|
64
|
+
timeUnixNano,
|
|
65
|
+
asDouble: Number(count),
|
|
66
|
+
exemplars: refs.map((ref) => ({ ...ref, asDouble: 1 })),
|
|
67
|
+
}));
|
|
68
|
+
const gave = [...byTarget.values()]
|
|
69
|
+
.filter((stat) => stat.gaveUp > 0)
|
|
70
|
+
.map((stat) => ({
|
|
71
|
+
attributes: [attribute('footprint.target', stat.target)],
|
|
72
|
+
asDouble: stat.gaveUp,
|
|
73
|
+
startTimeUnixNano: nano(rows.filter((row) => row.target === stat.target).reduce((n, row) => Math.min(n, row.startedAt), Infinity)),
|
|
74
|
+
timeUnixNano: nano(rows
|
|
75
|
+
.filter((row) => row.target === stat.target)
|
|
76
|
+
.reduce((n, row) => Math.max(n, row.startedAt + row.durationMs), 0)),
|
|
77
|
+
exemplars: exemplars(stat.exemplars.gaveUp, 'count'),
|
|
78
|
+
}));
|
|
79
|
+
return {
|
|
80
|
+
resourceMetrics: [
|
|
81
|
+
{
|
|
82
|
+
resource: { attributes: [] },
|
|
83
|
+
scopeMetrics: [
|
|
84
|
+
{
|
|
85
|
+
scope: { name: 'footprintjs.attempts' },
|
|
86
|
+
metrics: [
|
|
87
|
+
{
|
|
88
|
+
name: 'footprint.attempt.duration',
|
|
89
|
+
unit: 'ms',
|
|
90
|
+
description: 'Attempt work duration; nested attempts may overlap',
|
|
91
|
+
histogram: { aggregationTemporality: 2, dataPoints: histograms },
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'footprint.attempt.count',
|
|
95
|
+
unit: '{attempt}',
|
|
96
|
+
sum: { aggregationTemporality: 2, isMonotonic: true, dataPoints: counts },
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'footprint.attempt.gave_up',
|
|
100
|
+
unit: '{series}',
|
|
101
|
+
sum: { aggregationTemporality: 2, isMonotonic: true, dataPoints: gave },
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
exports.attemptOTel = attemptOTel;
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE9UZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRPVGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9HQUFvRztBQUNwRywyREFBNEM7QUFFNUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNGLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDNUUsU0FBUyxTQUFTLENBQUMsSUFBaUMsRUFBRSxRQUE4QixVQUFVO0lBQzVGLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QixRQUFRLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVTtRQUNoRCxZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDakMsa0JBQWtCLEVBQUU7WUFDbEIsU0FBUyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDcEQsU0FBUyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FB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eGFjdCBoaXN0b2dyYW0gYnVja2V0IGNvdW50cyBhbmQgcmVhbCBib3VuZGVkIHBoeXNpY2FsLWF0dGVtcHQgZXhlbXBsYXJzLiAqL1xuaW1wb3J0IHsgd29yc3QgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdE1ldHJpY1JlZiwgQXR0ZW1wdFN0YXRzLCBQaHlzaWNhbEF0dGVtcHRSb3cgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuY29uc3QgQk9VTkRTID0gWzEsIDUsIDEwLCAyNSwgNTAsIDEwMCwgMjUwLCA1MDAsIDEwMDAsIDI1MDAsIDUwMDAsIDEwMDAwXTtcbmNvbnN0IGF0dHJpYnV0ZSA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gKHsga2V5LCB2YWx1ZTogeyBzdHJpbmdWYWx1ZTogdmFsdWUgfSB9KTtcbmNvbnN0IG5hbm8gPSAobXM6IG51bWJlcikgPT4gKEJpZ0ludChNYXRoLnRydW5jKG1zKSkgKiAxMDAwMDAwbikudG9TdHJpbmcoKTtcbmZ1bmN0aW9uIGV4ZW1wbGFycyhyZWZzOiByZWFkb25seSBBdHRlbXB0TWV0cmljUmVmW10sIHZhbHVlOiAnZHVyYXRpb24nIHwgJ2NvdW50JyA9ICdkdXJhdGlvbicpIHtcbiAgcmV0dXJuIHJlZnMubWFwKChyZWYpID0+ICh7XG4gICAgYXNEb3VibGU6IHZhbHVlID09PSAnY291bnQnID8gMSA6IHJlZi5kdXJhdGlvbk1zLFxuICAgIHRpbWVVbml4TmFubzogbmFubyhyZWYuc3RhcnRlZEF0KSxcbiAgICBmaWx0ZXJlZEF0dHJpYnV0ZXM6IFtcbiAgICAgIGF0dHJpYnV0ZSgnZm9vdHByaW50LmF0dGVtcHQua2luZCcsIHJlZi5hdHRlbXB0S2luZCksXG4gICAgICBhdHRyaWJ1dGUoJ2Zvb3RwcmludC5hdHRlbXB0LmlkJywgcmVmLmlkKSxcbiAgICAgIGF0dHJpYnV0ZSgnZm9vdHByaW50LnJ1bnRpbWVfc3RhZ2VfaWQnLCByZWYucnVudGltZVN0YWdlSWQpLFxuICAgICAgYXR0cmlidXRlKCdmb290cHJpbnQuc2VyaWVzJywgcmVmLnNlcmllcyksXG4gICAgICBhdHRyaWJ1dGUoJ2Zvb3RwcmludC5ydW5faWQnLCByZWYucnVuSWQpLFxuICAgICAgLi4uKHJlZi50cmFjZUlkID09PSB1bmRlZmluZWQgPyBbXSA6IFthdHRyaWJ1dGUoJ2Zvb3RwcmludC50cmFjZV9pZCcsIHJlZi50cmFjZUlkKV0pLFxuICAgICAgLi4uKHJlZi5yZXRyeUxvb3AgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAgYXR0cmlidXRlKCdmb290cHJpbnQucmV0cnlfbG9vcC5zZXJpZXMnLCByZWYucmV0cnlMb29wLnNlcmllcyksXG4gICAgICAgICAgICBhdHRyaWJ1dGUoJ2Zvb3RwcmludC5yZXRyeV9sb29wLnBoYXNlJywgcmVmLnJldHJ5TG9vcC5waGFzZSksXG4gICAgICAgICAgXSksXG4gICAgXSxcbiAgICAuLi4oL15bYS1mMC05XXszMn0kLy50ZXN0KHJlZi50cmFjZUlkID8/ICcnKSAmJiAhL14wKyQvLnRlc3QocmVmLnRyYWNlSWQgPz8gJycpID8geyB0cmFjZUlkOiByZWYudHJhY2VJZCB9IDoge30pLFxuICB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXR0ZW1wdE9UZWwoXG4gIHJvd3M6IHJlYWRvbmx5IFBoeXNpY2FsQXR0ZW1wdFJvd1tdLFxuICBieVRhcmdldDogUmVhZG9ubHlNYXA8c3RyaW5nLCBBdHRlbXB0U3RhdHM+LFxuICBsaW1pdDogbnVtYmVyLFxuKSB7XG4gIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93W10+KCk7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcm93LnRhcmdldCwgcm93Lm91dGNvbWUsIHJvdy5jYXRlZ29yeSA/PyBudWxsLCByb3cuYXR0ZW1wdEtpbmRdKTtcbiAgICBjb25zdCBidWNrZXQgPSBncm91cGVkLmdldChrZXkpID8/IFtdO1xuICAgIGJ1Y2tldC5wdXNoKHJvdyk7XG4gICAgZ3JvdXBlZC5zZXQoa2V5LCBidWNrZXQpO1xuICB9XG4gIGNvbnN0IGhpc3RvZ3JhbXMgPSBbLi4uZ3JvdXBlZC52YWx1ZXMoKV0ubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IGZpcnN0ID0gZ3JvdXBbMF07XG4gICAgY29uc3QgYnVja2V0cyA9IEFycmF5KEJPVU5EUy5sZW5ndGggKyAxKS5maWxsKDApIGFzIG51bWJlcltdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGdyb3VwKSB7XG4gICAgICBjb25zdCBhdCA9IEJPVU5EUy5maW5kSW5kZXgoKGJvdW5kKSA9PiByb3cuZHVyYXRpb25NcyA8PSBib3VuZCk7XG4gICAgICBidWNrZXRzW2F0IDwgMCA/IEJPVU5EUy5sZW5ndGggOiBhdF0rKztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgYXR0cmlidXRlKCdmb290cHJpbnQudGFyZ2V0JywgZmlyc3QudGFyZ2V0KSxcbiAgICAgICAgYXR0cmlidXRlKCdmb290cHJpbnQub3V0Y29tZScsIGZpcnN0Lm91dGNvbWUpLFxuICAgICAgICBhdHRyaWJ1dGUoJ2Zvb3RwcmludC5hdHRlbXB0LmtpbmQnLCBmaXJzdC5hdHRlbXB0S2luZCksXG4gICAgICAgIC4uLihmaXJzdC5jYXRlZ29yeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbYXR0cmlidXRlKCdmb290cHJpbnQuY2F0ZWdvcnknLCBmaXJzdC5jYXRlZ29yeSldKSxcbiAgICAgIF0sXG4gICAgICBzdGFydFRpbWVVbml4TmFubzogbmFubyhncm91cC5yZWR1Y2UoKG4sIHJvdykgPT4gTWF0aC5taW4obiwgcm93LnN0YXJ0ZWRBdCksIEluZmluaXR5KSksXG4gICAgICB0aW1lVW5peE5hbm86IG5hbm8oZ3JvdXAucmVkdWNlKChuLCByb3cpID0+IE1hdGgubWF4KG4sIHJvdy5zdGFydGVkQXQgKyByb3cuZHVyYXRpb25NcyksIDApKSxcbiAgICAgIGNvdW50OiBTdHJpbmcoZ3JvdXAubGVuZ3RoKSxcbiAgICAgIHN1bTogZ3JvdXAucmVkdWNlKChuLCByb3cpID0+IG4gKyByb3cuZHVyYXRpb25NcywgMCksXG4gICAgICBleHBsaWNpdEJvdW5kczogWy4uLkJPVU5EU10sXG4gICAgICBidWNrZXRDb3VudHM6IGJ1Y2tldHMubWFwKFN0cmluZyksXG4gICAgICBleGVtcGxhcnM6IGV4ZW1wbGFycyh3b3JzdChncm91cCwgbGltaXQpKSxcbiAgICB9O1xuICB9KTtcbiAgY29uc3QgY291bnRzID0gaGlzdG9ncmFtcy5tYXAoKHsgYXR0cmlidXRlcywgc3RhcnRUaW1lVW5peE5hbm8sIHRpbWVVbml4TmFubywgY291bnQsIGV4ZW1wbGFyczogcmVmcyB9KSA9PiAoe1xuICAgIGF0dHJpYnV0ZXMsXG4gICAgc3RhcnRUaW1lVW5peE5hbm8sXG4gICAgdGltZVVuaXhOYW5vLFxuICAgIGFzRG91YmxlOiBOdW1iZXIoY291bnQpLFxuICAgIGV4ZW1wbGFyczogcmVmcy5tYXAoKHJlZikgPT4gKHsgLi4ucmVmLCBhc0RvdWJsZTogMSB9KSksXG4gIH0pKTtcbiAgY29uc3QgZ2F2ZSA9IFsuLi5ieVRhcmdldC52YWx1ZXMoKV1cbiAgICAuZmlsdGVyKChzdGF0KSA9PiBzdGF0LmdhdmVVcCA+IDApXG4gICAgLm1hcCgoc3RhdCkgPT4gKHtcbiAgICAgIGF0dHJpYnV0ZXM6IFthdHRyaWJ1dGUoJ2Zvb3RwcmludC50YXJnZXQnLCBzdGF0LnRhcmdldCldLFxuICAgICAgYXNEb3VibGU6IHN0YXQuZ2F2ZVVwLFxuICAgICAgc3RhcnRUaW1lVW5peE5hbm86IG5hbm8oXG4gICAgICAgIHJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy50YXJnZXQgPT09IHN0YXQudGFyZ2V0KS5yZWR1Y2UoKG4sIHJvdykgPT4gTWF0aC5taW4obiwgcm93LnN0YXJ0ZWRBdCksIEluZmluaXR5KSxcbiAgICAgICksXG4gICAgICB0aW1lVW5peE5hbm86IG5hbm8oXG4gICAgICAgIHJvd3NcbiAgICAgICAgICAuZmlsdGVyKChyb3cpID0+IHJvdy50YXJnZXQgPT09IHN0YXQudGFyZ2V0KVxuICAgICAgICAgIC5yZWR1Y2UoKG4sIHJvdykgPT4gTWF0aC5tYXgobiwgcm93LnN0YXJ0ZWRBdCArIHJvdy5kdXJhdGlvbk1zKSwgMCksXG4gICAgICApLFxuICAgICAgZXhlbXBsYXJzOiBleGVtcGxhcnMoc3RhdC5leGVtcGxhcnMuZ2F2ZVVwLCAnY291bnQnKSxcbiAgICB9KSk7XG4gIHJldHVybiB7XG4gICAgcmVzb3VyY2VNZXRyaWNzOiBbXG4gICAgICB7XG4gICAgICAgIHJlc291cmNlOiB7IGF0dHJpYnV0ZXM6IFtdIH0sXG4gICAgICAgIHNjb3BlTWV0cmljczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjb3BlOiB7IG5hbWU6ICdmb290cHJpbnRqcy5hdHRlbXB0cycgfSxcbiAgICAgICAgICAgIG1ldHJpY3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdmb290cHJpbnQuYXR0ZW1wdC5kdXJhdGlvbicsXG4gICAgICAgICAgICAgICAgdW5pdDogJ21zJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0F0dGVtcHQgd29yayBkdXJhdGlvbjsgbmVzdGVkIGF0dGVtcHRzIG1heSBvdmVybGFwJyxcbiAgICAgICAgICAgICAgICBoaXN0b2dyYW06IHsgYWdncmVnYXRpb25UZW1wb3JhbGl0eTogMiwgZGF0YVBvaW50czogaGlzdG9ncmFtcyB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2Zvb3RwcmludC5hdHRlbXB0LmNvdW50JyxcbiAgICAgICAgICAgICAgICB1bml0OiAne2F0dGVtcHR9JyxcbiAgICAgICAgICAgICAgICBzdW06IHsgYWdncmVnYXRpb25UZW1wb3JhbGl0eTogMiwgaXNNb25vdG9uaWM6IHRydWUsIGRhdGFQb2ludHM6IGNvdW50cyB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2Zvb3RwcmludC5hdHRlbXB0LmdhdmVfdXAnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICd7c2VyaWVzfScsXG4gICAgICAgICAgICAgICAgc3VtOiB7IGFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk6IDIsIGlzTW9ub3RvbmljOiB0cnVlLCBkYXRhUG9pbnRzOiBnYXZlIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG4iXX0=
|