/** * RFC 8785 (JCS) canonical JSON utility — kept as a UX / diagnostic helper. * * **As of v1.34, the gateway is authoritative for the deploy manifest * digest.** `POST /apply/v1/plans` returns the gateway-computed digest in * the response, and operation idempotency keys on it (combined with * `project_id`, `base_release_id`, and an optional client idempotency key). * A drift between this implementation and the gateway's canonicalize * therefore SHALL NOT silently break idempotency — retries still find the * existing plan because the lookup uses the gateway-computed value. * * This module remains exported so callers can still produce a stable local * digest for caching or debugging output. New code should treat the local * digest as advisory. * * Spec for our value domain: * - object keys sorted ASCII-ascending * - arrays comma-separated, no whitespace * - strings/numbers via JSON.stringify (matches RFC 8785 for ASCII paths, * hex sha256, integer sizes, ASCII content_types) */ export interface ManifestEntry { path: string; sha256: string; size: number; content_type: string; } export interface Manifest { files: ManifestEntry[]; } export declare function canonicalizeJson(value: unknown): string; /** * Build the canonical manifest object the gateway hashes: `{ files: [...] }` * with entries sorted by path and only the four expected keys per entry. * `content_type` defaults to `"application/octet-stream"` when absent. */ export declare function buildCanonicalManifest(entries: Array<{ path: string; sha256: string; size: number; content_type?: string; }>): Manifest; /** * Compute the hex SHA-256 of the canonical JSON encoding of a manifest. * Matches the gateway's `computeManifestDigest`. */ export declare function computeManifestDigest(manifest: Manifest): Promise; //# sourceMappingURL=canonicalize.d.ts.map