@aipt/platform-kernel 0.1.5
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/README.md +25 -0
- package/dist/adoption-contracts.d.ts +140 -0
- package/dist/adoption-contracts.d.ts.map +1 -0
- package/dist/adoption-contracts.js +2 -0
- package/dist/adoption-contracts.js.map +1 -0
- package/dist/adoption-metadata.d.ts +72 -0
- package/dist/adoption-metadata.d.ts.map +1 -0
- package/dist/adoption-metadata.js +408 -0
- package/dist/adoption-metadata.js.map +1 -0
- package/dist/adoption-schemas.d.ts +1608 -0
- package/dist/adoption-schemas.d.ts.map +1 -0
- package/dist/adoption-schemas.js +319 -0
- package/dist/adoption-schemas.js.map +1 -0
- package/dist/application-config-binding.d.ts +54 -0
- package/dist/application-config-binding.d.ts.map +1 -0
- package/dist/application-config-binding.js +139 -0
- package/dist/application-config-binding.js.map +1 -0
- package/dist/application-config-contract.d.ts +159 -0
- package/dist/application-config-contract.d.ts.map +1 -0
- package/dist/application-config-contract.js +142 -0
- package/dist/application-config-contract.js.map +1 -0
- package/dist/blank-profile.d.ts +60 -0
- package/dist/blank-profile.d.ts.map +1 -0
- package/dist/blank-profile.js +182 -0
- package/dist/blank-profile.js.map +1 -0
- package/dist/catalog-source.d.ts +167 -0
- package/dist/catalog-source.d.ts.map +1 -0
- package/dist/catalog-source.js +252 -0
- package/dist/catalog-source.js.map +1 -0
- package/dist/code-module-publication.d.ts +113 -0
- package/dist/code-module-publication.d.ts.map +1 -0
- package/dist/code-module-publication.js +71 -0
- package/dist/code-module-publication.js.map +1 -0
- package/dist/contracts.d.ts +150 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +3 -0
- package/dist/contracts.js.map +1 -0
- package/dist/delivery.d.ts +201 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +364 -0
- package/dist/delivery.js.map +1 -0
- package/dist/dependency-resolution.d.ts +46 -0
- package/dist/dependency-resolution.d.ts.map +1 -0
- package/dist/dependency-resolution.js +35 -0
- package/dist/dependency-resolution.js.map +1 -0
- package/dist/doctor.d.ts +50 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +62 -0
- package/dist/doctor.js.map +1 -0
- package/dist/durability-trace.d.ts +31 -0
- package/dist/durability-trace.d.ts.map +1 -0
- package/dist/durability-trace.js +45 -0
- package/dist/durability-trace.js.map +1 -0
- package/dist/engineering-operations.d.ts +43 -0
- package/dist/engineering-operations.d.ts.map +1 -0
- package/dist/engineering-operations.js +19 -0
- package/dist/engineering-operations.js.map +1 -0
- package/dist/engineering-product.d.ts +261 -0
- package/dist/engineering-product.d.ts.map +1 -0
- package/dist/engineering-product.js +61 -0
- package/dist/engineering-product.js.map +1 -0
- package/dist/example-recipe.d.ts +147 -0
- package/dist/example-recipe.d.ts.map +1 -0
- package/dist/example-recipe.js +58 -0
- package/dist/example-recipe.js.map +1 -0
- package/dist/feature-planner.d.ts +59 -0
- package/dist/feature-planner.d.ts.map +1 -0
- package/dist/feature-planner.js +160 -0
- package/dist/feature-planner.js.map +1 -0
- package/dist/filesystem-contracts.d.ts +77 -0
- package/dist/filesystem-contracts.d.ts.map +1 -0
- package/dist/filesystem-contracts.js +2 -0
- package/dist/filesystem-contracts.js.map +1 -0
- package/dist/filesystem-transaction.d.ts +52 -0
- package/dist/filesystem-transaction.d.ts.map +1 -0
- package/dist/filesystem-transaction.js +749 -0
- package/dist/filesystem-transaction.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/integrity.d.ts +3 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +17 -0
- package/dist/integrity.js.map +1 -0
- package/dist/local-artifact-registry.d.ts +55 -0
- package/dist/local-artifact-registry.d.ts.map +1 -0
- package/dist/local-artifact-registry.js +87 -0
- package/dist/local-artifact-registry.js.map +1 -0
- package/dist/locked-repository-state.d.ts +21 -0
- package/dist/locked-repository-state.d.ts.map +1 -0
- package/dist/locked-repository-state.js +62 -0
- package/dist/locked-repository-state.js.map +1 -0
- package/dist/managed-region.d.ts +11 -0
- package/dist/managed-region.d.ts.map +1 -0
- package/dist/managed-region.js +45 -0
- package/dist/managed-region.js.map +1 -0
- package/dist/package-adoption.d.ts +179 -0
- package/dist/package-adoption.d.ts.map +1 -0
- package/dist/package-adoption.js +332 -0
- package/dist/package-adoption.js.map +1 -0
- package/dist/package-release.d.ts +42 -0
- package/dist/package-release.d.ts.map +1 -0
- package/dist/package-release.js +85 -0
- package/dist/package-release.js.map +1 -0
- package/dist/plan-state.d.ts +10 -0
- package/dist/plan-state.d.ts.map +1 -0
- package/dist/plan-state.js +33 -0
- package/dist/plan-state.js.map +1 -0
- package/dist/planner.d.ts +19 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +111 -0
- package/dist/planner.js.map +1 -0
- package/dist/platform-package-sources.d.ts +49 -0
- package/dist/platform-package-sources.d.ts.map +1 -0
- package/dist/platform-package-sources.js +98 -0
- package/dist/platform-package-sources.js.map +1 -0
- package/dist/project-bootstrap.d.ts +42 -0
- package/dist/project-bootstrap.d.ts.map +1 -0
- package/dist/project-bootstrap.js +270 -0
- package/dist/project-bootstrap.js.map +1 -0
- package/dist/project-control.d.ts +149 -0
- package/dist/project-control.d.ts.map +1 -0
- package/dist/project-control.js +46 -0
- package/dist/project-control.js.map +1 -0
- package/dist/project-maintenance.d.ts +30 -0
- package/dist/project-maintenance.d.ts.map +1 -0
- package/dist/project-maintenance.js +29 -0
- package/dist/project-maintenance.js.map +1 -0
- package/dist/project-recovery.d.ts +31 -0
- package/dist/project-recovery.d.ts.map +1 -0
- package/dist/project-recovery.js +80 -0
- package/dist/project-recovery.js.map +1 -0
- package/dist/recovery-override.d.ts +20 -0
- package/dist/recovery-override.d.ts.map +1 -0
- package/dist/recovery-override.js +27 -0
- package/dist/recovery-override.js.map +1 -0
- package/dist/release-loader.d.ts +9 -0
- package/dist/release-loader.d.ts.map +1 -0
- package/dist/release-loader.js +86 -0
- package/dist/release-loader.js.map +1 -0
- package/dist/resolution-evidence.d.ts +67 -0
- package/dist/resolution-evidence.d.ts.map +1 -0
- package/dist/resolution-evidence.js +98 -0
- package/dist/resolution-evidence.js.map +1 -0
- package/dist/resolution-worker-build.d.ts +33 -0
- package/dist/resolution-worker-build.d.ts.map +1 -0
- package/dist/resolution-worker-build.js +42 -0
- package/dist/resolution-worker-build.js.map +1 -0
- package/dist/runtime-observability.d.ts +147 -0
- package/dist/runtime-observability.d.ts.map +1 -0
- package/dist/runtime-observability.js +264 -0
- package/dist/runtime-observability.js.map +1 -0
- package/dist/schemas.d.ts +740 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +348 -0
- package/dist/schemas.js.map +1 -0
- package/dist/solution-catalog.d.ts +169 -0
- package/dist/solution-catalog.d.ts.map +1 -0
- package/dist/solution-catalog.js +60 -0
- package/dist/solution-catalog.js.map +1 -0
- package/dist/standalone-npm-profile.d.ts +146 -0
- package/dist/standalone-npm-profile.d.ts.map +1 -0
- package/dist/standalone-npm-profile.js +425 -0
- package/dist/standalone-npm-profile.js.map +1 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +3 -0
- package/dist/testing.js.map +1 -0
- package/dist/upgrade-planner.d.ts +45 -0
- package/dist/upgrade-planner.d.ts.map +1 -0
- package/dist/upgrade-planner.js +207 -0
- package/dist/upgrade-planner.js.map +1 -0
- package/dist/workspace-publication.d.ts +18 -0
- package/dist/workspace-publication.d.ts.map +1 -0
- package/dist/workspace-publication.js +33 -0
- package/dist/workspace-publication.js.map +1 -0
- package/dist/workspace-topology.d.ts +22 -0
- package/dist/workspace-topology.d.ts.map +1 -0
- package/dist/workspace-topology.js +117 -0
- package/dist/workspace-topology.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { inspectMetadataCommit, recoverMetadataCommit, } from "./adoption-metadata.js";
|
|
2
|
+
import { inspectTransaction, recoverTransaction } from "./filesystem-transaction.js";
|
|
3
|
+
import { listProjectPlans } from "./project-bootstrap.js";
|
|
4
|
+
import { discoverPackageAdoptionTopology } from "./workspace-topology.js";
|
|
5
|
+
const filesystemRecoveryStates = new Set([
|
|
6
|
+
"preparing",
|
|
7
|
+
"prepared",
|
|
8
|
+
"applying",
|
|
9
|
+
"recovery-required",
|
|
10
|
+
"recovering",
|
|
11
|
+
]);
|
|
12
|
+
export async function inspectProjectRecovery(projectRoot) {
|
|
13
|
+
const plans = await listProjectPlans(projectRoot);
|
|
14
|
+
for (const plan of plans) {
|
|
15
|
+
const transaction = await inspectTransaction({ projectRoot, planId: plan.planId });
|
|
16
|
+
if (transaction !== null && filesystemRecoveryStates.has(transaction.state)) {
|
|
17
|
+
return {
|
|
18
|
+
required: true,
|
|
19
|
+
kind: "filesystem",
|
|
20
|
+
planId: plan.planId,
|
|
21
|
+
state: transaction.state,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const plan of plans) {
|
|
26
|
+
const metadata = await inspectMetadataCommit({ projectRoot, planId: plan.planId });
|
|
27
|
+
if (metadata !== null && metadata.state !== "committed") {
|
|
28
|
+
return {
|
|
29
|
+
required: true,
|
|
30
|
+
kind: "metadata",
|
|
31
|
+
planId: plan.planId,
|
|
32
|
+
state: metadata.state,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { required: false };
|
|
37
|
+
}
|
|
38
|
+
export async function recoverProject(input) {
|
|
39
|
+
const inspection = await inspectProjectRecovery(input.projectRoot);
|
|
40
|
+
if (!inspection.required)
|
|
41
|
+
return { kind: "none", state: "not-required" };
|
|
42
|
+
if (inspection.kind === "filesystem") {
|
|
43
|
+
const recovered = await recoverTransaction({
|
|
44
|
+
projectRoot: input.projectRoot,
|
|
45
|
+
planId: inspection.planId,
|
|
46
|
+
now: input.now,
|
|
47
|
+
});
|
|
48
|
+
return { kind: "filesystem", planId: inspection.planId, state: recovered.state };
|
|
49
|
+
}
|
|
50
|
+
await recoverMetadataCommit({ projectRoot: input.projectRoot, planId: inspection.planId });
|
|
51
|
+
return { kind: "metadata", planId: inspection.planId, state: "committed" };
|
|
52
|
+
}
|
|
53
|
+
export async function recoverProjectTransactionTopology(input) {
|
|
54
|
+
const direct = await recoverProject(input);
|
|
55
|
+
if (direct.kind !== "none")
|
|
56
|
+
return direct;
|
|
57
|
+
const topology = await discoverPackageAdoptionTopology(input.projectRoot).catch(() => undefined);
|
|
58
|
+
if (topology?.mode !== "pnpm-shared-lockfile")
|
|
59
|
+
return direct;
|
|
60
|
+
const unitPlans = new Set((await listProjectPlans(input.projectRoot)).map((plan) => plan.planId));
|
|
61
|
+
const transactionLock = await import("node:fs/promises").then(({ readFile }) => readFile(`${topology.transactionRoot}/.dyyto/transaction-lock.json`, "utf8")).catch((error) => error.code === "ENOENT" ? undefined : Promise.reject(error));
|
|
62
|
+
if (!transactionLock)
|
|
63
|
+
return direct;
|
|
64
|
+
let planId;
|
|
65
|
+
try {
|
|
66
|
+
const parsed = JSON.parse(transactionLock);
|
|
67
|
+
if (typeof parsed.planId !== "string" || !/^sha256:[a-f0-9]{64}$/u.test(parsed.planId) || !unitPlans.has(parsed.planId))
|
|
68
|
+
return direct;
|
|
69
|
+
planId = parsed.planId;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return direct;
|
|
73
|
+
}
|
|
74
|
+
const transaction = await inspectTransaction({ projectRoot: topology.transactionRoot, planId });
|
|
75
|
+
if (!transaction || !filesystemRecoveryStates.has(transaction.state))
|
|
76
|
+
return direct;
|
|
77
|
+
const recovered = await recoverTransaction({ projectRoot: topology.transactionRoot, planId, now: input.now });
|
|
78
|
+
return { kind: "filesystem", planId, state: recovered.state };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=project-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-recovery.js","sourceRoot":"","sources":["../src/project-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type RecoveryOverridePlan = Readonly<{
|
|
2
|
+
schemaVersion: 1;
|
|
3
|
+
planId: string;
|
|
4
|
+
transactionPlanId: string;
|
|
5
|
+
transactionRootDigest: string;
|
|
6
|
+
conflicts: readonly Readonly<{
|
|
7
|
+
path: string;
|
|
8
|
+
currentDigest: string;
|
|
9
|
+
preimageDigest: string;
|
|
10
|
+
}>[];
|
|
11
|
+
generatedAt: string;
|
|
12
|
+
expiresAt: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare class RecoveryOverrideError extends Error {
|
|
15
|
+
readonly code: "RECOVERY_OVERRIDE_INVALID" | "RECOVERY_OVERRIDE_EXPIRED" | "RECOVERY_OVERRIDE_PREIMAGE_CONFLICT";
|
|
16
|
+
constructor(code: "RECOVERY_OVERRIDE_INVALID" | "RECOVERY_OVERRIDE_EXPIRED" | "RECOVERY_OVERRIDE_PREIMAGE_CONFLICT");
|
|
17
|
+
}
|
|
18
|
+
export declare function createRecoveryOverridePlan(input: Omit<RecoveryOverridePlan, "schemaVersion" | "planId">): RecoveryOverridePlan;
|
|
19
|
+
export declare function parseRecoveryOverridePlan(value: unknown): RecoveryOverridePlan;
|
|
20
|
+
//# sourceMappingURL=recovery-override.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-override.d.ts","sourceRoot":"","sources":["../src/recovery-override.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,SAAS,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,EAAG,CAAC;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,qBAAa,qBAAsB,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,2BAA2B,GAAG,qCAAqC;gBAAvG,IAAI,EAAE,2BAA2B,GAAG,2BAA2B,GAAG,qCAAqC;CAC7H;AAKD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,GAAG,QAAQ,CAAC,GAAG,oBAAoB,CAG9H;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAI9E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { canonicalize, sha256Digest } from "./integrity.js";
|
|
2
|
+
export class RecoveryOverrideError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code) {
|
|
5
|
+
super(code);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "RecoveryOverrideError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const digest = /^sha256:[a-f0-9]{64}$/u;
|
|
11
|
+
const safePath = /^(?!\/)(?!.*(?:^|\/)\.\.(?:\/|$))[a-zA-Z0-9._@:/-]+$/u;
|
|
12
|
+
export function createRecoveryOverridePlan(input) {
|
|
13
|
+
if (![input.transactionPlanId, input.transactionRootDigest].every((value) => digest.test(value)) || input.conflicts.length === 0 || new Set(input.conflicts.map((item) => item.path)).size !== input.conflicts.length || input.conflicts.some((item) => !safePath.test(item.path) || !digest.test(item.currentDigest) || !digest.test(item.preimageDigest)) || Number.isNaN(Date.parse(input.generatedAt)) || Date.parse(input.expiresAt) <= Date.parse(input.generatedAt))
|
|
14
|
+
throw new RecoveryOverrideError("RECOVERY_OVERRIDE_INVALID");
|
|
15
|
+
const content = { schemaVersion: 1, ...input, conflicts: input.conflicts.map((item) => ({ ...item })).sort((left, right) => left.path.localeCompare(right.path)) };
|
|
16
|
+
return Object.freeze({ ...content, planId: sha256Digest(canonicalize(content)) });
|
|
17
|
+
}
|
|
18
|
+
export function parseRecoveryOverridePlan(value) {
|
|
19
|
+
const candidate = value;
|
|
20
|
+
if (!candidate || typeof candidate !== "object" || Object.keys(candidate).length !== 7)
|
|
21
|
+
throw new RecoveryOverrideError("RECOVERY_OVERRIDE_INVALID");
|
|
22
|
+
const recreated = createRecoveryOverridePlan({ transactionPlanId: candidate.transactionPlanId, transactionRootDigest: candidate.transactionRootDigest, conflicts: candidate.conflicts, generatedAt: candidate.generatedAt, expiresAt: candidate.expiresAt });
|
|
23
|
+
if (candidate.schemaVersion !== 1 || candidate.planId !== recreated.planId)
|
|
24
|
+
throw new RecoveryOverrideError("RECOVERY_OVERRIDE_INVALID");
|
|
25
|
+
return recreated;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=recovery-override.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-override.js","sourceRoot":"","sources":["../src/recovery-override.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CapabilityBundleReleaseV1, CapabilityBundleReleaseV2, LoadedCapabilityRelease } from "./adoption-contracts.js";
|
|
2
|
+
export declare class ReleaseLoadError extends Error {
|
|
3
|
+
readonly code: "RELEASE_INVALID" | "RELEASE_INTEGRITY_MISMATCH" | "RELEASE_ASSET_INVALID" | "RELEASE_ASSET_INTEGRITY_MISMATCH";
|
|
4
|
+
readonly assetPath?: string | undefined;
|
|
5
|
+
constructor(code: "RELEASE_INVALID" | "RELEASE_INTEGRITY_MISMATCH" | "RELEASE_ASSET_INVALID" | "RELEASE_ASSET_INTEGRITY_MISMATCH", message: string, assetPath?: string | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare function calculateReleaseIntegrity(release: Omit<CapabilityBundleReleaseV1, "integrity"> | Omit<CapabilityBundleReleaseV2, "integrity">): string;
|
|
8
|
+
export declare function loadCapabilityRelease(releaseDirectoryInput: string): Promise<LoadedCapabilityRelease>;
|
|
9
|
+
//# sourceMappingURL=release-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-loader.d.ts","sourceRoot":"","sources":["../src/release-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAK7H,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,IAAI,EACT,iBAAiB,GACjB,4BAA4B,GAC5B,uBAAuB,GACvB,kCAAkC;IAEtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM;gBANlB,IAAI,EACT,iBAAiB,GACjB,4BAA4B,GAC5B,uBAAuB,GACvB,kCAAkC,EACtC,OAAO,EAAE,MAAM,EACN,SAAS,CAAC,EAAE,MAAM,YAAA;CAI9B;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,GACnG,MAAM,CAER;AAqBD,wBAAsB,qBAAqB,CACzC,qBAAqB,EAAE,MAAM,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAyElC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { lstat, readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseCapabilityBundleRelease } from "./adoption-schemas.js";
|
|
4
|
+
import { canonicalize, sha256Digest } from "./integrity.js";
|
|
5
|
+
import { assertSafeRelativePath } from "./planner.js";
|
|
6
|
+
export class ReleaseLoadError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
assetPath;
|
|
9
|
+
constructor(code, message, assetPath) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.assetPath = assetPath;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function calculateReleaseIntegrity(release) {
|
|
16
|
+
return sha256Digest(canonicalize(release));
|
|
17
|
+
}
|
|
18
|
+
async function resolveAssetFile(releaseDirectory, assetPath) {
|
|
19
|
+
const direct = path.join(releaseDirectory, "assets", ...assetPath.split("/"));
|
|
20
|
+
try {
|
|
21
|
+
await lstat(direct);
|
|
22
|
+
return direct;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code !== "ENOENT" || path.posix.basename(assetPath) !== ".gitignore")
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
// npm 会无条件排除 tarball 内的 .gitignore。CLI 分发因此使用一个仅用于传输的
|
|
29
|
+
// 普通文件名;逻辑路径、Release 元数据和摘要仍保持为 .gitignore。
|
|
30
|
+
return path.join(releaseDirectory, "assets", ...path.posix.dirname(assetPath).split("/").filter((segment) => segment !== "."), "__dyyto_dotfiles__", "gitignore");
|
|
31
|
+
}
|
|
32
|
+
export async function loadCapabilityRelease(releaseDirectoryInput) {
|
|
33
|
+
const releaseDirectory = await realpath(path.resolve(releaseDirectoryInput));
|
|
34
|
+
let release;
|
|
35
|
+
try {
|
|
36
|
+
release = parseCapabilityBundleRelease(JSON.parse(await readFile(path.join(releaseDirectory, "release.json"), "utf8")));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error instanceof ReleaseLoadError)
|
|
40
|
+
throw error;
|
|
41
|
+
throw new ReleaseLoadError("RELEASE_INVALID", "Capability release metadata is invalid");
|
|
42
|
+
}
|
|
43
|
+
const { integrity, ...releaseContent } = release;
|
|
44
|
+
if (calculateReleaseIntegrity(releaseContent) !== integrity) {
|
|
45
|
+
throw new ReleaseLoadError("RELEASE_INTEGRITY_MISMATCH", "Capability release integrity does not match metadata");
|
|
46
|
+
}
|
|
47
|
+
const contents = new Map();
|
|
48
|
+
const seen = new Set();
|
|
49
|
+
let previousPath = "";
|
|
50
|
+
for (const asset of release.assets) {
|
|
51
|
+
try {
|
|
52
|
+
assertSafeRelativePath(asset.path);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new ReleaseLoadError("RELEASE_ASSET_INVALID", "Release asset path is unsafe", asset.path);
|
|
56
|
+
}
|
|
57
|
+
if (((asset.path === ".dyyto" || asset.path.startsWith(".dyyto/")) && asset.path !== ".dyyto/application-config-binding.json") ||
|
|
58
|
+
seen.has(asset.path) ||
|
|
59
|
+
asset.path.localeCompare(previousPath) < 0) {
|
|
60
|
+
throw new ReleaseLoadError("RELEASE_ASSET_INVALID", "Release assets must be unique, sorted and outside reserved .dyyto paths", asset.path);
|
|
61
|
+
}
|
|
62
|
+
seen.add(asset.path);
|
|
63
|
+
previousPath = asset.path;
|
|
64
|
+
const assetFile = await resolveAssetFile(releaseDirectory, asset.path);
|
|
65
|
+
const assetRealPath = await realpath(assetFile);
|
|
66
|
+
const assetRoot = path.join(releaseDirectory, "assets");
|
|
67
|
+
if (!assetRealPath.startsWith(`${assetRoot}${path.sep}`)) {
|
|
68
|
+
throw new ReleaseLoadError("RELEASE_ASSET_INVALID", "Release asset escapes its bundle", asset.path);
|
|
69
|
+
}
|
|
70
|
+
const assetStat = await lstat(assetFile);
|
|
71
|
+
if (!assetStat.isFile() || assetStat.isSymbolicLink()) {
|
|
72
|
+
throw new ReleaseLoadError("RELEASE_ASSET_INVALID", "Release asset must be a regular file", asset.path);
|
|
73
|
+
}
|
|
74
|
+
const bytes = await readFile(assetFile);
|
|
75
|
+
if (sha256Digest(bytes) !== asset.digest) {
|
|
76
|
+
throw new ReleaseLoadError("RELEASE_ASSET_INTEGRITY_MISMATCH", "Release asset digest does not match metadata", asset.path);
|
|
77
|
+
}
|
|
78
|
+
contents.set(asset.path, bytes);
|
|
79
|
+
}
|
|
80
|
+
if (release.exit.ownedAssets.length !== release.assets.length ||
|
|
81
|
+
release.exit.ownedAssets.some((assetPath, index) => assetPath !== release.assets[index]?.path)) {
|
|
82
|
+
throw new ReleaseLoadError("RELEASE_INVALID", "Exit owned assets must exactly match release assets");
|
|
83
|
+
}
|
|
84
|
+
return { release, contents };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=release-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-loader.js","sourceRoot":"","sources":["../src/release-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type ResolutionImporterFact = Readonly<{
|
|
2
|
+
importerId: string;
|
|
3
|
+
manifestDigest: string;
|
|
4
|
+
preimageDigest: string;
|
|
5
|
+
desiredDigest: string;
|
|
6
|
+
}>;
|
|
7
|
+
export type ResolutionPackageFact = Readonly<{
|
|
8
|
+
identity: string;
|
|
9
|
+
packageName: string;
|
|
10
|
+
version: string;
|
|
11
|
+
integrity: string;
|
|
12
|
+
registryId: string;
|
|
13
|
+
managed: boolean;
|
|
14
|
+
edgesDigest: string;
|
|
15
|
+
}>;
|
|
16
|
+
export type ResolutionJobEvidence = Readonly<{
|
|
17
|
+
schemaVersion: 1;
|
|
18
|
+
jobId: string;
|
|
19
|
+
workerReleaseId: string;
|
|
20
|
+
workerStateRevision: string;
|
|
21
|
+
requestDigest: string;
|
|
22
|
+
pnpmVersion: "11.21.0";
|
|
23
|
+
desiredLockfile: Uint8Array;
|
|
24
|
+
desiredLockDigest: string;
|
|
25
|
+
importerFacts: readonly ResolutionImporterFact[];
|
|
26
|
+
packageFacts: readonly ResolutionPackageFact[];
|
|
27
|
+
snapshotClosureDigest: string;
|
|
28
|
+
networkObservationDigest: string;
|
|
29
|
+
cacheObservation: Readonly<{
|
|
30
|
+
namespace: string;
|
|
31
|
+
preimageRevision: string;
|
|
32
|
+
desiredRevision: string;
|
|
33
|
+
writesDigest: string;
|
|
34
|
+
}>;
|
|
35
|
+
commandDigest: string;
|
|
36
|
+
completedAt: string;
|
|
37
|
+
expiresAt: string;
|
|
38
|
+
}>;
|
|
39
|
+
export type ResolutionEvidenceExpectation = Readonly<{
|
|
40
|
+
requestDigest: string;
|
|
41
|
+
pnpmVersion: "11.21.0";
|
|
42
|
+
workerReleaseId: string;
|
|
43
|
+
targetImporterId: string;
|
|
44
|
+
targetManifestDigest: string;
|
|
45
|
+
preservedImporterDigests: readonly Readonly<{
|
|
46
|
+
importerId: string;
|
|
47
|
+
preimageDigest: string;
|
|
48
|
+
}>[];
|
|
49
|
+
managedSources: readonly Readonly<{
|
|
50
|
+
registryId: string;
|
|
51
|
+
packageName: string;
|
|
52
|
+
version: string;
|
|
53
|
+
integrity: string;
|
|
54
|
+
}>[];
|
|
55
|
+
now: string;
|
|
56
|
+
}>;
|
|
57
|
+
export type ResolutionEvidenceErrorCode = "RESOLUTION_EVIDENCE_INVALID" | "RESOLUTION_EVIDENCE_EXPIRED" | "RESOLUTION_EVIDENCE_SOURCE_MISMATCH" | "RESOLUTION_EVIDENCE_IMPORTER_DRIFT";
|
|
58
|
+
export declare class ResolutionEvidenceError extends Error {
|
|
59
|
+
readonly code: ResolutionEvidenceErrorCode;
|
|
60
|
+
constructor(code: ResolutionEvidenceErrorCode);
|
|
61
|
+
}
|
|
62
|
+
export declare function calculateResolutionRequestDigest(input: unknown): string;
|
|
63
|
+
export declare function createResolutionJobEvidence(input: Omit<ResolutionJobEvidence, "schemaVersion" | "jobId" | "desiredLockDigest"> & {
|
|
64
|
+
desiredLockfile: Uint8Array;
|
|
65
|
+
}): ResolutionJobEvidence;
|
|
66
|
+
export declare function verifyResolutionJobEvidence(evidence: ResolutionJobEvidence, expected: ResolutionEvidenceExpectation): ResolutionJobEvidence;
|
|
67
|
+
//# sourceMappingURL=resolution-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-evidence.d.ts","sourceRoot":"","sources":["../src/resolution-evidence.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,aAAa,EAAE,CAAC,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,SAAS,CAAC;IACvB,eAAe,EAAE,UAAU,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACjD,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,QAAQ,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,SAAS,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,SAAS,QAAQ,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,EAAG,CAAC;IAC/F,cAAc,EAAE,SAAS,QAAQ,CAAC;QAChC,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,EAAE,CAAC;IACL,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GACnC,6BAA6B,GAC7B,6BAA6B,GAC7B,qCAAqC,GACrC,oCAAoC,CAAC;AAEzC,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,2BAA2B;gBAAjC,IAAI,EAAE,2BAA2B;CACvD;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvE;AAkBD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,eAAe,GAAG,OAAO,GAAG,mBAAmB,CAAC,GAAG;IAAE,eAAe,EAAE,UAAU,CAAA;CAAE,GAAG,qBAAqB,CA4BxL;AAcD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,6BAA6B,GAAG,qBAAqB,CAgB3I"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { canonicalize, sha256Digest } from "./integrity.js";
|
|
2
|
+
export class ResolutionEvidenceError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code) {
|
|
5
|
+
super(code);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "ResolutionEvidenceError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function calculateResolutionRequestDigest(input) {
|
|
11
|
+
return sha256Digest(canonicalize(input));
|
|
12
|
+
}
|
|
13
|
+
const digestPattern = /^sha256:[a-f0-9]{64}$/u;
|
|
14
|
+
const integrityPattern = /^sha512-[A-Za-z0-9+/]{86}==$/u;
|
|
15
|
+
const exactVersionPattern = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u;
|
|
16
|
+
const identityPattern = /^[a-z0-9][a-z0-9._/-]{0,255}$/u;
|
|
17
|
+
const packageNamePattern = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/u;
|
|
18
|
+
const packageIdentityPattern = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*@[0-9][a-zA-Z0-9.+()_@/-]*$/u;
|
|
19
|
+
function exactKeys(value, expected) {
|
|
20
|
+
const actual = Object.keys(value).sort();
|
|
21
|
+
const sorted = [...expected].sort();
|
|
22
|
+
return actual.length === sorted.length && actual.every((key, index) => key === sorted[index]);
|
|
23
|
+
}
|
|
24
|
+
function evidenceIdentity(evidence) {
|
|
25
|
+
return sha256Digest(canonicalize(evidence));
|
|
26
|
+
}
|
|
27
|
+
export function createResolutionJobEvidence(input) {
|
|
28
|
+
const desiredLockfile = Buffer.from(input.desiredLockfile);
|
|
29
|
+
const desiredLockDigest = sha256Digest(desiredLockfile);
|
|
30
|
+
const content = {
|
|
31
|
+
schemaVersion: 1,
|
|
32
|
+
workerReleaseId: input.workerReleaseId,
|
|
33
|
+
workerStateRevision: input.workerStateRevision,
|
|
34
|
+
requestDigest: input.requestDigest,
|
|
35
|
+
pnpmVersion: input.pnpmVersion,
|
|
36
|
+
desiredLockDigest,
|
|
37
|
+
importerFacts: input.importerFacts.map((item) => ({ ...item })),
|
|
38
|
+
packageFacts: input.packageFacts.map((item) => ({ ...item })),
|
|
39
|
+
snapshotClosureDigest: input.snapshotClosureDigest,
|
|
40
|
+
networkObservationDigest: input.networkObservationDigest,
|
|
41
|
+
cacheObservation: { ...input.cacheObservation },
|
|
42
|
+
commandDigest: input.commandDigest,
|
|
43
|
+
completedAt: input.completedAt,
|
|
44
|
+
expiresAt: input.expiresAt,
|
|
45
|
+
};
|
|
46
|
+
const candidate = { ...content, jobId: evidenceIdentity(content), desiredLockfile };
|
|
47
|
+
assertResolutionJobEvidence(candidate);
|
|
48
|
+
const frozen = {
|
|
49
|
+
...candidate,
|
|
50
|
+
importerFacts: Object.freeze(candidate.importerFacts.map((fact) => Object.freeze({ ...fact }))),
|
|
51
|
+
packageFacts: Object.freeze(candidate.packageFacts.map((fact) => Object.freeze({ ...fact }))),
|
|
52
|
+
cacheObservation: Object.freeze({ ...candidate.cacheObservation }),
|
|
53
|
+
};
|
|
54
|
+
return Object.freeze(frozen);
|
|
55
|
+
}
|
|
56
|
+
function assertResolutionJobEvidence(candidate) {
|
|
57
|
+
if (!exactKeys(candidate, ["schemaVersion", "jobId", "workerReleaseId", "workerStateRevision", "requestDigest", "pnpmVersion", "desiredLockfile", "desiredLockDigest", "importerFacts", "packageFacts", "snapshotClosureDigest", "networkObservationDigest", "cacheObservation", "commandDigest", "completedAt", "expiresAt"]) || candidate.schemaVersion !== 1 || candidate.pnpmVersion !== "11.21.0")
|
|
58
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
59
|
+
if (![candidate.jobId, candidate.workerStateRevision, candidate.requestDigest, candidate.desiredLockDigest, candidate.snapshotClosureDigest, candidate.networkObservationDigest, candidate.commandDigest, candidate.cacheObservation.preimageRevision, candidate.cacheObservation.desiredRevision, candidate.cacheObservation.writesDigest].every((value) => digestPattern.test(value)))
|
|
60
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
61
|
+
if (!identityPattern.test(candidate.workerReleaseId) || !identityPattern.test(candidate.cacheObservation.namespace) || candidate.desiredLockfile.byteLength === 0 || sha256Digest(candidate.desiredLockfile) !== candidate.desiredLockDigest || Number.isNaN(Date.parse(candidate.completedAt)) || Number.isNaN(Date.parse(candidate.expiresAt)) || Date.parse(candidate.expiresAt) <= Date.parse(candidate.completedAt))
|
|
62
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
63
|
+
if (!exactKeys(candidate.cacheObservation, ["namespace", "preimageRevision", "desiredRevision", "writesDigest"]) || candidate.importerFacts.length === 0 || candidate.packageFacts.length === 0)
|
|
64
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
65
|
+
if (candidate.importerFacts.some((fact) => !exactKeys(fact, ["importerId", "manifestDigest", "preimageDigest", "desiredDigest"]) || (fact.importerId !== "." && !identityPattern.test(fact.importerId)) || ![fact.manifestDigest, fact.preimageDigest, fact.desiredDigest].every((value) => digestPattern.test(value))))
|
|
66
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
67
|
+
if (candidate.packageFacts.some((fact) => !exactKeys(fact, ["identity", "packageName", "version", "integrity", "registryId", "managed", "edgesDigest"]) || !packageIdentityPattern.test(fact.identity) || !packageNamePattern.test(fact.packageName) || !identityPattern.test(fact.registryId) || !exactVersionPattern.test(fact.version) || !integrityPattern.test(fact.integrity) || typeof fact.managed !== "boolean" || !digestPattern.test(fact.edgesDigest)))
|
|
68
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
69
|
+
if (new Set(candidate.importerFacts.map((fact) => fact.importerId)).size !== candidate.importerFacts.length || new Set(candidate.packageFacts.map((fact) => fact.identity)).size !== candidate.packageFacts.length)
|
|
70
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
71
|
+
const { jobId: _jobId, desiredLockfile: _bytes, ...content } = candidate;
|
|
72
|
+
if (evidenceIdentity(content) !== candidate.jobId)
|
|
73
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
74
|
+
}
|
|
75
|
+
export function verifyResolutionJobEvidence(evidence, expected) {
|
|
76
|
+
assertResolutionJobEvidence(evidence);
|
|
77
|
+
if (Date.parse(expected.now) > Date.parse(evidence.expiresAt))
|
|
78
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_EXPIRED");
|
|
79
|
+
if (evidence.requestDigest !== expected.requestDigest || evidence.pnpmVersion !== expected.pnpmVersion || evidence.workerReleaseId !== expected.workerReleaseId)
|
|
80
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_INVALID");
|
|
81
|
+
const target = evidence.importerFacts.find((fact) => fact.importerId === expected.targetImporterId);
|
|
82
|
+
if (!target || target.manifestDigest !== expected.targetManifestDigest)
|
|
83
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_IMPORTER_DRIFT");
|
|
84
|
+
for (const preserved of expected.preservedImporterDigests) {
|
|
85
|
+
const fact = evidence.importerFacts.find((item) => item.importerId === preserved.importerId);
|
|
86
|
+
if (!fact || fact.preimageDigest !== preserved.preimageDigest || fact.desiredDigest !== preserved.preimageDigest)
|
|
87
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_IMPORTER_DRIFT");
|
|
88
|
+
}
|
|
89
|
+
for (const source of expected.managedSources) {
|
|
90
|
+
const matches = evidence.packageFacts.filter((fact) => fact.managed && fact.packageName === source.packageName);
|
|
91
|
+
if (matches.length !== 1 || matches[0].registryId !== source.registryId || matches[0].version !== source.version || matches[0].integrity !== source.integrity)
|
|
92
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_SOURCE_MISMATCH");
|
|
93
|
+
}
|
|
94
|
+
if (evidence.packageFacts.filter((fact) => fact.managed).length !== expected.managedSources.length)
|
|
95
|
+
throw new ResolutionEvidenceError("RESOLUTION_EVIDENCE_SOURCE_MISMATCH");
|
|
96
|
+
return evidence;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=resolution-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-evidence.js","sourceRoot":"","sources":["../src/resolution-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type ResolutionWorkerBuildPlan = Readonly<{
|
|
2
|
+
schemaVersion: 1;
|
|
3
|
+
planId: string;
|
|
4
|
+
workerReleaseId: string;
|
|
5
|
+
pnpmVersion: "11.21.0";
|
|
6
|
+
workspaceManifestDigest: string;
|
|
7
|
+
rootLockDigest: string;
|
|
8
|
+
cacheNamespace: string;
|
|
9
|
+
maximumBytes: number;
|
|
10
|
+
generatedAt: string;
|
|
11
|
+
expiresAt: string;
|
|
12
|
+
}>;
|
|
13
|
+
export type ResolutionWorkerBuildReceipt = Readonly<{
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
receiptId: string;
|
|
16
|
+
planId: string;
|
|
17
|
+
workerReleaseId: string;
|
|
18
|
+
pnpmVersion: "11.21.0";
|
|
19
|
+
cacheNamespace: string;
|
|
20
|
+
cacheDigest: string;
|
|
21
|
+
cacheBytes: number;
|
|
22
|
+
commandDigest: string;
|
|
23
|
+
completedAt: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare class ResolutionWorkerBuildError extends Error {
|
|
26
|
+
readonly code: "RESOLUTION_WORKER_BUILD_INVALID" | "RESOLUTION_WORKER_BUILD_EXPIRED" | "RESOLUTION_WORKER_BUILD_PREIMAGE_CONFLICT" | "RESOLUTION_WORKER_BUILD_LIMIT_EXCEEDED";
|
|
27
|
+
constructor(code: "RESOLUTION_WORKER_BUILD_INVALID" | "RESOLUTION_WORKER_BUILD_EXPIRED" | "RESOLUTION_WORKER_BUILD_PREIMAGE_CONFLICT" | "RESOLUTION_WORKER_BUILD_LIMIT_EXCEEDED");
|
|
28
|
+
}
|
|
29
|
+
export declare function createResolutionWorkerBuildPlan(input: Omit<ResolutionWorkerBuildPlan, "schemaVersion" | "planId">): ResolutionWorkerBuildPlan;
|
|
30
|
+
export declare function parseResolutionWorkerBuildPlan(value: unknown): ResolutionWorkerBuildPlan;
|
|
31
|
+
export declare function createResolutionWorkerBuildReceipt(input: Omit<ResolutionWorkerBuildReceipt, "schemaVersion" | "receiptId">): ResolutionWorkerBuildReceipt;
|
|
32
|
+
export declare function parseResolutionWorkerBuildReceipt(value: unknown): ResolutionWorkerBuildReceipt;
|
|
33
|
+
//# sourceMappingURL=resolution-worker-build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-worker-build.d.ts","sourceRoot":"","sources":["../src/resolution-worker-build.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,qBAAa,0BAA2B,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,iCAAiC,GAAG,iCAAiC,GAAG,2CAA2C,GAAG,wCAAwC;gBAApK,IAAI,EAAE,iCAAiC,GAAG,iCAAiC,GAAG,2CAA2C,GAAG,wCAAwC;CAC1L;AAKD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,IAAI,CAAC,yBAAyB,EAAE,eAAe,GAAG,QAAQ,CAAC,GAAG,yBAAyB,CAG7I;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,CAKxF;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,IAAI,CAAC,4BAA4B,EAAE,eAAe,GAAG,WAAW,CAAC,GAAG,4BAA4B,CAGzJ;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,4BAA4B,CAK9F"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { canonicalize, sha256Digest } from "./integrity.js";
|
|
2
|
+
export class ResolutionWorkerBuildError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code) {
|
|
5
|
+
super(code);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "ResolutionWorkerBuildError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const digestPattern = /^sha256:[a-f0-9]{64}$/u;
|
|
11
|
+
const identityPattern = /^[a-z0-9][a-z0-9._/-]{0,255}$/u;
|
|
12
|
+
export function createResolutionWorkerBuildPlan(input) {
|
|
13
|
+
if (!identityPattern.test(input.workerReleaseId) || input.pnpmVersion !== "11.21.0" || ![input.workspaceManifestDigest, input.rootLockDigest].every((value) => digestPattern.test(value)) || !identityPattern.test(input.cacheNamespace) || !Number.isSafeInteger(input.maximumBytes) || input.maximumBytes < 1 || Number.isNaN(Date.parse(input.generatedAt)) || Date.parse(input.expiresAt) <= Date.parse(input.generatedAt))
|
|
14
|
+
throw new ResolutionWorkerBuildError("RESOLUTION_WORKER_BUILD_INVALID");
|
|
15
|
+
const content = { schemaVersion: 1, ...input };
|
|
16
|
+
return Object.freeze({ ...content, planId: sha256Digest(canonicalize(content)) });
|
|
17
|
+
}
|
|
18
|
+
export function parseResolutionWorkerBuildPlan(value) {
|
|
19
|
+
const candidate = value;
|
|
20
|
+
if (!candidate || typeof candidate !== "object" || Object.keys(candidate).length !== 10)
|
|
21
|
+
throw new ResolutionWorkerBuildError("RESOLUTION_WORKER_BUILD_INVALID");
|
|
22
|
+
const recreated = createResolutionWorkerBuildPlan({ workerReleaseId: candidate.workerReleaseId, pnpmVersion: candidate.pnpmVersion, workspaceManifestDigest: candidate.workspaceManifestDigest, rootLockDigest: candidate.rootLockDigest, cacheNamespace: candidate.cacheNamespace, maximumBytes: candidate.maximumBytes, generatedAt: candidate.generatedAt, expiresAt: candidate.expiresAt });
|
|
23
|
+
if (candidate.schemaVersion !== 1 || candidate.planId !== recreated.planId)
|
|
24
|
+
throw new ResolutionWorkerBuildError("RESOLUTION_WORKER_BUILD_INVALID");
|
|
25
|
+
return recreated;
|
|
26
|
+
}
|
|
27
|
+
export function createResolutionWorkerBuildReceipt(input) {
|
|
28
|
+
if (![input.planId, input.cacheDigest, input.commandDigest].every((value) => digestPattern.test(value)) || !identityPattern.test(input.workerReleaseId) || !identityPattern.test(input.cacheNamespace) || input.pnpmVersion !== "11.21.0" || !Number.isSafeInteger(input.cacheBytes) || input.cacheBytes < 0 || Number.isNaN(Date.parse(input.completedAt)))
|
|
29
|
+
throw new ResolutionWorkerBuildError("RESOLUTION_WORKER_BUILD_INVALID");
|
|
30
|
+
const content = { schemaVersion: 1, ...input };
|
|
31
|
+
return Object.freeze({ ...content, receiptId: sha256Digest(canonicalize(content)) });
|
|
32
|
+
}
|
|
33
|
+
export function parseResolutionWorkerBuildReceipt(value) {
|
|
34
|
+
const candidate = value;
|
|
35
|
+
if (!candidate || typeof candidate !== "object" || Object.keys(candidate).length !== 10)
|
|
36
|
+
throw new ResolutionWorkerBuildError("RESOLUTION_WORKER_BUILD_INVALID");
|
|
37
|
+
const recreated = createResolutionWorkerBuildReceipt({ planId: candidate.planId, workerReleaseId: candidate.workerReleaseId, pnpmVersion: candidate.pnpmVersion, cacheNamespace: candidate.cacheNamespace, cacheDigest: candidate.cacheDigest, cacheBytes: candidate.cacheBytes, commandDigest: candidate.commandDigest, completedAt: candidate.completedAt });
|
|
38
|
+
if (candidate.schemaVersion !== 1 || candidate.receiptId !== recreated.receiptId)
|
|
39
|
+
throw new ResolutionWorkerBuildError("RESOLUTION_WORKER_BUILD_INVALID");
|
|
40
|
+
return recreated;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=resolution-worker-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-worker-build.js","sourceRoot":"","sources":["../src/resolution-worker-build.ts"],"names":[],"mappings":"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"}
|