/*
capability-artifacts store — persist and load capability artifact provenance records.
- Do not evaluate artifact content — the store only persists provenance.
- RFC-1097: sweep — werkstatt-engine clean
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.
*/
import type { Sha256Digest } from "@warpgogol/werkstatt-shared/fingerprint";
import { byteHash } from "@warpgogol/werkstatt-shared/fingerprint";
import type { WorkloadLimitsV1 } from "../isolation/contracts.ts";
export interface ArtifactProvenanceV1 {
schema: "werkstatt/artifact-provenance@1";
sourceCommit: string;
buildCommand: string;
builderId: string;
builtAt: string;
reproducible: boolean;
}
export interface CapabilityArtifactV1 {
schema: "werkstatt/capability-artifact@1";
artifactHash: Sha256Digest;
manifestHash: Sha256Digest;
payloadHash: Sha256Digest;
mediaType: string;
sizeBytes: number;
provenance: ArtifactProvenanceV1;
}
export interface ArtifactPublishRequestV1 {
manifestBytes: Uint8Array;
payloadBytes: Uint8Array;
mediaType: string;
provenance: ArtifactProvenanceV1;
}
export interface ArtifactPublishResultV1 {
ok: true;
artifact: CapabilityArtifactV1;
}
export interface ArtifactPublishFailureV1 {
ok: false;
ruleId: "CERT-ARTIFACT-01" | "CERT-ARTIFACT-02" | "CERT-ARTIFACT-03";
message: string;
}
export type ArtifactPublishOutcomeV1 = ArtifactPublishResultV1 | ArtifactPublishFailureV1;
export interface ArtifactStoreV1 {
publish(request: ArtifactPublishRequestV1): ArtifactPublishOutcomeV1;
get(artifactHash: Sha256Digest): CapabilityArtifactV1 | null;
verify(artifactHash: Sha256Digest, expectedBytes: Uint8Array): ArtifactVerifyOutcomeV1;
list(): readonly Sha256Digest[];
}
export interface ArtifactVerifyResultV1 {
ok: true;
verified: true;
}
export interface ArtifactVerifyFailureV1 {
ok: false;
ruleId: "CERT-ARTIFACT-04" | "CERT-ARTIFACT-05";
message: string;
}
export type ArtifactVerifyOutcomeV1 = ArtifactVerifyResultV1 | ArtifactVerifyFailureV1;
const MAX_ARTIFACT_SIZE = 256 * 1024 * 1024;
const ALLOWED_MEDIA_TYPES = new Set([
"application/vnd.werkstatt.capability+json",
"application/vnd.werkstatt.capability+binary",
"application/javascript",
"application/wasm",
]);
export function createInMemoryArtifactStore(): ArtifactStoreV1 {
const artifacts = new Map();
const payloadStore = new Map();
return {
publish(request: ArtifactPublishRequestV1): ArtifactPublishOutcomeV1 {
if (request.payloadBytes.length > MAX_ARTIFACT_SIZE) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-01",
message: `artifact size ${request.payloadBytes.length} exceeds maximum ${MAX_ARTIFACT_SIZE}`,
};
}
if (!ALLOWED_MEDIA_TYPES.has(request.mediaType)) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-02",
message: `media type "${request.mediaType}" is not allowed`,
};
}
const manifestHash = byteHash(request.manifestBytes);
const payloadHash = byteHash(request.payloadBytes);
const manifestObj: Record = {
manifestHash: manifestHash,
payloadHash: payloadHash,
mediaType: request.mediaType,
sizeBytes: request.payloadBytes.length,
provenance: request.provenance,
};
const artifactHash = byteHash(new TextEncoder().encode(JSON.stringify(manifestObj)));
if (artifacts.has(artifactHash)) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-03",
message: `artifact ${artifactHash} is already published — artifacts are immutable`,
};
}
const artifact: CapabilityArtifactV1 = {
schema: "werkstatt/capability-artifact@1",
artifactHash,
manifestHash,
payloadHash,
mediaType: request.mediaType,
sizeBytes: request.payloadBytes.length,
provenance: request.provenance,
};
artifacts.set(artifactHash, artifact);
payloadStore.set(artifactHash, request.payloadBytes);
return { ok: true, artifact };
},
get(artifactHash: Sha256Digest): CapabilityArtifactV1 | null {
return artifacts.get(artifactHash) ?? null;
},
verify(artifactHash: Sha256Digest, expectedBytes: Uint8Array): ArtifactVerifyOutcomeV1 {
const artifact = artifacts.get(artifactHash);
if (!artifact) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-04",
message: `artifact ${artifactHash} not found`,
};
}
const storedBytes = payloadStore.get(artifactHash);
if (!storedBytes) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-04",
message: `artifact ${artifactHash} payload missing from store`,
};
}
const expectedHash = byteHash(expectedBytes);
if (expectedHash !== artifact.payloadHash) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-05",
message: `payload hash mismatch: expected ${artifact.payloadHash}, got ${expectedHash}`,
};
}
return { ok: true, verified: true };
},
list(): readonly Sha256Digest[] {
return [...artifacts.keys()] as Sha256Digest[];
},
};
}
export interface SandboxProviderAdmissionV1 {
schema: "werkstatt/sandbox-provider-admission@1";
adapterId: string;
adapterVersion: string;
conformanceHash: Sha256Digest;
policyHash: Sha256Digest;
decision: "pass" | "fail" | "incomplete";
}
export interface ProviderAdmissionStoreV1 {
admit(admission: SandboxProviderAdmissionV1): ProviderAdmitOutcomeV1;
get(adapterId: string): SandboxProviderAdmissionV1 | null;
isAdmitted(adapterId: string): boolean;
}
export interface ProviderAdmitResultV1 {
ok: true;
admitted: true;
}
export interface ProviderAdmitFailureV1 {
ok: false;
ruleId: "CERT-ARTIFACT-06" | "CERT-ARTIFACT-07";
message: string;
}
export type ProviderAdmitOutcomeV1 = ProviderAdmitResultV1 | ProviderAdmitFailureV1;
export function createProviderAdmissionStore(): ProviderAdmissionStoreV1 {
const admissions = new Map();
return {
admit(admission: SandboxProviderAdmissionV1): ProviderAdmitOutcomeV1 {
if (admission.decision !== "pass") {
return {
ok: false,
ruleId: "CERT-ARTIFACT-06",
message: `adapter "${admission.adapterId}" admission decision is "${admission.decision}" — only "pass" is admitted`,
};
}
const existing = admissions.get(admission.adapterId);
if (existing && existing.conformanceHash !== admission.conformanceHash) {
return {
ok: false,
ruleId: "CERT-ARTIFACT-07",
message: `adapter "${admission.adapterId}" conformance hash changed — stale evidence is not admitted`,
};
}
admissions.set(admission.adapterId, admission);
return { ok: true, admitted: true };
},
get(adapterId: string): SandboxProviderAdmissionV1 | null {
return admissions.get(adapterId) ?? null;
},
isAdmitted(adapterId: string): boolean {
const admission = admissions.get(adapterId);
return admission !== null && admission !== undefined && admission.decision === "pass";
},
};
}
export interface CapabilityInvocationV1 {
schema: "werkstatt/capability-invocation@1";
artifactHash: Sha256Digest;
grantSetHash: Sha256Digest;
inputHash: Sha256Digest;
limits: WorkloadLimitsV1;
idempotencyKey: string;
}