@overkill-dev/run 0.0.67 → 0.0.69
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/{run/attachment-json.js → attachments/json-snapshot.js} +10 -6
- package/attachments/json-snapshot.js.map +1 -0
- package/baselines/performance-adapter.d.ts +60 -0
- package/baselines/performance-adapter.d.ts.map +1 -0
- package/baselines/performance-baseline.d.ts +48 -0
- package/baselines/performance-baseline.d.ts.map +1 -0
- package/baselines/performance-baseline.js +9 -0
- package/baselines/performance-baseline.js.map +1 -0
- package/baselines/performance-evaluation.js +88 -0
- package/baselines/performance-evaluation.js.map +1 -0
- package/baselines/performance-plan.js +33 -0
- package/baselines/performance-plan.js.map +1 -0
- package/baselines/performance-report.js +57 -0
- package/baselines/performance-report.js.map +1 -0
- package/baselines/performance-schema.js +12 -0
- package/baselines/performance-schema.js.map +1 -0
- package/baselines/performance-store.js +134 -0
- package/baselines/performance-store.js.map +1 -0
- package/baselines/performance-workflow.js +180 -0
- package/baselines/performance-workflow.js.map +1 -0
- package/bench/calibration-schema.js +12 -0
- package/bench/calibration-schema.js.map +1 -0
- package/canonical-identity.js +54 -0
- package/canonical-identity.js.map +1 -0
- package/config/config.d.ts +2 -5
- package/config/config.d.ts.map +1 -1
- package/config/config.js +1 -0
- package/config/config.js.map +1 -1
- package/config/normalized-microtest-schema.js +38 -0
- package/config/normalized-microtest-schema.js.map +1 -0
- package/config/performance-baselines.js +24 -0
- package/config/performance-baselines.js.map +1 -0
- package/config/schema.d.ts +3 -1
- package/config/schema.d.ts.map +1 -1
- package/config/schema.js +4 -2
- package/config/schema.js.map +1 -1
- package/config/snapshot.js +1 -0
- package/config/snapshot.js.map +1 -1
- package/config/types.d.ts +8 -1
- package/config/types.d.ts.map +1 -1
- package/config/validation.js +2 -0
- package/config/validation.js.map +1 -1
- package/engine/engine.d.ts +2 -1
- package/engine/engine.d.ts.map +1 -1
- package/engine/engine.js +1 -0
- package/engine/engine.js.map +1 -1
- package/{run/run-identity-schema.js → engine/identity-schema.js} +1 -1
- package/engine/identity-schema.js.map +1 -0
- package/engine/test-node.d.ts +18 -8
- package/engine/test-node.d.ts.map +1 -1
- package/engine/test-node.js +19 -26
- package/engine/test-node.js.map +1 -1
- package/engine/test-plan.d.ts +2 -2
- package/engine/test-plan.d.ts.map +1 -1
- package/engine/test-plan.js +27 -16
- package/engine/test-plan.js.map +1 -1
- package/engine/workload-label.js +4 -0
- package/engine/workload-label.js.map +1 -0
- package/engine/workload-test-case.js +57 -0
- package/engine/workload-test-case.js.map +1 -0
- package/file-store.js +48 -0
- package/file-store.js.map +1 -0
- package/package.json +18 -3
- package/packages/run/benchmark-calibration.entry-point.d.ts +22 -0
- package/packages/run/benchmark-calibration.entry-point.d.ts.map +1 -0
- package/packages/run/benchmark-calibration.entry-point.js +129 -0
- package/packages/run/benchmark-calibration.entry-point.js.map +1 -0
- package/packages/run/command-line.entry-point.d.ts +1 -1
- package/packages/run/command-line.entry-point.d.ts.map +1 -1
- package/packages/run/filters.entry-point.d.ts +1 -1
- package/packages/run/filters.entry-point.d.ts.map +1 -1
- package/packages/run/filters.entry-point.js +1 -1
- package/packages/run/filters.entry-point.js.map +1 -1
- package/packages/run/run.entry-point.d.ts +3 -1
- package/packages/run/run.entry-point.d.ts.map +1 -1
- package/packages/run/run.entry-point.js +1 -0
- package/packages/run/run.entry-point.js.map +1 -1
- package/readme.md +52 -5
- package/reporters/human-reporter-rendering.js +11 -5
- package/reporters/human-reporter-rendering.js.map +1 -1
- package/reporters/line-reporter.js +2 -1
- package/reporters/line-reporter.js.map +1 -1
- package/run/assertion-result-schema.js +1 -1
- package/run/assertion-result-schema.js.map +1 -1
- package/run/attachment-execution.js +2 -2
- package/run/attachment-execution.js.map +1 -1
- package/run/attachment-retention.js +2 -2
- package/run/attachment-retention.js.map +1 -1
- package/run/benchmark-baseline-commands.js +70 -0
- package/run/benchmark-baseline-commands.js.map +1 -0
- package/run/benchmark-baseline-finalization.js +67 -0
- package/run/benchmark-baseline-finalization.js.map +1 -0
- package/run/benchmark-baseline-operations.js +53 -0
- package/run/benchmark-baseline-operations.js.map +1 -0
- package/run/benchmark-baseline-run.js +58 -0
- package/run/benchmark-baseline-run.js.map +1 -0
- package/run/benchmark-baseline-session.js +72 -0
- package/run/benchmark-baseline-session.js.map +1 -0
- package/run/benchmark-calibration.entry-point.js +3 -0
- package/run/benchmark-calibration.entry-point.js.map +1 -0
- package/run/benchmark-calibration.js +41 -0
- package/run/benchmark-calibration.js.map +1 -0
- package/run/benchmark-command-policy.d.ts +8 -0
- package/run/benchmark-command-policy.d.ts.map +1 -0
- package/run/benchmark-command-policy.js +37 -0
- package/run/benchmark-command-policy.js.map +1 -0
- package/run/benchmark-commands.d.ts +1 -7
- package/run/benchmark-commands.d.ts.map +1 -1
- package/run/benchmark-commands.js +19 -40
- package/run/benchmark-commands.js.map +1 -1
- package/run/child-process-roles.js +1 -0
- package/run/child-process-roles.js.map +1 -1
- package/run/child-process.entry-point.js +5 -1
- package/run/child-process.entry-point.js.map +1 -1
- package/run/collected-run-plan-schema.js +1 -1
- package/run/collected-run-plan-schema.js.map +1 -1
- package/run/command-line-command.d.ts +18 -1
- package/run/command-line-command.d.ts.map +1 -1
- package/run/command-line-command.js.map +1 -1
- package/run/command-line-runner.d.ts +2 -2
- package/run/command-line-runner.d.ts.map +1 -1
- package/run/default-run-engine.js +1 -0
- package/run/default-run-engine.js.map +1 -1
- package/run/execution-plan-resolution.js +7 -0
- package/run/execution-plan-resolution.js.map +1 -1
- package/run/freeze-run-policy.js +29 -0
- package/run/freeze-run-policy.js.map +1 -0
- package/run/frozen-policy-validation.js +78 -0
- package/run/frozen-policy-validation.js.map +1 -0
- package/run/frozen-run-command.js +27 -0
- package/run/frozen-run-command.js.map +1 -0
- package/run/frozen-run-policy-schema.js +51 -0
- package/run/frozen-run-policy-schema.js.map +1 -0
- package/run/frozen-run-policy.d.ts +3 -0
- package/run/frozen-run-policy.d.ts.map +1 -0
- package/run/frozen-run-policy.js +100 -0
- package/run/frozen-run-policy.js.map +1 -0
- package/run/frozen-supervised-command-schema.js +26 -0
- package/run/frozen-supervised-command-schema.js.map +1 -0
- package/run/node-run-execution.js +2 -2
- package/run/node-run-execution.js.map +1 -1
- package/run/reporter-event-schema.js +1 -1
- package/run/reporter-event-schema.js.map +1 -1
- package/run/run-artifact-id-schema.js +1 -1
- package/run/run-artifact-id-schema.js.map +1 -1
- package/run/run-artifact-schema.js +1 -1
- package/run/run-artifact-schema.js.map +1 -1
- package/run/run-collected-planning.js +4 -7
- package/run/run-collected-planning.js.map +1 -1
- package/run/run-collected-resolution.js +1 -0
- package/run/run-collected-resolution.js.map +1 -1
- package/run/run-collection-source.d.ts +1 -1
- package/run/run-collection-source.d.ts.map +1 -1
- package/run/run-command-schema.js +5 -0
- package/run/run-command-schema.js.map +1 -1
- package/run/run-discovery-types.d.ts +1 -10
- package/run/run-discovery-types.d.ts.map +1 -1
- package/run/run-engine-selection.js +1 -0
- package/run/run-engine-selection.js.map +1 -1
- package/run/run-execution.js +54 -0
- package/run/run-execution.js.map +1 -0
- package/run/run-facts.js +1 -0
- package/run/run-facts.js.map +1 -1
- package/run/run-filter-grammar.d.ts.map +1 -1
- package/run/run-filter-grammar.js +2 -1
- package/run/run-filter-grammar.js.map +1 -1
- package/run/run-if-main.d.ts +1 -1
- package/run/run-if-main.d.ts.map +1 -1
- package/run/run-input-resolution.js +32 -10
- package/run/run-input-resolution.js.map +1 -1
- package/run/run-isolated-command.js +8 -4
- package/run/run-isolated-command.js.map +1 -1
- package/run/run-isolated-process.js +12 -2
- package/run/run-isolated-process.js.map +1 -1
- package/run/run-list-renderer.js +6 -4
- package/run/run-list-renderer.js.map +1 -1
- package/run/run-local-command.js +5 -4
- package/run/run-local-command.js.map +1 -1
- package/run/run-local-resolution.js +5 -2
- package/run/run-local-resolution.js.map +1 -1
- package/run/{run.d.ts → run-operations.d.ts} +2 -2
- package/run/run-operations.d.ts.map +1 -0
- package/run/run-operations.js +83 -0
- package/run/run-operations.js.map +1 -0
- package/run/run-orchestrator.d.ts.map +1 -1
- package/run/run-orchestrator.js +2 -5
- package/run/run-orchestrator.js.map +1 -1
- package/run/run-profile-facts.js +3 -0
- package/run/run-profile-facts.js.map +1 -1
- package/run/run-request-types.d.ts +1 -0
- package/run/run-request-types.d.ts.map +1 -1
- package/run/run-result-schema.js +2 -1
- package/run/run-result-schema.js.map +1 -1
- package/run/run-selection-filters.d.ts +1 -0
- package/run/run-selection-filters.d.ts.map +1 -1
- package/run/run-selection-filters.js +8 -1
- package/run/run-selection-filters.js.map +1 -1
- package/run/run-selection-schema.js +34 -0
- package/run/run-selection-schema.js.map +1 -0
- package/run/run-sharding.js +3 -55
- package/run/run-sharding.js.map +1 -1
- package/run/run-supervised-finalization.js +2 -1
- package/run/run-supervised-finalization.js.map +1 -1
- package/run/run-supervised-process.js +3 -0
- package/run/run-supervised-process.js.map +1 -1
- package/run/run-support.js.map +1 -1
- package/run/run-test-modules.d.ts +1 -1
- package/run/run-test-modules.d.ts.map +1 -1
- package/run/run-test-plan.js.map +1 -1
- package/run/run-types.d.ts +93 -10
- package/run/run-types.d.ts.map +1 -1
- package/run/run-types.js.map +1 -1
- package/run/run-validation.js +7 -0
- package/run/run-validation.js.map +1 -1
- package/run/run.js +26 -80
- package/run/run.js.map +1 -1
- package/run/runtime-matrix-expansion.js +1 -1
- package/run/runtime-matrix-expansion.js.map +1 -1
- package/run/simulation-witness.js +2 -2
- package/run/simulation-witness.js.map +1 -1
- package/run/supervised-child-test-plan.js +19 -3
- package/run/supervised-child-test-plan.js.map +1 -1
- package/run/supervised-child.entry-point.js +1 -1
- package/run/supervised-child.entry-point.js.map +1 -1
- package/run/supervised-child.js +3 -2
- package/run/supervised-child.js.map +1 -1
- package/run/supervised-protocol-schema.js +7 -8
- package/run/supervised-protocol-schema.js.map +1 -1
- package/run/supervised-protocol.js +3 -0
- package/run/supervised-protocol.js.map +1 -1
- package/run/worker-pool-host-protocol-schema.js +1 -1
- package/run/worker-pool-host-protocol-schema.js.map +1 -1
- package/run/worker-pool-results.js +2 -2
- package/run/worker-pool-results.js.map +1 -1
- package/run/worker-pool-run.js +5 -4
- package/run/worker-pool-run.js.map +1 -1
- package/run/worker-pool-task-schema.js +1 -1
- package/run/worker-pool-task-schema.js.map +1 -1
- package/sbom.cdx.json +4 -4
- package/run/attachment-json.js.map +0 -1
- package/run/node-runtime-state-store.js +0 -38
- package/run/node-runtime-state-store.js.map +0 -1
- package/run/run-collection-source-types.d.ts +0 -12
- package/run/run-collection-source-types.d.ts.map +0 -1
- package/run/run-identity-schema.js.map +0 -1
- package/run/run.d.ts.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createStoredValue } from "../stored-value.js";
|
|
2
2
|
const maxJsonDepth = 64;
|
|
3
3
|
const containerBytes = 2;
|
|
4
4
|
class JsonByteLimitError extends Error {
|
|
@@ -9,7 +9,7 @@ class JsonByteLimitError extends Error {
|
|
|
9
9
|
}
|
|
10
10
|
function createJsonSnapshotBudget(maxBytes) {
|
|
11
11
|
const ancestors = new Set();
|
|
12
|
-
const remaining =
|
|
12
|
+
const remaining = createStoredValue(maxBytes);
|
|
13
13
|
return {
|
|
14
14
|
reserve(bytes) {
|
|
15
15
|
if (bytes > remaining.read()) {
|
|
@@ -82,8 +82,9 @@ function containerSnapshot(value, budget, depth, visit) {
|
|
|
82
82
|
? arraySnapshot(value, budget, depth, visit)
|
|
83
83
|
: objectSnapshot(value, budget, depth, visit);
|
|
84
84
|
}
|
|
85
|
-
function createJsonVisit(budget) {
|
|
85
|
+
function createJsonVisit(budget, validate) {
|
|
86
86
|
return function visit(value, depth) {
|
|
87
|
+
validate(value);
|
|
87
88
|
if (scalar(value)) {
|
|
88
89
|
budget.reserve(Buffer.byteLength(JSON.stringify(value)));
|
|
89
90
|
return value;
|
|
@@ -101,10 +102,13 @@ function createJsonVisit(budget) {
|
|
|
101
102
|
};
|
|
102
103
|
}
|
|
103
104
|
function boundedJsonSnapshot(value, maxBytes) {
|
|
104
|
-
const copy = createJsonVisit(createJsonSnapshotBudget(maxBytes)
|
|
105
|
+
const copy = createJsonVisit(createJsonSnapshotBudget(maxBytes), function allowJsonValue() {
|
|
106
|
+
return undefined;
|
|
107
|
+
})(value, 0);
|
|
105
108
|
return { value: copy, encoded: JSON.stringify(copy) };
|
|
106
109
|
}
|
|
107
|
-
|
|
110
|
+
|
|
111
|
+
export function snapshotJson(value, maxBytes) {
|
|
108
112
|
try {
|
|
109
113
|
return boundedJsonSnapshot(value, maxBytes);
|
|
110
114
|
}
|
|
@@ -115,4 +119,4 @@ export function snapshotAttachmentJson(value, maxBytes) {
|
|
|
115
119
|
throw error;
|
|
116
120
|
}
|
|
117
121
|
}
|
|
118
|
-
//# sourceMappingURL=
|
|
122
|
+
//# sourceMappingURL=json-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-snapshot.js","sourceRoot":"","sources":["../../../../source/attachments/json-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { JsonValue, ReadonlyDeep } from 'type-fest';
|
|
2
|
+
import type { WorkId } from '../engine/identity.ts';
|
|
3
|
+
import type { RunArtifact } from '../engine/run-result.ts';
|
|
4
|
+
import type { ComparableCalibration as ComparableCalibrationDefinition } from '../packages/run/benchmark-calibration.entry-point.ts';
|
|
5
|
+
export type BaselineJson = ReadonlyDeep<JsonValue>;
|
|
6
|
+
export type PerformanceBaselineValue = {
|
|
7
|
+
readonly calibration: ComparableCalibration;
|
|
8
|
+
readonly value: BaselineJson;
|
|
9
|
+
};
|
|
10
|
+
type MissingObservation = {
|
|
11
|
+
readonly kind: 'missing';
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
};
|
|
14
|
+
type InapplicableObservation = {
|
|
15
|
+
readonly kind: 'not-applicable';
|
|
16
|
+
};
|
|
17
|
+
type ObservedValue = {
|
|
18
|
+
readonly kind: 'observed';
|
|
19
|
+
readonly value: BaselineJson;
|
|
20
|
+
};
|
|
21
|
+
export type PerformanceObservation = InapplicableObservation | MissingObservation | ObservedValue;
|
|
22
|
+
export type BaselineDiagnostic = {
|
|
23
|
+
readonly actual: BaselineJson;
|
|
24
|
+
readonly expected: BaselineJson;
|
|
25
|
+
readonly summary: string;
|
|
26
|
+
};
|
|
27
|
+
type MatchingPerformance = {
|
|
28
|
+
readonly kind: 'match';
|
|
29
|
+
};
|
|
30
|
+
type MismatchingPerformance = {
|
|
31
|
+
readonly diagnostics: readonly [BaselineDiagnostic, ...(readonly BaselineDiagnostic[])];
|
|
32
|
+
readonly kind: 'mismatch';
|
|
33
|
+
};
|
|
34
|
+
export type PerformanceComparison = MatchingPerformance | MismatchingPerformance;
|
|
35
|
+
export type PerformanceObservationInput = {
|
|
36
|
+
readonly artifacts: readonly RunArtifact[];
|
|
37
|
+
readonly calibration: ComparableCalibration;
|
|
38
|
+
readonly work: WorkId;
|
|
39
|
+
};
|
|
40
|
+
export type PerformanceProposalInput = {
|
|
41
|
+
readonly actual: PerformanceBaselineValue;
|
|
42
|
+
readonly expected: PerformanceBaselineValue | null;
|
|
43
|
+
};
|
|
44
|
+
export type PerformanceComparisonInput = {
|
|
45
|
+
readonly actual: PerformanceBaselineValue;
|
|
46
|
+
readonly expected: PerformanceBaselineValue;
|
|
47
|
+
};
|
|
48
|
+
export type PerformanceBaselineAdapter = {
|
|
49
|
+
readonly id: string;
|
|
50
|
+
readonly observe: (input: PerformanceObservationInput) => PerformanceObservation;
|
|
51
|
+
readonly propose: (input: PerformanceProposalInput) => BaselineJson;
|
|
52
|
+
readonly compare: (input: PerformanceComparisonInput) => PerformanceComparison;
|
|
53
|
+
};
|
|
54
|
+
export type BenchmarkBaselinePolicy = {
|
|
55
|
+
readonly adapters: readonly PerformanceBaselineAdapter[];
|
|
56
|
+
readonly directory: string;
|
|
57
|
+
};
|
|
58
|
+
export type ComparableCalibration = ComparableCalibrationDefinition;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=performance-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-adapter.d.ts","sourceRoot":"","sources":["../../../../source/baselines/performance-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACR,qBAAqB,IAAI,+BAA+B,EAC3D,MAAM,sDAAsD,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AACnD,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAChC,CAAC;AACF,KAAK,kBAAkB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAAE,CAAC;AACjF,KAAK,uBAAuB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CAAE,CAAC;AACpE,KAAK,aAAa,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAAE,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAClG,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B,CAAC;AACF,KAAK,mBAAmB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CAAE,CAAC;AACvD,KAAK,sBAAsB,GAAG;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACxF,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC7B,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;AACjF,MAAM,MAAM,2BAA2B,GAAG;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;CACtD,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG;IACrC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;CAC/C,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,sBAAsB,CAAC;IACjF,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,YAAY,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,qBAAqB,CAAC;CAClF,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { BenchmarkCalibrationResult as BenchmarkCalibrationResultDefinition } from '../packages/run/benchmark-calibration.entry-point.ts';
|
|
2
|
+
import type { WorkId } from '../engine/identity.ts';
|
|
3
|
+
import type { PerformanceBaselineValue } from './performance-adapter.ts';
|
|
4
|
+
export type StoredPerformanceBaseline = {
|
|
5
|
+
readonly adapter: string;
|
|
6
|
+
readonly expected: PerformanceBaselineValue;
|
|
7
|
+
readonly profile: string;
|
|
8
|
+
readonly subtype: 'performance-baseline';
|
|
9
|
+
readonly version: 1;
|
|
10
|
+
readonly work: WorkId;
|
|
11
|
+
};
|
|
12
|
+
export type BaselineEntry = {
|
|
13
|
+
readonly baseline: StoredPerformanceBaseline;
|
|
14
|
+
readonly path: string;
|
|
15
|
+
};
|
|
16
|
+
type CreatedBaseline = {
|
|
17
|
+
readonly baseline: StoredPerformanceBaseline;
|
|
18
|
+
readonly kind: 'create';
|
|
19
|
+
};
|
|
20
|
+
type RemovedBaseline = {
|
|
21
|
+
readonly baseline: StoredPerformanceBaseline;
|
|
22
|
+
readonly kind: 'remove';
|
|
23
|
+
};
|
|
24
|
+
type UpdatedBaseline = {
|
|
25
|
+
readonly baseline: StoredPerformanceBaseline;
|
|
26
|
+
readonly kind: 'update';
|
|
27
|
+
readonly previous: StoredPerformanceBaseline;
|
|
28
|
+
};
|
|
29
|
+
export type BaselineChange = CreatedBaseline | RemovedBaseline | UpdatedBaseline;
|
|
30
|
+
type WrittenBaselines = {
|
|
31
|
+
readonly changes: readonly BaselineChange[];
|
|
32
|
+
readonly kind: 'written';
|
|
33
|
+
};
|
|
34
|
+
type BlockedBaselineWrites = {
|
|
35
|
+
readonly kind: 'blocked';
|
|
36
|
+
};
|
|
37
|
+
type FailedBaselineWrites = {
|
|
38
|
+
readonly kind: 'failed';
|
|
39
|
+
readonly writtenChanges: readonly BaselineChange[];
|
|
40
|
+
};
|
|
41
|
+
type ReadOnlyBaselines = {
|
|
42
|
+
readonly kind: 'read-only';
|
|
43
|
+
};
|
|
44
|
+
export type BaselineWriteOutcome = BlockedBaselineWrites | FailedBaselineWrites | ReadOnlyBaselines | WrittenBaselines;
|
|
45
|
+
export type BaselineUpdateMode = 'apply' | 'bootstrap' | 'diff' | 'none' | 'update';
|
|
46
|
+
export type BenchmarkCalibrationResult = BenchmarkCalibrationResultDefinition;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=performance-baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-baseline.d.ts","sourceRoot":"","sources":["../../../../source/baselines/performance-baseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,0BAA0B,IAAI,oCAAoC,EACrE,MAAM,sDAAsD,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,MAAM,+BAO+B,GAAG;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB,CAAC;AACF,KAAK,eAAe,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CAAE,CAAC;AAClG,KAAK,eAAe,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CAAE,CAAC;AAClG,KAAK,eAAe,GAAG;IACnB,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;CAChD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;AACjF,KAAK,gBAAgB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAAE,CAAC;AACnG,KAAK,qBAAqB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAAE,CAAC;AAC3D,KAAK,oBAAoB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,cAAc,EAAE,CAAC;CAAE,CAAC;AAC7G,KAAK,iBAAiB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAAE,CAAC;AACzD,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AACvH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpF,YASY,0BAA0B,GAAG,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function performanceBaselineIdentity(baseline) {
|
|
2
|
+
return {
|
|
3
|
+
adapter: baseline.adapter,
|
|
4
|
+
machineClass: baseline.expected.calibration.machineClass,
|
|
5
|
+
profile: baseline.profile,
|
|
6
|
+
work: baseline.work
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=performance-baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-baseline.js","sourceRoot":"","sources":["../../../../source/baselines/performance-baseline.ts"],"names":[],"mappings":"AAwCA,MAAM,UAAU,2BAA2B,CAAC,QAAmC;IAC3E,OAAO;QACH,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY;QACxD,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;KACtB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { resolveSourceLocation } from "../assertion-protocol/source-location.js";
|
|
2
|
+
import { compareDeepValues } from "../compare/comparison.js";
|
|
3
|
+
import { snapshotJson } from "../attachments/json-snapshot.js";
|
|
4
|
+
import { createDefaultWorkId } from "../engine/identity.js";
|
|
5
|
+
import { proposePerformanceBaseline } from "./performance-plan.js";
|
|
6
|
+
function failedBaselineCheck(input) {
|
|
7
|
+
const [first, ...rest] = input.event.definitionLocations;
|
|
8
|
+
const comparison = compareDeepValues(input.actual, input.expected);
|
|
9
|
+
return {
|
|
10
|
+
actual: comparison.actual,
|
|
11
|
+
diff: comparison.diff,
|
|
12
|
+
expected: comparison.expected,
|
|
13
|
+
id: input.id,
|
|
14
|
+
kind: 'leaf',
|
|
15
|
+
path: comparison.path,
|
|
16
|
+
source: 'assert',
|
|
17
|
+
sourceLocations: [resolveSourceLocation(first), ...rest.map(resolveSourceLocation)],
|
|
18
|
+
summary: input.summary
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function comparisonChecks(input, actual, existing) {
|
|
22
|
+
const comparison = input.adapter.compare({ actual, expected: existing.expected });
|
|
23
|
+
if (comparison.kind === 'match') {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
if (comparison.diagnostics.length === 0) {
|
|
27
|
+
throw new Error('Performance comparison mismatch requires diagnostics.');
|
|
28
|
+
}
|
|
29
|
+
return comparison.diagnostics.map(function diagnosticCheck(diagnostic, index) {
|
|
30
|
+
return failedBaselineCheck({
|
|
31
|
+
...diagnostic,
|
|
32
|
+
event: input.event,
|
|
33
|
+
id: `performance-baseline:${input.adapter.id}:${index.toString()}`
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function baselineChecks(input, actual) {
|
|
38
|
+
const compare = input.mode === 'none' || input.mode === 'bootstrap' && input.existing !== null;
|
|
39
|
+
if (!compare) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
if (input.existing !== null) {
|
|
43
|
+
return comparisonChecks(input, actual, input.existing);
|
|
44
|
+
}
|
|
45
|
+
return [failedBaselineCheck({
|
|
46
|
+
actual: actual.value,
|
|
47
|
+
event: input.event,
|
|
48
|
+
expected: null,
|
|
49
|
+
id: `performance-baseline:${input.adapter.id}:missing`,
|
|
50
|
+
summary: `Missing performance baseline for adapter "${input.adapter.id}".`
|
|
51
|
+
})];
|
|
52
|
+
}
|
|
53
|
+
function snapshotObservation(value, input) {
|
|
54
|
+
const snapshot = snapshotJson(value, input.maxBytes);
|
|
55
|
+
if (snapshot === null) {
|
|
56
|
+
throw new Error('Performance observation exceeds the configured artifact byte limit.');
|
|
57
|
+
}
|
|
58
|
+
return { calibration: input.calibration, value: snapshot.value };
|
|
59
|
+
}
|
|
60
|
+
export function evaluatePerformanceBaseline(input) {
|
|
61
|
+
const work = input.event.workId ?? createDefaultWorkId(input.event.case);
|
|
62
|
+
const observation = input.adapter.observe({
|
|
63
|
+
artifacts: input.event.artifacts,
|
|
64
|
+
calibration: input.calibration,
|
|
65
|
+
work
|
|
66
|
+
});
|
|
67
|
+
if (observation.kind === 'not-applicable') {
|
|
68
|
+
return { change: null, checks: [], participates: false };
|
|
69
|
+
}
|
|
70
|
+
if (observation.kind === 'missing') {
|
|
71
|
+
throw new Error(observation.reason);
|
|
72
|
+
}
|
|
73
|
+
const actual = snapshotObservation(observation.value, input);
|
|
74
|
+
const change = proposePerformanceBaseline({ ...input, actual, work });
|
|
75
|
+
return { change, checks: baselineChecks(input, actual), participates: true };
|
|
76
|
+
}
|
|
77
|
+
export function performanceBaselineError(error, event) {
|
|
78
|
+
return {
|
|
79
|
+
attributedTo: event === null ? null : event.case,
|
|
80
|
+
attributedToAttempt: event === null ? null : { index: event.attempt },
|
|
81
|
+
attributedToWork: event === null ? null : event.workId ?? createDefaultWorkId(event.case),
|
|
82
|
+
cause: error,
|
|
83
|
+
diagnostics: [],
|
|
84
|
+
message: error instanceof Error ? error.message : String(error),
|
|
85
|
+
subtype: 'artifact'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=performance-evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-evaluation.js","sourceRoot":"","sources":["../../../../source/baselines/performance-evaluation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { compareExactly } from "../compare/raw-comparison.js";
|
|
2
|
+
import { snapshotJson } from "../attachments/json-snapshot.js";
|
|
3
|
+
function preservesBaseline(input) {
|
|
4
|
+
return input.mode === 'none' || input.mode === 'bootstrap' && input.existing !== null;
|
|
5
|
+
}
|
|
6
|
+
function previousExpectation(existing) {
|
|
7
|
+
return existing === null ? null : existing.expected;
|
|
8
|
+
}
|
|
9
|
+
export function proposePerformanceBaseline(input) {
|
|
10
|
+
if (preservesBaseline(input)) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const proposal = input.adapter.propose({ actual: input.actual, expected: previousExpectation(input.existing) });
|
|
14
|
+
const snapshot = snapshotJson(proposal, input.maxBytes);
|
|
15
|
+
if (snapshot === null) {
|
|
16
|
+
throw new Error('Performance baseline proposal exceeds the configured artifact byte limit.');
|
|
17
|
+
}
|
|
18
|
+
if (input.existing !== null && compareExactly(input.existing.expected.value, snapshot.value)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const baseline = {
|
|
22
|
+
adapter: input.adapter.id,
|
|
23
|
+
expected: { calibration: input.actual.calibration, value: snapshot.value },
|
|
24
|
+
profile: input.profile,
|
|
25
|
+
subtype: 'performance-baseline',
|
|
26
|
+
version: 1,
|
|
27
|
+
work: input.work
|
|
28
|
+
};
|
|
29
|
+
return input.existing === null
|
|
30
|
+
? { baseline, kind: 'create' }
|
|
31
|
+
: { baseline, kind: 'update', previous: input.existing };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=performance-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-plan.js","sourceRoot":"","sources":["../../../../source/baselines/performance-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAe/D,SAAS,iBAAiB,CAAC,KAA8B;IACrD,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC1F,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA0C;IACnE,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAA8B;IACrE,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChH,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,QAAQ,GAA8B;QACxC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;QACzB,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;QAC1E,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,KAAK,CAAC,IAAI;KACnB,CAAC;IACF,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI;QAC1B,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { snapshotJson } from "../attachments/json-snapshot.js";
|
|
3
|
+
import { comparableCalibrationSchema } from "../bench/calibration-schema.js";
|
|
4
|
+
import { storedPerformanceBaselineSchema } from "./performance-schema.js";
|
|
5
|
+
const changeSchema = z.discriminatedUnion('kind', [
|
|
6
|
+
z.strictObject({ baseline: storedPerformanceBaselineSchema, kind: z.literal('create') }),
|
|
7
|
+
z.strictObject({ baseline: storedPerformanceBaselineSchema, kind: z.literal('remove') }),
|
|
8
|
+
z.strictObject({
|
|
9
|
+
baseline: storedPerformanceBaselineSchema,
|
|
10
|
+
kind: z.literal('update'),
|
|
11
|
+
previous: storedPerformanceBaselineSchema
|
|
12
|
+
})
|
|
13
|
+
]);
|
|
14
|
+
const writeOutcomeSchema = z.discriminatedUnion('kind', [
|
|
15
|
+
z.strictObject({ kind: z.literal('read-only') }),
|
|
16
|
+
z.strictObject({ kind: z.literal('blocked') }),
|
|
17
|
+
z.strictObject({ changes: z.array(changeSchema), kind: z.literal('written') }),
|
|
18
|
+
z.strictObject({ kind: z.literal('failed'), writtenChanges: z.array(changeSchema) })
|
|
19
|
+
]);
|
|
20
|
+
const reportSchema = z.strictObject({
|
|
21
|
+
calibration: comparableCalibrationSchema,
|
|
22
|
+
changes: z.array(changeSchema),
|
|
23
|
+
writeOutcome: writeOutcomeSchema
|
|
24
|
+
});
|
|
25
|
+
const reportMediaType = 'application/vnd.overkill.performance-baselines+json';
|
|
26
|
+
export function performanceReportArtifact(input) {
|
|
27
|
+
const snapshot = snapshotJson(input.report, input.maxBytes);
|
|
28
|
+
if (snapshot === null) {
|
|
29
|
+
throw new Error('Performance baseline report exceeds the configured artifact byte limit.');
|
|
30
|
+
}
|
|
31
|
+
const sequence = input.result.artifacts.reduce(function nextSequence(next, artifact) {
|
|
32
|
+
return Math.max(next, artifact.id.sequence + 1);
|
|
33
|
+
}, 0);
|
|
34
|
+
return {
|
|
35
|
+
id: { attempt: null, runtimes: [], scope: { kind: 'run' }, sequence, subtype: 'attachment', workload: null },
|
|
36
|
+
payload: {
|
|
37
|
+
capture: 'opt-in',
|
|
38
|
+
capturedAtMicroseconds: input.capturedAtMicroseconds,
|
|
39
|
+
content: { byteLength: Buffer.byteLength(snapshot.encoded), kind: 'json', value: snapshot.value },
|
|
40
|
+
kind: 'runtime-attachment',
|
|
41
|
+
mediaType: reportMediaType,
|
|
42
|
+
name: 'performance-baselines',
|
|
43
|
+
producer: { kind: 'case' }
|
|
44
|
+
},
|
|
45
|
+
source: 'native'
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function readPerformanceBaselineReport(result) {
|
|
49
|
+
for (const artifact of result.artifacts) {
|
|
50
|
+
if (artifact.payload.kind === 'runtime-attachment' && artifact.payload.mediaType === reportMediaType &&
|
|
51
|
+
artifact.payload.content.kind === 'json' && artifact.id.scope.kind === 'run') {
|
|
52
|
+
return reportSchema.parse(artifact.payload.content.value);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=performance-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-report.js","sourceRoot":"","sources":["../../../../source/baselines/performance-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { comparableCalibrationSchema } from "../bench/calibration-schema.js";
|
|
3
|
+
import { workIdSchema } from "../engine/identity-schema.js";
|
|
4
|
+
export const storedPerformanceBaselineSchema = z.strictObject({
|
|
5
|
+
adapter: z.string().min(1),
|
|
6
|
+
expected: z.strictObject({ calibration: comparableCalibrationSchema, value: z.json() }),
|
|
7
|
+
profile: z.string().min(1),
|
|
8
|
+
subtype: z.literal('performance-baseline'),
|
|
9
|
+
version: z.literal(1),
|
|
10
|
+
work: workIdSchema
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=performance-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-schema.js","sourceRoot":"","sources":["../../../../source/baselines/performance-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,MAAM,CAAC,MAAM,+BAA+B,GAAyC,CAAC,CAAC,YAAY,CAAC;IAChG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACvF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,YAAY;CACrB,CAAC,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, readdir, realpath, unlink } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { canonicalIdentityJson } from "../canonical-identity.js";
|
|
5
|
+
import { createNodeFileStore } from "../file-store.js";
|
|
6
|
+
import { snapshotJson } from "../attachments/json-snapshot.js";
|
|
7
|
+
import { isPathInside } from "../run/path-containment.js";
|
|
8
|
+
import { storedPerformanceBaselineSchema } from "./performance-schema.js";
|
|
9
|
+
import { performanceBaselineIdentity } from "./performance-baseline.js";
|
|
10
|
+
export const performanceBaselineKey = canonicalIdentityJson;
|
|
11
|
+
function baselineFilename(baseline) {
|
|
12
|
+
const key = performanceBaselineKey(performanceBaselineIdentity(baseline));
|
|
13
|
+
return `${createHash('sha256').update(key).digest('hex')}.benchmark.json`;
|
|
14
|
+
}
|
|
15
|
+
function missingFile(error) {
|
|
16
|
+
return error instanceof Error && Reflect.get(error, 'code') === 'ENOENT';
|
|
17
|
+
}
|
|
18
|
+
async function existingAncestor(candidate) {
|
|
19
|
+
try {
|
|
20
|
+
return await realpath(candidate);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const parent = path.dirname(candidate);
|
|
24
|
+
if (!missingFile(error) || parent === candidate) {
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
return await existingAncestor(parent);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function validateDirectory(location) {
|
|
31
|
+
if (!isPathInside(location.root, location.directory) ||
|
|
32
|
+
!isPathInside(location.root, await existingAncestor(location.directory))) {
|
|
33
|
+
throw new Error('Performance baseline directory must remain inside the project root.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function baselineNames(directory) {
|
|
37
|
+
try {
|
|
38
|
+
return await readdir(directory);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (missingFile(error)) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function validateBaselineFile(location, name, filePath) {
|
|
48
|
+
const stats = await lstat(filePath);
|
|
49
|
+
if (!stats.isFile() || stats.size > location.maxBytes) {
|
|
50
|
+
throw new Error(`Invalid performance baseline file: ${name}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function readBaseline(location, name) {
|
|
54
|
+
const filePath = path.join(location.directory, name);
|
|
55
|
+
await validateBaselineFile(location, name, filePath);
|
|
56
|
+
const content = await location.files.read(filePath);
|
|
57
|
+
if (content === null) {
|
|
58
|
+
throw new Error(`Performance baseline disappeared while reading: ${name}`);
|
|
59
|
+
}
|
|
60
|
+
const parsed = JSON.parse(content);
|
|
61
|
+
const baseline = storedPerformanceBaselineSchema.parse(parsed);
|
|
62
|
+
if (baselineFilename(baseline) !== name) {
|
|
63
|
+
throw new Error(`Performance baseline path does not match its identity: ${name}`);
|
|
64
|
+
}
|
|
65
|
+
return { baseline, path: path.relative(location.root, filePath).replaceAll('\\', '/') };
|
|
66
|
+
}
|
|
67
|
+
async function verifyPrevious(location, change, filePath) {
|
|
68
|
+
const expected = change.kind === 'create'
|
|
69
|
+
? null
|
|
70
|
+
: JSON.stringify(change.kind === 'update' ? change.previous : change.baseline);
|
|
71
|
+
const previous = await location.files.read(filePath);
|
|
72
|
+
if (previous === null) {
|
|
73
|
+
if (expected !== null) {
|
|
74
|
+
throw new Error('Performance baseline disappeared during execution.');
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const parsed = JSON.parse(previous);
|
|
79
|
+
if (JSON.stringify(storedPerformanceBaselineSchema.parse(parsed)) !== expected) {
|
|
80
|
+
throw new Error('Performance baseline changed during execution. Run the command again.');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function persistBaseline(location, change, filePath) {
|
|
84
|
+
const snapshot = snapshotJson(change.baseline, location.maxBytes);
|
|
85
|
+
if (snapshot === null) {
|
|
86
|
+
throw new Error('Performance baseline exceeds the configured artifact byte limit.');
|
|
87
|
+
}
|
|
88
|
+
await mkdir(location.directory, { recursive: true });
|
|
89
|
+
await validateDirectory(location);
|
|
90
|
+
if (change.kind === 'create') {
|
|
91
|
+
await location.files.create(filePath, snapshot.encoded);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await location.files.write(filePath, snapshot.encoded);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export async function createPerformanceBaselineStore(input) {
|
|
98
|
+
const root = await realpath(input.projectRoot);
|
|
99
|
+
const location = {
|
|
100
|
+
directory: path.resolve(root, input.directory, 'performance'),
|
|
101
|
+
files: createNodeFileStore(),
|
|
102
|
+
maxBytes: input.maxBytes,
|
|
103
|
+
root
|
|
104
|
+
};
|
|
105
|
+
await validateDirectory(location);
|
|
106
|
+
return {
|
|
107
|
+
async list() {
|
|
108
|
+
await validateDirectory(location);
|
|
109
|
+
const names = await baselineNames(location.directory);
|
|
110
|
+
const selected = names
|
|
111
|
+
.filter(function performanceFile(name) {
|
|
112
|
+
return name.endsWith('.benchmark.json');
|
|
113
|
+
})
|
|
114
|
+
.toSorted(function alphabetical(left, right) {
|
|
115
|
+
return left.localeCompare(right);
|
|
116
|
+
});
|
|
117
|
+
return await Promise.all(selected.map(async function entry(name) {
|
|
118
|
+
return await readBaseline(location, name);
|
|
119
|
+
}));
|
|
120
|
+
},
|
|
121
|
+
async apply(change) {
|
|
122
|
+
await validateDirectory(location);
|
|
123
|
+
const filePath = path.join(location.directory, baselineFilename(change.baseline));
|
|
124
|
+
await verifyPrevious(location, change, filePath);
|
|
125
|
+
if (change.kind === 'remove') {
|
|
126
|
+
await unlink(filePath);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
await persistBaseline(location, change, filePath);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=performance-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-store.js","sourceRoot":"","sources":["../../../../source/baselines/performance-store.ts"],"names":[],"mappings":"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"}
|