@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
package/dist/delivery.js
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { link, mkdir, open, readFile, readdir, realpath, rename, rm, unlink } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { canonicalize, sha256Digest } from "./integrity.js";
|
|
4
|
+
export class DeliveryError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "DeliveryError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function isDigest(value) {
|
|
13
|
+
return /^sha256:[a-f0-9]{64}$/.test(value);
|
|
14
|
+
}
|
|
15
|
+
export function calculateDeliveryPlanId(plan) {
|
|
16
|
+
return sha256Digest(canonicalize(plan));
|
|
17
|
+
}
|
|
18
|
+
export function createDeliveryPlan(input) {
|
|
19
|
+
if (!isDigest(input.project.lockDigest) || !isDigest(input.project.appliedPlanId) || !isDigest(input.artifact.digest)) {
|
|
20
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Delivery identities must use canonical SHA-256 digests");
|
|
21
|
+
}
|
|
22
|
+
if (Date.parse(input.expiresAt) <= Date.parse(input.createdAt) || Number.isNaN(Date.parse(input.createdAt))) {
|
|
23
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Delivery plan expiry must follow creation time");
|
|
24
|
+
}
|
|
25
|
+
if ((input.kind === "npm-publish" && (input.artifact.type !== "npm-package" || input.target.adapterId !== "registry.npmjs" || input.risk !== "irreversible-publish")) ||
|
|
26
|
+
(input.kind === "application-deploy" && ((input.artifact.type !== "node-application" && input.artifact.type !== "web-application") || input.target.adapterId !== "deployment.local-docker" || input.risk !== "local-reversible-deployment")) ||
|
|
27
|
+
(input.kind === "artifact-publication" && (input.artifact.type !== "published-package" || (input.target.adapterId !== "publication.offline-web" && input.target.adapterId !== "publication.hosted-static") || (input.target.adapterId === "publication.offline-web" ? input.risk !== "local-reversible-publication" : input.risk !== "external-reversible-publication"))) ||
|
|
28
|
+
(input.kind === "hosted-static" && (input.artifact.type !== "web-bundle" || input.target.adapterId !== "publication.hosted-static" || input.risk !== "external-reversible-publication"))) {
|
|
29
|
+
throw new DeliveryError("DELIVERY_PROJECT_UNSUPPORTED", "Delivery kind, artifact, target, and risk must be compatible");
|
|
30
|
+
}
|
|
31
|
+
if (input.kind === "npm-publish" && input.publication !== undefined) {
|
|
32
|
+
const policy = input.publication;
|
|
33
|
+
const execution = policy.execution;
|
|
34
|
+
if (policy.mode !== "staged" || policy.access !== "public" || policy.authentication !== "trusted-publishing" || policy.trustedAction !== "stage-only" || policy.provenance !== "required" || !/^[a-z0-9][a-z0-9._-]*$/.test(policy.tag) ||
|
|
35
|
+
(execution?.provider !== "github-actions" && execution?.provider !== "gitlab-ci") || !execution.repository || !execution.workflow || !execution.ref || Object.values(execution).some((value) => typeof value !== "string" || value.length > 512 || /[\u0000-\u001f\u007f]/.test(value))) {
|
|
36
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "npm publication policy is invalid");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (input.kind !== "npm-publish" && input.publication !== undefined)
|
|
40
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Publication policy is only valid for npm delivery");
|
|
41
|
+
const withoutId = { schemaVersion: input.kind === "npm-publish" && input.publication !== undefined ? 2 : 1, ...input, state: "reviewable" };
|
|
42
|
+
return { ...withoutId, planId: calculateDeliveryPlanId(withoutId) };
|
|
43
|
+
}
|
|
44
|
+
export function parseDeliveryPlan(value) {
|
|
45
|
+
const plan = value;
|
|
46
|
+
if ((plan?.schemaVersion !== 1 && plan?.schemaVersion !== 2) || plan.state !== "reviewable") {
|
|
47
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Delivery Plan is invalid or has been modified");
|
|
48
|
+
}
|
|
49
|
+
if ((plan.schemaVersion === 2 && (plan.kind !== "npm-publish" || plan.publication === undefined)) || (plan.schemaVersion === 1 && plan.publication !== undefined))
|
|
50
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Delivery Plan schema and publication policy do not match");
|
|
51
|
+
const { planId, ...withoutId } = plan;
|
|
52
|
+
if (calculateDeliveryPlanId(withoutId) !== planId)
|
|
53
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Delivery Plan is invalid or has been modified");
|
|
54
|
+
return createDeliveryPlan({
|
|
55
|
+
kind: plan.kind, project: plan.project, artifact: plan.artifact, target: plan.target,
|
|
56
|
+
risk: plan.risk, createdAt: plan.createdAt, expiresAt: plan.expiresAt,
|
|
57
|
+
...(plan.publication === undefined ? {} : { publication: plan.publication }),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function createDeliveryStageRecord(input) {
|
|
61
|
+
if (!isDigest(input.planId) || !isDigest(input.artifactDigest) || !/^[A-Za-z0-9._:-]{1,256}$/.test(input.stageId) || Number.isNaN(Date.parse(input.createdAt))) {
|
|
62
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Record identities are invalid");
|
|
63
|
+
}
|
|
64
|
+
const content = { schemaVersion: 1, ...input, status: "registry-accepted" };
|
|
65
|
+
return { ...content, recordId: sha256Digest(canonicalize(content)) };
|
|
66
|
+
}
|
|
67
|
+
export function createDeliveryAttemptRecord(input) {
|
|
68
|
+
if (!isDigest(input.planId) || !isDigest(input.artifactDigest) || Number.isNaN(Date.parse(input.startedAt)))
|
|
69
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Attempt Record identities are invalid");
|
|
70
|
+
const content = { schemaVersion: 1, ...input, status: "remote-write-started" };
|
|
71
|
+
return { ...content, recordId: sha256Digest(canonicalize(content)) };
|
|
72
|
+
}
|
|
73
|
+
export function parseDeliveryAttemptRecord(value) {
|
|
74
|
+
const record = value;
|
|
75
|
+
const { recordId, ...content } = record ?? {};
|
|
76
|
+
if (record?.schemaVersion !== 1 || record.status !== "remote-write-started" || recordId !== sha256Digest(canonicalize(content)))
|
|
77
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Attempt Record is invalid or has been modified");
|
|
78
|
+
return record;
|
|
79
|
+
}
|
|
80
|
+
export function parseDeliveryStageRecord(value) {
|
|
81
|
+
const record = value;
|
|
82
|
+
const { recordId, ...content } = record ?? {};
|
|
83
|
+
if (record?.schemaVersion !== 1 || record.status !== "registry-accepted" || recordId !== sha256Digest(canonicalize(content)))
|
|
84
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Record is invalid or has been modified");
|
|
85
|
+
return record;
|
|
86
|
+
}
|
|
87
|
+
export function createDeliveryStageReviewRecord(input) {
|
|
88
|
+
if (!isDigest(input.planId) || !isDigest(input.artifactDigest) || !/^[A-Za-z0-9._:-]{1,256}$/.test(input.stageId) || Number.isNaN(Date.parse(input.reviewedAt))) {
|
|
89
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Review Record identities are invalid");
|
|
90
|
+
}
|
|
91
|
+
const content = { schemaVersion: 1, ...input, status: "artifact-digest-verified" };
|
|
92
|
+
return { ...content, recordId: sha256Digest(canonicalize(content)) };
|
|
93
|
+
}
|
|
94
|
+
export function parseDeliveryStageReviewRecord(value) {
|
|
95
|
+
const record = value;
|
|
96
|
+
const { recordId, ...content } = record ?? {};
|
|
97
|
+
if (record?.schemaVersion !== 1 || record.status !== "artifact-digest-verified" || recordId !== sha256Digest(canonicalize(content)))
|
|
98
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Review Record is invalid or has been modified");
|
|
99
|
+
return record;
|
|
100
|
+
}
|
|
101
|
+
export function createDeliveryReceipt(input) {
|
|
102
|
+
if (!isDigest(input.planId) || !isDigest(input.artifactDigest) || input.externalIdentity.length === 0) {
|
|
103
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Receipt identities are invalid");
|
|
104
|
+
}
|
|
105
|
+
if ("npm" in input) {
|
|
106
|
+
const npm = input.npm;
|
|
107
|
+
if (input.adapterId !== "registry.npmjs" || npm === undefined || npm.stageId.length === 0 || npm.registry !== "https://registry.npmjs.org" || npm.tarballDigest !== input.artifactDigest || npm.access !== "public" || !/^[a-z0-9][a-z0-9._-]*$/.test(npm.tag) || npm.provenance !== "registry-attested" || !isDigest(npm.attestationUrlDigest)) {
|
|
108
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Verified npm Receipt facts are incomplete or inconsistent");
|
|
109
|
+
}
|
|
110
|
+
const content = { schemaVersion: 2, ...input, status: "verified" };
|
|
111
|
+
return { ...content, receiptId: sha256Digest(canonicalize(content)) };
|
|
112
|
+
}
|
|
113
|
+
if (input.kind === "npm-publish" || (input.kind === "application-deploy" && input.adapterId !== "deployment.local-docker") || (input.kind === "artifact-publication" && input.adapterId !== "publication.offline-web" && input.adapterId !== "publication.hosted-static") || (input.kind === "hosted-static" && (input.adapterId !== "publication.hosted-static" || input.details.renderMode !== "csr")))
|
|
114
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Application or artifact Delivery Receipt facts are invalid");
|
|
115
|
+
const content = { schemaVersion: 1, ...input, status: "verified" };
|
|
116
|
+
return { ...content, receiptId: sha256Digest(canonicalize(content)) };
|
|
117
|
+
}
|
|
118
|
+
export function parseDeliveryReceipt(value) {
|
|
119
|
+
const receipt = value;
|
|
120
|
+
const { receiptId, ...content } = receipt ?? {};
|
|
121
|
+
if ((receipt?.schemaVersion !== 1 && receipt?.schemaVersion !== 2) || receipt.status !== "verified" || receiptId !== sha256Digest(canonicalize(content))) {
|
|
122
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Receipt is invalid or has been modified");
|
|
123
|
+
}
|
|
124
|
+
const { receiptId: _receiptId, schemaVersion: _schemaVersion, status: _status, ...input } = receipt;
|
|
125
|
+
return createDeliveryReceipt(input);
|
|
126
|
+
}
|
|
127
|
+
async function syncDirectory(directory) {
|
|
128
|
+
const handle = await open(directory, "r");
|
|
129
|
+
try {
|
|
130
|
+
await handle.sync();
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
await handle.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function writeExclusive(target, value) {
|
|
137
|
+
const directory = path.dirname(target);
|
|
138
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
139
|
+
const temporary = `${target}.tmp-${process.pid}-${crypto.randomUUID()}`;
|
|
140
|
+
const handle = await open(temporary, "wx", 0o600);
|
|
141
|
+
try {
|
|
142
|
+
await handle.writeFile(`${canonicalize(value)}\n`, "utf8");
|
|
143
|
+
await handle.sync();
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
await handle.close();
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await link(temporary, target);
|
|
150
|
+
await unlink(temporary);
|
|
151
|
+
await syncDirectory(directory);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
await rm(temporary, { force: true });
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export async function saveDeliveryPlan(input) {
|
|
159
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
160
|
+
const plan = parseDeliveryPlan(input.plan);
|
|
161
|
+
const target = path.join(root, ".dyyto", "delivery", "plans", `${plan.planId}.json`);
|
|
162
|
+
try {
|
|
163
|
+
await writeExclusive(target, plan);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error.code !== "EEXIST")
|
|
167
|
+
throw error;
|
|
168
|
+
if (canonicalize(parseDeliveryPlan(JSON.parse(await readFile(target, "utf8")))) !== canonicalize(plan)) {
|
|
169
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Stored Delivery Plan content does not match its identity");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return plan;
|
|
173
|
+
}
|
|
174
|
+
export async function readDeliveryPlan(input) {
|
|
175
|
+
if (!isDigest(input.planId))
|
|
176
|
+
throw new DeliveryError("DELIVERY_PLAN_NOT_FOUND", "Delivery Plan identity is invalid");
|
|
177
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
178
|
+
try {
|
|
179
|
+
const plan = parseDeliveryPlan(JSON.parse(await readFile(path.join(root, ".dyyto", "delivery", "plans", `${input.planId}.json`), "utf8")));
|
|
180
|
+
if (plan.planId !== input.planId)
|
|
181
|
+
throw new DeliveryError("DELIVERY_PRECONDITION_FAILED", "Stored Delivery Plan identity does not match its path");
|
|
182
|
+
return plan;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (error.code === "ENOENT")
|
|
186
|
+
throw new DeliveryError("DELIVERY_PLAN_NOT_FOUND", "Delivery Plan was not found");
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function saveDeliveryReceipt(input) {
|
|
191
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
192
|
+
const receipt = parseDeliveryReceipt(input.receipt);
|
|
193
|
+
const plan = await readDeliveryPlan({ projectRoot: root, planId: receipt.planId });
|
|
194
|
+
if (receipt.kind !== plan.kind || receipt.adapterId !== plan.target.adapterId || receipt.artifactDigest !== plan.artifact.digest || receipt.target !== plan.target.location)
|
|
195
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Receipt does not match its immutable Plan");
|
|
196
|
+
if (receipt.schemaVersion === 2) {
|
|
197
|
+
const stage = await readDeliveryStageRecord({ projectRoot: root, planId: receipt.planId });
|
|
198
|
+
if (plan.schemaVersion !== 2 || plan.publication === undefined || stage === null || receipt.npm.stageId !== stage.stageId || receipt.npm.tarballDigest !== stage.artifactDigest || receipt.npm.tag !== plan.publication.tag || receipt.npm.access !== plan.publication.access)
|
|
199
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Verified npm Receipt does not match its Plan and Stage Record");
|
|
200
|
+
}
|
|
201
|
+
const target = path.join(root, ".dyyto", "delivery", "receipts", `${receipt.planId}.json`);
|
|
202
|
+
try {
|
|
203
|
+
await writeExclusive(target, receipt);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (error.code !== "EEXIST")
|
|
207
|
+
throw error;
|
|
208
|
+
const current = parseDeliveryReceipt(JSON.parse(await readFile(target, "utf8")));
|
|
209
|
+
if (canonicalize(current) !== canonicalize(receipt))
|
|
210
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "A different Receipt already exists for this Plan");
|
|
211
|
+
return current;
|
|
212
|
+
}
|
|
213
|
+
return receipt;
|
|
214
|
+
}
|
|
215
|
+
export async function readDeliveryReceipt(input) {
|
|
216
|
+
if (!isDigest(input.planId))
|
|
217
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Receipt Plan identity is invalid");
|
|
218
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
219
|
+
try {
|
|
220
|
+
const receipt = parseDeliveryReceipt(JSON.parse(await readFile(path.join(root, ".dyyto", "delivery", "receipts", `${input.planId}.json`), "utf8")));
|
|
221
|
+
if (receipt.planId !== input.planId)
|
|
222
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Stored Delivery Receipt identity does not match its path");
|
|
223
|
+
return receipt;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (error.code === "ENOENT")
|
|
227
|
+
return null;
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export async function saveDeliveryAttemptRecord(input) {
|
|
232
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
233
|
+
const record = parseDeliveryAttemptRecord(input.record);
|
|
234
|
+
const plan = await readDeliveryPlan({ projectRoot: root, planId: record.planId });
|
|
235
|
+
if (plan.schemaVersion !== 2 || plan.kind !== "npm-publish" || record.artifactDigest !== plan.artifact.digest)
|
|
236
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Attempt Record does not match an npm Plan v2");
|
|
237
|
+
const target = path.join(root, ".dyyto", "delivery", "attempts", `${record.planId}.json`);
|
|
238
|
+
try {
|
|
239
|
+
await writeExclusive(target, record);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (error.code !== "EEXIST")
|
|
243
|
+
throw error;
|
|
244
|
+
const current = parseDeliveryAttemptRecord(JSON.parse(await readFile(target, "utf8")));
|
|
245
|
+
if (canonicalize(current) !== canonicalize(record))
|
|
246
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "A different Attempt Record already exists for this Plan");
|
|
247
|
+
return current;
|
|
248
|
+
}
|
|
249
|
+
return record;
|
|
250
|
+
}
|
|
251
|
+
export async function readDeliveryAttemptRecord(input) {
|
|
252
|
+
if (!isDigest(input.planId))
|
|
253
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Attempt Plan identity is invalid");
|
|
254
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
255
|
+
try {
|
|
256
|
+
const record = parseDeliveryAttemptRecord(JSON.parse(await readFile(path.join(root, ".dyyto", "delivery", "attempts", `${input.planId}.json`), "utf8")));
|
|
257
|
+
if (record.planId !== input.planId)
|
|
258
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Stored Delivery Attempt identity does not match its path");
|
|
259
|
+
return record;
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
if (error.code === "ENOENT")
|
|
263
|
+
return null;
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
export async function findUnresolvedDeliveryAttempt(input) {
|
|
268
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
269
|
+
const directory = path.join(root, ".dyyto", "delivery", "attempts");
|
|
270
|
+
let names;
|
|
271
|
+
try {
|
|
272
|
+
names = await readdir(directory);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (error.code === "ENOENT")
|
|
276
|
+
return null;
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
for (const name of names.sort()) {
|
|
280
|
+
if (!name.endsWith(".json"))
|
|
281
|
+
continue;
|
|
282
|
+
const attempt = parseDeliveryAttemptRecord(JSON.parse(await readFile(path.join(directory, name), "utf8")));
|
|
283
|
+
const plan = await readDeliveryPlan({ projectRoot: root, planId: attempt.planId });
|
|
284
|
+
if (plan.artifact.identity !== input.artifactIdentity)
|
|
285
|
+
continue;
|
|
286
|
+
const [stage, receipt] = await Promise.all([readDeliveryStageRecord({ projectRoot: root, planId: attempt.planId }), readDeliveryReceipt({ projectRoot: root, planId: attempt.planId })]);
|
|
287
|
+
if (stage === null && receipt === null)
|
|
288
|
+
return attempt;
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
export async function saveDeliveryStageRecord(input) {
|
|
293
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
294
|
+
const record = parseDeliveryStageRecord(input.record);
|
|
295
|
+
const plan = await readDeliveryPlan({ projectRoot: root, planId: record.planId });
|
|
296
|
+
if (plan.schemaVersion !== 2 || plan.kind !== "npm-publish" || plan.publication === undefined || record.artifactDigest !== plan.artifact.digest)
|
|
297
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Record does not match an npm Plan v2");
|
|
298
|
+
const target = path.join(root, ".dyyto", "delivery", "stages", `${record.planId}.json`);
|
|
299
|
+
try {
|
|
300
|
+
await writeExclusive(target, record);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (error.code !== "EEXIST")
|
|
304
|
+
throw error;
|
|
305
|
+
const current = parseDeliveryStageRecord(JSON.parse(await readFile(target, "utf8")));
|
|
306
|
+
if (canonicalize(current) !== canonicalize(record))
|
|
307
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "A different Stage Record already exists for this Plan");
|
|
308
|
+
return current;
|
|
309
|
+
}
|
|
310
|
+
return record;
|
|
311
|
+
}
|
|
312
|
+
export async function readDeliveryStageRecord(input) {
|
|
313
|
+
if (!isDigest(input.planId))
|
|
314
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Plan identity is invalid");
|
|
315
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
316
|
+
try {
|
|
317
|
+
const record = parseDeliveryStageRecord(JSON.parse(await readFile(path.join(root, ".dyyto", "delivery", "stages", `${input.planId}.json`), "utf8")));
|
|
318
|
+
if (record.planId !== input.planId)
|
|
319
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Stored Delivery Stage identity does not match its path");
|
|
320
|
+
return record;
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (error.code === "ENOENT")
|
|
324
|
+
return null;
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
export async function saveDeliveryStageReviewRecord(input) {
|
|
329
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
330
|
+
const record = parseDeliveryStageReviewRecord(input.record);
|
|
331
|
+
const stage = await readDeliveryStageRecord({ projectRoot: root, planId: record.planId });
|
|
332
|
+
if (stage === null || record.stageId !== stage.stageId || record.artifactDigest !== stage.artifactDigest)
|
|
333
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Review Record does not match its immutable Stage Record");
|
|
334
|
+
const target = path.join(root, ".dyyto", "delivery", "stage-reviews", `${record.planId}.json`);
|
|
335
|
+
try {
|
|
336
|
+
await writeExclusive(target, record);
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
if (error.code !== "EEXIST")
|
|
340
|
+
throw error;
|
|
341
|
+
const current = parseDeliveryStageReviewRecord(JSON.parse(await readFile(target, "utf8")));
|
|
342
|
+
if (canonicalize(current) !== canonicalize(record))
|
|
343
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "A different Stage Review Record already exists for this Plan");
|
|
344
|
+
return current;
|
|
345
|
+
}
|
|
346
|
+
return record;
|
|
347
|
+
}
|
|
348
|
+
export async function readDeliveryStageReviewRecord(input) {
|
|
349
|
+
if (!isDigest(input.planId))
|
|
350
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Delivery Stage Review Plan identity is invalid");
|
|
351
|
+
const root = await realpath(path.resolve(input.projectRoot));
|
|
352
|
+
try {
|
|
353
|
+
const record = parseDeliveryStageReviewRecord(JSON.parse(await readFile(path.join(root, ".dyyto", "delivery", "stage-reviews", `${input.planId}.json`), "utf8")));
|
|
354
|
+
if (record.planId !== input.planId)
|
|
355
|
+
throw new DeliveryError("DELIVERY_RECEIPT_INVALID", "Stored Delivery Stage Review identity does not match its path");
|
|
356
|
+
return record;
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
if (error.code === "ENOENT")
|
|
360
|
+
return null;
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type Sha256Digest = `sha256:${string}`;
|
|
2
|
+
export type DependencyResolutionPlan = Readonly<{
|
|
3
|
+
schemaVersion: 1;
|
|
4
|
+
planId: Sha256Digest;
|
|
5
|
+
capability: Readonly<{
|
|
6
|
+
capabilityId: string;
|
|
7
|
+
version: string;
|
|
8
|
+
integrity: Sha256Digest;
|
|
9
|
+
}>;
|
|
10
|
+
inputs: Readonly<{
|
|
11
|
+
packageManifestDigest: Sha256Digest;
|
|
12
|
+
workspaceConfigDigest: Sha256Digest;
|
|
13
|
+
}>;
|
|
14
|
+
toolchain: Readonly<{
|
|
15
|
+
node: string;
|
|
16
|
+
pnpm: "11.21.0";
|
|
17
|
+
}>;
|
|
18
|
+
registry: Readonly<{
|
|
19
|
+
id: "registry.npmjs.public";
|
|
20
|
+
origin: "https://registry.npmjs.org/";
|
|
21
|
+
}>;
|
|
22
|
+
policy: Readonly<{
|
|
23
|
+
ignoreScripts: true;
|
|
24
|
+
minimumReleaseAgeStrict: true;
|
|
25
|
+
minimumReleaseAgeExclude: readonly string[];
|
|
26
|
+
}>;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
}>;
|
|
29
|
+
export type DependencyResolutionReceipt = Readonly<{
|
|
30
|
+
schemaVersion: 1;
|
|
31
|
+
receiptId: Sha256Digest;
|
|
32
|
+
planId: Sha256Digest;
|
|
33
|
+
lockDigest: Sha256Digest;
|
|
34
|
+
packageCount: number;
|
|
35
|
+
integrityCount: number;
|
|
36
|
+
lifecycleScriptFindings: readonly string[];
|
|
37
|
+
registryOrigins: readonly string[];
|
|
38
|
+
createdAt: string;
|
|
39
|
+
}>;
|
|
40
|
+
export declare class DependencyResolutionError extends Error {
|
|
41
|
+
readonly code: "DEPENDENCY_RESOLUTION_INVALID" | "DEPENDENCY_RESOLUTION_POLICY_REJECTED";
|
|
42
|
+
constructor(code: "DEPENDENCY_RESOLUTION_INVALID" | "DEPENDENCY_RESOLUTION_POLICY_REJECTED", message: string);
|
|
43
|
+
}
|
|
44
|
+
export declare function createDependencyResolutionPlan(input: Omit<DependencyResolutionPlan, "schemaVersion" | "planId">): DependencyResolutionPlan;
|
|
45
|
+
export declare function createDependencyResolutionReceipt(input: Omit<DependencyResolutionReceipt, "schemaVersion" | "receiptId">, plan: DependencyResolutionPlan): DependencyResolutionReceipt;
|
|
46
|
+
//# sourceMappingURL=dependency-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolution.d.ts","sourceRoot":"","sources":["../src/dependency-resolution.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,UAAU,MAAM,EAAE,CAAC;AAE9C,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,QAAQ,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACzF,MAAM,EAAE,QAAQ,CAAC;QAAE,qBAAqB,EAAE,YAAY,CAAC;QAAC,qBAAqB,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IAC/F,SAAS,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IACvD,QAAQ,EAAE,QAAQ,CAAC;QAAE,EAAE,EAAE,uBAAuB,CAAC;QAAC,MAAM,EAAE,6BAA6B,CAAA;KAAE,CAAC,CAAC;IAC3F,MAAM,EAAE,QAAQ,CAAC;QAAE,aAAa,EAAE,IAAI,CAAC;QAAC,uBAAuB,EAAE,IAAI,CAAC;QAAC,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACtH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,YAAY,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,GAAG,uCAAuC;gBAA/E,IAAI,EAAE,+BAA+B,GAAG,uCAAuC,EAAE,OAAO,EAAE,MAAM;CACtH;AAUD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,IAAI,CAAC,wBAAwB,EAAE,eAAe,GAAG,QAAQ,CAAC,GAAG,wBAAwB,CAM1I;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,IAAI,CAAC,2BAA2B,EAAE,eAAe,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,wBAAwB,GAAG,2BAA2B,CAKtL"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { canonicalize, sha256Digest } from "./integrity.js";
|
|
2
|
+
export class DependencyResolutionError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const digestPattern = /^sha256:[a-f0-9]{64}$/;
|
|
10
|
+
const exactException = /^(?:@[a-z0-9._-]+\/[a-z0-9._-]+|[a-z0-9._-]+)@(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
11
|
+
const approvedExceptions = new Set(["@rolldown/binding-darwin-x64@1.2.5", "@rolldown/binding-linux-arm64-gnu@1.2.5"]);
|
|
12
|
+
function digest(value, field) {
|
|
13
|
+
if (typeof value !== "string" || !digestPattern.test(value))
|
|
14
|
+
throw new DependencyResolutionError("DEPENDENCY_RESOLUTION_INVALID", `${field} must be a sha256 digest`);
|
|
15
|
+
}
|
|
16
|
+
export function createDependencyResolutionPlan(input) {
|
|
17
|
+
digest(input.capability.integrity, "capability.integrity");
|
|
18
|
+
digest(input.inputs.packageManifestDigest, "packageManifestDigest");
|
|
19
|
+
digest(input.inputs.workspaceConfigDigest, "workspaceConfigDigest");
|
|
20
|
+
if (input.toolchain.pnpm !== "11.21.0" || input.registry.id !== "registry.npmjs.public" || input.registry.origin !== "https://registry.npmjs.org/" || input.policy.ignoreScripts !== true || input.policy.minimumReleaseAgeStrict !== true)
|
|
21
|
+
throw new DependencyResolutionError("DEPENDENCY_RESOLUTION_POLICY_REJECTED", "Dependency resolution policy is not approved");
|
|
22
|
+
if (input.policy.minimumReleaseAgeExclude.some((item) => !exactException.test(item) || !approvedExceptions.has(item)) || new Set(input.policy.minimumReleaseAgeExclude).size !== input.policy.minimumReleaseAgeExclude.length)
|
|
23
|
+
throw new DependencyResolutionError("DEPENDENCY_RESOLUTION_POLICY_REJECTED", "Minimum release age exceptions must be unique approved exact versions");
|
|
24
|
+
const content = { schemaVersion: 1, ...input, policy: { ...input.policy, minimumReleaseAgeExclude: [...input.policy.minimumReleaseAgeExclude].sort() } };
|
|
25
|
+
return Object.freeze({ ...content, planId: sha256Digest(canonicalize(content)) });
|
|
26
|
+
}
|
|
27
|
+
export function createDependencyResolutionReceipt(input, plan) {
|
|
28
|
+
digest(input.planId, "planId");
|
|
29
|
+
digest(input.lockDigest, "lockDigest");
|
|
30
|
+
if (input.planId !== plan.planId || !Number.isSafeInteger(input.packageCount) || input.packageCount < 1 || !Number.isSafeInteger(input.integrityCount) || input.integrityCount < 1 || input.lifecycleScriptFindings.length > 0 || input.registryOrigins.length !== 1 || input.registryOrigins[0] !== plan.registry.origin)
|
|
31
|
+
throw new DependencyResolutionError("DEPENDENCY_RESOLUTION_POLICY_REJECTED", "Dependency resolution receipt violates the approved Plan");
|
|
32
|
+
const content = { schemaVersion: 1, ...input };
|
|
33
|
+
return Object.freeze({ ...content, receiptId: sha256Digest(canonicalize(content)) });
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=dependency-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolution.js","sourceRoot":"","sources":["../src/dependency-resolution.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ProjectAdoptionLock } from "./adoption-contracts.js";
|
|
2
|
+
export type DoctorSeverity = "info" | "warning" | "critical";
|
|
3
|
+
export type DoctorFact = "manifest" | "lock" | "repository" | "evidence" | "recovery";
|
|
4
|
+
export type DoctorFinding = {
|
|
5
|
+
code: string;
|
|
6
|
+
severity: DoctorSeverity;
|
|
7
|
+
fact: DoctorFact;
|
|
8
|
+
message: string;
|
|
9
|
+
action?: string;
|
|
10
|
+
};
|
|
11
|
+
export type DoctorUnitReport = {
|
|
12
|
+
unit: string;
|
|
13
|
+
kind: "root" | "package" | "application";
|
|
14
|
+
state: string;
|
|
15
|
+
status: "healthy" | "attention" | "blocked";
|
|
16
|
+
findings: DoctorFinding[];
|
|
17
|
+
};
|
|
18
|
+
export type DoctorReport = {
|
|
19
|
+
schemaVersion: 1;
|
|
20
|
+
workspace: string;
|
|
21
|
+
generatedAt: string;
|
|
22
|
+
status: "healthy" | "attention" | "blocked";
|
|
23
|
+
summary: {
|
|
24
|
+
total: number;
|
|
25
|
+
healthy: number;
|
|
26
|
+
attention: number;
|
|
27
|
+
blocked: number;
|
|
28
|
+
};
|
|
29
|
+
units: DoctorUnitReport[];
|
|
30
|
+
};
|
|
31
|
+
export declare function auditAdoptionEvidence(input: {
|
|
32
|
+
projectRoot: string;
|
|
33
|
+
lock: ProjectAdoptionLock;
|
|
34
|
+
}): Promise<DoctorFinding[]>;
|
|
35
|
+
export declare function doctorFindingsForState(state: string): DoctorFinding[];
|
|
36
|
+
export declare function auditRuntimeObservabilityHealth(input: {
|
|
37
|
+
workspaceRoot: string;
|
|
38
|
+
applicationId: string;
|
|
39
|
+
}): Promise<DoctorFinding[]>;
|
|
40
|
+
export declare function buildDoctorReport(input: {
|
|
41
|
+
workspace: string;
|
|
42
|
+
generatedAt: string;
|
|
43
|
+
units: Array<{
|
|
44
|
+
unit: string;
|
|
45
|
+
kind: "root" | "package" | "application";
|
|
46
|
+
state: string;
|
|
47
|
+
findings: DoctorFinding[];
|
|
48
|
+
}>;
|
|
49
|
+
}): DoctorReport;
|
|
50
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAC7D,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AACtF,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3H,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AACjL,MAAM,MAAM,YAAY,GAAG;IAAE,aAAa,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAIjP,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB/H;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAOrE;AAED,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CASvI;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,YAAY,CAOrN"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseAdoptionEvidence } from "./adoption-schemas.js";
|
|
4
|
+
import { LocalRuntimeErrorStore } from "./runtime-observability.js";
|
|
5
|
+
const finding = (code, severity, fact, message, action) => ({ code, severity, fact, message, ...(action === undefined ? {} : { action }) });
|
|
6
|
+
export async function auditAdoptionEvidence(input) {
|
|
7
|
+
if (input.lock.capabilities.length === 0 || input.lock.capabilities.some((capability) => capability.evidenceIds.length === 0)) {
|
|
8
|
+
return [finding("EVIDENCE_INVALID", "critical", "evidence", "已验证锁缺少完整证据引用。", "重新运行验证;若事务未完成,先执行安全恢复。")];
|
|
9
|
+
}
|
|
10
|
+
for (const capability of input.lock.capabilities) {
|
|
11
|
+
for (const evidenceId of capability.evidenceIds) {
|
|
12
|
+
try {
|
|
13
|
+
const evidence = parseAdoptionEvidence(JSON.parse(await readFile(path.join(input.projectRoot, ".dyyto", "evidence", `${evidenceId}.json`), "utf8")));
|
|
14
|
+
if (evidence.evidenceId !== evidenceId || evidence.capabilityId !== capability.capabilityId || evidence.capabilityVersion !== capability.version || evidence.capabilityIntegrity !== capability.integrity || evidence.projectStateDigest !== capability.projectStateDigest || evidence.result !== "passed") {
|
|
15
|
+
return [finding("EVIDENCE_INVALID", "critical", "evidence", "采用证据与已验证锁的身份或工程状态不一致。", "重新运行验证;若现场已变化,先检查并重新规划。")];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return [finding("EVIDENCE_INVALID", "critical", "evidence", "采用证据缺失、损坏或不符合契约。", "重新运行验证;若事务未完成,先执行安全恢复。")];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const count = input.lock.capabilities.reduce((total, capability) => total + capability.evidenceIds.length, 0);
|
|
24
|
+
return [finding("EVIDENCE_VALID", "info", "evidence", `已核验 ${input.lock.capabilities.length} 项能力的 ${count} 条采用证据。`)];
|
|
25
|
+
}
|
|
26
|
+
export function doctorFindingsForState(state) {
|
|
27
|
+
if (state === "adopted")
|
|
28
|
+
return [];
|
|
29
|
+
if (state === "planned")
|
|
30
|
+
return [finding("ADOPTION_PLANNED", "warning", "lock", "能力采用仍处于计划阶段。", "审阅并批准精确 Plan。")];
|
|
31
|
+
if (state === "applied-unverified")
|
|
32
|
+
return [finding("VERIFICATION_REQUIRED", "warning", "evidence", "变更已应用但尚未形成验证证据。", "运行验证并提交采用锁。")];
|
|
33
|
+
if (state === "drifted")
|
|
34
|
+
return [finding("REPOSITORY_DRIFT", "warning", "repository", "工程现场与已锁定事实不一致。", "检查差异并重新规划,平台不会覆盖用户修改。")];
|
|
35
|
+
if (state === "recovery-required")
|
|
36
|
+
return [finding("RECOVERY_REQUIRED", "critical", "recovery", "检测到未完成的持久化事务。", "先执行安全恢复,再继续其他操作。")];
|
|
37
|
+
return [finding("FACT_INVALID", "critical", "manifest", "工程单元事实无法安全读取。", "修复该单元的 Manifest 或元数据后重新诊断。")];
|
|
38
|
+
}
|
|
39
|
+
export async function auditRuntimeObservabilityHealth(input) {
|
|
40
|
+
try {
|
|
41
|
+
const config = JSON.parse(await readFile(path.join(input.workspaceRoot, ".dyyto", "observability", "config.json"), "utf8"));
|
|
42
|
+
if (!Array.isArray(config.applications) || !config.applications.includes(input.applicationId))
|
|
43
|
+
return [finding("OBSERVABILITY_NOT_CONFIGURED", "warning", "repository", "当前 Web 应用尚未配置运行时错误采集。", "登记应用 Origin,并启动本地采集端。")];
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [finding("OBSERVABILITY_NOT_CONFIGURED", "warning", "repository", "当前 Web 应用尚未配置运行时错误采集。", "登记应用 Origin,并启动本地采集端。")];
|
|
47
|
+
}
|
|
48
|
+
await new LocalRuntimeErrorStore(input.workspaceRoot).list({ applicationId: input.applicationId });
|
|
49
|
+
const quarantined = (await readdir(path.join(input.workspaceRoot, ".dyyto", "observability", "quarantine")).catch(() => [])).length;
|
|
50
|
+
if (quarantined > 0)
|
|
51
|
+
return [finding("OBSERVABILITY_STORE_DAMAGED", "critical", "repository", `运行时错误本地存储已隔离 ${quarantined} 条损坏记录,健康事件仍可查询。`, "检查本机磁盘状态,并显式处理隔离记录。")];
|
|
52
|
+
return [finding("OBSERVABILITY_CONFIGURED", "info", "repository", "运行时错误采集配置与本地存储可读取。")];
|
|
53
|
+
}
|
|
54
|
+
export function buildDoctorReport(input) {
|
|
55
|
+
const units = input.units.map((unit) => {
|
|
56
|
+
const status = unit.findings.some((item) => item.severity === "critical") ? "blocked" : unit.findings.some((item) => item.severity === "warning") ? "attention" : "healthy";
|
|
57
|
+
return { ...unit, status };
|
|
58
|
+
});
|
|
59
|
+
const summary = { total: units.length, healthy: units.filter((unit) => unit.status === "healthy").length, attention: units.filter((unit) => unit.status === "attention").length, blocked: units.filter((unit) => unit.status === "blocked").length };
|
|
60
|
+
return { schemaVersion: 1, workspace: input.workspace, generatedAt: input.generatedAt, status: summary.blocked > 0 ? "blocked" : summary.attention > 0 ? "attention" : "healthy", summary, units };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAQpE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,QAAwB,EAAE,IAAgB,EAAE,OAAe,EAAE,MAAe,EAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhN,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAyD;IACnG,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9H,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC1G,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACjD,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrJ,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,YAAY,KAAK,UAAU,CAAC,YAAY,IAAI,QAAQ,CAAC,iBAAiB,KAAK,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,mBAAmB,KAAK,UAAU,CAAC,SAAS,IAAI,QAAQ,CAAC,kBAAkB,KAAK,UAAU,CAAC,kBAAkB,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC3S,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,uBAAuB,EAAE,yBAAyB,CAAC,CAAC,CAAC;gBACnH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAC,UAAU,EAAC,EAAE,CAAA,KAAK,GAAC,UAAU,CAAC,WAAW,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC;AACvH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAClH,IAAI,KAAK,KAAK,oBAAoB;QAAE,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC;IACvI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAClI,IAAI,KAAK,KAAK,mBAAmB;QAAE,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACtI,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,4BAA4B,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,KAAuD;IAC3G,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAA+B,CAAC;QAC1J,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;YAAE,OAAO,CAAC,OAAO,CAAC,8BAA8B,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC7N,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAAC,CAAC;IACxI,MAAM,IAAI,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IACnG,MAAM,WAAW,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACpI,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,WAAW,kBAAkB,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACrK,OAAO,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAqK;IACrM,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAoB,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5K,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IACrP,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACrM,CAAC"}
|