@game_engine/scene 0.1.0-alpha
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/dist/index.d.ts +381 -0
- package/dist/index.js +3996 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { existsSync, statSync } from \"node:fs\";\r\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport Ajv, { type ErrorObject, type ValidateFunction } from \"ajv\";\r\nimport { parse, stringify } from \"yaml\";\r\nimport {\r\n assetManifestSchema,\r\n componentFieldOrder,\r\n componentOrder,\r\n componentSchemas,\r\n generatedMapSchema,\r\n mapGenerationConfigSchema,\r\n patchSchema,\r\n prefabSchema,\r\n projectSchema,\r\n sceneSchema,\r\n supportedPatchOperations,\r\n type AddComponentOperation,\r\n type AddEntityOperation,\r\n type AddAnimationFrameOperation,\r\n type AnimationFrameUpdate,\r\n type AssetDefinition,\r\n type AssetManifestDocument,\r\n type ClearParentOperation,\r\n type DuplicateEntityOperation,\r\n type GeneratedMapDocument,\r\n type GeneratedMapEntity,\r\n type MapGenerationConfigDocument,\r\n type MapPrefabRef,\r\n type MapPrefabRole,\r\n type InstantiatePrefabOperation,\r\n type PatchDocument,\r\n type PatchOperation,\r\n type PrefabDocument,\r\n type ProjectDocument,\r\n type RemoveComponentOperation,\r\n type RemoveEntityOperation,\r\n type RemoveAnimationFrameOperation,\r\n type RenameEntityAtSourceOperation,\r\n type RenameEntityOperation,\r\n type ReplaceReferenceOperation,\r\n type SceneDocument,\r\n type SceneEntity,\r\n type SetComponentFieldOperation,\r\n type SetAnimatorClipOperation,\r\n type SetParentOperation,\r\n type SpriteFrame,\r\n type UpdateComponentOperation,\r\n type UpdateAnimationFrameOperation\r\n} from \"@game_engine/contracts\";\r\n\r\nexport {\r\n assetManifestSchema,\r\n componentSchemas,\r\n generatedMapSchema,\r\n mapGenerationConfigSchema,\r\n patchSchema,\r\n prefabSchema,\r\n projectSchema,\r\n sceneSchema\r\n} from \"@game_engine/contracts\";\r\n\r\nexport type {\r\n AddAnimationFrameOperation,\r\n AddComponentOperation,\r\n AddEntityOperation,\r\n AnimationFrameUpdate,\r\n AssetDefinition,\r\n AssetManifestDocument,\r\n ClearParentOperation,\r\n DuplicateEntityOperation,\r\n GeneratedMapDocument,\r\n GeneratedMapEntity,\r\n InstantiatePrefabOperation,\r\n MapGenerationConfigDocument,\r\n MapPrefabRef,\r\n MapPrefabRole,\r\n PatchDocument,\r\n PatchOperation,\r\n PrefabDocument,\r\n ProjectDocument,\r\n RemoveAnimationFrameOperation,\r\n RemoveComponentOperation,\r\n RemoveEntityOperation,\r\n RenameEntityAtSourceOperation,\r\n RenameEntityOperation,\r\n ReplaceReferenceOperation,\r\n SceneDocument,\r\n SceneEntity,\r\n SetAnimatorClipOperation,\r\n SetComponentFieldOperation,\r\n SetParentOperation,\r\n SpriteFrame,\r\n UpdateAnimationFrameOperation,\r\n UpdateComponentOperation\r\n} from \"@game_engine/contracts\";\r\n\r\nexport type DiagnosticSeverity = \"error\" | \"warning\";\r\n\r\nexport interface Diagnostic {\r\n severity: DiagnosticSeverity;\r\n code: string;\r\n file: string;\r\n path: string;\r\n message: string;\r\n suggestion?: string;\r\n}\r\n\r\nexport interface ValidationResult<TDocument = unknown> {\r\n file: string;\r\n document?: TDocument;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface SceneInspection {\r\n scenePath: string;\r\n name: string;\r\n entityCount: number;\r\n hierarchy: SceneHierarchySummary;\r\n animations: SceneAnimationSummary;\r\n assets: SceneAssetSummary;\r\n entities: Array<{\r\n id: string;\r\n prefab?: string;\r\n components: string[];\r\n overrides?: string[];\r\n parent?: string;\r\n children: string[];\r\n worldTransform?: TransformSummary;\r\n }>;\r\n}\r\n\r\nexport interface EntityInspection {\r\n scenePath: string;\r\n entity: SceneEntity;\r\n hierarchy: EntityHierarchySummary;\r\n}\r\n\r\nexport interface ProjectInspection {\r\n projectPath: string;\r\n rootPath: string;\r\n name?: string;\r\n defaultScene?: string;\r\n scenes: Array<{\r\n path: string;\r\n name?: string;\r\n entityCount?: number;\r\n }>;\r\n assetManifests: Array<{\r\n path: string;\r\n assetCount?: number;\r\n }>;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface AssetManifestInspection {\r\n assetManifestPath: string;\r\n assetManifest?: string;\r\n assetCount: number;\r\n assetsByType: Record<string, number>;\r\n assets: Array<{\n id: string;\n type: string;\n path: string;\n texture?: string;\n rect?: [number, number, number, number];\n atlas?: string;\n frame?: string;\n frameCount?: number;\n frames?: Array<{\n id: string;\n rect: [number, number, number, number];\n }>;\n }>;\n}\n\r\nexport interface PrefabInspection {\r\n prefabPath: string;\r\n prefab: string;\r\n components: string[];\r\n}\r\n\r\nexport interface FormatResult {\r\n files: string[];\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface EntityReference {\r\n entityId: string;\r\n component: string;\r\n field: string;\r\n path: string;\r\n value: string;\r\n}\r\n\r\nexport interface HierarchyNodeSummary {\r\n entityId: string;\r\n parent?: string;\r\n children: string[];\r\n depth: number;\r\n}\r\n\r\nexport interface SceneHierarchySummary {\r\n roots: string[];\r\n nodes: HierarchyNodeSummary[];\r\n}\r\n\r\nexport interface AnimationClipSummary {\r\n id: string;\r\n entityId: string;\r\n frameCount: number;\r\n durationFrames: number;\r\n fps?: number;\r\n frameOrder?: string[];\r\n orderedFrameIds: string[];\r\n spriteAssetIds: string[];\r\n frames: AnimationFrameSummary[];\r\n}\r\n\r\nexport interface AnimationFrameSummary {\r\n id: string;\r\n durationFrames: number;\r\n order: number;\r\n playbackOrder: number;\r\n sprite?: string;\r\n rect?: [number, number, number, number];\r\n assetResolved?: boolean;\r\n assetType?: string;\r\n assetPath?: string;\n texture?: string;\n assetRect?: [number, number, number, number];\n assetAtlas?: string;\n assetFrame?: string;\n assetFrameRect?: [number, number, number, number];\n}\n\r\nexport interface AnimatorSummary {\r\n entityId: string;\r\n clips: string[];\r\n defaultClip?: string;\r\n currentClip: string;\r\n activeClip?: string;\r\n activeFrameId?: string;\r\n currentFrameIndex?: number;\r\n elapsedFrames?: number;\r\n elapsedSeconds?: number;\r\n}\r\n\r\nexport interface SceneAnimationSummary {\r\n clips: AnimationClipSummary[];\r\n animators: AnimatorSummary[];\r\n}\r\n\r\nexport interface SceneAssetReferenceSummary {\r\n assetId: string;\r\n expectedType: string;\r\n path: string;\r\n entityId: string;\r\n component: string;\r\n field: string;\r\n resolved: boolean;\r\n actualType?: string;\r\n}\r\n\r\nexport interface SceneAssetSummary {\n manifestCount: number;\n assetCount: number;\n atlasCount: number;\n atlasFrameCount: number;\n referencedAssets: SceneAssetReferenceSummary[];\n unresolvedReferences: SceneAssetReferenceSummary[];\n}\n\r\nexport interface EntityHierarchySummary {\r\n parent?: string;\r\n children: string[];\r\n depth: number;\r\n worldTransform?: TransformSummary;\r\n}\r\n\r\nexport interface TransformSummary {\r\n position: [number, number];\r\n rotation: number;\r\n scale: [number, number];\r\n}\r\n\r\nexport interface HierarchyDerivation {\r\n roots: string[];\r\n childrenByEntityId: Record<string, string[]>;\r\n parentByEntityId: Record<string, string>;\r\n depthByEntityId: Record<string, number>;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface WorldTransformResult {\r\n transforms: Record<string, TransformSummary>;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface ReferenceChange extends EntityReference {\r\n from: string;\r\n to: string;\r\n}\r\n\r\nexport interface PatchApplicationSummary {\r\n changedReferences: ReferenceChange[];\r\n}\r\n\r\nexport interface PatchApplicationResult {\r\n patchPath: string;\r\n scenePath?: string;\r\n diagnostics: Diagnostic[];\r\n changed: boolean;\r\n summary?: PatchApplicationSummary;\r\n}\r\n\r\nexport interface AssetRecord {\n id: string;\n type: string;\n path: string;\n texture?: string;\n rect?: [number, number, number, number];\n atlas?: string;\n frame?: string;\n frames?: AssetAtlasFrameRecord[];\n manifestFile: string;\n dataPath: string;\n}\n\nexport interface AssetAtlasFrameRecord {\n id: string;\n rect: [number, number, number, number];\n dataPath: string;\n}\n\r\nexport interface AssetManifestContext {\r\n manifestFiles: string[];\r\n assets: AssetDefinition[];\r\n assetsById: Map<string, AssetRecord>;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface ProjectAssetManifestLoadResult {\r\n projectFile: string;\r\n rootPath: string;\r\n manifestFiles: string[];\r\n assets: AssetDefinition[];\r\n assetsById: Map<string, AssetRecord>;\r\n diagnostics: Diagnostic[];\r\n}\r\n\r\nexport interface MapGenerationSummary {\r\n generator: \"procedural-map-v0\";\r\n seed: number;\r\n width: number;\r\n height: number;\r\n platformCount: number;\r\n enemyCount: number;\r\n entityCount: number;\r\n configHash: string;\r\n}\r\n\r\nexport interface MapGenerationResult {\r\n configPath: string;\r\n diagnostics: Diagnostic[];\r\n config?: MapGenerationConfigDocument;\r\n map?: GeneratedMapDocument;\r\n scene?: SceneDocument;\r\n summary?: MapGenerationSummary;\r\n}\r\n\r\nexport interface MapGenerationFileResult extends MapGenerationResult {\r\n outPath?: string;\r\n mapOutPath?: string;\r\n}\r\n\r\ninterface SceneAssetReference {\r\n assetId: string;\r\n expectedType: string;\r\n path: string;\r\n entityId: string;\r\n component: string;\r\n field: string;\r\n}\r\n\r\nconst componentReferenceFields: Record<string, string[]> = {\r\n CharacterController: [\"groundEntityId\", \"targetEntityId\"],\r\n CameraFollow: [\"target\"],\r\n Camera3D: [\"targetEntityId\"],\r\n GroundedState: [\"groundEntityId\"],\r\n Parent: [\"entityId\"]\r\n};\r\n\r\nconst ajv = new Ajv({ allErrors: true, strict: false });\r\nconst validateAssetManifestSchema = ajv.compile(assetManifestSchema);\r\nconst validateMapGenerationConfigSchema = ajv.compile(mapGenerationConfigSchema);\r\nconst validateGeneratedMapSchema = ajv.compile(generatedMapSchema);\r\nconst validateProjectSchema = ajv.compile(projectSchema);\r\nconst validateSceneSchema = ajv.compile(sceneSchema);\r\nconst validatePrefabSchema = ajv.compile(prefabSchema);\r\nconst validatePatchSchema = ajv.compile(patchSchema);\r\nconst componentValidators = Object.fromEntries(\r\n Object.entries(componentSchemas).map(([name, schema]) => [name, ajv.compile(schema)])\r\n) as Record<string, ValidateFunction>;\r\n\r\nexport function parseProjectSource(source: string, file = \"agent.project.yml\"): ValidationResult<ProjectDocument> {\r\n return parseYamlSource<ProjectDocument>(source, file);\r\n}\r\n\r\nexport function parseSceneSource(source: string, file = \"scene.yml\"): ValidationResult<SceneDocument> {\r\n return parseYamlSource<SceneDocument>(source, file);\r\n}\r\n\r\nexport function parsePrefabSource(source: string, file = \"prefab.yml\"): ValidationResult<PrefabDocument> {\r\n return parseYamlSource<PrefabDocument>(source, file);\r\n}\r\n\r\nexport function parseAssetManifestSource(\r\n source: string,\r\n file = \"agent.assets.yml\"\r\n): ValidationResult<AssetManifestDocument> {\r\n return parseYamlSource<AssetManifestDocument>(source, file);\r\n}\r\n\r\nexport function parseMapGenerationConfigSource(\r\n source: string,\r\n file = \"map.yml\"\r\n): ValidationResult<MapGenerationConfigDocument> {\r\n return parseYamlSource<MapGenerationConfigDocument>(source, file);\r\n}\r\n\r\nexport function parseGeneratedMapSource(source: string, file = \"generated-map.yml\"): ValidationResult<GeneratedMapDocument> {\r\n return parseYamlSource<GeneratedMapDocument>(source, file);\r\n}\r\n\r\nexport function parsePatchSource(source: string, file = \"patch.json\"): ValidationResult<PatchDocument> {\r\n try {\r\n const document =\r\n path.extname(file).toLowerCase() === \".json\" ? JSON.parse(source) : (parse(source) as PatchDocument);\r\n\r\n if (document === null || document === undefined) {\r\n return {\r\n file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_EMPTY_DOCUMENT\",\r\n file,\r\n path: \"$\",\r\n message: \"Patch document is empty.\",\r\n suggestion: \"Add version, target, and operations before applying the patch.\"\r\n }\r\n ]\r\n };\r\n }\r\n\r\n return {\r\n file,\r\n document: document as PatchDocument,\r\n diagnostics: []\r\n };\r\n } catch (error) {\r\n return {\r\n file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_PARSE_ERROR\",\r\n file,\r\n path: \"$\",\r\n message: error instanceof Error ? error.message : String(error),\r\n suggestion: \"Fix the patch JSON or YAML syntax before applying it.\"\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\nexport async function loadProjectFile(\r\n projectPath = \".\",\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<ProjectDocument>> {\r\n const file = resolveProjectFile(projectPath, options.cwd);\r\n return loadYamlFile<ProjectDocument>(file);\r\n}\r\n\r\nexport async function loadSceneFile(\r\n scenePath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<SceneDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), scenePath);\r\n return loadYamlFile<SceneDocument>(file);\r\n}\r\n\r\nexport async function loadPrefabFile(\r\n prefabPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<PrefabDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), prefabPath);\r\n return loadYamlFile<PrefabDocument>(file);\r\n}\r\n\r\nexport async function loadAssetManifestFile(\r\n assetManifestPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<AssetManifestDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), assetManifestPath);\r\n return loadYamlFile<AssetManifestDocument>(file);\r\n}\r\n\r\nexport async function loadMapGenerationConfigFile(\r\n configPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<MapGenerationConfigDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), configPath);\r\n return loadYamlFile<MapGenerationConfigDocument>(file);\r\n}\r\n\r\nexport async function loadGeneratedMapFile(\r\n generatedMapPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<GeneratedMapDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), generatedMapPath);\r\n return loadYamlFile<GeneratedMapDocument>(file);\r\n}\r\n\r\nexport async function loadPatchFile(\r\n patchPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<PatchDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), patchPath);\r\n try {\r\n const source = await readFile(file, \"utf8\");\r\n return parsePatchSource(source, file);\r\n } catch (error) {\r\n return {\r\n file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"FILE_READ_FAILED\",\r\n file,\r\n path: \"$\",\r\n message: error instanceof Error ? error.message : String(error),\r\n suggestion: \"Check that the patch path exists and is readable.\"\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\nexport function validateProjectDocument(project: unknown, file = \"agent.project.yml\"): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(validateProjectSchema, project, file, \"PROJECT_SCHEMA_INVALID\");\r\n\r\n if (isRecord(project) && Array.isArray(project.scenes) && typeof project.defaultScene === \"string\") {\r\n if (!project.scenes.includes(project.defaultScene)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PROJECT_DEFAULT_SCENE_MISSING\",\r\n file,\r\n path: \"$.defaultScene\",\r\n message: `Default scene '${project.defaultScene}' is not listed in scenes.`,\r\n suggestion: \"Add the default scene path to the scenes array.\"\r\n });\r\n }\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nexport function validateAssetManifestDocument(\r\n assetManifest: unknown,\r\n file = \"agent.assets.yml\"\r\n): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(\r\n validateAssetManifestSchema,\r\n assetManifest,\r\n file,\r\n \"ASSET_MANIFEST_SCHEMA_INVALID\"\r\n );\r\n\r\n if (!isRecord(assetManifest) || !Array.isArray(assetManifest.assets)) {\r\n return diagnostics;\r\n }\r\n\r\n const assetsById = new Map<\n string,\n {\n type: string;\n path: string;\n dataPath: string;\n texture?: string;\n atlas?: string;\n frame?: string;\n frames?: AssetAtlasFrameRecord[];\n }\n >();\n assetManifest.assets.forEach((asset, index) => {\n const assetPath = `$.assets[${index}]`;\n if (!isRecord(asset)) {\n return;\n }\n\n if (typeof asset.type === \"string\" && ![\"texture\", \"sprite\", \"atlas\", \"audio\", \"font\"].includes(asset.type)) {\n diagnostics.push({\n severity: \"error\",\n code: \"ASSET_UNKNOWN_TYPE\",\n file,\n path: `${assetPath}.type`,\n message: `Unknown asset type '${asset.type}'.`,\n suggestion: \"Use one of: texture, sprite, atlas, audio, font.\"\n });\n }\n\r\n if (typeof asset.path === \"string\" && !isPortableAssetPath(asset.path)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"ASSET_PATH_INVALID\",\r\n file,\r\n path: `${assetPath}.path`,\r\n message: `Asset path '${asset.path}' is not a portable project-relative path.`,\r\n suggestion: \"Use a relative path with forward slashes, no drive letters, no leading slash, and no '..' segments.\"\r\n });\r\n }\r\n\r\n if (asset.type === \"sprite\" && Object.prototype.hasOwnProperty.call(asset, \"rect\")) {\n diagnostics.push(...validateAssetRectMetadata(asset.rect, file, `${assetPath}.rect`, String(asset.id)));\n }\n\n if (asset.type === \"atlas\" && Array.isArray(asset.frames)) {\n diagnostics.push(...validateAtlasFramesMetadata(asset.frames, file, `${assetPath}.frames`, String(asset.id)));\n }\n\r\n if (typeof asset.id !== \"string\") {\r\n return;\r\n }\r\n\r\n if (assetsById.has(asset.id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"ASSET_DUPLICATE_ID\",\r\n file,\r\n path: `${assetPath}.id`,\r\n message: `Duplicate asset id '${asset.id}'.`,\r\n suggestion: \"Give every asset one unique stable id and update references to the chosen id.\"\r\n });\r\n return;\r\n }\r\n\r\n if (typeof asset.type === \"string\" && typeof asset.path === \"string\") {\n const record = {\n type: asset.type,\n path: asset.path,\n dataPath: assetPath,\n ...(typeof asset.texture === \"string\" ? { texture: asset.texture } : {}),\n ...(typeof asset.atlas === \"string\" ? { atlas: asset.atlas } : {}),\n ...(typeof asset.frame === \"string\" ? { frame: asset.frame } : {}),\n ...(asset.type === \"atlas\" && Array.isArray(asset.frames)\n ? { frames: readAtlasFrameRecords(asset.frames, `${assetPath}.frames`) }\n : {})\n };\n assetsById.set(asset.id, record);\n }\n });\n\n assetManifest.assets.forEach((asset, index) => {\n if (!isRecord(asset) || typeof asset.id !== \"string\" || typeof asset.type !== \"string\") {\n return;\n }\n\n const assetPath = `$.assets[${index}]`;\n\n if (asset.type === \"sprite\") {\n if (typeof asset.texture === \"string\") {\n diagnostics.push(\n ...validateAssetReferenceToType({\n assetsById,\n file,\n path: `${assetPath}.texture`,\n assetId: asset.id,\n referencedId: asset.texture,\n expectedType: \"texture\",\n missingCode: \"ASSET_BROKEN_REFERENCE\",\n mismatchCode: \"ASSET_TYPE_MISMATCH\",\n ownerType: \"Sprite asset\",\n suggestion: \"Point SpriteAsset.texture to a texture asset id or remove the texture reference.\"\n })\n );\n }\n\n diagnostics.push(...validateSpriteAtlasFrameReference(asset, assetsById, file, assetPath));\n return;\n }\n\n if (asset.type === \"atlas\" && typeof asset.texture === \"string\") {\n diagnostics.push(\n ...validateAssetReferenceToType({\n assetsById,\n file,\n path: `${assetPath}.texture`,\n assetId: asset.id,\n referencedId: asset.texture,\n expectedType: \"texture\",\n missingCode: \"ASSET_ATLAS_TEXTURE_REFERENCE_UNRESOLVED\",\n mismatchCode: \"ASSET_ATLAS_TEXTURE_TYPE_MISMATCH\",\n ownerType: \"Atlas asset\",\n suggestion: \"Point atlas.texture to a texture asset id or remove the source texture reference.\"\n })\n );\n }\n });\n\r\n return diagnostics;\r\n}\r\n\r\nfunction validateAssetRectMetadata(rect: unknown, file: string, dataPath: string, assetId: string): Diagnostic[] {\n if (!Array.isArray(rect) || rect.length !== 4) {\n return [\n {\r\n severity: \"error\",\r\n code: \"ASSET_RECT_INVALID\",\r\n file,\r\n path: dataPath,\r\n message: `Sprite asset '${assetId}' rect must be [x, y, width, height].`,\r\n suggestion: \"Use four finite numbers and keep width and height greater than zero.\"\r\n }\r\n ];\r\n }\r\n\r\n const invalidIndex = rect.findIndex((value) => typeof value !== \"number\" || !Number.isFinite(value));\r\n if (invalidIndex !== -1) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"ASSET_RECT_INVALID\",\r\n file,\r\n path: `${dataPath}[${invalidIndex}]`,\r\n message: `Sprite asset '${assetId}' rect value at index ${invalidIndex} must be a finite number.`,\r\n suggestion: \"Use numeric [x, y, width, height] atlas planning metadata.\"\r\n }\r\n ];\r\n }\r\n\r\n const [, , width, height] = rect;\r\n if (width <= 0 || height <= 0) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"ASSET_RECT_INVALID\",\r\n file,\r\n path: width <= 0 ? `${dataPath}[2]` : `${dataPath}[3]`,\r\n message: `Sprite asset '${assetId}' rect width and height must be greater than zero.`,\r\n suggestion: \"Use positive width and height values. No atlas slicing is performed from this metadata.\"\r\n }\r\n ];\r\n }\r\n\n return [];\n}\n\nfunction validateAtlasFramesMetadata(\n frames: unknown[],\n file: string,\n dataPath: string,\n atlasId: string\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const frameIds = new Map<string, string>();\n\n frames.forEach((frame, index) => {\n const framePath = `${dataPath}[${index}]`;\n if (!isRecord(frame)) {\n return;\n }\n\n if (typeof frame.id === \"string\") {\n const existingPath = frameIds.get(frame.id);\n if (existingPath) {\n diagnostics.push({\n severity: \"error\",\n code: \"ASSET_ATLAS_DUPLICATE_FRAME_ID\",\n file,\n path: `${framePath}.id`,\n message: `Atlas asset '${atlasId}' defines duplicate frame id '${frame.id}'.`,\n suggestion: `Keep one '${frame.id}' frame in this atlas. First occurrence is at ${existingPath}.`\n });\n } else {\n frameIds.set(frame.id, `${framePath}.id`);\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(frame, \"rect\")) {\n diagnostics.push(...validateAtlasFrameRectMetadata(frame.rect, file, `${framePath}.rect`, atlasId, String(frame.id)));\n }\n });\n\n return diagnostics;\n}\n\nfunction validateAtlasFrameRectMetadata(\n rect: unknown,\n file: string,\n dataPath: string,\n atlasId: string,\n frameId: string\n): Diagnostic[] {\n if (!Array.isArray(rect) || rect.length !== 4) {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_FRAME_RECT_INVALID\",\n file,\n path: dataPath,\n message: `Atlas frame '${frameId}' in atlas '${atlasId}' rect must be [x, y, width, height].`,\n suggestion: \"Use four finite numbers and keep width and height greater than zero.\"\n }\n ];\n }\n\n const invalidIndex = rect.findIndex((value) => typeof value !== \"number\" || !Number.isFinite(value));\n if (invalidIndex !== -1) {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_FRAME_RECT_INVALID\",\n file,\n path: `${dataPath}[${invalidIndex}]`,\n message: `Atlas frame '${frameId}' in atlas '${atlasId}' rect value at index ${invalidIndex} must be a finite number.`,\n suggestion: \"Use numeric [x, y, width, height] atlas metadata.\"\n }\n ];\n }\n\n const [, , width, height] = rect;\n if (width <= 0 || height <= 0) {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_FRAME_RECT_INVALID\",\n file,\n path: width <= 0 ? `${dataPath}[2]` : `${dataPath}[3]`,\n message: `Atlas frame '${frameId}' in atlas '${atlasId}' rect width and height must be greater than zero.`,\n suggestion: \"Use positive width and height values. No atlas slicing is performed from this metadata.\"\n }\n ];\n }\n\n return [];\n}\n\nfunction readAtlasFrameRecords(frames: unknown[], dataPath: string): AssetAtlasFrameRecord[] {\n return frames.flatMap((frame, index): AssetAtlasFrameRecord[] => {\n if (!isRecord(frame) || typeof frame.id !== \"string\") {\n return [];\n }\n\n const rect = readRectTuple(frame.rect);\n if (!rect) {\n return [];\n }\n\n return [\n {\n id: frame.id,\n rect,\n dataPath: `${dataPath}[${index}]`\n }\n ];\n });\n}\n\nfunction validateAssetReferenceToType(input: {\n assetsById: Map<string, { type: string; dataPath: string }>;\n file: string;\n path: string;\n assetId: string;\n referencedId: string;\n expectedType: string;\n missingCode: string;\n mismatchCode: string;\n ownerType: string;\n suggestion: string;\n}): Diagnostic[] {\n const referenced = input.assetsById.get(input.referencedId);\n if (!referenced) {\n return [\n {\n severity: \"error\",\n code: input.missingCode,\n file: input.file,\n path: input.path,\n message: `${input.ownerType} '${input.assetId}' references missing ${input.expectedType} asset '${input.referencedId}'.`,\n suggestion: input.suggestion\n }\n ];\n }\n\n if (referenced.type !== input.expectedType) {\n return [\n {\n severity: \"error\",\n code: input.mismatchCode,\n file: input.file,\n path: input.path,\n message: `${input.ownerType} '${input.assetId}' references '${input.referencedId}', but it is '${referenced.type}', not '${input.expectedType}'.`,\n suggestion: input.suggestion\n }\n ];\n }\n\n return [];\n}\n\nfunction validateSpriteAtlasFrameReference(\n asset: Record<string, unknown>,\n assetsById: Map<string, { type: string; frames?: AssetAtlasFrameRecord[] }>,\n file: string,\n assetPath: string\n): Diagnostic[] {\n const hasAtlas = typeof asset.atlas === \"string\";\n const hasFrame = typeof asset.frame === \"string\";\n if (!hasAtlas && !hasFrame) {\n return [];\n }\n\n if (!hasAtlas || !hasFrame) {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_FRAME_REFERENCE_INCOMPLETE\",\n file,\n path: hasAtlas ? `${assetPath}.frame` : `${assetPath}.atlas`,\n message: `Sprite asset '${String(asset.id)}' must set both atlas and frame when referencing atlas metadata.`,\n suggestion: \"Set atlas to an atlas asset id and frame to a frame id inside that atlas.\"\n }\n ];\n }\n\n const atlas = assetsById.get(String(asset.atlas));\n if (!atlas) {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_REFERENCE_UNRESOLVED\",\n file,\n path: `${assetPath}.atlas`,\n message: `Sprite asset '${String(asset.id)}' references missing atlas asset '${String(asset.atlas)}'.`,\n suggestion: \"Add the atlas asset or update SpriteAsset.atlas to an existing atlas id.\"\n }\n ];\n }\n\n if (atlas.type !== \"atlas\") {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_REFERENCE_TYPE_MISMATCH\",\n file,\n path: `${assetPath}.atlas`,\n message: `Sprite asset '${String(asset.id)}' references '${String(asset.atlas)}', but it is '${atlas.type}', not 'atlas'.`,\n suggestion: \"Point SpriteAsset.atlas to an atlas asset id.\"\n }\n ];\n }\n\n const frame = atlas.frames?.find((candidate) => candidate.id === asset.frame);\n if (!frame) {\n return [\n {\n severity: \"error\",\n code: \"ASSET_ATLAS_FRAME_REFERENCE_UNRESOLVED\",\n file,\n path: `${assetPath}.frame`,\n message: `Sprite asset '${String(asset.id)}' references missing frame '${String(asset.frame)}' in atlas '${String(asset.atlas)}'.`,\n suggestion: \"Use a frame id defined in the referenced atlas asset.\"\n }\n ];\n }\n\n return [];\n}\n\r\nexport function validateMapGenerationConfigDocument(\r\n config: unknown,\r\n file = \"map.yml\"\r\n): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(\r\n validateMapGenerationConfigSchema,\r\n config,\r\n file,\r\n \"MAP_CONFIG_SCHEMA_INVALID\"\r\n );\r\n\r\n if (!isRecord(config) || !Array.isArray(config.prefabRefs)) {\r\n return diagnostics;\r\n }\r\n\r\n const prefabRefIds = new Set<string>();\r\n for (const [index, prefabRef] of config.prefabRefs.entries()) {\r\n if (!isRecord(prefabRef)) {\r\n continue;\r\n }\r\n\r\n if (typeof prefabRef.id === \"string\") {\r\n if (prefabRefIds.has(prefabRef.id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_REF_DUPLICATE\",\r\n file,\r\n path: `$.prefabRefs[${index}].id`,\r\n message: `Duplicate prefab ref id '${prefabRef.id}'.`,\r\n suggestion: \"Use one stable prefab ref id once per map generation config.\"\r\n });\r\n }\r\n prefabRefIds.add(prefabRef.id);\r\n }\r\n\r\n if (typeof prefabRef.prefab === \"string\" && !isPortableSourcePath(prefabRef.prefab)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_PATH_INVALID\",\r\n file,\r\n path: `$.prefabRefs[${index}].prefab`,\r\n message: `Prefab path '${prefabRef.prefab}' is not a portable relative source path.`,\r\n suggestion: \"Use a relative path with forward slashes, no drive letters, no leading slash, and no '..' escape.\"\r\n });\r\n }\r\n }\r\n\r\n const platformCount = typeof config.platformCount === \"number\" ? config.platformCount : 0;\r\n const enemyCount = typeof config.enemyCount === \"number\" ? config.enemyCount : 0;\r\n const width = typeof config.width === \"number\" ? config.width : 0;\r\n const minPlatformSpacing = isRecord(config.constraints) && typeof config.constraints.minPlatformSpacing === \"number\"\r\n ? config.constraints.minPlatformSpacing\r\n : 0;\r\n const minEnemySpacing = isRecord(config.constraints) && typeof config.constraints.minEnemySpacing === \"number\"\r\n ? config.constraints.minEnemySpacing\r\n : 0;\r\n\r\n if (platformCount > 0 && !hasPrefabRole(config.prefabRefs, \"platform\")) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_ROLE_REQUIRED\",\r\n file,\r\n path: \"$.prefabRefs\",\r\n message: \"platformCount is greater than zero but no platform prefab ref exists.\",\r\n suggestion: \"Add a prefabRefs entry with role: platform.\"\r\n });\r\n }\r\n\r\n if (enemyCount > 0 && !hasPrefabRole(config.prefabRefs, \"enemy\")) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_ROLE_REQUIRED\",\r\n file,\r\n path: \"$.prefabRefs\",\r\n message: \"enemyCount is greater than zero but no enemy prefab ref exists.\",\r\n suggestion: \"Add a prefabRefs entry with role: enemy.\"\r\n });\r\n }\r\n\r\n if (enemyCount > 0 && platformCount === 0) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_CONSTRAINT_UNSATISFIABLE\",\r\n file,\r\n path: \"$.enemyCount\",\r\n message: \"Enemies require at least one generated platform in procedural-map-v0.\",\r\n suggestion: \"Increase platformCount or set enemyCount to 0.\"\r\n });\r\n }\r\n\r\n if (platformCount > 0 && width > 0 && platformCount + minPlatformSpacing * Math.max(platformCount - 1, 0) > width) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_CONSTRAINT_UNSATISFIABLE\",\r\n file,\r\n path: \"$.constraints.minPlatformSpacing\",\r\n message: \"Platform spacing constraints cannot fit within the requested width.\",\r\n suggestion: \"Reduce platformCount, reduce minPlatformSpacing, or increase width.\"\r\n });\r\n }\r\n\r\n if (enemyCount > 1 && width > 0 && enemyCount + minEnemySpacing * (enemyCount - 1) > width) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_CONSTRAINT_UNSATISFIABLE\",\r\n file,\r\n path: \"$.constraints.minEnemySpacing\",\r\n message: \"Enemy spacing constraints cannot fit within the requested width.\",\r\n suggestion: \"Reduce enemyCount, reduce minEnemySpacing, or increase width.\"\r\n });\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nexport function validateGeneratedMapDocument(map: unknown, file = \"generated-map.yml\"): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(validateGeneratedMapSchema, map, file, \"GENERATED_MAP_SCHEMA_INVALID\");\r\n\r\n if (!isRecord(map) || !isRecord(map.config) || !isRecord(map.stats) || !Array.isArray(map.entities)) {\r\n return diagnostics;\r\n }\r\n\r\n const configDiagnostics = validateMapGenerationConfigDocument(map.config, file).map((diagnostic) => ({\r\n ...diagnostic,\r\n path: diagnostic.path === \"$\" ? \"$.config\" : `$.config${diagnostic.path.slice(1)}`\r\n }));\r\n diagnostics.push(...configDiagnostics);\r\n\r\n const prefabRefs = Array.isArray(map.config.prefabRefs) ? (map.config.prefabRefs as unknown[]) : [];\r\n const prefabRefIds = new Set(\r\n prefabRefs.filter(isRecord).map((prefabRef) => prefabRef.id).filter((id): id is string => typeof id === \"string\")\r\n );\r\n let platformCount = 0;\r\n let enemyCount = 0;\r\n\r\n for (const [index, entity] of map.entities.entries()) {\r\n const entityPath = `$.entities[${index}]`;\r\n if (!isRecord(entity)) {\r\n continue;\r\n }\r\n\r\n if (typeof entity.prefabRef === \"string\" && !prefabRefIds.has(entity.prefabRef)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"GENERATED_MAP_PREFAB_REF_MISSING\",\r\n file,\r\n path: `${entityPath}.prefabRef`,\r\n message: `Generated entity references unknown prefab ref '${entity.prefabRef}'.`,\r\n suggestion: \"Regenerate the map from a config containing that prefab ref id.\"\r\n });\r\n }\r\n\r\n if (entity.role === \"platform\") {\r\n platformCount += 1;\r\n }\r\n if (entity.role === \"enemy\") {\r\n enemyCount += 1;\r\n }\r\n\r\n if (Array.isArray(entity.position) && typeof map.stats.width === \"number\" && typeof map.stats.height === \"number\") {\r\n const [x, y] = entity.position;\r\n if (typeof x === \"number\" && typeof y === \"number\" && (x < 0 || y < 0 || x >= map.stats.width || y >= map.stats.height)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"GENERATED_MAP_ENTITY_OUT_OF_BOUNDS\",\r\n file,\r\n path: `${entityPath}.position`,\r\n message: `Generated entity '${String(entity.id)}' is outside the map bounds.`,\r\n suggestion: \"Regenerate the map with valid constraints or adjust the dimensions.\"\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (typeof map.stats.platformCount === \"number\" && map.stats.platformCount !== platformCount) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"GENERATED_MAP_STATS_MISMATCH\",\r\n file,\r\n path: \"$.stats.platformCount\",\r\n message: `Generated map stats report ${map.stats.platformCount} platforms, but entities contain ${platformCount}.`,\r\n suggestion: \"Regenerate the map so stats match generated entities.\"\r\n });\r\n }\r\n\r\n if (typeof map.stats.enemyCount === \"number\" && map.stats.enemyCount !== enemyCount) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"GENERATED_MAP_STATS_MISMATCH\",\r\n file,\r\n path: \"$.stats.enemyCount\",\r\n message: `Generated map stats report ${map.stats.enemyCount} enemies, but entities contain ${enemyCount}.`,\r\n suggestion: \"Regenerate the map so stats match generated entities.\"\r\n });\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nexport function validatePatchDocument(patch: unknown, file = \"patch.json\"): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(validatePatchSchema, patch, file, \"PATCH_SCHEMA_INVALID\");\r\n\r\n if (!isRecord(patch) || !Array.isArray(patch.operations)) {\r\n return diagnostics;\r\n }\r\n\r\n patch.operations.forEach((operation, index) => {\r\n const operationPath = `$.operations[${index}]`;\r\n if (!isRecord(operation)) {\r\n return;\r\n }\r\n\r\n if (typeof operation.op === \"string\" && !supportedPatchOperations.includes(operation.op as PatchOperation[\"op\"])) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PATCH_UNKNOWN_OPERATION\",\r\n file,\r\n path: `${operationPath}.op`,\r\n message: `Unknown patch operation '${operation.op}'.`,\r\n suggestion: `Use one of: ${supportedPatchOperations.join(\", \")}.`\r\n });\r\n }\r\n\r\n if (\r\n (operation.op === \"add_component\" || operation.op === \"set_component_field\" || operation.op === \"update_component\") &&\r\n typeof operation.component === \"string\" &&\r\n !componentValidators[operation.component]\r\n ) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PATCH_UNKNOWN_COMPONENT\",\r\n file,\r\n path: `${operationPath}.component`,\r\n message: `Unknown component '${operation.component}'.`,\r\n suggestion: `Use one of: ${componentOrder.join(\", \")}.`\r\n });\r\n }\r\n\r\n if (operation.op === \"duplicate_entity\" && isRecord(operation.overrides)) {\r\n for (const componentName of Object.keys(operation.overrides)) {\r\n if (!componentValidators[componentName]) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PATCH_UNKNOWN_COMPONENT\",\r\n file,\r\n path: `${operationPath}.overrides.${componentName}`,\r\n message: `Unknown component '${componentName}'.`,\r\n suggestion: `Use one of: ${componentOrder.join(\", \")}.`\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n return diagnostics;\r\n}\r\n\r\nexport function validatePrefabDocument(prefab: unknown, file = \"prefab.yml\"): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(validatePrefabSchema, prefab, file, \"PREFAB_SCHEMA_INVALID\");\r\n\r\n if (!isRecord(prefab) || !isRecord(prefab.components)) {\r\n return diagnostics;\r\n }\r\n\r\n for (const [componentName, componentValue] of Object.entries(prefab.components)) {\r\n const componentPath = `$.components.${componentName}`;\r\n const componentValidator = componentValidators[componentName];\r\n\r\n if (!componentValidator) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PREFAB_UNKNOWN_COMPONENT\",\r\n file,\r\n path: componentPath,\r\n message: `Unknown component '${componentName}'.`,\r\n suggestion: `Use one of: ${componentOrder.join(\", \")}.`\r\n });\r\n continue;\r\n }\r\n\r\n diagnostics.push(\r\n ...schemaDiagnostics(componentValidator, componentValue, file, \"PREFAB_COMPONENT_INVALID\", componentPath)\r\n );\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nexport async function validatePrefabFile(\r\n prefabPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<PrefabDocument>> {\r\n const result = await loadPrefabFile(prefabPath, options);\r\n\r\n if (result.document !== undefined) {\r\n result.diagnostics.push(...validatePrefabDocument(result.document, result.file));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function validateAssetManifestFile(\r\n assetManifestPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<AssetManifestDocument>> {\r\n const result = await loadAssetManifestFile(assetManifestPath, options);\r\n\r\n if (result.document !== undefined) {\r\n result.diagnostics.push(...validateAssetManifestDocument(result.document, result.file));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function validateMapGenerationConfigFile(\r\n configPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<MapGenerationConfigDocument>> {\r\n const result = await loadMapGenerationConfigFile(configPath, options);\r\n\r\n if (result.document === undefined) {\r\n return result;\r\n }\r\n\r\n result.diagnostics.push(...validateMapGenerationConfigDocument(result.document, result.file));\r\n if (hasErrors(result.diagnostics)) {\r\n return result;\r\n }\r\n\r\n result.diagnostics.push(...(await validateMapPrefabRefs(result.document, result.file)));\r\n return result;\r\n}\r\n\r\nexport async function validateGeneratedMapFile(\r\n generatedMapPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<GeneratedMapDocument>> {\r\n const result = await loadGeneratedMapFile(generatedMapPath, options);\r\n\r\n if (result.document !== undefined) {\r\n result.diagnostics.push(...validateGeneratedMapDocument(result.document, result.file));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function loadProjectAssetManifests(\r\n projectPath = \".\",\r\n options: { cwd?: string } = {}\r\n): Promise<ProjectAssetManifestLoadResult> {\r\n const projectFile = resolveProjectFile(projectPath, options.cwd);\r\n const rootPath = path.dirname(projectFile);\r\n const projectResult = await loadProjectFile(projectFile);\r\n const diagnostics = [...projectResult.diagnostics];\r\n\r\n if (projectResult.document !== undefined) {\r\n diagnostics.push(...validateProjectDocument(projectResult.document, projectFile));\r\n }\r\n\r\n if (projectResult.document === undefined || hasErrors(diagnostics)) {\r\n return {\r\n projectFile,\r\n rootPath,\r\n manifestFiles: [],\r\n assets: [],\r\n assetsById: new Map(),\r\n diagnostics\r\n };\r\n }\r\n\r\n const context = await loadProjectAssetManifestContext(projectFile, projectResult.document);\r\n return {\r\n projectFile,\r\n rootPath,\r\n manifestFiles: context.manifestFiles,\r\n assets: context.assets,\r\n assetsById: context.assetsById,\r\n diagnostics: [...diagnostics, ...context.diagnostics]\r\n };\r\n}\r\n\r\nexport async function loadProjectAssetManifestContext(\r\n projectFile: string,\r\n project: ProjectDocument\r\n): Promise<AssetManifestContext> {\r\n const manifestRefs = project.assetManifests ?? [];\r\n const context = createAssetManifestContext();\r\n const rootPath = path.dirname(projectFile);\r\n\r\n for (const [manifestIndex, manifestRef] of manifestRefs.entries()) {\r\n const manifestFile = path.resolve(rootPath, manifestRef);\r\n context.manifestFiles.push(manifestFile);\r\n\r\n if (!existsSync(manifestFile)) {\r\n context.diagnostics.push({\r\n severity: \"error\",\r\n code: \"PROJECT_ASSET_MANIFEST_NOT_FOUND\",\r\n file: projectFile,\r\n path: `$.assetManifests[${manifestIndex}]`,\r\n message: `Asset manifest '${manifestRef}' was not found.`,\r\n suggestion: \"Create the asset manifest file or remove the path from assetManifests.\"\r\n });\r\n continue;\r\n }\r\n\r\n const manifestResult = await validateAssetManifestFile(manifestFile);\r\n context.diagnostics.push(...manifestResult.diagnostics);\r\n if (!manifestResult.document || hasErrors(manifestResult.diagnostics)) {\r\n continue;\r\n }\r\n\r\n for (const [assetIndex, asset] of manifestResult.document.assets.entries()) {\r\n const existing = context.assetsById.get(asset.id);\r\n const assetPath = `$.assets[${assetIndex}].id`;\r\n if (existing) {\r\n context.diagnostics.push({\r\n severity: \"error\",\r\n code: \"ASSET_DUPLICATE_ID\",\r\n file: manifestFile,\r\n path: assetPath,\r\n message: `Asset id '${asset.id}' already exists in '${existing.manifestFile}'.`,\r\n suggestion: \"Use one stable asset id once across all project asset manifests.\"\r\n });\r\n continue;\r\n }\r\n\r\n const record: AssetRecord = {\n id: asset.id,\n type: asset.type,\n path: asset.path,\n ...((asset.type === \"sprite\" || asset.type === \"atlas\") && typeof asset.texture === \"string\"\n ? { texture: asset.texture }\n : {}),\n ...(asset.type === \"sprite\" && Array.isArray(asset.rect)\n ? { rect: asset.rect as [number, number, number, number] }\n : {}),\n ...(asset.type === \"sprite\" && typeof asset.atlas === \"string\" ? { atlas: asset.atlas } : {}),\n ...(asset.type === \"sprite\" && typeof asset.frame === \"string\" ? { frame: asset.frame } : {}),\n ...(asset.type === \"atlas\"\n ? { frames: readAtlasFrameRecords(asset.frames, `$.assets[${assetIndex}].frames`) }\n : {}),\n manifestFile,\n dataPath: `$.assets[${assetIndex}]`\n };\n context.assetsById.set(asset.id, record);\n }\r\n }\r\n\r\n context.assets = sortedAssetDefinitions(context.assetsById);\r\n return context;\r\n}\r\n\r\nexport function validateSceneDocument(\r\n scene: unknown,\r\n file = \"scene.yml\",\r\n options: { assets?: AssetManifestContext } = {}\r\n): Diagnostic[] {\r\n const diagnostics = schemaDiagnostics(validateSceneSchema, scene, file, \"SCENE_SCHEMA_INVALID\");\r\n\r\n if (!isRecord(scene) || !Array.isArray(scene.entities)) {\r\n return diagnostics;\r\n }\r\n\r\n const ids = new Set<string>();\r\n\r\n scene.entities.forEach((entity, index) => {\r\n if (!isRecord(entity)) {\r\n return;\r\n }\r\n\r\n if (typeof entity.id === \"string\") {\r\n if (ids.has(entity.id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_DUPLICATE_ENTITY_ID\",\r\n file,\r\n path: `$.entities[${index}].id`,\r\n message: `Duplicate entity id '${entity.id}'.`,\r\n suggestion: \"Give every entity a unique stable id.\"\r\n });\r\n }\r\n ids.add(entity.id);\r\n }\r\n });\r\n\r\n scene.entities.forEach((entity, entityIndex) => {\r\n if (!isRecord(entity) || !isRecord(entity.components)) {\r\n return;\r\n }\r\n\r\n for (const [componentName, componentValue] of Object.entries(entity.components)) {\r\n const componentPath = `$.entities[${entityIndex}].components.${componentName}`;\r\n const componentValidator = componentValidators[componentName];\r\n\r\n if (!componentValidator) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_UNKNOWN_COMPONENT\",\r\n file,\r\n path: componentPath,\r\n message: `Unknown component '${componentName}'.`,\r\n suggestion: `Use one of: ${componentOrder.join(\", \")}.`\r\n });\r\n continue;\r\n }\r\n\r\n diagnostics.push(\r\n ...schemaDiagnostics(componentValidator, componentValue, file, \"COMPONENT_SCHEMA_INVALID\", componentPath)\r\n );\r\n\r\n for (const reference of findEntityReferences(scene as unknown as SceneDocument).filter((candidate) =>\r\n candidate.path.startsWith(componentPath)\r\n )) {\r\n if (!ids.has(reference.value)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ENTITY_REFERENCE\",\r\n file,\r\n path: reference.path,\r\n message: `Entity reference '${reference.value}' does not resolve.`,\r\n suggestion: \"Use the stable id of an entity in this scene.\"\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n diagnostics.push(...validateHierarchyRules(scene as unknown as SceneDocument, file, ids));\r\n diagnostics.push(...validateAnimationRules(scene as unknown as SceneDocument, file));\r\n diagnostics.push(...validate3DContractRules(scene as unknown as SceneDocument, file));\r\n if (options.assets) {\r\n diagnostics.push(...validateSceneAssetReferences(scene as unknown as SceneDocument, file, options.assets));\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nexport async function validateProjectFile(\r\n projectPath = \".\",\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<ProjectDocument>> {\r\n const projectFile = resolveProjectFile(projectPath, options.cwd);\r\n const result = await loadYamlFile<ProjectDocument>(projectFile);\r\n\r\n if (result.document === undefined) {\r\n return result;\r\n }\r\n\r\n result.diagnostics.push(...validateProjectDocument(result.document, projectFile));\r\n\r\n if (hasErrors(result.diagnostics)) {\r\n return result;\r\n }\r\n\r\n const rootPath = path.dirname(projectFile);\r\n const assetContext = await loadProjectAssetManifestContext(projectFile, result.document);\r\n result.diagnostics.push(...assetContext.diagnostics);\r\n if (hasErrors(result.diagnostics)) {\r\n return result;\r\n }\r\n\r\n for (const sceneRef of result.document.scenes) {\r\n const sceneFile = path.resolve(rootPath, sceneRef);\r\n if (!existsSync(sceneFile)) {\r\n result.diagnostics.push({\r\n severity: \"error\",\r\n code: \"PROJECT_SCENE_NOT_FOUND\",\r\n file: projectFile,\r\n path: \"$.scenes\",\r\n message: `Scene file '${sceneRef}' was not found.`,\r\n suggestion: \"Create the scene file or remove the scene path from the project.\"\r\n });\r\n continue;\r\n }\r\n\r\n const sceneResult = await validateSceneFile(sceneFile, { assets: assetContext });\r\n result.diagnostics.push(...sceneResult.diagnostics);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function validateSceneFile(\r\n scenePath: string,\r\n options: { cwd?: string; assets?: AssetManifestContext } = {}\r\n): Promise<ValidationResult<SceneDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), scenePath);\r\n const result = await loadYamlFile<SceneDocument>(file);\r\n\r\n if (result.document !== undefined) {\r\n const expanded = await expandSceneDocument(result.document, { sceneFile: file, assets: options.assets });\r\n result.diagnostics.push(...expanded.diagnostics);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport async function loadExpandedSceneFile(\r\n scenePath: string,\r\n options: { cwd?: string; assets?: AssetManifestContext } = {}\r\n): Promise<ValidationResult<SceneDocument>> {\r\n const file = path.resolve(options.cwd ?? process.cwd(), scenePath);\r\n const result = await loadYamlFile<SceneDocument>(file);\r\n\r\n if (result.document === undefined) {\r\n return result;\r\n }\r\n\r\n const expanded = await expandSceneDocument(result.document, { sceneFile: file, assets: options.assets });\r\n return {\r\n file,\r\n document: expanded.document,\r\n diagnostics: [...result.diagnostics, ...expanded.diagnostics]\r\n };\r\n}\r\n\r\nexport async function expandSceneDocument(\r\n scene: SceneDocument,\r\n options: { sceneFile?: string; assets?: AssetManifestContext } = {}\r\n): Promise<ValidationResult<SceneDocument>> {\r\n const sceneFile = options.sceneFile ?? \"scene.yml\";\r\n const diagnostics = validateSceneDocument(scene, sceneFile, { assets: options.assets });\r\n\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n file: sceneFile,\r\n diagnostics\r\n };\r\n }\r\n\r\n const expandedEntities: SceneEntity[] = [];\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n if (typeof entity.prefab !== \"string\") {\r\n expandedEntities.push({\r\n id: entity.id,\r\n components: cloneJson(entity.components ?? {}) as Record<string, unknown>\r\n });\r\n continue;\r\n }\r\n\r\n const prefabFile = resolveScenePrefabPath(sceneFile, entity.prefab);\r\n const prefabResult = await loadPrefabFile(prefabFile);\r\n const prefabDiagnostics = [...prefabResult.diagnostics];\r\n\r\n if (prefabResult.document !== undefined) {\r\n prefabDiagnostics.push(...validatePrefabDocument(prefabResult.document, prefabResult.file));\r\n }\r\n\r\n if (prefabResult.document === undefined || hasErrors(prefabDiagnostics)) {\r\n if (prefabResult.diagnostics.some((diagnostic) => diagnostic.code === \"FILE_READ_FAILED\")) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_PREFAB_NOT_FOUND\",\r\n file: sceneFile,\r\n path: `$.entities[${entityIndex}].prefab`,\r\n message: `Prefab file '${entity.prefab}' was not found.`,\r\n suggestion: \"Create the prefab file or update the prefab path relative to the scene file.\"\r\n });\r\n }\r\n diagnostics.push(...prefabDiagnostics);\r\n continue;\r\n }\r\n\r\n const overrideDiagnostics = validatePrefabOverrides(entity, prefabResult.document, sceneFile, entityIndex);\r\n diagnostics.push(...overrideDiagnostics);\r\n if (hasErrors(overrideDiagnostics)) {\r\n continue;\r\n }\r\n\r\n expandedEntities.push({\r\n id: entity.id,\r\n components: mergePrefabComponents(prefabResult.document.components, entity.overrides)\r\n });\r\n }\r\n\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n file: sceneFile,\r\n diagnostics\r\n };\r\n }\r\n\r\n const expandedScene: SceneDocument = {\r\n version: scene.version,\r\n name: scene.name,\r\n entities: expandedEntities\r\n };\r\n\r\n diagnostics.push(...validateSceneDocument(expandedScene, sceneFile, { assets: options.assets }));\r\n\r\n return {\r\n file: sceneFile,\r\n document: hasErrors(diagnostics) ? undefined : expandedScene,\r\n diagnostics\r\n };\r\n}\r\n\r\nexport function formatProject(project: ProjectDocument): string {\r\n return toYaml({\r\n version: project.version,\r\n name: project.name,\r\n defaultScene: project.defaultScene,\r\n ...(project.assetManifests ? { assetManifests: [...project.assetManifests] } : {}),\r\n scenes: [...project.scenes]\r\n });\r\n}\r\n\r\nexport function formatScene(scene: SceneDocument): string {\r\n return toYaml({\r\n version: scene.version,\r\n name: scene.name,\r\n entities: scene.entities.map((entity) => {\r\n if (typeof entity.prefab === \"string\") {\r\n return {\r\n id: entity.id,\r\n prefab: entity.prefab,\r\n ...(entity.overrides ? { overrides: orderComponents(entity.overrides) } : {})\r\n };\r\n }\r\n\r\n return {\r\n id: entity.id,\r\n components: orderComponents(entity.components ?? {})\r\n };\r\n })\r\n });\r\n}\r\n\r\nexport function formatPrefab(prefab: PrefabDocument): string {\r\n return toYaml({\r\n prefab: prefab.prefab,\r\n version: prefab.version,\r\n components: orderComponents(prefab.components)\r\n });\r\n}\r\n\r\nexport function formatMapGenerationConfig(config: MapGenerationConfigDocument): string {\r\n return toYaml({\r\n version: config.version,\r\n name: config.name,\r\n seed: config.seed,\r\n width: config.width,\r\n height: config.height,\r\n platformCount: config.platformCount,\r\n enemyCount: config.enemyCount,\r\n prefabRefs: config.prefabRefs.map((prefabRef) => ({\r\n id: prefabRef.id,\r\n prefab: prefabRef.prefab,\r\n role: prefabRef.role\r\n })),\r\n ...(config.tileSetRef ? { tileSetRef: config.tileSetRef } : {}),\r\n ...(config.goal ? { goal: config.goal } : {}),\r\n ...(config.constraints ? { constraints: orderObject(config.constraints) } : {})\r\n });\r\n}\r\n\r\nexport function formatGeneratedMap(map: GeneratedMapDocument): string {\r\n return toYaml({\r\n generatedMap: map.generatedMap,\r\n version: map.version,\r\n generator: map.generator,\r\n config: parse(formatMapGenerationConfig(map.config)) as MapGenerationConfigDocument,\r\n stats: orderObject(map.stats),\r\n regions: map.regions.map((region) => ({\r\n id: region.id,\r\n x: region.x,\r\n y: region.y,\r\n width: region.width,\r\n height: region.height\r\n })),\r\n entities: map.entities.map((entity) => ({\r\n id: entity.id,\r\n prefabRef: entity.prefabRef,\r\n role: entity.role,\r\n position: entity.position,\r\n ...(entity.size ? { size: entity.size } : {})\r\n }))\r\n });\r\n}\r\n\r\nexport async function generateMapFromConfigFile(\r\n configPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<MapGenerationResult> {\r\n const configResult = await validateMapGenerationConfigFile(configPath, options);\r\n const diagnostics = [...configResult.diagnostics];\r\n\r\n if (!configResult.document || hasErrors(diagnostics)) {\r\n return {\r\n configPath: configResult.file,\r\n diagnostics,\r\n config: configResult.document\r\n };\r\n }\r\n\r\n const generated = generateMapDocument(configResult.document, { configFile: configResult.file });\r\n diagnostics.push(...generated.diagnostics);\r\n\r\n if (!generated.document || hasErrors(diagnostics)) {\r\n return {\r\n configPath: configResult.file,\r\n diagnostics,\r\n config: configResult.document\r\n };\r\n }\r\n\r\n const scene = generatedMapToScene(generated.document);\r\n return {\r\n configPath: configResult.file,\r\n diagnostics,\r\n config: configResult.document,\r\n map: generated.document,\r\n scene,\r\n summary: createMapGenerationSummary(generated.document)\r\n };\r\n}\r\n\r\nexport function generateMapDocument(\r\n config: MapGenerationConfigDocument,\r\n options: { configFile?: string } = {}\r\n): ValidationResult<GeneratedMapDocument> {\r\n const file = options.configFile ?? \"map.yml\";\r\n const diagnostics = validateMapGenerationConfigDocument(config, file);\r\n\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n file,\r\n diagnostics\r\n };\r\n }\r\n\r\n const configHash = hashStableObject(config);\r\n const rng = createSeededRandom(config.seed);\r\n const platformRef = findMapPrefabRefByRole(config.prefabRefs, \"platform\");\r\n const enemyRef = findMapPrefabRefByRole(config.prefabRefs, \"enemy\");\r\n const goalRef = findMapPrefabRefByRole(config.prefabRefs, \"goal\");\r\n const entities: GeneratedMapEntity[] = [];\r\n const platforms: GeneratedMapEntity[] = [];\r\n\r\n if (config.platformCount > 0 && !platformRef) {\r\n return {\r\n file,\r\n diagnostics: [\r\n ...diagnostics,\r\n {\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_ROLE_REQUIRED\",\r\n file,\r\n path: \"$.prefabRefs\",\r\n message: \"platformCount is greater than zero but no platform prefab ref exists.\",\r\n suggestion: \"Add a prefabRefs entry with role: platform.\"\r\n }\r\n ]\r\n };\r\n }\r\n\r\n if (config.enemyCount > 0 && !enemyRef) {\r\n return {\r\n file,\r\n diagnostics: [\r\n ...diagnostics,\r\n {\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_ROLE_REQUIRED\",\r\n file,\r\n path: \"$.prefabRefs\",\r\n message: \"enemyCount is greater than zero but no enemy prefab ref exists.\",\r\n suggestion: \"Add a prefabRefs entry with role: enemy.\"\r\n }\r\n ]\r\n };\r\n }\r\n\r\n if (platformRef) {\r\n const platformWidth = Math.max(2, Math.floor(config.width / Math.max(config.platformCount * 2, 1)));\r\n const slotWidth = Math.max(1, Math.floor(config.width / Math.max(config.platformCount, 1)));\r\n\r\n for (let index = 0; index < config.platformCount; index += 1) {\r\n const slotStart = index * slotWidth;\r\n const slotEnd = index === config.platformCount - 1 ? config.width - platformWidth : Math.min(config.width - platformWidth, (index + 1) * slotWidth - platformWidth);\r\n const x = clampInteger(randomInteger(rng, slotStart, Math.max(slotStart, slotEnd)), 0, Math.max(config.width - platformWidth, 0));\r\n const y = index === 0 ? 0 : randomInteger(rng, 0, Math.max(config.height - 2, 0));\r\n const platform: GeneratedMapEntity = {\r\n id: `platform_${padNumber(index + 1)}`,\r\n prefabRef: platformRef.id,\r\n role: \"platform\",\r\n position: [x, y],\r\n size: [platformWidth, 1]\r\n };\r\n platforms.push(platform);\r\n entities.push(platform);\r\n }\r\n }\r\n\r\n if (enemyRef) {\r\n for (let index = 0; index < config.enemyCount; index += 1) {\r\n const platform = platforms[index % Math.max(platforms.length, 1)];\r\n if (!platform) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_CONSTRAINT_UNSATISFIABLE\",\r\n file,\r\n path: \"$.enemyCount\",\r\n message: \"Enemies require generated platforms in procedural-map-v0.\",\r\n suggestion: \"Increase platformCount or set enemyCount to 0.\"\r\n });\r\n break;\r\n }\r\n\r\n const width = Array.isArray(platform.size) ? Math.max(Math.floor(platform.size[0]), 1) : 1;\r\n entities.push({\r\n id: `enemy_${padNumber(index + 1)}`,\r\n prefabRef: enemyRef.id,\r\n role: \"enemy\",\r\n position: [\r\n clampInteger(platform.position[0] + randomInteger(rng, 0, width - 1), 0, config.width - 1),\r\n clampInteger(platform.position[1] + 1, 0, config.height - 1)\r\n ]\r\n });\r\n }\r\n }\r\n\r\n if (goalRef) {\r\n entities.push({\r\n id: config.goal?.targetEntityId ?? \"goal\",\r\n prefabRef: goalRef.id,\r\n role: \"goal\",\r\n position: [config.width - 1, Math.max(config.height - 1, 0)]\r\n });\r\n }\r\n\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n file,\r\n diagnostics\r\n };\r\n }\r\n\r\n const map: GeneratedMapDocument = {\r\n generatedMap: config.name,\r\n version: 1,\r\n generator: \"procedural-map-v0\",\r\n config: cloneJson(config) as MapGenerationConfigDocument,\r\n stats: {\r\n seed: config.seed,\r\n width: config.width,\r\n height: config.height,\r\n platformCount: config.platformCount,\r\n enemyCount: config.enemyCount,\r\n configHash\r\n },\r\n regions: [\r\n {\r\n id: \"world\",\r\n x: 0,\r\n y: 0,\r\n width: config.width,\r\n height: config.height\r\n }\r\n ],\r\n entities\r\n };\r\n\r\n diagnostics.push(...validateGeneratedMapDocument(map, file));\r\n\r\n return {\r\n file,\r\n document: hasErrors(diagnostics) ? undefined : map,\r\n diagnostics\r\n };\r\n}\r\n\r\nexport function generatedMapToScene(\r\n map: GeneratedMapDocument,\r\n options: { configFile?: string; sceneFile?: string } = {}\r\n): SceneDocument {\r\n const prefabRefsById = new Map(map.config.prefabRefs.map((prefabRef) => [prefabRef.id, prefabRef]));\r\n const entities: SceneEntity[] = [\r\n {\r\n id: \"generated_map_meta\",\r\n components: {\r\n GeneratedMap: {\r\n generator: map.generator,\r\n seed: map.stats.seed,\r\n width: map.stats.width,\r\n height: map.stats.height,\r\n platformCount: map.stats.platformCount,\r\n enemyCount: map.stats.enemyCount,\r\n configHash: map.stats.configHash,\r\n ...(map.config.constraints ? { constraints: cloneJson(map.config.constraints) } : {})\r\n }\r\n }\r\n }\r\n ];\r\n\r\n for (const generatedEntity of map.entities) {\r\n const prefabRef = prefabRefsById.get(generatedEntity.prefabRef);\r\n if (!prefabRef) {\r\n continue;\r\n }\r\n\r\n const overrides: Record<string, unknown> = {\r\n Transform: {\r\n position: generatedEntity.position,\r\n rotation: 0,\r\n scale: [1, 1]\r\n }\r\n };\r\n\r\n if (generatedEntity.role === \"platform\" && generatedEntity.size) {\r\n overrides.Collider = {\r\n shape: \"box\",\r\n size: generatedEntity.size,\r\n static: true\r\n };\r\n }\r\n\r\n entities.push({\r\n id: generatedEntity.id,\r\n prefab: resolveGeneratedScenePrefabRef(prefabRef, options),\r\n overrides\r\n });\r\n }\r\n\r\n return {\r\n version: 1,\r\n name: map.generatedMap,\r\n entities\r\n };\r\n}\r\n\r\nexport async function generateMapSceneFile(\r\n configPath: string,\r\n outPath: string,\r\n options: { cwd?: string; mapOutPath?: string } = {}\r\n): Promise<MapGenerationFileResult> {\r\n const result = await generateMapFromConfigFile(configPath, options);\r\n const outFile = path.resolve(options.cwd ?? process.cwd(), outPath);\r\n const mapOutFile = options.mapOutPath ? path.resolve(options.cwd ?? process.cwd(), options.mapOutPath) : undefined;\r\n const diagnostics = [...result.diagnostics];\r\n\r\n if (!result.map || !result.scene || hasErrors(diagnostics)) {\r\n return {\r\n ...result,\r\n outPath: outFile,\r\n ...(mapOutFile ? { mapOutPath: mapOutFile } : {}),\r\n diagnostics\r\n };\r\n }\r\n\r\n const scene = generatedMapToScene(result.map, {\r\n configFile: result.configPath,\r\n sceneFile: outFile\r\n });\r\n\r\n await mkdir(path.dirname(outFile), { recursive: true });\r\n await writeFile(outFile, formatScene(scene), \"utf8\");\r\n if (mapOutFile) {\r\n await mkdir(path.dirname(mapOutFile), { recursive: true });\r\n await writeFile(mapOutFile, formatGeneratedMap(result.map), \"utf8\");\r\n }\r\n\r\n const sceneValidation = await validateSceneFile(outFile);\r\n diagnostics.push(...sceneValidation.diagnostics);\r\n\r\n return {\r\n ...result,\r\n outPath: outFile,\r\n ...(mapOutFile ? { mapOutPath: mapOutFile } : {}),\r\n diagnostics,\r\n scene: hasErrors(diagnostics) ? undefined : scene\r\n };\r\n}\r\n\r\nexport function createMapGenerationSummary(map: GeneratedMapDocument): MapGenerationSummary {\r\n return {\r\n generator: map.generator,\r\n seed: map.stats.seed,\r\n width: map.stats.width,\r\n height: map.stats.height,\r\n platformCount: map.stats.platformCount,\r\n enemyCount: map.stats.enemyCount,\r\n entityCount: map.entities.length,\r\n configHash: map.stats.configHash\r\n };\r\n}\r\n\r\nexport async function formatProjectFiles(\r\n projectPath = \".\",\r\n options: { cwd?: string } = {}\r\n): Promise<FormatResult> {\r\n const projectFile = resolveProjectFile(projectPath, options.cwd);\r\n const projectResult = await loadYamlFile<ProjectDocument>(projectFile);\r\n const diagnostics = [...projectResult.diagnostics];\r\n const files: string[] = [];\r\n\r\n if (projectResult.document === undefined) {\r\n return { files, diagnostics };\r\n }\r\n\r\n diagnostics.push(...validateProjectDocument(projectResult.document, projectFile));\r\n if (hasErrors(diagnostics)) {\r\n return { files, diagnostics };\r\n }\r\n\r\n const assetContext = await loadProjectAssetManifestContext(projectFile, projectResult.document);\r\n diagnostics.push(...assetContext.diagnostics);\r\n if (hasErrors(diagnostics)) {\r\n return { files, diagnostics };\r\n }\r\n\r\n await writeFile(projectFile, formatProject(projectResult.document), \"utf8\");\r\n files.push(projectFile);\r\n\r\n const rootPath = path.dirname(projectFile);\r\n for (const sceneRef of projectResult.document.scenes) {\r\n const sceneFile = path.resolve(rootPath, sceneRef);\r\n const sceneResult = await loadYamlFile<SceneDocument>(sceneFile);\r\n diagnostics.push(...sceneResult.diagnostics);\r\n if (sceneResult.document === undefined) {\r\n continue;\r\n }\r\n\r\n const sceneValidation = await validateSceneFile(sceneFile, { assets: assetContext });\r\n const sceneDiagnostics = sceneValidation.diagnostics;\r\n diagnostics.push(...sceneDiagnostics);\r\n if (hasErrors(sceneDiagnostics)) {\r\n continue;\r\n }\r\n\r\n await writeFile(sceneFile, formatScene(sceneResult.document), \"utf8\");\r\n files.push(sceneFile);\r\n }\r\n\r\n return { files, diagnostics };\r\n}\r\n\r\nexport function applyPatchDocument(\r\n scene: SceneDocument,\r\n patch: PatchDocument,\r\n options: { patchFile?: string; sceneFile?: string } = {}\r\n): ValidationResult<SceneDocument> & { summary: PatchApplicationSummary } {\r\n const patchFile = options.patchFile ?? \"patch.json\";\r\n const sceneFile = options.sceneFile ?? patch.target.scene;\r\n const diagnostics = validatePatchDocument(patch, patchFile);\r\n const summary = createPatchSummary();\r\n\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n file: sceneFile,\r\n diagnostics,\r\n summary\r\n };\r\n }\r\n\r\n const nextScene = cloneJson(scene) as SceneDocument;\r\n\r\n patch.operations.forEach((operation, index) => {\r\n if (hasErrors(diagnostics)) {\r\n return;\r\n }\r\n\r\n diagnostics.push(...applyPatchOperation(nextScene, operation, index, patchFile, summary));\r\n });\r\n\r\n if (!hasErrors(diagnostics)) {\r\n diagnostics.push(...validateSceneDocument(nextScene, sceneFile));\r\n }\r\n\r\n return {\r\n file: sceneFile,\r\n document: hasErrors(diagnostics) ? undefined : nextScene,\r\n diagnostics,\r\n summary\r\n };\r\n}\r\n\r\nexport async function applyPatchDocumentWithFileValidation(\r\n scene: SceneDocument,\r\n patch: PatchDocument,\r\n options: { patchFile?: string; sceneFile: string }\r\n): Promise<ValidationResult<SceneDocument> & { summary: PatchApplicationSummary }> {\r\n const patchFile = options.patchFile ?? \"patch.json\";\r\n const sceneFile = options.sceneFile;\r\n const patched = applyPatchDocument(scene, patch, { patchFile, sceneFile });\r\n const diagnostics = [...patched.diagnostics];\r\n const assetContext = await loadNearestProjectAssetManifestContext(sceneFile);\r\n diagnostics.push(...assetContext.diagnostics);\r\n\r\n if (!patched.document || hasErrors(diagnostics)) {\r\n return {\r\n file: sceneFile,\r\n diagnostics,\r\n summary: patched.summary\r\n };\r\n }\r\n\r\n diagnostics.push(...(await validateInstantiatePrefabOperations(patch, patchFile, sceneFile)));\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n file: sceneFile,\r\n diagnostics,\r\n summary: patched.summary\r\n };\r\n }\r\n\r\n const expandedPatched = await expandSceneDocument(patched.document, { sceneFile, assets: assetContext });\r\n diagnostics.push(...expandedPatched.diagnostics);\r\n\r\n return {\r\n file: sceneFile,\r\n document: hasErrors(diagnostics) ? undefined : patched.document,\r\n diagnostics,\r\n summary: patched.summary\r\n };\r\n}\r\n\r\nexport async function applyPatchFile(\r\n patchPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<PatchApplicationResult> {\r\n const patchFile = path.resolve(options.cwd ?? process.cwd(), patchPath);\r\n const patchResult = await loadPatchFile(patchFile);\r\n const diagnostics = [...patchResult.diagnostics];\r\n\r\n if (patchResult.document === undefined) {\r\n return {\r\n patchPath: patchFile,\r\n diagnostics,\r\n changed: false,\r\n summary: createPatchSummary()\r\n };\r\n }\r\n\r\n diagnostics.push(...validatePatchDocument(patchResult.document, patchFile));\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n patchPath: patchFile,\r\n scenePath: resolvePatchScenePath(patchFile, patchResult.document.target?.scene),\r\n diagnostics,\r\n changed: false,\r\n summary: createPatchSummary()\r\n };\r\n }\r\n\r\n const sceneFile = path.resolve(path.dirname(patchFile), patchResult.document.target.scene);\r\n const sceneResult = await loadSceneFile(sceneFile);\r\n diagnostics.push(...sceneResult.diagnostics);\r\n\r\n if (sceneResult.document === undefined || hasErrors(diagnostics)) {\r\n return {\r\n patchPath: patchFile,\r\n scenePath: sceneFile,\r\n diagnostics,\r\n changed: false,\r\n summary: createPatchSummary()\r\n };\r\n }\r\n\r\n const patched = await applyPatchDocumentWithFileValidation(sceneResult.document, patchResult.document, {\r\n patchFile,\r\n sceneFile\r\n });\r\n diagnostics.push(...patched.diagnostics);\r\n\r\n if (!patched.document || hasErrors(diagnostics)) {\r\n return {\r\n patchPath: patchFile,\r\n scenePath: sceneFile,\r\n diagnostics,\r\n changed: false,\r\n summary: patched.summary\r\n };\r\n }\r\n\r\n await writeFile(sceneFile, formatScene(patched.document), \"utf8\");\r\n\r\n return {\r\n patchPath: patchFile,\r\n scenePath: sceneFile,\r\n diagnostics,\r\n changed: true,\r\n summary: patched.summary\r\n };\r\n}\r\n\r\nexport function inspectSceneDocument(\r\n scene: SceneDocument,\r\n scenePath = \"scene.yml\",\r\n expandedScene: SceneDocument = scene,\r\n assets: AssetManifestContext = createAssetManifestContext()\r\n): SceneInspection {\r\n const expandedById = new Map(expandedScene.entities.map((entity) => [entity.id, entity]));\r\n const hierarchy = deriveHierarchy(expandedScene, scenePath);\r\n const worldTransforms = computeWorldTransforms(expandedScene, scenePath);\r\n const hierarchySummary = createHierarchySummary(hierarchy);\r\n const animationSummary = inspectSceneAnimations(expandedScene, assets);\r\n const assetSummary = createSceneAssetSummary(expandedScene, assets);\r\n\r\n return {\r\n scenePath,\r\n name: scene.name,\r\n entityCount: scene.entities.length,\r\n hierarchy: hierarchySummary,\r\n animations: animationSummary,\r\n assets: assetSummary,\r\n entities: scene.entities.map((entity) => {\r\n const expandedEntity = expandedById.get(entity.id);\r\n const parent = hierarchy.parentByEntityId[entity.id];\r\n const worldTransform = worldTransforms.transforms[entity.id];\r\n return {\r\n id: entity.id,\r\n ...(entity.prefab ? { prefab: entity.prefab } : {}),\r\n components: Object.keys(expandedEntity?.components ?? entity.components ?? {}),\r\n ...(entity.overrides ? { overrides: Object.keys(entity.overrides) } : {}),\r\n ...(parent ? { parent } : {}),\r\n children: hierarchy.childrenByEntityId[entity.id] ?? [],\r\n ...(worldTransform ? { worldTransform } : {})\r\n };\r\n })\r\n };\r\n}\r\n\r\nexport async function inspectSceneFile(\r\n scenePath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<SceneInspection>> {\r\n const sceneResult = await loadSceneFile(scenePath, options);\r\n if (sceneResult.document === undefined) {\r\n return {\r\n file: sceneResult.file,\r\n diagnostics: sceneResult.diagnostics\r\n };\r\n }\r\n\r\n const assetContext = await loadNearestProjectAssetManifestContext(sceneResult.file);\r\n const expandedResult = await expandSceneDocument(sceneResult.document, {\r\n sceneFile: sceneResult.file,\r\n assets: assetContext\r\n });\r\n const diagnostics = [...sceneResult.diagnostics, ...assetContext.diagnostics, ...expandedResult.diagnostics];\r\n if (!expandedResult.document || hasErrors(diagnostics)) {\r\n return {\r\n file: sceneResult.file,\r\n diagnostics\r\n };\r\n }\r\n\r\n return {\r\n file: sceneResult.file,\r\n document: inspectSceneDocument(sceneResult.document, sceneResult.file, expandedResult.document, assetContext),\r\n diagnostics\r\n };\r\n}\r\n\r\nexport async function inspectEntityFile(\r\n scenePath: string,\r\n entityId: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<EntityInspection>> {\r\n const sceneResult = await loadExpandedSceneFile(scenePath, options);\r\n if (!sceneResult.document || hasErrors(sceneResult.diagnostics)) {\r\n return {\r\n file: sceneResult.file,\r\n diagnostics: sceneResult.diagnostics\r\n };\r\n }\r\n\r\n const entity = sceneResult.document.entities.find((candidate) => candidate.id === entityId);\r\n if (!entity) {\r\n return {\r\n file: sceneResult.file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"SCENE_ENTITY_NOT_FOUND\",\r\n file: sceneResult.file,\r\n path: \"$.entities\",\r\n message: `Entity '${entityId}' was not found.`,\r\n suggestion: \"Inspect the scene to list available entity ids.\"\r\n }\r\n ]\r\n };\r\n }\r\n\r\n const inspection = inspectSceneDocument(sceneResult.document, sceneResult.file);\r\n const entitySummary = inspection.entities.find((candidate) => candidate.id === entityId);\r\n\r\n return {\r\n file: sceneResult.file,\r\n document: {\r\n scenePath: sceneResult.file,\r\n entity,\r\n hierarchy: {\r\n ...(entitySummary?.parent ? { parent: entitySummary.parent } : {}),\r\n children: entitySummary?.children ?? [],\r\n depth: inspection.hierarchy.nodes.find((node) => node.entityId === entityId)?.depth ?? 0,\r\n ...(entitySummary?.worldTransform ? { worldTransform: entitySummary.worldTransform } : {})\r\n }\r\n },\r\n diagnostics: sceneResult.diagnostics\r\n };\r\n}\r\n\r\nexport function inspectPrefabDocument(prefab: PrefabDocument, prefabPath = \"prefab.yml\"): PrefabInspection {\r\n return {\r\n prefabPath,\r\n prefab: prefab.prefab,\r\n components: Object.keys(prefab.components ?? {})\r\n };\r\n}\r\n\r\nexport async function inspectPrefabFile(\r\n prefabPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<PrefabInspection>> {\r\n const result = await validatePrefabFile(prefabPath, options);\r\n if (!result.document || hasErrors(result.diagnostics)) {\r\n return {\r\n file: result.file,\r\n diagnostics: result.diagnostics\r\n };\r\n }\r\n\r\n return {\r\n file: result.file,\r\n document: inspectPrefabDocument(result.document, result.file),\r\n diagnostics: result.diagnostics\r\n };\r\n}\r\n\r\nexport function inspectAssetManifestDocument(\r\n assetManifest: AssetManifestDocument,\r\n assetManifestPath = \"agent.assets.yml\"\r\n): AssetManifestInspection {\r\n return {\r\n assetManifestPath,\r\n ...(assetManifest.assetManifest ? { assetManifest: assetManifest.assetManifest } : {}),\r\n assetCount: assetManifest.assets.length,\r\n assetsByType: countAssetsByType(assetManifest.assets),\r\n assets: assetManifest.assets\r\n .map((asset) => {\n if (asset.type === \"sprite\") {\n return {\n id: asset.id,\n type: asset.type,\n path: asset.path,\n ...(asset.texture ? { texture: asset.texture } : {}),\n ...(asset.rect ? { rect: asset.rect } : {}),\n ...(asset.atlas ? { atlas: asset.atlas } : {}),\n ...(asset.frame ? { frame: asset.frame } : {})\n };\n }\n\n if (asset.type === \"atlas\") {\n const frames = asset.frames\n .map((frame) => ({\n id: frame.id,\n rect: frame.rect\n }))\n .sort((left, right) => left.id.localeCompare(right.id));\n return {\n id: asset.id,\n type: asset.type,\n path: asset.path,\n ...(asset.texture ? { texture: asset.texture } : {}),\n frameCount: frames.length,\n frames\n };\n }\n\n return {\n id: asset.id,\r\n type: asset.type,\r\n path: asset.path\r\n };\r\n })\r\n .sort((left, right) => left.id.localeCompare(right.id))\r\n };\r\n}\r\n\r\nexport async function inspectAssetManifestFile(\r\n assetManifestPath: string,\r\n options: { cwd?: string } = {}\r\n): Promise<ValidationResult<AssetManifestInspection>> {\r\n const result = await validateAssetManifestFile(assetManifestPath, options);\r\n if (!result.document || hasErrors(result.diagnostics)) {\r\n return {\r\n file: result.file,\r\n diagnostics: result.diagnostics\r\n };\r\n }\r\n\r\n return {\r\n file: result.file,\r\n document: inspectAssetManifestDocument(result.document, result.file),\r\n diagnostics: result.diagnostics\r\n };\r\n}\r\n\r\nexport async function inspectProjectFile(\r\n projectPath = \".\",\r\n options: { cwd?: string } = {}\r\n): Promise<ProjectInspection> {\r\n const projectFile = resolveProjectFile(projectPath, options.cwd);\r\n const projectResult = await validateProjectFile(projectFile);\r\n const rootPath = path.dirname(projectFile);\r\n\r\n const inspection: ProjectInspection = {\r\n projectPath: projectFile,\r\n rootPath,\r\n scenes: [],\r\n assetManifests: [],\r\n diagnostics: projectResult.diagnostics\r\n };\r\n\r\n if (projectResult.document === undefined || hasErrors(projectResult.diagnostics)) {\r\n return inspection;\r\n }\r\n\r\n inspection.name = projectResult.document.name;\r\n inspection.defaultScene = projectResult.document.defaultScene;\r\n for (const manifestRef of projectResult.document.assetManifests ?? []) {\r\n const manifestFile = path.resolve(rootPath, manifestRef);\r\n const manifestResult = await loadYamlFile<AssetManifestDocument>(manifestFile);\r\n inspection.assetManifests.push({\r\n path: manifestRef,\r\n assetCount: Array.isArray(manifestResult.document?.assets) ? manifestResult.document.assets.length : undefined\r\n });\r\n }\r\n\r\n for (const sceneRef of projectResult.document.scenes) {\r\n const sceneFile = path.resolve(rootPath, sceneRef);\r\n const sceneResult = await loadYamlFile<SceneDocument>(sceneFile);\r\n if (sceneResult.document !== undefined) {\r\n inspection.scenes.push({\r\n path: sceneRef,\r\n name: sceneResult.document.name,\r\n entityCount: Array.isArray(sceneResult.document.entities) ? sceneResult.document.entities.length : undefined\r\n });\r\n } else {\r\n inspection.scenes.push({ path: sceneRef });\r\n }\r\n }\r\n\r\n return inspection;\r\n}\r\n\r\nfunction applyPatchOperation(\r\n scene: SceneDocument,\r\n operation: PatchOperation,\r\n index: number,\r\n patchFile: string,\r\n summary: PatchApplicationSummary\r\n): Diagnostic[] {\r\n switch (operation.op) {\r\n case \"add_entity\":\r\n return applyAddEntity(scene, operation, index, patchFile);\r\n case \"add_component\":\r\n return applyAddComponent(scene, operation, index, patchFile);\r\n case \"set_component_field\":\r\n return applySetComponentField(scene, operation, index, patchFile);\r\n case \"remove_component\":\r\n return applyRemoveComponent(scene, operation, index, patchFile);\r\n case \"remove_entity\":\r\n return applyRemoveEntity(scene, operation, index, patchFile);\r\n case \"rename_entity\":\r\n return applyRenameEntity(scene, operation, index, patchFile, summary);\r\n case \"rename_entity_at_source\":\r\n return applyRenameEntityAtSource(scene, operation, index, patchFile);\r\n case \"replace_reference\":\r\n return applyReplaceReference(scene, operation, index, patchFile, summary);\r\n case \"update_component\":\r\n return applyUpdateComponent(scene, operation, index, patchFile);\r\n case \"duplicate_entity\":\r\n return applyDuplicateEntity(scene, operation, index, patchFile);\r\n case \"instantiate_prefab\":\r\n return applyInstantiatePrefab(scene, operation, index, patchFile);\r\n case \"set_parent\":\r\n return applySetParent(scene, operation, index, patchFile);\r\n case \"clear_parent\":\r\n return applyClearParent(scene, operation, index, patchFile);\r\n case \"add_animation_frame\":\r\n return applyAddAnimationFrame(scene, operation, index, patchFile);\r\n case \"update_animation_frame\":\r\n return applyUpdateAnimationFrame(scene, operation, index, patchFile);\r\n case \"remove_animation_frame\":\r\n return applyRemoveAnimationFrame(scene, operation, index, patchFile);\r\n case \"set_animator_clip\":\r\n return applySetAnimatorClip(scene, operation, index, patchFile);\r\n }\r\n}\r\n\r\nfunction applyAddEntity(\r\n scene: SceneDocument,\r\n operation: AddEntityOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n if (!isRecord(operation.entity) || typeof operation.entity.id !== \"string\" || !isRecord(operation.entity.components)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_INVALID_ENTITY\",\r\n file: patchFile,\r\n path: `${operationPath}.entity`,\r\n message: \"add_entity requires an entity with stable id and components.\",\r\n suggestion: \"Provide entity.id and entity.components.\"\r\n }\r\n ];\r\n }\r\n\r\n if (findEntity(scene, operation.entity.id)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_DUPLICATE_ENTITY_ID\",\r\n file: patchFile,\r\n path: `${operationPath}.entity.id`,\r\n message: `Entity id '${operation.entity.id}' already exists.`,\r\n suggestion: \"Use a new stable entity id.\"\r\n }\r\n ];\r\n }\r\n\r\n scene.entities.push(cloneJson(operation.entity) as SceneEntity);\r\n return [];\r\n}\r\n\r\nfunction applyAddComponent(\r\n scene: SceneDocument,\r\n operation: AddComponentOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n if (!componentValidators[operation.component]) {\r\n return unknownComponent(operation.component, patchFile, `${operationPath}.component`);\r\n }\r\n\r\n if (Object.hasOwn(entity.components, operation.component)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_COMPONENT_ALREADY_EXISTS\",\r\n file: patchFile,\r\n path: `${operationPath}.component`,\r\n message: `Entity '${operation.entityId}' already has component '${operation.component}'.`,\r\n suggestion: \"Use set_component_field to modify an existing component.\"\r\n }\r\n ];\r\n }\r\n\r\n const componentDiagnostics = validateComponentValue(\r\n operation.component,\r\n operation.value,\r\n patchFile,\r\n `${operationPath}.value`,\r\n \"PATCH_COMPONENT_INVALID\"\r\n );\r\n if (componentDiagnostics.length > 0) {\r\n return componentDiagnostics;\r\n }\r\n\r\n entity.components[operation.component] = cloneJson(operation.value);\r\n return [];\r\n}\r\n\r\nfunction applySetComponentField(\r\n scene: SceneDocument,\r\n operation: SetComponentFieldOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n if (!componentValidators[operation.component]) {\r\n return unknownComponent(operation.component, patchFile, `${operationPath}.component`);\r\n }\r\n\r\n if (!Object.hasOwn(entity.components, operation.component)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_COMPONENT_NOT_FOUND\",\r\n file: patchFile,\r\n path: `${operationPath}.component`,\r\n message: `Entity '${operation.entityId}' does not have component '${operation.component}'.`,\r\n suggestion: \"Add the component before setting its fields.\"\r\n }\r\n ];\r\n }\r\n\r\n const componentValue = entity.components[operation.component];\r\n const pointerDiagnostics = setJsonPointer(componentValue, operation.path, operation.value, patchFile, operationPath);\r\n if (pointerDiagnostics.length > 0) {\r\n return pointerDiagnostics;\r\n }\r\n\r\n return validateComponentValue(\r\n operation.component,\r\n componentValue,\r\n patchFile,\r\n operationPath,\r\n \"PATCH_COMPONENT_INVALID\"\r\n );\r\n}\r\n\r\nfunction applyRemoveComponent(\r\n scene: SceneDocument,\r\n operation: RemoveComponentOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n if (!Object.hasOwn(entity.components, operation.component)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_COMPONENT_NOT_FOUND\",\r\n file: patchFile,\r\n path: `${operationPath}.component`,\r\n message: `Entity '${operation.entityId}' does not have component '${operation.component}'.`,\r\n suggestion: \"Inspect the entity before removing components.\"\r\n }\r\n ];\r\n }\r\n\r\n delete entity.components[operation.component];\r\n return [];\r\n}\r\n\r\nfunction applyRemoveEntity(\r\n scene: SceneDocument,\r\n operation: RemoveEntityOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entityIndex = scene.entities.findIndex((entity) => entity.id === operation.entityId);\r\n if (entityIndex === -1) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!operation.allowDanglingReferences) {\r\n const references = findEntityReferences(scene, operation.entityId);\r\n if (references.length > 0) {\r\n return references.map((reference) => ({\r\n severity: \"error\",\r\n code: \"PATCH_ENTITY_HAS_REFERENCES\",\r\n file: patchFile,\r\n path: `${operationPath}.entityId`,\r\n message: `Entity '${operation.entityId}' is referenced by entity '${reference.entityId}' at ${reference.component}.${reference.field}.`,\r\n suggestion: \"Use rename_entity, replace_reference, or set allowDanglingReferences only when a later operation repairs references.\"\r\n }));\r\n }\r\n }\r\n\r\n scene.entities.splice(entityIndex, 1);\r\n return [];\r\n}\r\n\r\nfunction applyRenameEntity(\r\n scene: SceneDocument,\r\n operation: RenameEntityOperation,\r\n index: number,\r\n patchFile: string,\r\n summary: PatchApplicationSummary\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (findEntity(scene, operation.newEntityId)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_DUPLICATE_ENTITY_ID\",\r\n file: patchFile,\r\n path: `${operationPath}.newEntityId`,\r\n message: `Entity id '${operation.newEntityId}' already exists.`,\r\n suggestion: \"Use a new stable entity id.\"\r\n }\r\n ];\r\n }\r\n\r\n entity.id = operation.newEntityId;\r\n replaceReferences(scene, operation.entityId, operation.newEntityId, summary);\r\n return [];\r\n}\r\n\r\nfunction applyRenameEntityAtSource(\r\n scene: SceneDocument,\r\n operation: RenameEntityAtSourceOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const sourceIndex = entityIndexFromSourcePath(operation.sourcePath);\r\n if (sourceIndex === undefined) {\r\n return patchSourceSelectorInvalid(\r\n patchFile,\r\n `${operationPath}.sourcePath`,\r\n \"rename_entity_at_source sourcePath must target an entity array item.\",\r\n \"Use a source path such as $.entities[1].\"\r\n );\r\n }\r\n\r\n const keepIndex = entityIndexFromSourcePath(operation.keepEntitySourcePath);\r\n if (keepIndex === undefined) {\r\n return patchSourceSelectorInvalid(\r\n patchFile,\r\n `${operationPath}.keepEntitySourcePath`,\r\n \"rename_entity_at_source keepEntitySourcePath must target an entity array item.\",\r\n \"Use a source path such as $.entities[0].\"\r\n );\r\n }\r\n\r\n const selectedEntity = scene.entities[sourceIndex];\r\n if (!selectedEntity || selectedEntity.id !== operation.entityId) {\r\n return patchSourceSelectorMismatch(\r\n patchFile,\r\n `${operationPath}.sourcePath`,\r\n `Selected source path '${operation.sourcePath}' no longer identifies duplicate entity '${operation.entityId}'.`\r\n );\r\n }\r\n\r\n const duplicateIndexes = scene.entities\r\n .map((entity, entityIndex) => (entity.id === operation.entityId ? entityIndex : -1))\r\n .filter((entityIndex) => entityIndex >= 0);\r\n if (duplicateIndexes.length !== operation.occurrenceCount || duplicateIndexes.length < 2) {\r\n return patchSourceSelectorMismatch(\r\n patchFile,\r\n `${operationPath}.occurrenceCount`,\r\n `Duplicate occurrence count for '${operation.entityId}' changed from ${operation.occurrenceCount} to ${duplicateIndexes.length}.`\r\n );\r\n }\r\n\r\n const currentOccurrenceIndex = duplicateIndexes.indexOf(sourceIndex) + 1;\r\n if (currentOccurrenceIndex !== operation.occurrenceIndex) {\r\n return patchSourceSelectorMismatch(\r\n patchFile,\r\n `${operationPath}.occurrenceIndex`,\r\n `Selected source path '${operation.sourcePath}' is occurrence ${currentOccurrenceIndex}, not occurrence ${operation.occurrenceIndex}.`\r\n );\r\n }\r\n\r\n const keptEntity = scene.entities[keepIndex];\r\n if (\r\n keepIndex === sourceIndex ||\r\n !keptEntity ||\r\n keptEntity.id !== operation.entityId ||\r\n !duplicateIndexes.includes(keepIndex)\r\n ) {\r\n return patchSourceSelectorMismatch(\r\n patchFile,\r\n `${operationPath}.keepEntitySourcePath`,\r\n \"keepEntitySourcePath must identify a different current duplicate occurrence that keeps the original id.\"\r\n );\r\n }\r\n\r\n if (operation.newEntityId === operation.entityId || findEntity(scene, operation.newEntityId)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_DUPLICATE_ENTITY_ID\",\r\n file: patchFile,\r\n path: `${operationPath}.newEntityId`,\r\n message: `Entity id '${operation.newEntityId}' already exists or matches the duplicate id.`,\r\n suggestion: \"Use a new stable entity id for only the selected duplicate occurrence.\"\r\n }\r\n ];\r\n }\r\n\r\n if (operation.referenceOwnership.trim().length === 0) {\r\n return patchSourceSelectorMismatch(\r\n patchFile,\r\n `${operationPath}.referenceOwnership`,\r\n \"rename_entity_at_source requires a reviewed reference ownership note.\"\r\n );\r\n }\r\n\r\n selectedEntity.id = operation.newEntityId;\r\n return [];\r\n}\r\n\r\nfunction applyReplaceReference(\r\n scene: SceneDocument,\r\n operation: ReplaceReferenceOperation,\r\n index: number,\r\n patchFile: string,\r\n summary: PatchApplicationSummary\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n if (!findEntity(scene, operation.toEntityId)) {\r\n return targetEntityNotFound(operation.toEntityId, patchFile, `${operationPath}.toEntityId`);\r\n }\r\n\r\n replaceReferences(scene, operation.fromEntityId, operation.toEntityId, summary);\r\n return [];\r\n}\r\n\r\nfunction applyUpdateComponent(\r\n scene: SceneDocument,\r\n operation: UpdateComponentOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n if (!componentValidators[operation.component]) {\r\n return unknownComponent(operation.component, patchFile, `${operationPath}.component`);\r\n }\r\n\r\n if (!Object.hasOwn(entity.components, operation.component)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_COMPONENT_NOT_FOUND\",\r\n file: patchFile,\r\n path: `${operationPath}.component`,\r\n message: `Entity '${operation.entityId}' does not have component '${operation.component}'.`,\r\n suggestion: \"Add the component before updating it.\"\r\n }\r\n ];\r\n }\r\n\r\n if (!isRecord(operation.value)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_COMPONENT_UPDATE_INVALID\",\r\n file: patchFile,\r\n path: `${operationPath}.value`,\r\n message: \"update_component requires an object value to deep-merge into the component.\",\r\n suggestion: \"Use an object containing only the component fields to update.\"\r\n }\r\n ];\r\n }\r\n\r\n entity.components[operation.component] = deepMergeObjects(entity.components[operation.component], operation.value);\r\n return validateComponentValue(\r\n operation.component,\r\n entity.components[operation.component],\r\n patchFile,\r\n `${operationPath}.value`,\r\n \"PATCH_COMPONENT_INVALID\"\r\n );\r\n}\r\n\r\nfunction applyDuplicateEntity(\r\n scene: SceneDocument,\r\n operation: DuplicateEntityOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const sourceEntity = findEntity(scene, operation.entityId);\r\n if (!sourceEntity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (findEntity(scene, operation.newEntityId)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_DUPLICATE_ENTITY_ID\",\r\n file: patchFile,\r\n path: `${operationPath}.newEntityId`,\r\n message: `Entity id '${operation.newEntityId}' already exists.`,\r\n suggestion: \"Use a new stable entity id.\"\r\n }\r\n ];\r\n }\r\n\r\n if (!isRecord(sourceEntity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n const duplicatedComponents = cloneJson(sourceEntity.components) as Record<string, unknown>;\r\n const duplicatedEntity: SceneEntity = {\r\n id: operation.newEntityId,\r\n components: duplicatedComponents\r\n };\r\n\r\n if (operation.overrides) {\r\n for (const [componentName, override] of Object.entries(operation.overrides)) {\r\n if (!componentValidators[componentName]) {\r\n return unknownComponent(componentName, patchFile, `${operationPath}.overrides.${componentName}`);\r\n }\r\n\r\n duplicatedComponents[componentName] = Object.hasOwn(duplicatedComponents, componentName)\r\n ? deepMergeObjects(duplicatedComponents[componentName], override)\r\n : cloneJson(override);\r\n\r\n const componentDiagnostics = validateComponentValue(\r\n componentName,\r\n duplicatedComponents[componentName],\r\n patchFile,\r\n `${operationPath}.overrides.${componentName}`,\r\n \"PATCH_COMPONENT_INVALID\"\r\n );\r\n if (componentDiagnostics.length > 0) {\r\n return componentDiagnostics;\r\n }\r\n }\r\n }\r\n\r\n scene.entities.push(duplicatedEntity);\r\n return [];\r\n}\r\n\r\nfunction applyInstantiatePrefab(\r\n scene: SceneDocument,\r\n operation: InstantiatePrefabOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n\r\n if (findEntity(scene, operation.entityId)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_DUPLICATE_ENTITY_ID\",\r\n file: patchFile,\r\n path: `${operationPath}.entityId`,\r\n message: `Entity id '${operation.entityId}' already exists.`,\r\n suggestion: \"Use a new stable entity id for the prefab instance.\"\r\n }\r\n ];\r\n }\r\n\r\n if (typeof operation.prefab !== \"string\" || operation.prefab.trim().length === 0) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_INVALID_PREFAB_PATH\",\r\n file: patchFile,\r\n path: `${operationPath}.prefab`,\r\n message: \"instantiate_prefab requires a non-empty prefab path.\",\r\n suggestion: \"Use a prefab path relative to the target scene, such as ../prefabs/slime.prefab.yml.\"\r\n }\r\n ];\r\n }\r\n\r\n const entity: SceneEntity = {\r\n id: operation.entityId,\r\n prefab: operation.prefab\r\n };\r\n\r\n if (operation.overrides !== undefined) {\r\n entity.overrides = cloneJson(operation.overrides) as Record<string, unknown>;\r\n }\r\n\r\n scene.entities.push(entity);\r\n return [];\r\n}\r\n\r\nfunction applySetParent(\r\n scene: SceneDocument,\r\n operation: SetParentOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!findEntity(scene, operation.parentEntityId)) {\r\n return targetEntityNotFound(operation.parentEntityId, patchFile, `${operationPath}.parentEntityId`);\r\n }\r\n\r\n if (operation.entityId === operation.parentEntityId) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_SELF_PARENT\",\r\n file: patchFile,\r\n path: `${operationPath}.parentEntityId`,\r\n message: `Entity '${operation.entityId}' cannot parent itself.`,\r\n suggestion: \"Use a different parent entity id or clear the parent.\"\r\n }\r\n ];\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n entity.components.Parent = { entityId: operation.parentEntityId };\r\n return [];\r\n}\r\n\r\nfunction applyClearParent(\r\n scene: SceneDocument,\r\n operation: ClearParentOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const entity = findEntity(scene, operation.entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(operation.entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(operation.entityId, patchFile, operationPath);\r\n }\r\n\r\n delete entity.components.Parent;\r\n return [];\r\n}\r\n\r\nfunction applyAddAnimationFrame(\r\n scene: SceneDocument,\r\n operation: AddAnimationFrameOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const clipResult = findAnimationClipForPatch(scene, operation.entityId, patchFile, operationPath);\r\n if (Array.isArray(clipResult)) {\r\n return clipResult;\r\n }\r\n\r\n if (clipResult.frames.some((frame) => isRecord(frame) && frame.id === operation.frame.id)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATION_FRAME_DUPLICATE\",\r\n file: patchFile,\r\n path: `${operationPath}.frame.id`,\r\n message: `Animation frame '${operation.frame.id}' already exists in clip '${String(clipResult.clip.id)}'.`,\r\n suggestion: \"Use a new stable SpriteFrame.id or update the existing frame.\"\r\n }\r\n ];\r\n }\r\n\r\n const insertIndex = animationFrameInsertIndex(clipResult.frames, operation.afterFrameId);\r\n if (insertIndex === undefined) {\r\n return animationFrameNotFound(\r\n operation.afterFrameId ?? \"<unknown>\",\r\n patchFile,\r\n `${operationPath}.afterFrameId`,\r\n \"Choose an existing SpriteFrame.id from the target AnimationClip.\"\r\n );\r\n }\r\n\r\n if (Array.isArray(clipResult.clip.frameOrder) && operation.afterFrameId) {\r\n const frameOrderIndex = clipResult.clip.frameOrder.indexOf(operation.afterFrameId);\r\n if (frameOrderIndex === -1) {\r\n return animationFrameNotFound(\r\n operation.afterFrameId,\r\n patchFile,\r\n `${operationPath}.afterFrameId`,\r\n \"When frameOrder is explicit, afterFrameId must also appear in AnimationClip.frameOrder.\"\r\n );\r\n }\r\n clipResult.clip.frameOrder.splice(frameOrderIndex + 1, 0, operation.frame.id);\r\n } else if (Array.isArray(clipResult.clip.frameOrder)) {\r\n clipResult.clip.frameOrder.push(operation.frame.id);\r\n }\r\n\r\n clipResult.frames.splice(insertIndex, 0, cloneJson(operation.frame) as SpriteFrame);\r\n return validateComponentValue(\"AnimationClip\", clipResult.clip, patchFile, operationPath, \"PATCH_COMPONENT_INVALID\");\r\n}\r\n\r\nfunction applyUpdateAnimationFrame(\r\n scene: SceneDocument,\r\n operation: UpdateAnimationFrameOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const clipResult = findAnimationClipForPatch(scene, operation.entityId, patchFile, operationPath);\r\n if (Array.isArray(clipResult)) {\r\n return clipResult;\r\n }\r\n\r\n if (Object.keys(operation.value).length === 0) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATION_FRAME_UPDATE_EMPTY\",\r\n file: patchFile,\r\n path: `${operationPath}.value`,\r\n message: \"update_animation_frame requires at least one frame field to update.\",\r\n suggestion: \"Set durationFrames, sprite, or rect.\"\r\n }\r\n ];\r\n }\r\n\r\n const frame = clipResult.frames.find((candidate) => isRecord(candidate) && candidate.id === operation.frameId);\r\n if (!frame || !isRecord(frame)) {\r\n return animationFrameNotFound(\r\n operation.frameId,\r\n patchFile,\r\n `${operationPath}.frameId`,\r\n \"Inspect the target AnimationClip and choose an existing SpriteFrame.id.\"\r\n );\r\n }\r\n\r\n Object.assign(frame, cloneJson(operation.value) as AnimationFrameUpdate);\r\n return validateComponentValue(\"AnimationClip\", clipResult.clip, patchFile, operationPath, \"PATCH_COMPONENT_INVALID\");\r\n}\r\n\r\nfunction applyRemoveAnimationFrame(\r\n scene: SceneDocument,\r\n operation: RemoveAnimationFrameOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n const clipResult = findAnimationClipForPatch(scene, operation.entityId, patchFile, operationPath);\r\n if (Array.isArray(clipResult)) {\r\n return clipResult;\r\n }\r\n\r\n const frameIndex = clipResult.frames.findIndex((frame) => isRecord(frame) && frame.id === operation.frameId);\r\n if (frameIndex === -1) {\r\n return animationFrameNotFound(\r\n operation.frameId,\r\n patchFile,\r\n `${operationPath}.frameId`,\r\n \"Inspect the target AnimationClip and choose an existing SpriteFrame.id.\"\r\n );\r\n }\r\n\r\n if (clipResult.frames.length <= 1) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATION_FRAME_REQUIRED\",\r\n file: patchFile,\r\n path: `${operationPath}.frameId`,\r\n message: `AnimationClip '${String(clipResult.clip.id)}' must keep at least one frame.`,\r\n suggestion: \"Update the frame instead of removing the final frame, or add a replacement frame first.\"\r\n }\r\n ];\r\n }\r\n\r\n clipResult.frames.splice(frameIndex, 1);\r\n if (Array.isArray(clipResult.clip.frameOrder)) {\r\n clipResult.clip.frameOrder = clipResult.clip.frameOrder.filter((frameId) => frameId !== operation.frameId);\r\n }\r\n\r\n return validateComponentValue(\"AnimationClip\", clipResult.clip, patchFile, operationPath, \"PATCH_COMPONENT_INVALID\");\r\n}\r\n\r\nfunction applySetAnimatorClip(\r\n scene: SceneDocument,\r\n operation: SetAnimatorClipOperation,\r\n index: number,\r\n patchFile: string\r\n): Diagnostic[] {\r\n const operationPath = `$.operations[${index}]`;\r\n if (!findAnimationClipById(scene, operation.clipId)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATION_CLIP_NOT_FOUND\",\r\n file: patchFile,\r\n path: `${operationPath}.clipId`,\r\n message: `AnimationClip '${operation.clipId}' does not exist in the scene.`,\r\n suggestion: \"Use an AnimationClip.id from the target scene.\"\r\n }\r\n ];\r\n }\r\n\r\n const animatorResult = findAnimatorForPatch(scene, operation.entityId, patchFile, operationPath);\r\n if (Array.isArray(animatorResult)) {\r\n return animatorResult;\r\n }\r\n\r\n if (!Array.isArray(animatorResult.clips)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATOR_CLIPS_INVALID\",\r\n file: patchFile,\r\n path: `${operationPath}.entityId`,\r\n message: `Entity '${operation.entityId}' Animator.clips must be an array before setting a clip.`,\r\n suggestion: \"Run scene validation and repair Animator.clips first.\"\r\n }\r\n ];\r\n }\r\n\r\n if (!animatorResult.clips.includes(operation.clipId)) {\r\n animatorResult.clips.push(operation.clipId);\r\n }\r\n\r\n switch (operation.slot ?? \"current\") {\r\n case \"current\":\r\n animatorResult.currentClip = operation.clipId;\r\n break;\r\n case \"default\":\r\n animatorResult.defaultClip = operation.clipId;\r\n break;\r\n case \"active\":\r\n animatorResult.activeClip = operation.clipId;\r\n break;\r\n }\r\n\r\n return validateComponentValue(\"Animator\", animatorResult, patchFile, operationPath, \"PATCH_COMPONENT_INVALID\");\r\n}\r\n\r\nfunction findAnimationClipForPatch(\r\n scene: SceneDocument,\r\n entityId: string,\r\n patchFile: string,\r\n operationPath: string\r\n): { entity: SceneEntity; clip: Record<string, unknown>; frames: unknown[] } | Diagnostic[] {\r\n const entity = findEntity(scene, entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(entityId, patchFile, operationPath);\r\n }\r\n\r\n const clip = getComponentRecord(entity, \"AnimationClip\");\r\n if (!clip || !Array.isArray(clip.frames)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATION_CLIP_NOT_FOUND\",\r\n file: patchFile,\r\n path: `${operationPath}.entityId`,\r\n message: `Entity '${entityId}' does not have an AnimationClip component.`,\r\n suggestion: \"Target an entity that owns the AnimationClip component.\"\r\n }\r\n ];\r\n }\r\n\r\n return { entity, clip, frames: clip.frames };\r\n}\r\n\r\nfunction findAnimatorForPatch(\r\n scene: SceneDocument,\r\n entityId: string,\r\n patchFile: string,\r\n operationPath: string\r\n): Record<string, unknown> | Diagnostic[] {\r\n const entity = findEntity(scene, entityId);\r\n if (!entity) {\r\n return targetEntityNotFound(entityId, patchFile, `${operationPath}.entityId`);\r\n }\r\n\r\n if (!isRecord(entity.components)) {\r\n return entityComponentsUnavailable(entityId, patchFile, operationPath);\r\n }\r\n\r\n const animator = getComponentRecord(entity, \"Animator\");\r\n if (!animator) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATOR_NOT_FOUND\",\r\n file: patchFile,\r\n path: `${operationPath}.entityId`,\r\n message: `Entity '${entityId}' does not have an Animator component.`,\r\n suggestion: \"Target an entity that owns the Animator component.\"\r\n }\r\n ];\r\n }\r\n\r\n return animator;\r\n}\r\n\r\nfunction findAnimationClipById(scene: SceneDocument, clipId: string): Record<string, unknown> | undefined {\r\n for (const entity of scene.entities) {\r\n const clip = getComponentRecord(entity, \"AnimationClip\");\r\n if (clip?.id === clipId) {\r\n return clip;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction animationFrameInsertIndex(frames: unknown[], afterFrameId?: string): number | undefined {\r\n if (afterFrameId === undefined) {\r\n return frames.length;\r\n }\r\n\r\n const frameIndex = frames.findIndex((frame) => isRecord(frame) && frame.id === afterFrameId);\r\n return frameIndex === -1 ? undefined : frameIndex + 1;\r\n}\r\n\r\nfunction animationFrameNotFound(\r\n frameId: string,\r\n patchFile: string,\r\n dataPath: string,\r\n suggestion: string\r\n): Diagnostic[] {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ANIMATION_FRAME_NOT_FOUND\",\r\n file: patchFile,\r\n path: dataPath,\r\n message: `Animation frame '${frameId}' was not found.`,\r\n suggestion\r\n }\r\n ];\r\n}\r\n\r\nasync function validateInstantiatePrefabOperations(\r\n patch: PatchDocument,\r\n patchFile: string,\r\n sceneFile: string\r\n): Promise<Diagnostic[]> {\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n for (const [index, operation] of patch.operations.entries()) {\r\n if (operation.op !== \"instantiate_prefab\") {\r\n continue;\r\n }\r\n\r\n const operationPath = `$.operations[${index}]`;\r\n if (typeof operation.prefab !== \"string\" || operation.prefab.trim().length === 0) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PATCH_INVALID_PREFAB_PATH\",\r\n file: patchFile,\r\n path: `${operationPath}.prefab`,\r\n message: \"instantiate_prefab requires a non-empty prefab path.\",\r\n suggestion: \"Use a prefab path relative to the target scene, such as ../prefabs/slime.prefab.yml.\"\r\n });\r\n continue;\r\n }\r\n\r\n const prefabFile = resolveScenePrefabPath(sceneFile, operation.prefab);\r\n const prefabResult = await loadPrefabFile(prefabFile);\r\n\r\n if (\r\n prefabResult.document === undefined &&\r\n prefabResult.diagnostics.some((diagnostic) => diagnostic.code === \"FILE_READ_FAILED\")\r\n ) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PATCH_MISSING_PREFAB\",\r\n file: patchFile,\r\n path: `${operationPath}.prefab`,\r\n message: `Prefab file '${operation.prefab}' was not found.`,\r\n suggestion: \"Create the prefab file or update the prefab path relative to the target scene.\"\r\n });\r\n continue;\r\n }\r\n\r\n const prefabDiagnostics = [...prefabResult.diagnostics];\r\n if (prefabResult.document !== undefined) {\r\n prefabDiagnostics.push(...validatePrefabDocument(prefabResult.document, prefabResult.file));\r\n }\r\n\r\n if (prefabResult.document === undefined || hasErrors(prefabDiagnostics)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"PATCH_INVALID_PREFAB\",\r\n file: patchFile,\r\n path: `${operationPath}.prefab`,\r\n message: `Prefab file '${operation.prefab}' is invalid.`,\r\n suggestion: \"Validate the prefab file before instantiating it.\"\r\n });\r\n diagnostics.push(...prefabDiagnostics);\r\n continue;\r\n }\r\n\r\n diagnostics.push(\r\n ...validatePrefabOverrideEntries(operation.overrides, prefabResult.document, patchFile, `${operationPath}.overrides`, {\r\n invalidOverrides: \"PATCH_INVALID_PREFAB_OVERRIDES\",\r\n unknownComponent: \"PATCH_INVALID_PREFAB_OVERRIDES\",\r\n componentNotFound: \"PATCH_INVALID_PREFAB_OVERRIDES\",\r\n invalidOverride: \"PATCH_INVALID_PREFAB_OVERRIDES\"\r\n })\r\n );\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction validateComponentValue(\r\n componentName: string,\r\n value: unknown,\r\n file: string,\r\n dataPath: string,\r\n code: string\r\n): Diagnostic[] {\r\n const validator = componentValidators[componentName];\r\n if (!validator) {\r\n return unknownComponent(componentName, file, dataPath);\r\n }\r\n\r\n return schemaDiagnostics(validator, value, file, code, dataPath);\r\n}\r\n\r\nfunction validatePrefabOverrides(\r\n entity: SceneEntity,\r\n prefab: PrefabDocument,\r\n sceneFile: string,\r\n entityIndex: number\r\n): Diagnostic[] {\r\n return validatePrefabOverrideEntries(\r\n entity.overrides,\r\n prefab,\r\n sceneFile,\r\n `$.entities[${entityIndex}].overrides`,\r\n {\r\n invalidOverrides: \"SCENE_PREFAB_OVERRIDES_INVALID\",\r\n unknownComponent: \"SCENE_PREFAB_OVERRIDE_UNKNOWN_COMPONENT\",\r\n componentNotFound: \"SCENE_PREFAB_OVERRIDE_COMPONENT_NOT_FOUND\",\r\n invalidOverride: \"SCENE_PREFAB_OVERRIDE_INVALID\"\r\n }\r\n );\r\n}\r\n\r\nfunction validatePrefabOverrideEntries(\r\n overrides: Record<string, unknown> | undefined,\r\n prefab: PrefabDocument,\r\n file: string,\r\n pathPrefix: string,\r\n codes: {\r\n invalidOverrides: string;\r\n unknownComponent: string;\r\n componentNotFound: string;\r\n invalidOverride: string;\r\n }\r\n): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n if (overrides === undefined) {\r\n return diagnostics;\r\n }\r\n\r\n if (!isRecord(overrides)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: codes.invalidOverrides,\r\n file,\r\n path: pathPrefix,\r\n message: \"Prefab overrides must be an object keyed by component name.\",\r\n suggestion: \"Use component names such as Transform under overrides.\"\r\n }\r\n ];\r\n }\r\n\r\n for (const [componentName, overrideValue] of Object.entries(overrides)) {\r\n const overridePath = `${pathPrefix}.${componentName}`;\r\n\r\n if (!componentValidators[componentName]) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: codes.unknownComponent,\r\n file,\r\n path: overridePath,\r\n message: `Unknown component '${componentName}' in prefab override.`,\r\n suggestion: `Use one of: ${componentOrder.join(\", \")}.`\r\n });\r\n continue;\r\n }\r\n\r\n if (!Object.hasOwn(prefab.components, componentName)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: codes.componentNotFound,\r\n file,\r\n path: overridePath,\r\n message: `Prefab '${prefab.prefab}' does not define component '${componentName}'.`,\r\n suggestion: \"Override only components defined by the prefab in v0.\"\r\n });\r\n continue;\r\n }\r\n\r\n if (!isRecord(overrideValue)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: codes.invalidOverride,\r\n file,\r\n path: overridePath,\r\n message: `Override for component '${componentName}' must be an object.`,\r\n suggestion: \"Provide only the component fields to override.\"\r\n });\r\n continue;\r\n }\r\n\r\n const mergedValue = deepMergeObjects(prefab.components[componentName], overrideValue);\r\n diagnostics.push(\r\n ...validateComponentValue(componentName, mergedValue, file, overridePath, codes.invalidOverride)\r\n );\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction targetEntityNotFound(entityId: string, file: string, dataPath: string): Diagnostic[] {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_TARGET_ENTITY_NOT_FOUND\",\r\n file,\r\n path: dataPath,\r\n message: `Target entity '${entityId}' was not found.`,\r\n suggestion: \"Inspect the scene and use an existing stable entity id.\"\r\n }\r\n ];\r\n}\r\n\r\nfunction entityComponentsUnavailable(entityId: string, file: string, operationPath: string): Diagnostic[] {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ENTITY_COMPONENTS_UNAVAILABLE\",\r\n file,\r\n path: `${operationPath}.entityId`,\r\n message: `Entity '${entityId}' does not define direct components.`,\r\n suggestion: \"For prefab instances, edit overrides or instantiate a direct entity before component patch operations.\"\r\n }\r\n ];\r\n}\r\n\r\nfunction unknownComponent(componentName: string, file: string, dataPath: string): Diagnostic[] {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_UNKNOWN_COMPONENT\",\r\n file,\r\n path: dataPath,\r\n message: `Unknown component '${componentName}'.`,\r\n suggestion: `Use one of: ${componentOrder.join(\", \")}.`\r\n }\r\n ];\r\n}\r\n\r\nfunction entityIndexFromSourcePath(sourcePath: string): number | undefined {\r\n const match = /^\\$\\.entities\\[(\\d+)\\]$/.exec(sourcePath);\r\n if (!match) {\r\n return undefined;\r\n }\r\n return Number(match[1]);\r\n}\r\n\r\nfunction patchSourceSelectorInvalid(file: string, dataPath: string, message: string, suggestion: string): Diagnostic[] {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_SOURCE_SELECTOR_INVALID\",\r\n file,\r\n path: dataPath,\r\n message,\r\n suggestion\r\n }\r\n ];\r\n}\r\n\r\nfunction patchSourceSelectorMismatch(file: string, dataPath: string, message: string): Diagnostic[] {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_SOURCE_SELECTOR_MISMATCH\",\r\n file,\r\n path: dataPath,\r\n message,\r\n suggestion: \"Re-run validation and regenerate the selector-based repair artifact from current source evidence.\"\r\n }\r\n ];\r\n}\r\n\r\nfunction findEntity(scene: SceneDocument, entityId: string): SceneEntity | undefined {\r\n return scene.entities.find((entity) => entity.id === entityId);\r\n}\r\n\r\nfunction findEntityReferences(scene: SceneDocument, targetEntityId?: string): EntityReference[] {\r\n const references: EntityReference[] = [];\r\n\r\n scene.entities.forEach((entity, entityIndex) => {\r\n if (!isRecord(entity) || typeof entity.id !== \"string\" || !isRecord(entity.components)) {\r\n return;\r\n }\r\n\r\n for (const [componentName, componentValue] of Object.entries(entity.components ?? {})) {\r\n if (!isRecord(componentValue)) {\r\n continue;\r\n }\r\n\r\n for (const referenceField of componentReferenceFields[componentName] ?? []) {\r\n const referencedId = componentValue[referenceField];\r\n if (typeof referencedId !== \"string\") {\r\n continue;\r\n }\r\n\r\n if (targetEntityId && referencedId !== targetEntityId) {\r\n continue;\r\n }\r\n\r\n references.push({\r\n entityId: entity.id,\r\n component: componentName,\r\n field: referenceField,\r\n path: `$.entities[${entityIndex}].components.${componentName}.${referenceField}`,\r\n value: referencedId\r\n });\r\n }\r\n }\r\n });\r\n\r\n return references;\r\n}\r\n\r\nfunction replaceReferences(\r\n scene: SceneDocument,\r\n fromEntityId: string,\r\n toEntityId: string,\r\n summary: PatchApplicationSummary\r\n): ReferenceChange[] {\r\n const changes: ReferenceChange[] = [];\r\n\r\n for (const reference of findEntityReferences(scene, fromEntityId)) {\r\n const entity = findEntity(scene, reference.entityId);\r\n const componentValue = entity?.components?.[reference.component];\r\n if (!isRecord(componentValue)) {\r\n continue;\r\n }\r\n\r\n componentValue[reference.field] = toEntityId;\r\n const change = {\r\n ...reference,\r\n from: fromEntityId,\r\n to: toEntityId\r\n };\r\n changes.push(change);\r\n summary.changedReferences.push(change);\r\n }\r\n\r\n return changes;\r\n}\r\n\r\nexport function deriveHierarchy(scene: SceneDocument, file = \"scene.yml\"): HierarchyDerivation {\r\n const ids = scene.entities\r\n .map((entity) => entity.id)\r\n .filter((entityId): entityId is string => typeof entityId === \"string\")\r\n .sort();\r\n const idSet = new Set(ids);\r\n const parentByEntityId: Record<string, string> = {};\r\n const childrenByEntityId: Record<string, string[]> = Object.fromEntries(ids.map((entityId) => [entityId, []]));\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n const parentEntityId = getParentEntityId(entity);\r\n if (typeof entity.id !== \"string\" || parentEntityId === undefined) {\r\n continue;\r\n }\r\n\r\n const parentPath = `$.entities[${entityIndex}].components.Parent.entityId`;\r\n if (!idSet.has(parentEntityId)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ENTITY_REFERENCE\",\r\n file,\r\n path: parentPath,\r\n message: `Parent entity reference '${parentEntityId}' does not resolve.`,\r\n suggestion: \"Use the stable id of an entity in this scene.\"\r\n });\r\n continue;\r\n }\r\n\r\n if (parentEntityId === entity.id) {\r\n diagnostics.push(selfParentDiagnostic(entity.id, file, parentPath));\r\n continue;\r\n }\r\n\r\n parentByEntityId[entity.id] = parentEntityId;\r\n childrenByEntityId[parentEntityId]?.push(entity.id);\r\n }\r\n\r\n for (const children of Object.values(childrenByEntityId)) {\r\n children.sort();\r\n }\r\n\r\n diagnostics.push(...findParentCycleDiagnostics(scene, file, parentByEntityId));\r\n\r\n return {\r\n roots: ids.filter((entityId) => !Object.hasOwn(parentByEntityId, entityId)),\r\n childrenByEntityId,\r\n parentByEntityId,\r\n depthByEntityId: computeHierarchyDepths(ids, parentByEntityId),\r\n diagnostics\r\n };\r\n}\r\n\r\nexport function computeWorldTransforms(scene: SceneDocument, file = \"scene.yml\"): WorldTransformResult {\r\n const hierarchy = deriveHierarchy(scene, file);\r\n const entityById = new Map(scene.entities.map((entity) => [entity.id, entity]));\r\n const transforms: Record<string, TransformSummary> = {};\r\n const visiting = new Set<string>();\r\n\r\n function resolveWorldTransform(entityId: string): TransformSummary | undefined {\r\n if (Object.hasOwn(transforms, entityId)) {\r\n return transforms[entityId];\r\n }\r\n\r\n if (visiting.has(entityId)) {\r\n return undefined;\r\n }\r\n\r\n visiting.add(entityId);\r\n const entity = entityById.get(entityId);\r\n const localTransform = getTransformSummary(entity);\r\n if (!localTransform) {\r\n visiting.delete(entityId);\r\n return undefined;\r\n }\r\n\r\n const parentId = hierarchy.parentByEntityId[entityId];\r\n const parentTransform = parentId ? resolveWorldTransform(parentId) : undefined;\r\n const worldTransform = parentTransform ? composeTransform(parentTransform, localTransform) : localTransform;\r\n transforms[entityId] = worldTransform;\r\n visiting.delete(entityId);\r\n return worldTransform;\r\n }\r\n\r\n for (const entityId of scene.entities.map((entity) => entity.id).filter((id): id is string => typeof id === \"string\").sort()) {\r\n resolveWorldTransform(entityId);\r\n }\r\n\r\n return {\r\n transforms,\r\n diagnostics: hierarchy.diagnostics\r\n };\r\n}\r\n\r\nfunction validateHierarchyRules(scene: SceneDocument, file: string, ids: Set<string>): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n const parentByEntityId: Record<string, string> = {};\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n const parentEntityId = getParentEntityId(entity);\r\n if (typeof entity.id !== \"string\" || parentEntityId === undefined || !ids.has(parentEntityId)) {\r\n continue;\r\n }\r\n\r\n const parentPath = `$.entities[${entityIndex}].components.Parent.entityId`;\r\n if (parentEntityId === entity.id) {\r\n diagnostics.push(selfParentDiagnostic(entity.id, file, parentPath));\r\n continue;\r\n }\r\n\r\n parentByEntityId[entity.id] = parentEntityId;\r\n }\r\n\r\n diagnostics.push(...findParentCycleDiagnostics(scene, file, parentByEntityId));\r\n return diagnostics;\r\n}\r\n\r\nfunction validateAnimationRules(scene: SceneDocument, file: string): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n const clips = new Map<string, { entityId: string; frameCount: number; frameIds: Set<string> }>();\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n const clip = getComponentRecord(entity, \"AnimationClip\");\r\n if (!clip || typeof clip.id !== \"string\") {\r\n continue;\r\n }\r\n\r\n const frames = Array.isArray(clip.frames) ? clip.frames : [];\r\n const frameIds = new Set<string>();\r\n frames.forEach((frame, frameIndex) => {\r\n if (!isRecord(frame) || typeof frame.id !== \"string\") {\r\n return;\r\n }\r\n\r\n if (frameIds.has(frame.id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_DUPLICATE_ANIMATION_FRAME_ID\",\r\n file,\r\n path: `$.entities[${entityIndex}].components.AnimationClip.frames[${frameIndex}].id`,\r\n message: `Duplicate animation frame id '${frame.id}' in clip '${clip.id}'.`,\r\n suggestion: \"Use stable SpriteFrame.id values that are unique within each AnimationClip.\"\r\n });\r\n return;\r\n }\r\n\r\n frameIds.add(frame.id);\r\n });\r\n\r\n if (Array.isArray(clip.frameOrder)) {\r\n clip.frameOrder.forEach((frameId, frameOrderIndex) => {\r\n if (typeof frameId === \"string\" && !frameIds.has(frameId)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ANIMATION_FRAME_REFERENCE\",\r\n file,\r\n path: `$.entities[${entityIndex}].components.AnimationClip.frameOrder[${frameOrderIndex}]`,\r\n message: `AnimationClip frameOrder references missing frame '${frameId}'.`,\r\n suggestion: \"Use a SpriteFrame.id defined in AnimationClip.frames.\"\r\n });\r\n }\r\n });\r\n }\r\n\r\n const clipPath = `$.entities[${entityIndex}].components.AnimationClip.id`;\r\n if (clips.has(clip.id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_DUPLICATE_ANIMATION_CLIP_ID\",\r\n file,\r\n path: clipPath,\r\n message: `Duplicate animation clip id '${clip.id}'.`,\r\n suggestion: \"Use one stable AnimationClip.id per scene.\"\r\n });\r\n continue;\r\n }\r\n\r\n clips.set(clip.id, {\r\n entityId: entity.id,\r\n frameCount: Array.isArray(clip.frameOrder) ? clip.frameOrder.length : frames.length,\r\n frameIds\r\n });\r\n }\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n const animator = getComponentRecord(entity, \"Animator\");\r\n if (!animator) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(animator.clips)) {\r\n animator.clips.forEach((clipId, clipIndex) => {\r\n if (typeof clipId === \"string\" && !clips.has(clipId)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ANIMATION_CLIP_REFERENCE\",\r\n file,\r\n path: `$.entities[${entityIndex}].components.Animator.clips[${clipIndex}]`,\r\n message: `Animator references missing animation clip '${clipId}'.`,\r\n suggestion: \"Use an AnimationClip.id defined in this scene.\"\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (typeof animator.defaultClip === \"string\") {\r\n const defaultClipPath = `$.entities[${entityIndex}].components.Animator.defaultClip`;\r\n if (!clips.has(animator.defaultClip)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ANIMATION_CLIP_REFERENCE\",\r\n file,\r\n path: defaultClipPath,\r\n message: `Animator defaultClip '${animator.defaultClip}' does not resolve.`,\r\n suggestion: \"Use an AnimationClip.id defined in this scene.\"\r\n });\r\n } else if (Array.isArray(animator.clips) && !animator.clips.includes(animator.defaultClip)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_ANIMATOR_DEFAULT_CLIP_NOT_LISTED\",\r\n file,\r\n path: defaultClipPath,\r\n message: `Animator defaultClip '${animator.defaultClip}' is not listed in Animator.clips.`,\r\n suggestion: \"Add the default clip id to Animator.clips or choose a listed clip.\"\r\n });\r\n }\r\n }\r\n\r\n const activeClipId = typeof animator.activeClip === \"string\" ? animator.activeClip : undefined;\r\n const activeClip = activeClipId ? clips.get(activeClipId) : undefined;\r\n if (activeClipId) {\r\n const activeClipPath = `$.entities[${entityIndex}].components.Animator.activeClip`;\r\n if (!activeClip) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ANIMATION_CLIP_REFERENCE\",\r\n file,\r\n path: activeClipPath,\r\n message: `Animator activeClip '${activeClipId}' does not resolve.`,\r\n suggestion: \"Use an AnimationClip.id defined in this scene.\"\r\n });\r\n } else if (Array.isArray(animator.clips) && !animator.clips.includes(activeClipId)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_ANIMATOR_ACTIVE_CLIP_NOT_LISTED\",\r\n file,\r\n path: activeClipPath,\r\n message: `Animator activeClip '${activeClipId}' is not listed in Animator.clips.`,\r\n suggestion: \"Add the active clip id to Animator.clips or choose a listed clip.\"\r\n });\r\n }\r\n }\r\n\r\n if (typeof animator.currentClip !== \"string\") {\r\n continue;\r\n }\r\n\r\n const currentClipPath = `$.entities[${entityIndex}].components.Animator.currentClip`;\r\n const currentClip = clips.get(animator.currentClip);\r\n if (!currentClip) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ANIMATION_CLIP_REFERENCE\",\r\n file,\r\n path: currentClipPath,\r\n message: `Animator currentClip '${animator.currentClip}' does not resolve.`,\r\n suggestion: \"Use an AnimationClip.id defined in this scene.\"\r\n });\r\n continue;\r\n }\r\n\r\n if (Array.isArray(animator.clips) && !animator.clips.includes(animator.currentClip)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_ANIMATOR_CURRENT_CLIP_NOT_LISTED\",\r\n file,\r\n path: currentClipPath,\r\n message: `Animator currentClip '${animator.currentClip}' is not listed in Animator.clips.`,\r\n suggestion: \"Add the current clip id to Animator.clips or choose a listed clip.\"\r\n });\r\n }\r\n\r\n const playbackClip = activeClip ?? currentClip;\r\n if (typeof animator.activeFrameId === \"string\" && playbackClip && !playbackClip.frameIds.has(animator.activeFrameId)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ANIMATION_FRAME_REFERENCE\",\r\n file,\r\n path: `$.entities[${entityIndex}].components.Animator.activeFrameId`,\r\n message: `Animator activeFrameId '${animator.activeFrameId}' does not resolve in '${activeClipId ?? animator.currentClip}'.`,\r\n suggestion: \"Use a SpriteFrame.id from the active animation clip.\"\r\n });\r\n }\r\n\r\n if (\r\n typeof animator.currentFrameIndex === \"number\" &&\r\n Number.isInteger(animator.currentFrameIndex) &&\r\n animator.currentFrameIndex >= playbackClip.frameCount\r\n ) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_ANIMATOR_FRAME_OUT_OF_RANGE\",\r\n file,\r\n path: `$.entities[${entityIndex}].components.Animator.currentFrameIndex`,\r\n message: `Animator currentFrameIndex ${animator.currentFrameIndex} is outside '${activeClipId ?? animator.currentClip}'.`,\r\n suggestion: `Use a frame index from 0 to ${Math.max(playbackClip.frameCount - 1, 0)} or omit currentFrameIndex.`\r\n });\r\n }\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction validate3DContractRules(scene: SceneDocument, file: string): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n const meshRefs = new Map<string, { entityId: string; path: string }>();\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n const transform = getComponentRecord(entity, \"Transform3D\");\r\n if (transform) {\r\n diagnostics.push(...validateTransform3DValue(transform, file, `$.entities[${entityIndex}].components.Transform3D`));\r\n }\r\n\r\n const camera = getComponentRecord(entity, \"Camera3D\");\r\n if (camera) {\r\n diagnostics.push(...validateCamera3DValue(camera, file, `$.entities[${entityIndex}].components.Camera3D`));\r\n }\r\n\r\n const collider = getComponentRecord(entity, \"Collider3D\");\r\n if (collider) {\r\n diagnostics.push(...validateCollider3DValue(collider, file, `$.entities[${entityIndex}].components.Collider3D`));\r\n }\r\n\r\n const meshRef = getComponentRecord(entity, \"MeshRef\");\r\n if (!meshRef || typeof meshRef.id !== \"string\") {\r\n continue;\r\n }\r\n\r\n const meshPath = `$.entities[${entityIndex}].components.MeshRef`;\r\n if (meshRefs.has(meshRef.id)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_DUPLICATE_MESH_REF_ID\",\r\n file,\r\n path: `${meshPath}.id`,\r\n message: `Duplicate MeshRef id '${meshRef.id}'.`,\r\n suggestion: \"Use one stable MeshRef.id per expanded scene.\"\r\n });\r\n } else {\r\n meshRefs.set(meshRef.id, {\r\n entityId: entity.id,\r\n path: meshPath\r\n });\r\n }\r\n\r\n if (typeof meshRef.path === \"string\" && !isPortableAssetPath(meshRef.path)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_MESH_PATH_INVALID\",\r\n file,\r\n path: `${meshPath}.path`,\r\n message: `Mesh path '${meshRef.path}' is not a portable project-relative path.`,\r\n suggestion: \"Use a relative path with forward slashes, no drive letters, no leading slash, and no '..' segments.\"\r\n });\r\n }\r\n }\r\n\r\n for (const [entityIndex, entity] of scene.entities.entries()) {\r\n const renderer = getComponentRecord(entity, \"MeshRenderer3D\");\r\n if (!renderer || typeof renderer.mesh !== \"string\") {\r\n continue;\r\n }\r\n\r\n if (!meshRefs.has(renderer.mesh)) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_MESH_REFERENCE\",\r\n file,\r\n path: `$.entities[${entityIndex}].components.MeshRenderer3D.mesh`,\r\n message: `MeshRenderer3D references missing MeshRef '${renderer.mesh}'.`,\r\n suggestion: \"Use a MeshRef.id defined in this expanded scene.\"\r\n });\r\n }\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction createHierarchySummary(hierarchy: HierarchyDerivation): SceneHierarchySummary {\r\n const entityIds = Object.keys(hierarchy.childrenByEntityId).sort();\r\n return {\r\n roots: [...hierarchy.roots].sort(),\r\n nodes: entityIds.map((entityId) => ({\r\n entityId,\r\n ...(hierarchy.parentByEntityId[entityId] ? { parent: hierarchy.parentByEntityId[entityId] } : {}),\r\n children: hierarchy.childrenByEntityId[entityId] ?? [],\r\n depth: hierarchy.depthByEntityId[entityId] ?? 0\r\n }))\r\n };\r\n}\r\n\r\nexport function inspectSceneAnimations(\r\n scene: SceneDocument,\r\n assets: AssetManifestContext = createAssetManifestContext()\r\n): SceneAnimationSummary {\r\n const clips: AnimationClipSummary[] = [];\r\n const animators: AnimatorSummary[] = [];\r\n\r\n for (const entity of scene.entities) {\r\n const clip = getComponentRecord(entity, \"AnimationClip\");\r\n if (clip && typeof clip.id === \"string\" && Array.isArray(clip.frames)) {\r\n const frameOrder = Array.isArray(clip.frameOrder)\r\n ? clip.frameOrder.filter((frameId): frameId is string => typeof frameId === \"string\")\r\n : undefined;\r\n const orderedFrameIds = orderedAnimationFrameIds(clip.frames, frameOrder);\r\n clips.push({\r\n id: clip.id,\r\n entityId: entity.id,\r\n frameCount: clip.frames.length,\r\n durationFrames: sumFrameDurations(clip.frames),\r\n ...(typeof clip.fps === \"number\" ? { fps: clip.fps } : {}),\r\n ...(frameOrder ? { frameOrder } : {}),\r\n orderedFrameIds,\r\n spriteAssetIds: [\r\n ...new Set(\r\n clip.frames\r\n .map((frame) => (isRecord(frame) && typeof frame.sprite === \"string\" ? frame.sprite : undefined))\r\n .filter((sprite): sprite is string => typeof sprite === \"string\")\r\n )\r\n ].sort(),\r\n frames: createAnimationFrameSummaries(clip.frames, orderedFrameIds, assets)\r\n });\r\n }\r\n\r\n const animator = getComponentRecord(entity, \"Animator\");\r\n if (animator && Array.isArray(animator.clips) && typeof animator.currentClip === \"string\") {\r\n animators.push({\r\n entityId: entity.id,\r\n clips: animator.clips.filter((clipId): clipId is string => typeof clipId === \"string\"),\r\n ...(typeof animator.defaultClip === \"string\" ? { defaultClip: animator.defaultClip } : {}),\r\n currentClip: animator.currentClip,\r\n ...(typeof animator.activeClip === \"string\" ? { activeClip: animator.activeClip } : {}),\r\n ...(typeof animator.activeFrameId === \"string\" ? { activeFrameId: animator.activeFrameId } : {}),\r\n ...(typeof animator.currentFrameIndex === \"number\" ? { currentFrameIndex: animator.currentFrameIndex } : {}),\r\n ...(typeof animator.elapsedFrames === \"number\" ? { elapsedFrames: animator.elapsedFrames } : {}),\r\n ...(typeof animator.elapsedSeconds === \"number\" ? { elapsedSeconds: animator.elapsedSeconds } : {})\r\n });\r\n }\r\n }\r\n\r\n return {\r\n clips: clips.sort((left, right) => left.id.localeCompare(right.id) || left.entityId.localeCompare(right.entityId)),\r\n animators: animators.sort((left, right) => left.entityId.localeCompare(right.entityId))\r\n };\r\n}\r\n\r\nfunction orderedAnimationFrameIds(frames: unknown[], frameOrder: string[] | undefined): string[] {\r\n const frameIds = frames\r\n .map((frame) => (isRecord(frame) && typeof frame.id === \"string\" ? frame.id : undefined))\r\n .filter((frameId): frameId is string => typeof frameId === \"string\");\r\n\r\n if (!frameOrder || frameOrder.length === 0) {\r\n return frameIds;\r\n }\r\n\r\n const frameIdSet = new Set(frameIds);\r\n return frameOrder.filter((frameId) => frameIdSet.has(frameId));\r\n}\r\n\r\nfunction createAnimationFrameSummaries(\r\n frames: unknown[],\r\n orderedFrameIds: string[],\r\n assets: AssetManifestContext\r\n): AnimationFrameSummary[] {\r\n const playbackOrderByFrameId = new Map(orderedFrameIds.map((frameId, index) => [frameId, index]));\r\n\r\n return frames.flatMap((frame, index): AnimationFrameSummary[] => {\r\n if (!isRecord(frame) || typeof frame.id !== \"string\" || typeof frame.durationFrames !== \"number\") {\r\n return [];\r\n }\r\n\r\n const sprite = typeof frame.sprite === \"string\" ? frame.sprite : undefined;\n const asset = sprite ? assets.assetsById.get(sprite) : undefined;\n const atlasFrame = asset ? resolveAssetAtlasFrame(asset, assets) : undefined;\n const rect = readRectTuple(frame.rect);\n return [\n {\n id: frame.id,\r\n durationFrames: frame.durationFrames,\r\n order: index,\r\n playbackOrder: playbackOrderByFrameId.get(frame.id) ?? index,\r\n ...(sprite ? { sprite } : {}),\r\n ...(rect ? { rect } : {}),\r\n ...(sprite ? { assetResolved: asset?.type === \"sprite\" } : {}),\n ...(asset ? { assetType: asset.type, assetPath: asset.path } : {}),\n ...(asset?.texture ? { texture: asset.texture } : {}),\n ...(asset?.rect ? { assetRect: asset.rect } : {}),\n ...(asset?.atlas ? { assetAtlas: asset.atlas } : {}),\n ...(asset?.frame ? { assetFrame: asset.frame } : {}),\n ...(atlasFrame ? { assetFrameRect: atlasFrame.rect } : {})\n }\n ];\n });\n}\n\nfunction resolveAssetAtlasFrame(\n asset: AssetRecord,\n assets: AssetManifestContext\n): AssetAtlasFrameRecord | undefined {\n if (!asset.atlas || !asset.frame) {\n return undefined;\n }\n\n const atlas = assets.assetsById.get(asset.atlas);\n if (atlas?.type !== \"atlas\") {\n return undefined;\n }\n\n return atlas.frames?.find((frame) => frame.id === asset.frame);\n}\n\r\nfunction readRectTuple(value: unknown): [number, number, number, number] | undefined {\r\n if (\r\n !Array.isArray(value) ||\r\n value.length !== 4 ||\r\n !value.every((item) => typeof item === \"number\" && Number.isFinite(item))\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return [value[0], value[1], value[2], value[3]];\r\n}\r\n\r\nfunction validateSceneAssetReferences(\r\n scene: SceneDocument,\r\n file: string,\r\n assets: AssetManifestContext\r\n): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n for (const reference of findSceneAssetReferences(scene)) {\r\n const asset = assets.assetsById.get(reference.assetId);\r\n if (!asset) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_BROKEN_ASSET_REFERENCE\",\r\n file,\r\n path: reference.path,\r\n message: `Asset reference '${reference.assetId}' does not resolve.`,\r\n suggestion: \"Add the asset id to a project asset manifest or update the scene reference.\"\r\n });\r\n continue;\r\n }\r\n\r\n if (asset.type !== reference.expectedType) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_ASSET_TYPE_MISMATCH\",\r\n file,\r\n path: reference.path,\r\n message: `Asset reference '${reference.assetId}' is '${asset.type}', not '${reference.expectedType}'.`,\r\n suggestion: `Use an asset id with type '${reference.expectedType}' for this field.`\r\n });\r\n }\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction createSceneAssetSummary(scene: SceneDocument, assets: AssetManifestContext): SceneAssetSummary {\r\n const references = findSceneAssetReferences(scene).map((reference) => {\r\n const asset = assets.assetsById.get(reference.assetId);\r\n return {\r\n assetId: reference.assetId,\r\n expectedType: reference.expectedType,\r\n path: reference.path,\r\n entityId: reference.entityId,\r\n component: reference.component,\r\n field: reference.field,\r\n resolved: asset?.type === reference.expectedType,\r\n ...(asset ? { actualType: asset.type } : {})\r\n };\r\n });\r\n\r\n return {\n manifestCount: assets.manifestFiles.length,\n assetCount: assets.assetsById.size,\n atlasCount: [...assets.assetsById.values()].filter((asset) => asset.type === \"atlas\").length,\n atlasFrameCount: [...assets.assetsById.values()].reduce(\n (total, asset) => total + (asset.type === \"atlas\" ? asset.frames?.length ?? 0 : 0),\n 0\n ),\n referencedAssets: references,\n unresolvedReferences: references.filter((reference) => !reference.resolved)\n };\n}\n\r\nfunction findSceneAssetReferences(scene: SceneDocument): SceneAssetReference[] {\r\n const references: SceneAssetReference[] = [];\r\n\r\n scene.entities.forEach((entity, entityIndex) => {\r\n const clip = getComponentRecord(entity, \"AnimationClip\");\r\n if (!clip || !Array.isArray(clip.frames)) {\r\n return;\r\n }\r\n\r\n clip.frames.forEach((frame, frameIndex) => {\r\n if (!isRecord(frame) || typeof frame.sprite !== \"string\") {\r\n return;\r\n }\r\n\r\n references.push({\r\n assetId: frame.sprite,\r\n expectedType: \"sprite\",\r\n path: `$.entities[${entityIndex}].components.AnimationClip.frames[${frameIndex}].sprite`,\r\n entityId: entity.id,\r\n component: \"AnimationClip\",\r\n field: \"frames[].sprite\"\r\n });\r\n });\r\n });\r\n\r\n return references;\r\n}\r\n\r\nfunction getComponentRecord(entity: SceneEntity, componentName: string): Record<string, unknown> | undefined {\r\n if (!isRecord(entity.components)) {\r\n return undefined;\r\n }\r\n\r\n const component = entity.components[componentName];\r\n return isRecord(component) ? component : undefined;\r\n}\r\n\r\nfunction sumFrameDurations(frames: unknown[]): number {\r\n return frames.reduce<number>((total, frame) => {\r\n if (!isRecord(frame) || typeof frame.durationFrames !== \"number\") {\r\n return total;\r\n }\r\n return total + frame.durationFrames;\r\n }, 0);\r\n}\r\n\r\nfunction selfParentDiagnostic(entityId: string, file: string, dataPath: string): Diagnostic {\r\n return {\r\n severity: \"error\",\r\n code: \"SCENE_SELF_PARENT\",\r\n file,\r\n path: dataPath,\r\n message: `Entity '${entityId}' cannot parent itself.`,\r\n suggestion: \"Use a different parent entity id or remove the Parent component.\"\r\n };\r\n}\r\n\r\nfunction findParentCycleDiagnostics(\r\n scene: SceneDocument,\r\n file: string,\r\n parentByEntityId: Record<string, string>\r\n): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n const state = new Map<string, \"visiting\" | \"visited\">();\r\n const stack: string[] = [];\r\n const reportedCycles = new Set<string>();\r\n\r\n function visit(entityId: string): void {\r\n const currentState = state.get(entityId);\r\n if (currentState === \"visited\") {\r\n return;\r\n }\r\n\r\n if (currentState === \"visiting\") {\r\n const cycleStart = stack.indexOf(entityId);\r\n const cycleEntities = cycleStart >= 0 ? stack.slice(cycleStart) : [entityId];\r\n const cycleKey = [...cycleEntities].sort().join(\">\");\r\n if (!reportedCycles.has(cycleKey)) {\r\n reportedCycles.add(cycleKey);\r\n const cyclePath = [...cycleEntities, entityId].join(\" -> \");\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_PARENT_CYCLE\",\r\n file,\r\n path: parentFieldPath(scene, cycleEntities[0] ?? entityId),\r\n message: `Parent cycle detected: ${cyclePath}.`,\r\n suggestion: \"Clear or retarget one Parent component so the hierarchy is a tree or forest.\"\r\n });\r\n }\r\n return;\r\n }\r\n\r\n state.set(entityId, \"visiting\");\r\n stack.push(entityId);\r\n\r\n const parentEntityId = parentByEntityId[entityId];\r\n if (parentEntityId) {\r\n visit(parentEntityId);\r\n }\r\n\r\n stack.pop();\r\n state.set(entityId, \"visited\");\r\n }\r\n\r\n for (const entityId of Object.keys(parentByEntityId).sort()) {\r\n visit(entityId);\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction computeHierarchyDepths(ids: string[], parentByEntityId: Record<string, string>): Record<string, number> {\r\n const depths: Record<string, number> = {};\r\n\r\n function depthOf(entityId: string, visiting = new Set<string>()): number {\r\n if (Object.hasOwn(depths, entityId)) {\r\n return depths[entityId];\r\n }\r\n\r\n const parentEntityId = parentByEntityId[entityId];\r\n if (!parentEntityId || visiting.has(entityId)) {\r\n depths[entityId] = 0;\r\n return depths[entityId];\r\n }\r\n\r\n visiting.add(entityId);\r\n depths[entityId] = depthOf(parentEntityId, visiting) + 1;\r\n visiting.delete(entityId);\r\n return depths[entityId];\r\n }\r\n\r\n for (const entityId of ids) {\r\n depthOf(entityId);\r\n }\r\n\r\n return depths;\r\n}\r\n\r\nfunction parentFieldPath(scene: SceneDocument, entityId: string): string {\r\n const entityIndex = scene.entities.findIndex((entity) => entity.id === entityId);\r\n return entityIndex >= 0 ? `$.entities[${entityIndex}].components.Parent.entityId` : \"$.entities\";\r\n}\r\n\r\nfunction getParentEntityId(entity: SceneEntity): string | undefined {\r\n const parent = entity.components?.Parent;\r\n if (!isRecord(parent) || typeof parent.entityId !== \"string\") {\r\n return undefined;\r\n }\r\n\r\n return parent.entityId;\r\n}\r\n\r\nfunction getTransformSummary(entity: SceneEntity | undefined): TransformSummary | undefined {\r\n const transform = entity?.components?.Transform;\r\n if (!isRecord(transform)) {\r\n return undefined;\r\n }\r\n\r\n const position = transform.position;\r\n const scale = transform.scale;\r\n const rotation = transform.rotation;\r\n\r\n if (!isVector2(position) || !isVector2(scale) || typeof rotation !== \"number\") {\r\n return undefined;\r\n }\r\n\r\n return {\r\n position: [position[0], position[1]],\r\n rotation,\r\n scale: [scale[0], scale[1]]\r\n };\r\n}\r\n\r\nfunction composeTransform(parent: TransformSummary, local: TransformSummary): TransformSummary {\r\n const scaledLocalX = local.position[0] * parent.scale[0];\r\n const scaledLocalY = local.position[1] * parent.scale[1];\r\n const cos = Math.cos(parent.rotation);\r\n const sin = Math.sin(parent.rotation);\r\n\r\n return {\r\n position: [\r\n roundDeterministic(parent.position[0] + scaledLocalX * cos - scaledLocalY * sin),\r\n roundDeterministic(parent.position[1] + scaledLocalX * sin + scaledLocalY * cos)\r\n ],\r\n rotation: roundDeterministic(parent.rotation + local.rotation),\r\n scale: [\r\n roundDeterministic(parent.scale[0] * local.scale[0]),\r\n roundDeterministic(parent.scale[1] * local.scale[1])\r\n ]\r\n };\r\n}\r\n\r\nfunction isVector2(value: unknown): value is [number, number] {\r\n return Array.isArray(value) && value.length === 2 && value.every((item) => typeof item === \"number\");\r\n}\r\n\r\nfunction isVector3(value: unknown): value is [number, number, number] {\r\n return Array.isArray(value) && value.length === 3 && value.every((item) => typeof item === \"number\");\r\n}\r\n\r\nfunction validateTransform3DValue(transform: Record<string, unknown>, file: string, basePath: string): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n diagnostics.push(...validateFiniteVector3(transform.position, file, `${basePath}.position`, \"SCENE_3D_COORDINATE_INVALID\"));\r\n diagnostics.push(...validateFiniteVector3(transform.rotation, file, `${basePath}.rotation`, \"SCENE_3D_ROTATION_INVALID\"));\r\n diagnostics.push(\r\n ...validateFiniteVector3(transform.scale, file, `${basePath}.scale`, \"SCENE_3D_SCALE_INVALID\", {\r\n requirePositive: true\r\n })\r\n );\r\n return diagnostics;\r\n}\r\n\r\nfunction validateCamera3DValue(camera: Record<string, unknown>, file: string, basePath: string): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n if (typeof camera.near === \"number\" && typeof camera.far === \"number\" && camera.far <= camera.near) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_3D_CAMERA_RANGE_INVALID\",\r\n file,\r\n path: `${basePath}.far`,\r\n message: `Camera3D far plane ${camera.far} must be greater than near plane ${camera.near}.`,\r\n suggestion: \"Use a far value greater than near.\"\r\n });\r\n }\r\n\r\n if (camera.projection === \"perspective\" && typeof camera.fov !== \"number\") {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_3D_CAMERA_FOV_REQUIRED\",\r\n file,\r\n path: `${basePath}.fov`,\r\n message: \"Perspective Camera3D requires fov.\",\r\n suggestion: \"Add fov with a value greater than 0 and less than 180.\"\r\n });\r\n }\r\n\r\n if (camera.projection === \"orthographic\" && typeof camera.orthographicSize !== \"number\") {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"SCENE_3D_CAMERA_SIZE_REQUIRED\",\r\n file,\r\n path: `${basePath}.orthographicSize`,\r\n message: \"Orthographic Camera3D requires orthographicSize.\",\r\n suggestion: \"Add orthographicSize with a positive value.\"\r\n });\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction validateCollider3DValue(collider: Record<string, unknown>, file: string, basePath: string): Diagnostic[] {\r\n return validateFiniteVector3(collider.size, file, `${basePath}.size`, \"SCENE_3D_COLLIDER_SIZE_INVALID\", {\r\n requirePositive: true\r\n });\r\n}\r\n\r\nfunction validateFiniteVector3(\r\n value: unknown,\r\n file: string,\r\n dataPath: string,\r\n code: string,\r\n options: { requirePositive?: boolean } = {}\r\n): Diagnostic[] {\r\n if (!isVector3(value)) {\r\n return [];\r\n }\r\n\r\n const diagnostics: Diagnostic[] = [];\r\n value.forEach((item, index) => {\r\n if (!Number.isFinite(item) || Math.abs(item) > 1_000_000) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code,\r\n file,\r\n path: `${dataPath}[${index}]`,\r\n message: `3D vector value '${String(item)}' is outside the supported experimental range.`,\r\n suggestion: \"Use finite coordinate values with absolute magnitude no greater than 1000000.\"\r\n });\r\n }\r\n\r\n if (options.requirePositive && item <= 0) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code,\r\n file,\r\n path: `${dataPath}[${index}]`,\r\n message: `3D vector value '${String(item)}' must be positive.`,\r\n suggestion: \"Use positive non-zero scale and collider size values.\"\r\n });\r\n }\r\n });\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction roundDeterministic(value: number): number {\r\n const rounded = Number(value.toFixed(12));\r\n const nearestInteger = Math.round(rounded);\r\n\r\n if (Math.abs(rounded - nearestInteger) < 1e-9) {\r\n return nearestInteger;\r\n }\r\n\r\n return rounded;\r\n}\r\n\r\nfunction createPatchSummary(): PatchApplicationSummary {\r\n return {\r\n changedReferences: []\r\n };\r\n}\r\n\r\nfunction mergePrefabComponents(\r\n components: Record<string, unknown>,\r\n overrides: Record<string, unknown> | undefined\r\n): Record<string, unknown> {\r\n const merged = cloneJson(components) as Record<string, unknown>;\r\n\r\n if (!overrides) {\r\n return merged;\r\n }\r\n\r\n for (const [componentName, overrideValue] of Object.entries(overrides)) {\r\n if (Object.hasOwn(merged, componentName)) {\r\n merged[componentName] = deepMergeObjects(merged[componentName], overrideValue);\r\n }\r\n }\r\n\r\n return merged;\r\n}\r\n\r\nfunction deepMergeObjects(existingValue: unknown, patchValue: unknown): unknown {\r\n if (!isRecord(existingValue) || !isRecord(patchValue)) {\r\n return cloneJson(patchValue);\r\n }\r\n\r\n const merged = cloneJson(existingValue) as Record<string, unknown>;\r\n for (const [key, value] of Object.entries(patchValue)) {\r\n merged[key] = isRecord(value) && isRecord(merged[key]) ? deepMergeObjects(merged[key], value) : cloneJson(value);\r\n }\r\n\r\n return merged;\r\n}\r\n\r\nfunction setJsonPointer(root: unknown, pointer: string, value: unknown, file: string, operationPath: string): Diagnostic[] {\r\n if (!pointer.startsWith(\"/\")) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_INVALID_FIELD_PATH\",\r\n file,\r\n path: `${operationPath}.path`,\r\n message: `Field path '${pointer}' is not a JSON Pointer.`,\r\n suggestion: \"Use a JSON Pointer path such as /position/0 or /current.\"\r\n }\r\n ];\r\n }\r\n\r\n const tokens = pointer\r\n .slice(1)\r\n .split(\"/\")\r\n .map((token) => token.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\r\n let parent = root;\r\n\r\n for (const token of tokens.slice(0, -1)) {\r\n const next = getPointerChild(parent, token);\r\n if (next === undefined) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_FIELD_PATH_NOT_FOUND\",\r\n file,\r\n path: `${operationPath}.path`,\r\n message: `Field path '${pointer}' does not resolve.`,\r\n suggestion: \"Inspect the component and target an existing nested object or array element.\"\r\n }\r\n ];\r\n }\r\n parent = next;\r\n }\r\n\r\n const finalToken = tokens[tokens.length - 1];\r\n if (finalToken === undefined) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(parent)) {\r\n if (!/^\\d+$/.test(finalToken)) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_INVALID_ARRAY_INDEX\",\r\n file,\r\n path: `${operationPath}.path`,\r\n message: `Array path token '${finalToken}' is not a numeric index.`,\r\n suggestion: \"Use a numeric array index.\"\r\n }\r\n ];\r\n }\r\n\r\n const index = Number(finalToken);\r\n if (index < 0 || index >= parent.length) {\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_ARRAY_INDEX_OUT_OF_RANGE\",\r\n file,\r\n path: `${operationPath}.path`,\r\n message: `Array index '${index}' is out of range.`,\r\n suggestion: \"Inspect the component and target an existing array index.\"\r\n }\r\n ];\r\n }\r\n\r\n parent[index] = cloneJson(value);\r\n return [];\r\n }\r\n\r\n if (isRecord(parent)) {\r\n parent[finalToken] = cloneJson(value);\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n severity: \"error\",\r\n code: \"PATCH_FIELD_PATH_NOT_FOUND\",\r\n file,\r\n path: `${operationPath}.path`,\r\n message: `Field path '${pointer}' does not resolve to an object or array.`,\r\n suggestion: \"Inspect the component and target an object field or array element.\"\r\n }\r\n ];\r\n}\r\n\r\nfunction getPointerChild(parent: unknown, token: string): unknown {\r\n if (Array.isArray(parent)) {\r\n if (!/^\\d+$/.test(token)) {\r\n return undefined;\r\n }\r\n return parent[Number(token)];\r\n }\r\n\r\n if (isRecord(parent)) {\r\n return parent[token];\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction resolvePatchScenePath(patchFile: string, sceneRef: unknown): string | undefined {\r\n if (typeof sceneRef !== \"string\") {\r\n return undefined;\r\n }\r\n return path.resolve(path.dirname(patchFile), sceneRef);\r\n}\r\n\r\nfunction resolveScenePrefabPath(sceneFile: string, prefabRef: string): string {\r\n return path.resolve(path.dirname(sceneFile), prefabRef);\r\n}\r\n\r\nfunction cloneJson(value: unknown): unknown {\r\n return JSON.parse(JSON.stringify(value));\r\n}\r\n\r\nexport function hasErrors(diagnostics: Diagnostic[]): boolean {\r\n return diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\r\n}\r\n\r\nexport function resolveProjectFile(projectPath = \".\", cwd = process.cwd()): string {\r\n const resolved = path.resolve(cwd, projectPath);\r\n if (existsSync(resolved) && statSync(resolved).isDirectory()) {\r\n return path.join(resolved, \"agent.project.yml\");\r\n }\r\n return resolved;\r\n}\r\n\r\nasync function loadYamlFile<TDocument>(file: string): Promise<ValidationResult<TDocument>> {\r\n try {\r\n const source = await readFile(file, \"utf8\");\r\n return parseYamlSource<TDocument>(source, file);\r\n } catch (error) {\r\n return {\r\n file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"FILE_READ_FAILED\",\r\n file,\r\n path: \"$\",\r\n message: error instanceof Error ? error.message : String(error),\r\n suggestion: \"Check that the path exists and is readable.\"\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\nfunction parseYamlSource<TDocument>(source: string, file: string): ValidationResult<TDocument> {\r\n try {\r\n const document = parse(source) as TDocument | null | undefined;\r\n if (document === null || document === undefined) {\r\n return {\r\n file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"YAML_EMPTY_DOCUMENT\",\r\n file,\r\n path: \"$\",\r\n message: \"YAML document is empty.\",\r\n suggestion: \"Add the required document fields before running validation again.\"\r\n }\r\n ]\r\n };\r\n }\r\n\r\n return {\r\n file,\r\n document,\r\n diagnostics: []\r\n };\r\n } catch (error) {\r\n return {\r\n file,\r\n diagnostics: [\r\n {\r\n severity: \"error\",\r\n code: \"YAML_PARSE_ERROR\",\r\n file,\r\n path: \"$\",\r\n message: error instanceof Error ? error.message : String(error),\r\n suggestion: \"Fix the YAML syntax before running validation again.\"\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\nasync function loadNearestProjectAssetManifestContext(sceneFile: string): Promise<AssetManifestContext> {\r\n const projectFile = findNearestProjectFile(path.dirname(sceneFile));\r\n if (!projectFile) {\r\n return createAssetManifestContext();\r\n }\r\n\r\n const projectResult = await loadYamlFile<ProjectDocument>(projectFile);\r\n const diagnostics = [...projectResult.diagnostics];\r\n if (projectResult.document === undefined) {\r\n return {\r\n ...createAssetManifestContext(),\r\n diagnostics\r\n };\r\n }\r\n\r\n diagnostics.push(...validateProjectDocument(projectResult.document, projectFile));\r\n if (hasErrors(diagnostics)) {\r\n return {\r\n ...createAssetManifestContext(),\r\n diagnostics\r\n };\r\n }\r\n\r\n const context = await loadProjectAssetManifestContext(projectFile, projectResult.document);\r\n return {\r\n manifestFiles: context.manifestFiles,\r\n assets: context.assets,\r\n assetsById: context.assetsById,\r\n diagnostics: [...diagnostics, ...context.diagnostics]\r\n };\r\n}\r\n\r\nfunction findNearestProjectFile(startDir: string): string | undefined {\r\n let currentDir = path.resolve(startDir);\r\n\r\n while (true) {\r\n const candidate = path.join(currentDir, \"agent.project.yml\");\r\n if (existsSync(candidate)) {\r\n return candidate;\r\n }\r\n\r\n const parentDir = path.dirname(currentDir);\r\n if (parentDir === currentDir) {\r\n return undefined;\r\n }\r\n currentDir = parentDir;\r\n }\r\n}\r\n\r\nfunction createAssetManifestContext(): AssetManifestContext {\r\n return {\r\n manifestFiles: [],\r\n assets: [],\r\n assetsById: new Map<string, AssetRecord>(),\r\n diagnostics: []\r\n };\r\n}\r\n\r\nfunction sortedAssetDefinitions(assetsById: Map<string, AssetRecord>): AssetDefinition[] {\r\n return [...assetsById.values()]\r\n .sort((left, right) => left.id.localeCompare(right.id))\r\n .map((asset) => {\r\n if (asset.type === \"sprite\") {\n return {\n id: asset.id,\n type: \"sprite\",\n path: asset.path,\n ...(typeof asset.texture === \"string\" ? { texture: asset.texture } : {}),\n ...(asset.rect ? { rect: asset.rect } : {}),\n ...(typeof asset.atlas === \"string\" ? { atlas: asset.atlas } : {}),\n ...(typeof asset.frame === \"string\" ? { frame: asset.frame } : {})\n };\n }\n\n if (asset.type === \"atlas\") {\n return {\n id: asset.id,\n type: \"atlas\",\n path: asset.path,\n ...(typeof asset.texture === \"string\" ? { texture: asset.texture } : {}),\n frames: (asset.frames ?? [])\n .map((frame) => ({\n id: frame.id,\n rect: frame.rect\n }))\n .sort((left, right) => left.id.localeCompare(right.id))\n };\n }\n\n return {\n id: asset.id,\n type: asset.type as \"texture\" | \"audio\" | \"font\",\r\n path: asset.path\r\n };\r\n });\r\n}\r\n\r\nfunction countAssetsByType(assets: AssetDefinition[]): Record<string, number> {\r\n const counts: Record<string, number> = {};\r\n for (const asset of assets) {\r\n counts[asset.type] = (counts[asset.type] ?? 0) + 1;\r\n }\r\n return Object.fromEntries(Object.entries(counts).sort(([left], [right]) => left.localeCompare(right)));\r\n}\r\n\r\nfunction isPortableAssetPath(assetPath: string): boolean {\r\n if (assetPath.length === 0) {\r\n return false;\r\n }\r\n\r\n if (assetPath.includes(\"\\\\\") || assetPath.includes(\"://\") || assetPath.startsWith(\"/\") || path.isAbsolute(assetPath)) {\r\n return false;\r\n }\r\n\r\n return assetPath.split(\"/\").every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\r\n}\r\n\r\nfunction isPortableSourcePath(sourcePath: string): boolean {\r\n if (sourcePath.length === 0) {\r\n return false;\r\n }\r\n\r\n if (sourcePath.includes(\"\\\\\") || sourcePath.includes(\"://\") || sourcePath.startsWith(\"/\") || path.isAbsolute(sourcePath)) {\r\n return false;\r\n }\r\n\r\n return sourcePath.split(\"/\").every((segment) => segment.length > 0 && segment !== \".\");\r\n}\r\n\r\nfunction hasPrefabRole(prefabRefs: unknown[], role: MapPrefabRole): boolean {\r\n return prefabRefs.some((prefabRef) => isRecord(prefabRef) && prefabRef.role === role);\r\n}\r\n\r\nfunction findMapPrefabRefByRole(prefabRefs: MapPrefabRef[], role: MapPrefabRole): MapPrefabRef | undefined {\r\n return prefabRefs.find((prefabRef) => prefabRef.role === role);\r\n}\r\n\r\nasync function validateMapPrefabRefs(config: MapGenerationConfigDocument, file: string): Promise<Diagnostic[]> {\r\n const diagnostics: Diagnostic[] = [];\r\n\r\n for (const [index, prefabRef] of config.prefabRefs.entries()) {\r\n const prefabFile = resolveMapPrefabPath(file, prefabRef.prefab);\r\n const prefabResult = await loadPrefabFile(prefabFile);\r\n const prefabDiagnostics = [...prefabResult.diagnostics];\r\n\r\n if (prefabResult.document !== undefined) {\r\n prefabDiagnostics.push(...validatePrefabDocument(prefabResult.document, prefabResult.file));\r\n }\r\n\r\n if (prefabResult.document === undefined || hasErrors(prefabDiagnostics)) {\r\n if (prefabResult.diagnostics.some((diagnostic) => diagnostic.code === \"FILE_READ_FAILED\")) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_REF_NOT_FOUND\",\r\n file,\r\n path: `$.prefabRefs[${index}].prefab`,\r\n message: `Prefab file '${prefabRef.prefab}' was not found.`,\r\n suggestion: \"Create the prefab file or update the prefab path relative to the map config file.\"\r\n });\r\n }\r\n diagnostics.push(...prefabDiagnostics);\r\n continue;\r\n }\r\n\r\n diagnostics.push(...validateMapPrefabRoleConsistency(prefabRef, prefabResult.document, file, index));\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction validateMapPrefabRoleConsistency(\r\n prefabRef: MapPrefabRef,\r\n prefab: PrefabDocument,\r\n file: string,\r\n index: number\r\n): Diagnostic[] {\r\n const diagnostics: Diagnostic[] = [];\r\n const components = prefab.components ?? {};\r\n\r\n if (!Object.hasOwn(components, \"Transform\")) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_ROLE_MISMATCH\",\r\n file,\r\n path: `$.prefabRefs[${index}].prefab`,\r\n message: `Prefab ref '${prefabRef.id}' with role '${prefabRef.role}' must provide Transform.`,\r\n suggestion: \"Add Transform to the prefab or use a prefab intended for generated map placement.\"\r\n });\r\n }\r\n\r\n if (prefabRef.role === \"platform\" && !Object.hasOwn(components, \"Collider\")) {\r\n diagnostics.push({\r\n severity: \"error\",\r\n code: \"MAP_PREFAB_ROLE_MISMATCH\",\r\n file,\r\n path: `$.prefabRefs[${index}].prefab`,\r\n message: `Platform prefab ref '${prefabRef.id}' must provide Collider.`,\r\n suggestion: \"Use a platform prefab with Transform and Collider.\"\r\n });\r\n }\r\n\r\n return diagnostics;\r\n}\r\n\r\nfunction resolveMapPrefabPath(configFile: string, prefabRef: string): string {\r\n return path.resolve(path.dirname(configFile), prefabRef);\r\n}\r\n\r\nfunction resolveGeneratedScenePrefabRef(\r\n prefabRef: MapPrefabRef,\r\n options: { configFile?: string; sceneFile?: string }\r\n): string {\r\n if (!options.configFile || !options.sceneFile) {\r\n return prefabRef.prefab;\r\n }\r\n\r\n const prefabFile = resolveMapPrefabPath(options.configFile, prefabRef.prefab);\r\n const relativePath = path.relative(path.dirname(options.sceneFile), prefabFile).replace(/\\\\/g, \"/\");\r\n return relativePath.length > 0 ? relativePath : path.basename(prefabFile);\r\n}\r\n\r\nfunction hashStableObject(value: unknown): string {\r\n const stable = JSON.stringify(orderObject(value));\r\n let hash = 2166136261;\r\n\r\n for (let index = 0; index < stable.length; index += 1) {\r\n hash ^= stable.charCodeAt(index);\r\n hash = Math.imul(hash, 16777619);\r\n }\r\n\r\n return `fnv1a-${(hash >>> 0).toString(16).padStart(8, \"0\")}`;\r\n}\r\n\r\nfunction createSeededRandom(seed: number): () => number {\r\n let state = seed >>> 0;\r\n return () => {\r\n state = (Math.imul(state, 1664525) + 1013904223) >>> 0;\r\n return state / 0x100000000;\r\n };\r\n}\r\n\r\nfunction randomInteger(rng: () => number, min: number, max: number): number {\r\n const low = Math.ceil(Math.min(min, max));\r\n const high = Math.floor(Math.max(min, max));\r\n return low + Math.floor(rng() * (high - low + 1));\r\n}\r\n\r\nfunction clampInteger(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(Math.round(value), min), max);\r\n}\r\n\r\nfunction padNumber(value: number): string {\r\n return String(value).padStart(3, \"0\");\r\n}\r\n\r\nfunction schemaDiagnostics(\r\n validator: ValidateFunction,\r\n value: unknown,\r\n file: string,\r\n code: string,\r\n basePath = \"$\"\r\n): Diagnostic[] {\r\n const valid = validator(value);\r\n if (valid) {\r\n return [];\r\n }\r\n\r\n return (validator.errors ?? []).map((error) => ({\r\n severity: \"error\",\r\n code,\r\n file,\r\n path: joinDataPath(basePath, errorPath(error)),\r\n message: schemaMessage(error),\r\n suggestion: schemaSuggestion(error)\r\n }));\r\n}\r\n\r\nfunction errorPath(error: ErrorObject): string {\r\n const base = instancePathToDataPath(error.instancePath);\r\n if (error.keyword === \"required\" && isRecord(error.params) && typeof error.params.missingProperty === \"string\") {\r\n return `${base}.${error.params.missingProperty}`;\r\n }\r\n return base;\r\n}\r\n\r\nfunction instancePathToDataPath(instancePath: string): string {\r\n if (!instancePath) {\r\n return \"$\";\r\n }\r\n\r\n return `$${instancePath\r\n .split(\"/\")\r\n .slice(1)\r\n .map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\r\n .map((segment) => (/^\\d+$/.test(segment) ? `[${segment}]` : `.${segment}`))\r\n .join(\"\")}`;\r\n}\r\n\r\nfunction joinDataPath(basePath: string, childPath: string): string {\r\n if (basePath === \"$\") {\r\n return childPath;\r\n }\r\n\r\n if (childPath === \"$\") {\r\n return basePath;\r\n }\r\n\r\n return `${basePath}${childPath.slice(1)}`;\r\n}\r\n\r\nfunction schemaMessage(error: ErrorObject): string {\r\n if (error.keyword === \"required\" && isRecord(error.params) && typeof error.params.missingProperty === \"string\") {\r\n return `Missing required property '${error.params.missingProperty}'.`;\r\n }\r\n\r\n if (error.keyword === \"additionalProperties\" && isRecord(error.params)) {\r\n return `Unknown property '${String(error.params.additionalProperty)}'.`;\r\n }\r\n\r\n return error.message ?? \"Value does not match schema.\";\r\n}\r\n\r\nfunction schemaSuggestion(error: ErrorObject): string | undefined {\r\n if (error.keyword === \"required\" && isRecord(error.params) && typeof error.params.missingProperty === \"string\") {\r\n return `Add '${error.params.missingProperty}'.`;\r\n }\r\n\r\n if (error.keyword === \"type\") {\r\n return \"Use the expected value type for this field.\";\r\n }\r\n\r\n if (error.keyword === \"additionalProperties\") {\r\n return \"Remove the unknown property or add it to the engine schema.\";\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction toYaml(value: unknown): string {\r\n return `${stringify(value, { lineWidth: 0 }).trimEnd()}\\n`;\r\n}\r\n\r\nfunction orderComponents(components: Record<string, unknown>): Record<string, unknown> {\r\n const ordered: Record<string, unknown> = {};\r\n const componentNames = [\r\n ...componentOrder.filter((name) => Object.hasOwn(components, name)),\r\n ...Object.keys(components)\r\n .filter((name) => !componentOrder.includes(name))\r\n .sort()\r\n ];\r\n\r\n for (const componentName of componentNames) {\r\n ordered[componentName] = orderObject(components[componentName], componentFieldOrder[componentName]);\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\nfunction orderObject(value: unknown, preferredKeys: string[] = []): unknown {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => orderObject(item));\r\n }\r\n\r\n if (!isRecord(value)) {\r\n return value;\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n const keys = [\r\n ...preferredKeys.filter((key) => Object.hasOwn(value, key)),\r\n ...Object.keys(value)\r\n .filter((key) => !preferredKeys.includes(key))\r\n .sort()\r\n ];\r\n\r\n for (const key of keys) {\r\n result[key] = orderObject(value[key]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n"],"mappings":"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","names":["assetManifestSchema","componentSchemas","generatedMapSchema","mapGenerationConfigSchema","patchSchema","prefabSchema","projectSchema","sceneSchema"]}
|