export type Vec3 = [number, number, number]; export type Bounds = { min: Vec3; max: Vec3; }; /** * Explicit recipient-rights statement for a converted source. Helsinki's CC BY * terms are one instance of this shape, not the shape itself: a pack-agnostic * importer must let non-CC-BY sources declare their own open license without * false-failing on a literal string comparison. */ export type SourceRights = { /** Slug form of the license class, e.g. 'open-cc-by', 'open-cc0', 'open-mit'. */ licenseClass: string; accessControlChangesLicense: false; additionalRestrictions: string; drm: 'not-permitted'; }; export type SourceConversionReceipt = { schemaVersion: 'helix.scene-source-conversion/1'; sourceId: string; originalSha256: string; attribution: { license: string; licenseUrl: string; creator: string; title: string; url: string; citation?: string; changes: string; }; rights: SourceRights; sourceCrs: string | null; sourceOrigin: Vec3; conversion: { geometry: string; materials: string; normalMaps: string; orm: string; }; unsupported: string[]; }; export type CompiledSceneArtifact = { filename: string; bytes: Buffer; contentSha256: string; bounds: Bounds; summary: { triangles: number; materials: number; textures: number; nodes: number; }; /** * Where a player can actually stand in this geometry, probed against the real * triangles. Only the artifact that also backs collision carries one. */ spawn?: { position: Vec3; groundY: number; rejectedCandidates: number; }; }; export declare function assertFiniteVec3(value: Vec3, label: string): void; /** Derives the receipt rights block from a license string, e.g. 'CC BY 4.0' → 'open-cc-by'. */ export declare function sourceRightsForLicense(license: string): SourceRights; export declare function assertSourceRights(rights: SourceRights): void; /** * The ONE way a Scene v2 document is turned into bytes. * * Compact, no indent. This is not a style choice: the server enforces a 1 MiB * cap on the Scene document's FILE bytes, and pretty-printing at two spaces is * 52% of the file. Measured on the Pacifica mall exterior — the same 842-node * document is 1,422,213 B indented and 678,160 B compact, so the indent alone * decided whether the world could be published at all, and it halved the * placement ceiling everyone was sizing groups against (805 B/placement, not * 1,576). Nothing is lost: `integrity.sha256` is RFC 8785 canonical over the * PARSED object (canonicalSceneDocumentPayload deletes `integrity`, then * canonicalizes), so whitespace was never in the hash and a compact document * verifies identically. * * Keep every scene write going through here, and keep it compact. */ export declare function serializeSceneDocument(scene: unknown): string;