@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.
Files changed (182) hide show
  1. package/README.md +25 -0
  2. package/dist/adoption-contracts.d.ts +140 -0
  3. package/dist/adoption-contracts.d.ts.map +1 -0
  4. package/dist/adoption-contracts.js +2 -0
  5. package/dist/adoption-contracts.js.map +1 -0
  6. package/dist/adoption-metadata.d.ts +72 -0
  7. package/dist/adoption-metadata.d.ts.map +1 -0
  8. package/dist/adoption-metadata.js +408 -0
  9. package/dist/adoption-metadata.js.map +1 -0
  10. package/dist/adoption-schemas.d.ts +1608 -0
  11. package/dist/adoption-schemas.d.ts.map +1 -0
  12. package/dist/adoption-schemas.js +319 -0
  13. package/dist/adoption-schemas.js.map +1 -0
  14. package/dist/application-config-binding.d.ts +54 -0
  15. package/dist/application-config-binding.d.ts.map +1 -0
  16. package/dist/application-config-binding.js +139 -0
  17. package/dist/application-config-binding.js.map +1 -0
  18. package/dist/application-config-contract.d.ts +159 -0
  19. package/dist/application-config-contract.d.ts.map +1 -0
  20. package/dist/application-config-contract.js +142 -0
  21. package/dist/application-config-contract.js.map +1 -0
  22. package/dist/blank-profile.d.ts +60 -0
  23. package/dist/blank-profile.d.ts.map +1 -0
  24. package/dist/blank-profile.js +182 -0
  25. package/dist/blank-profile.js.map +1 -0
  26. package/dist/catalog-source.d.ts +167 -0
  27. package/dist/catalog-source.d.ts.map +1 -0
  28. package/dist/catalog-source.js +252 -0
  29. package/dist/catalog-source.js.map +1 -0
  30. package/dist/code-module-publication.d.ts +113 -0
  31. package/dist/code-module-publication.d.ts.map +1 -0
  32. package/dist/code-module-publication.js +71 -0
  33. package/dist/code-module-publication.js.map +1 -0
  34. package/dist/contracts.d.ts +150 -0
  35. package/dist/contracts.d.ts.map +1 -0
  36. package/dist/contracts.js +3 -0
  37. package/dist/contracts.js.map +1 -0
  38. package/dist/delivery.d.ts +201 -0
  39. package/dist/delivery.d.ts.map +1 -0
  40. package/dist/delivery.js +364 -0
  41. package/dist/delivery.js.map +1 -0
  42. package/dist/dependency-resolution.d.ts +46 -0
  43. package/dist/dependency-resolution.d.ts.map +1 -0
  44. package/dist/dependency-resolution.js +35 -0
  45. package/dist/dependency-resolution.js.map +1 -0
  46. package/dist/doctor.d.ts +50 -0
  47. package/dist/doctor.d.ts.map +1 -0
  48. package/dist/doctor.js +62 -0
  49. package/dist/doctor.js.map +1 -0
  50. package/dist/durability-trace.d.ts +31 -0
  51. package/dist/durability-trace.d.ts.map +1 -0
  52. package/dist/durability-trace.js +45 -0
  53. package/dist/durability-trace.js.map +1 -0
  54. package/dist/engineering-operations.d.ts +43 -0
  55. package/dist/engineering-operations.d.ts.map +1 -0
  56. package/dist/engineering-operations.js +19 -0
  57. package/dist/engineering-operations.js.map +1 -0
  58. package/dist/engineering-product.d.ts +261 -0
  59. package/dist/engineering-product.d.ts.map +1 -0
  60. package/dist/engineering-product.js +61 -0
  61. package/dist/engineering-product.js.map +1 -0
  62. package/dist/example-recipe.d.ts +147 -0
  63. package/dist/example-recipe.d.ts.map +1 -0
  64. package/dist/example-recipe.js +58 -0
  65. package/dist/example-recipe.js.map +1 -0
  66. package/dist/feature-planner.d.ts +59 -0
  67. package/dist/feature-planner.d.ts.map +1 -0
  68. package/dist/feature-planner.js +160 -0
  69. package/dist/feature-planner.js.map +1 -0
  70. package/dist/filesystem-contracts.d.ts +77 -0
  71. package/dist/filesystem-contracts.d.ts.map +1 -0
  72. package/dist/filesystem-contracts.js +2 -0
  73. package/dist/filesystem-contracts.js.map +1 -0
  74. package/dist/filesystem-transaction.d.ts +52 -0
  75. package/dist/filesystem-transaction.d.ts.map +1 -0
  76. package/dist/filesystem-transaction.js +749 -0
  77. package/dist/filesystem-transaction.js.map +1 -0
  78. package/dist/index.d.ts +44 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +42 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/integrity.d.ts +3 -0
  83. package/dist/integrity.d.ts.map +1 -0
  84. package/dist/integrity.js +17 -0
  85. package/dist/integrity.js.map +1 -0
  86. package/dist/local-artifact-registry.d.ts +55 -0
  87. package/dist/local-artifact-registry.d.ts.map +1 -0
  88. package/dist/local-artifact-registry.js +87 -0
  89. package/dist/local-artifact-registry.js.map +1 -0
  90. package/dist/locked-repository-state.d.ts +21 -0
  91. package/dist/locked-repository-state.d.ts.map +1 -0
  92. package/dist/locked-repository-state.js +62 -0
  93. package/dist/locked-repository-state.js.map +1 -0
  94. package/dist/managed-region.d.ts +11 -0
  95. package/dist/managed-region.d.ts.map +1 -0
  96. package/dist/managed-region.js +45 -0
  97. package/dist/managed-region.js.map +1 -0
  98. package/dist/package-adoption.d.ts +179 -0
  99. package/dist/package-adoption.d.ts.map +1 -0
  100. package/dist/package-adoption.js +332 -0
  101. package/dist/package-adoption.js.map +1 -0
  102. package/dist/package-release.d.ts +42 -0
  103. package/dist/package-release.d.ts.map +1 -0
  104. package/dist/package-release.js +85 -0
  105. package/dist/package-release.js.map +1 -0
  106. package/dist/plan-state.d.ts +10 -0
  107. package/dist/plan-state.d.ts.map +1 -0
  108. package/dist/plan-state.js +33 -0
  109. package/dist/plan-state.js.map +1 -0
  110. package/dist/planner.d.ts +19 -0
  111. package/dist/planner.d.ts.map +1 -0
  112. package/dist/planner.js +111 -0
  113. package/dist/planner.js.map +1 -0
  114. package/dist/platform-package-sources.d.ts +49 -0
  115. package/dist/platform-package-sources.d.ts.map +1 -0
  116. package/dist/platform-package-sources.js +98 -0
  117. package/dist/platform-package-sources.js.map +1 -0
  118. package/dist/project-bootstrap.d.ts +42 -0
  119. package/dist/project-bootstrap.d.ts.map +1 -0
  120. package/dist/project-bootstrap.js +270 -0
  121. package/dist/project-bootstrap.js.map +1 -0
  122. package/dist/project-control.d.ts +149 -0
  123. package/dist/project-control.d.ts.map +1 -0
  124. package/dist/project-control.js +46 -0
  125. package/dist/project-control.js.map +1 -0
  126. package/dist/project-maintenance.d.ts +30 -0
  127. package/dist/project-maintenance.d.ts.map +1 -0
  128. package/dist/project-maintenance.js +29 -0
  129. package/dist/project-maintenance.js.map +1 -0
  130. package/dist/project-recovery.d.ts +31 -0
  131. package/dist/project-recovery.d.ts.map +1 -0
  132. package/dist/project-recovery.js +80 -0
  133. package/dist/project-recovery.js.map +1 -0
  134. package/dist/recovery-override.d.ts +20 -0
  135. package/dist/recovery-override.d.ts.map +1 -0
  136. package/dist/recovery-override.js +27 -0
  137. package/dist/recovery-override.js.map +1 -0
  138. package/dist/release-loader.d.ts +9 -0
  139. package/dist/release-loader.d.ts.map +1 -0
  140. package/dist/release-loader.js +86 -0
  141. package/dist/release-loader.js.map +1 -0
  142. package/dist/resolution-evidence.d.ts +67 -0
  143. package/dist/resolution-evidence.d.ts.map +1 -0
  144. package/dist/resolution-evidence.js +98 -0
  145. package/dist/resolution-evidence.js.map +1 -0
  146. package/dist/resolution-worker-build.d.ts +33 -0
  147. package/dist/resolution-worker-build.d.ts.map +1 -0
  148. package/dist/resolution-worker-build.js +42 -0
  149. package/dist/resolution-worker-build.js.map +1 -0
  150. package/dist/runtime-observability.d.ts +147 -0
  151. package/dist/runtime-observability.d.ts.map +1 -0
  152. package/dist/runtime-observability.js +264 -0
  153. package/dist/runtime-observability.js.map +1 -0
  154. package/dist/schemas.d.ts +740 -0
  155. package/dist/schemas.d.ts.map +1 -0
  156. package/dist/schemas.js +348 -0
  157. package/dist/schemas.js.map +1 -0
  158. package/dist/solution-catalog.d.ts +169 -0
  159. package/dist/solution-catalog.d.ts.map +1 -0
  160. package/dist/solution-catalog.js +60 -0
  161. package/dist/solution-catalog.js.map +1 -0
  162. package/dist/standalone-npm-profile.d.ts +146 -0
  163. package/dist/standalone-npm-profile.d.ts.map +1 -0
  164. package/dist/standalone-npm-profile.js +425 -0
  165. package/dist/standalone-npm-profile.js.map +1 -0
  166. package/dist/testing.d.ts +5 -0
  167. package/dist/testing.d.ts.map +1 -0
  168. package/dist/testing.js +3 -0
  169. package/dist/testing.js.map +1 -0
  170. package/dist/upgrade-planner.d.ts +45 -0
  171. package/dist/upgrade-planner.d.ts.map +1 -0
  172. package/dist/upgrade-planner.js +207 -0
  173. package/dist/upgrade-planner.js.map +1 -0
  174. package/dist/workspace-publication.d.ts +18 -0
  175. package/dist/workspace-publication.d.ts.map +1 -0
  176. package/dist/workspace-publication.js +33 -0
  177. package/dist/workspace-publication.js.map +1 -0
  178. package/dist/workspace-topology.d.ts +22 -0
  179. package/dist/workspace-topology.d.ts.map +1 -0
  180. package/dist/workspace-topology.js +117 -0
  181. package/dist/workspace-topology.js.map +1 -0
  182. 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":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA4B5D,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC9B;IAArB,YAAqB,IAAoK;QAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAApL,SAAI,GAAJ,IAAI,CAAgK;QAAiB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAAC,CAAC;CACtP;AAED,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD,MAAM,UAAU,+BAA+B,CAAC,KAAkE;IAChH,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,0BAA0B,CAAC,iCAAiC,CAAC,CAAC;IACxe,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,CAAU,EAAE,GAAG,KAAK,EAAE,CAAC;IAAC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7I,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAc;IAC3D,MAAM,SAAS,GAAG,KAAkC,CAAC;IACrD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,0BAA0B,CAAC,iCAAiC,CAAC,CAAC;IACjK,MAAM,SAAS,GAAG,+BAA+B,CAAC,EAAE,eAAe,EAAE,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,uBAAuB,EAAE,SAAS,CAAC,uBAAuB,EAAE,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IAChY,IAAI,SAAS,CAAC,aAAa,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,0BAA0B,CAAC,iCAAiC,CAAC,CAAC;IAAC,OAAO,SAAS,CAAC;AACxK,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAAwE;IACzH,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAAE,MAAM,IAAI,0BAA0B,CAAC,iCAAiC,CAAC,CAAC;IACra,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,CAAU,EAAE,GAAG,KAAK,EAAE,CAAC;IAAC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAChJ,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAAc;IAC9D,MAAM,SAAS,GAAG,KAAqC,CAAC;IACxD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,0BAA0B,CAAC,iCAAiC,CAAC,CAAC;IACjK,MAAM,SAAS,GAAG,kCAAkC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/V,IAAI,SAAS,CAAC,aAAa,KAAK,CAAC,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS;QAAE,MAAM,IAAI,0BAA0B,CAAC,iCAAiC,CAAC,CAAC;IAAC,OAAO,SAAS,CAAC;AAC9K,CAAC"}