@forgeax/engine-preview 0.1.31 → 0.1.32

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/host/preview-host.ts","../src/domains/subject.ts","../src/evidence/oracle.ts","../src/kit/canonical.ts","../src/domains/texture.ts","../src/host.ts","../src/texture.ts"],"names":["defineToolPlugin","isRecord"],"mappings":"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","file":"texture.mjs","sourcesContent":["import { defineToolPlugin, type Plugin, type ToolPlugin } from '@forgeax/engine-plugin';\nimport {\n type ArtifactRef,\n defineToolCapability,\n type SnapshotRef,\n} from '@forgeax/engine-tool-runtime';\n\nexport interface PreviewAssetLoadResult<TAsset = unknown> {\n readonly ok: true;\n readonly value: TAsset;\n readonly digest?: string;\n readonly ownerFacts?: Readonly<Record<string, string | number | boolean>>;\n}\n\nexport interface PreviewAssetLoadFailure {\n readonly ok: false;\n readonly error: unknown;\n}\n\nexport interface PreviewAssetRegistry {\n readonly loadByGuid: <TAsset = unknown>(\n guid: string,\n ) => Promise<PreviewAssetLoadResult<TAsset> | PreviewAssetLoadFailure>;\n}\n\nexport interface PreviewRenderRuntime {\n readonly rendererReady: boolean;\n readonly worldReady: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n /**\n * Facts read back from the real render/asset owner path. Domain executors\n * must not manufacture observed identity from the requested subject.\n */\n readonly observation?: Readonly<Record<string, string | number | boolean | readonly number[]>>;\n readonly vfx?: {\n readonly dispatches: number;\n readonly indirectDraws: number;\n readonly subjectOutputs: number;\n };\n readonly texture?: {\n readonly drawCalls: number;\n };\n}\n\nexport interface PreviewHostMechanisms {\n readonly runId: string;\n readonly snapshot: SnapshotRef;\n readonly projectRoot: string;\n readonly backend: 'webgpu';\n readonly signal: AbortSignal;\n readonly assets?: PreviewAssetRegistry;\n readonly renderer?: PreviewRenderRuntime;\n readonly artifacts?: readonly ArtifactRef[];\n}\n\nexport interface PreviewHost {\n readonly withSession: <T>(\n execute: (mechanisms: PreviewHostMechanisms) => Promise<T>,\n ) => Promise<T>;\n}\n\nexport const previewHostCapability = defineToolCapability<PreviewHost>('preview.host');\n\nexport function previewHostPlugin(host: PreviewHost): Plugin {\n return {\n name: 'forgeax-preview-host',\n provide: previewHostCapability.id,\n apply(ctx) {\n ctx.provide(previewHostCapability.id, host);\n },\n };\n}\n\nexport function bindPreviewHost(plugin: ToolPlugin, host: PreviewHost): ToolPlugin {\n return defineToolPlugin(previewHostPlugin(host), plugin.tools);\n}\n\nexport function createPreviewHost(input: PreviewHostMechanisms): PreviewHost {\n let active = true;\n return {\n async withSession(execute) {\n if (!active || input.signal.aborted) throw new Error('preview-host-session-terminal');\n try {\n return await execute(input);\n } finally {\n active = false;\n }\n },\n };\n}\n","import { defineToolPlugin } from '@forgeax/engine-plugin';\nimport type {\n JsonValue,\n ToolContribution,\n ToolDescriptor,\n ToolExecutionContext,\n ToolSchema,\n} from '@forgeax/engine-tool-runtime';\nimport { previewHostCapability } from '../host/preview-host.js';\nimport type { PreviewSubjectKind } from '../kit/presentation.js';\n\nexport interface ResourcePreviewArgs {\n readonly guid: string;\n /** Square screenshot edge in device pixels. Defaults to 512 and must be a power of two. */\n readonly size?: number;\n}\n\nexport const RESOURCE_PREVIEW_DEFAULT_SIZE = 512;\nexport const RESOURCE_PREVIEW_MIN_SIZE = 64;\nexport const RESOURCE_PREVIEW_MAX_SIZE = 4096;\n\nexport function isResourcePreviewSize(value: unknown): value is number {\n return (\n typeof value === 'number' &&\n Number.isSafeInteger(value) &&\n value >= RESOURCE_PREVIEW_MIN_SIZE &&\n value <= RESOURCE_PREVIEW_MAX_SIZE &&\n (value & (value - 1)) === 0\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\n/** Keep the public result contract concrete at the ToolRuntime boundary. */\nfunction isResourcePreviewResult(value: unknown): boolean {\n if (!isRecord(value)) return false;\n const subject = value.subject;\n if (\n !isRecord(subject) ||\n !isString(subject.kind) ||\n !isString(subject.guid) ||\n !isString(subject.digest)\n )\n return false;\n if (!isRecord(value.presentation) || !isString(value.presentation.kind)) return false;\n if (\n !isRecord(value.recipe) ||\n !isString(value.recipe.schemaVersion) ||\n !isString(value.recipe.recipeDigest)\n )\n return false;\n if (!isRecord(value.oracle) || !isString(value.oracle.status)) return false;\n return Array.isArray(value.artifacts);\n}\n\nexport const resourcePreviewResultSchema: ToolSchema<unknown> = {\n parse(value) {\n return isResourcePreviewResult(value)\n ? { ok: true, value }\n : {\n ok: false,\n error:\n 'resource preview result must include subject, presentation, recipe, oracle, and artifacts',\n };\n },\n describe: '{\"type\":\"object\",\"required\":[\"subject\",\"presentation\",\"recipe\",\"oracle\",\"artifacts\"]}',\n};\n\nexport const resourcePreviewArgsSchema: ToolSchema<ResourcePreviewArgs> = {\n parse(value) {\n if (\n value === null ||\n typeof value !== 'object' ||\n typeof Reflect.get(value, 'guid') !== 'string'\n ) {\n return { ok: false, error: 'expected { guid: string }' };\n }\n const guid = Reflect.get(value, 'guid');\n if (guid.length === 0) return { ok: false, error: 'guid must not be empty' };\n const size = Reflect.get(value, 'size');\n if (size === undefined) return { ok: true, value: { guid } };\n return isResourcePreviewSize(size)\n ? { ok: true, value: { guid, size } }\n : {\n ok: false,\n error: `size must be a power of two between ${RESOURCE_PREVIEW_MIN_SIZE} and ${RESOURCE_PREVIEW_MAX_SIZE}`,\n };\n },\n describe: `{\"type\":\"object\",\"required\":[\"guid\"],\"properties\":{\"guid\":{\"type\":\"string\"},\"size\":{\"type\":\"integer\",\"minimum\":${RESOURCE_PREVIEW_MIN_SIZE},\"maximum\":${RESOURCE_PREVIEW_MAX_SIZE},\"description\":\"square power-of-two screenshot edge; defaults to ${RESOURCE_PREVIEW_DEFAULT_SIZE}\"}}}`,\n};\n\nexport function subjectDescriptor(\n kind: PreviewSubjectKind,\n): ToolDescriptor<ResourcePreviewArgs, unknown> {\n return {\n id: `${kind}.preview`,\n title: `Preview ${kind}`,\n summary: `Preview one ${kind} asset in the Engine-owned resource host.`,\n realm: 'host',\n argsSchema: resourcePreviewArgsSchema,\n resultSchema: resourcePreviewResultSchema,\n evidence: ['rhi-tape', 'profile-capture', 'png'],\n };\n}\n\nexport type SubjectExecutor = (args: ResourcePreviewArgs, context: ToolExecutionContext) => unknown;\n\nexport interface ResourceSubjectFailure {\n readonly ok: false;\n readonly error: {\n readonly code:\n | 'resource-preview-subject-invalid'\n | 'resource-preview-kind-mismatch'\n | 'resource-preview-oracle-failed';\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<Record<string, JsonValue>>;\n };\n}\n\nexport function subjectFailure(\n code: ResourceSubjectFailure['error']['code'],\n expected: string,\n detail: Readonly<Record<string, JsonValue>>,\n): ResourceSubjectFailure {\n return {\n ok: false,\n error: {\n code,\n expected,\n hint: 'Load the requested GUID through AssetRegistry.loadByGuid and repair the owner facts before retrying.',\n detail,\n },\n };\n}\n\nexport function assetLoadFailure(\n expected: string,\n runId: string,\n error: unknown,\n): ResourceSubjectFailure {\n const owner = isRecord(error) ? error : undefined;\n const ownerCode = typeof owner?.code === 'string' ? owner.code : undefined;\n const ownerExpected = typeof owner?.expected === 'string' ? owner.expected : undefined;\n const ownerHint = typeof owner?.hint === 'string' ? owner.hint : undefined;\n const ownerDetail = owner?.detail;\n return subjectFailure('resource-preview-subject-invalid', expected, {\n phase: 'asset-load',\n runId,\n ...(ownerCode === undefined ? {} : { ownerCode }),\n ...(ownerExpected === undefined ? {} : { ownerExpected }),\n ...(ownerHint === undefined ? {} : { ownerHint }),\n ...(ownerDetail === undefined ? {} : { ownerDetail: toJsonValue(ownerDetail) }),\n });\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (Array.isArray(value)) return value.map((entry) => toJsonValue(entry));\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, toJsonValue(entry)]),\n );\n }\n return String(value);\n}\n\nexport function nativePreviewPlugin(\n kind: PreviewSubjectKind,\n contribution: ToolContribution<ResourcePreviewArgs, unknown>,\n) {\n return defineToolPlugin({ name: `forgeax-preview-${kind}`, apply() {} }, [\n contribution as ToolContribution<unknown, unknown>,\n ]);\n}\n\nexport async function failUnboundSubject(\n kind: PreviewSubjectKind,\n args: ResourcePreviewArgs,\n context: ToolExecutionContext,\n): Promise<unknown> {\n const host = context.require(previewHostCapability);\n if (!host.ok) return host;\n return host.value.withSession(async (mechanisms) => ({\n ...subjectFailure(\n 'resource-preview-subject-invalid',\n `${kind} asset ${args.guid} to be bound by its owner before rendering`,\n { phase: 'subject-binding', runId: mechanisms.runId },\n ),\n }));\n}\n","export type PreviewOracleStatus = PreviewOracle['status'];\n\nexport type PreviewOracle =\n | {\n readonly status: 'passed';\n readonly subjectBound: true;\n readonly drawCalls: number;\n readonly dispatches: number;\n readonly rendererHealthy: true;\n readonly detail: Record<string, string | number | boolean>;\n }\n | {\n readonly status: 'failed';\n readonly subjectBound: false;\n readonly drawCalls: number;\n readonly dispatches: number;\n readonly rendererHealthy: boolean;\n readonly detail: Record<string, string | number | boolean>;\n };\n\nexport function passedPreviewOracle(input: {\n readonly drawCalls: number;\n readonly dispatches?: number;\n readonly detail: Record<string, string | number | boolean>;\n}): PreviewOracle {\n return {\n status: 'passed',\n subjectBound: true,\n drawCalls: input.drawCalls,\n dispatches: input.dispatches ?? 0,\n rendererHealthy: true,\n detail: { ...input.detail },\n };\n}\n\nexport function failedPreviewOracle(input: {\n readonly drawCalls?: number;\n readonly dispatches?: number;\n readonly rendererHealthy?: boolean;\n readonly detail: Record<string, string | number | boolean>;\n}): PreviewOracle {\n return {\n status: 'failed',\n subjectBound: false,\n drawCalls: input.drawCalls ?? 0,\n dispatches: input.dispatches ?? 0,\n rendererHealthy: input.rendererHealthy ?? false,\n detail: { ...input.detail },\n };\n}\n\nexport interface MaterialOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly program: string;\n readonly pass: string;\n readonly bindingsDigest: string;\n readonly closureDigest: string;\n };\n readonly observed: MaterialOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n };\n}\n\nexport interface MeshOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly vertexDigest: string;\n readonly indexDigest: string;\n readonly submeshDigest: string;\n readonly aabbDigest: string;\n readonly aabb?: readonly [number, number, number, number, number, number];\n readonly submeshCount?: number;\n readonly materialSlotCount?: number;\n };\n readonly observed: MeshOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n };\n}\n\nfunction oracleDetail(\n kind: 'material' | 'mesh',\n requested: Record<string, unknown>,\n observed: Record<string, unknown>,\n mismatch: string | undefined,\n): Record<string, string | number | boolean> {\n return {\n kind,\n mismatch: mismatch ?? 'none',\n requestedSubjectDigest:\n typeof requested.subjectDigest === 'string' ? requested.subjectDigest : 'unknown',\n observedSubjectDigest:\n typeof observed.subjectDigest === 'string' ? observed.subjectDigest : 'unknown',\n requestedOwnerDigest: JSON.stringify(requested),\n observedOwnerDigest: JSON.stringify(observed),\n };\n}\n\nfunction firstMismatch(\n requested: Record<string, unknown>,\n observed: Record<string, unknown>,\n): string | undefined {\n for (const key of Object.keys(requested)) {\n const requestedValue = requested[key];\n const observedValue = observed[key];\n if (\n Array.isArray(requestedValue) ||\n Array.isArray(observedValue) ||\n typeof requestedValue === 'object' ||\n typeof observedValue === 'object'\n ) {\n if (JSON.stringify(requestedValue) !== JSON.stringify(observedValue)) return key;\n } else if (requestedValue !== observedValue) {\n return key;\n }\n }\n return undefined;\n}\n\nexport function evaluateMaterialOracle(input: MaterialOracleInput): PreviewOracle {\n const requested = input.requested as unknown as Record<string, string>;\n const observed = input.observed as unknown as Record<string, string>;\n const mismatch = firstMismatch(requested, observed);\n const healthy = input.observed.rendererHealthy && input.observed.drawCalls > 0;\n const detail = oracleDetail('material', requested, observed, mismatch);\n if (mismatch !== undefined || !healthy) {\n return failedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n rendererHealthy: input.observed.rendererHealthy,\n detail: { ...detail, rendererHealthy: input.observed.rendererHealthy },\n });\n }\n return passedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n detail: { ...detail, rendererHealthy: true },\n });\n}\n\nexport function evaluateMeshOracle(input: MeshOracleInput): PreviewOracle {\n const requested = input.requested as unknown as Record<string, string>;\n const observed = input.observed as unknown as Record<string, string>;\n const mismatch = firstMismatch(requested, observed);\n const healthy = input.observed.rendererHealthy && input.observed.drawCalls > 0;\n const detail = oracleDetail('mesh', requested, observed, mismatch);\n if (mismatch !== undefined || !healthy) {\n return failedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n rendererHealthy: input.observed.rendererHealthy,\n detail: { ...detail, rendererHealthy: input.observed.rendererHealthy },\n });\n }\n return passedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n detail: { ...detail, rendererHealthy: true },\n });\n}\n\nexport interface VfxOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly programFingerprint: string;\n readonly emitterDigest: string;\n readonly sampleDigest: string;\n readonly boundsDigest: string;\n readonly computeDigest: string;\n readonly indirectDigest: string;\n readonly contactSheetDigest?: string;\n readonly authoredBounds?: readonly [number, number, number, number, number, number];\n readonly seed?: number;\n readonly fixedDelta?: number;\n readonly timelineFrames?: number;\n };\n readonly observed: VfxOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly dispatches: number;\n readonly indirectDraws: number;\n readonly subjectOutputs: number;\n readonly nonBlackPixels: number;\n };\n}\n\nexport interface TextureOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly boundDigest: string;\n readonly dimensions: readonly [number, number];\n readonly format: string;\n readonly colorSpace: string;\n readonly mipCount: number;\n readonly uvDigest: string;\n readonly filter: string;\n readonly bindingDigest: string;\n };\n readonly observed: TextureOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n readonly payloadClass: 'black' | 'transparent' | 'single-channel' | 'color';\n };\n}\n\nfunction identityRecord(input: Record<string, unknown>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => [\n key,\n Array.isArray(value) ? JSON.stringify(value) : String(value),\n ]),\n );\n}\n\nfunction evaluateIdentityOracle(\n kind: 'vfx' | 'texture',\n requestedInput: Record<string, unknown>,\n observedInput: Record<string, unknown>,\n healthy: boolean,\n drawCalls: number,\n dispatches: number,\n detailOverrides: Record<string, string | number | boolean>,\n): PreviewOracle {\n const requested = identityRecord(requestedInput);\n const observed = identityRecord(observedInput);\n const mismatch = firstMismatch(requested, observed);\n const detail = {\n kind,\n mismatch: mismatch ?? 'none',\n requestedSubjectDigest: requested.subjectDigest ?? 'unknown',\n observedSubjectDigest: observed.subjectDigest ?? 'unknown',\n requestedOwnerDigest: JSON.stringify(requested),\n observedOwnerDigest: JSON.stringify(observed),\n ...detailOverrides,\n };\n if (mismatch !== undefined || !healthy) {\n return failedPreviewOracle({ drawCalls, dispatches, rendererHealthy: healthy, detail });\n }\n return passedPreviewOracle({ drawCalls, dispatches, detail });\n}\n\nexport function evaluateVfxOracle(input: VfxOracleInput): PreviewOracle {\n const observed = input.observed;\n const healthy =\n observed.rendererHealthy &&\n observed.dispatches > 0 &&\n observed.indirectDraws > 0 &&\n observed.subjectOutputs > 0;\n return evaluateIdentityOracle(\n 'vfx',\n input.requested,\n input.observed,\n healthy,\n observed.indirectDraws,\n observed.dispatches,\n {\n rendererHealthy: observed.rendererHealthy,\n indirectDraws: observed.indirectDraws,\n subjectOutputs: observed.subjectOutputs,\n nonBlackPixels: observed.nonBlackPixels,\n },\n );\n}\n\nexport function evaluateTextureOracle(input: TextureOracleInput): PreviewOracle {\n const observed = input.observed;\n return evaluateIdentityOracle(\n 'texture',\n input.requested,\n input.observed,\n observed.rendererHealthy && observed.drawCalls > 0,\n observed.drawCalls,\n 0,\n {\n rendererHealthy: observed.rendererHealthy,\n payloadClass: observed.payloadClass,\n nonBlackPixels: observed.nonBlackPixels,\n },\n );\n}\n","import type { PreviewPresentation, PreviewSubjectKind } from './presentation.js';\n\nexport interface CanonicalPreviewRecipe {\n readonly schemaVersion: '1.0.0';\n readonly rig:\n | Extract<PreviewPresentation, { readonly kind: 'lit-asset' }>['geometry']\n | 'asset-quad';\n readonly environment: 'engine-canonical' | 'black';\n readonly skybox: 'engine-canonical' | 'none';\n readonly skylight: 'engine-canonical' | 'none';\n readonly directionalLight: 'engine-canonical' | 'none';\n readonly stage: 'neutral-material-checker-unlit' | 'texture-unlit-black';\n readonly camera: 'bounds-derived' | 'texture-orthographic';\n readonly recipeDigest: string;\n}\n\nexport function createCanonicalPreviewRecipe(kind: PreviewSubjectKind): CanonicalPreviewRecipe {\n const texture = kind === 'texture';\n return {\n schemaVersion: '1.0.0',\n rig: kind === 'mesh' ? 'asset-mesh' : texture ? 'asset-quad' : 'handle-sphere',\n environment: texture ? 'black' : 'engine-canonical',\n skybox: texture ? 'none' : 'engine-canonical',\n skylight: texture ? 'none' : 'engine-canonical',\n directionalLight: texture ? 'none' : 'engine-canonical',\n stage: texture ? 'texture-unlit-black' : 'neutral-material-checker-unlit',\n camera: texture ? 'texture-orthographic' : 'bounds-derived',\n recipeDigest: `canonical:${kind}:${texture ? 'texture-orthographic' : 'bounds-derived'}`,\n };\n}\n\nexport function canonicalPresentation(kind: PreviewSubjectKind): PreviewPresentation {\n if (kind === 'texture') {\n return {\n kind: 'texture-unlit',\n geometry: 'aspect-quad',\n checkerboard: 'linear-alpha',\n };\n }\n return {\n kind: 'lit-asset',\n geometry: kind === 'mesh' ? 'asset-mesh' : 'handle-sphere',\n skylight: 'engine-canonical',\n directionalLight: 'engine-canonical',\n skybox: 'engine-canonical',\n };\n}\n","import type { ArtifactRef } from '@forgeax/engine-tool-runtime';\nimport { evaluateTextureOracle, type TextureOracleInput } from '../evidence/oracle.js';\nimport type { PreviewAssetRegistry, PreviewRenderRuntime } from '../host/preview-host.js';\nimport { canonicalPresentation, createCanonicalPreviewRecipe } from '../kit/canonical.js';\nimport { assetLoadFailure, type ResourcePreviewArgs, subjectFailure } from './subject.js';\n\nexport interface TextureSubjectInspection {\n readonly subjectDigest: string;\n readonly boundDigest: string;\n readonly dimensions: readonly [number, number];\n readonly format: string;\n readonly colorSpace: string;\n readonly mipCount: number;\n readonly uvDigest: string;\n readonly filter: string;\n readonly bindingDigest: string;\n readonly payloadClass: TextureOracleInput['observed']['payloadClass'];\n}\n\ntype InspectionResult =\n | { readonly ok: true; readonly value: TextureSubjectInspection }\n | ReturnType<typeof subjectFailure>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction requiredString(asset: Record<string, unknown>, field: string): string | undefined {\n const value = asset[field];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction requiredNumber(asset: Record<string, unknown>, field: string): number | undefined {\n const value = asset[field];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction isTexturePayloadClass(value: unknown): value is TextureSubjectInspection['payloadClass'] {\n return (\n value === 'black' || value === 'transparent' || value === 'single-channel' || value === 'color'\n );\n}\n\nfunction classifyPayload(\n data: unknown,\n format: string | undefined,\n): TextureSubjectInspection['payloadClass'] | undefined {\n const bytes =\n data instanceof Uint8Array || data instanceof Uint8ClampedArray\n ? [...data]\n : Array.isArray(data) && data.every((value) => typeof value === 'number')\n ? data\n : undefined;\n if (bytes === undefined || bytes.length === 0) return undefined;\n const channels = format?.startsWith('r') && !format.startsWith('rg') ? 1 : 4;\n if (bytes.every((value) => value === 0)) return 'black';\n if (channels === 1) return 'single-channel';\n const alpha = bytes.filter((_, index) => (index + 1) % channels === 0);\n if (alpha.length > 0 && alpha.every((value) => value === 0)) return 'transparent';\n return 'color';\n}\n\ntype Observation = Readonly<Record<string, string | number | boolean | readonly number[]>>;\n\nfunction observationString(observation: Observation, field: string): string | undefined {\n const value = observation[field];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction observationDimensions(observation: Observation): readonly [number, number] | undefined {\n const value = observation.dimensions;\n if (\n !Array.isArray(value) ||\n value.length !== 2 ||\n value.some((entry) => typeof entry !== 'number' || !Number.isInteger(entry) || entry <= 0)\n )\n return undefined;\n return [value[0] as number, value[1] as number];\n}\n\nfunction observationPayloadClass(\n observation: Observation,\n): TextureSubjectInspection['payloadClass'] | undefined {\n const value = observation.payloadClass;\n return isTexturePayloadClass(value) ? value : undefined;\n}\n\nexport function inspectTextureSubject(input: {\n readonly guid: string;\n readonly asset: unknown;\n readonly digest?: string;\n readonly ownerFacts?: Readonly<Record<string, string | number | boolean>>;\n}): InspectionResult {\n if (!isRecord(input.asset) || input.asset.kind !== 'texture') {\n return subjectFailure('resource-preview-kind-mismatch', 'a TextureAsset with kind texture', {\n phase: 'subject',\n guid: input.guid,\n actualKind:\n isRecord(input.asset) && typeof input.asset.kind === 'string'\n ? input.asset.kind\n : 'unknown',\n });\n }\n const asset = input.asset;\n const inlineOwner = asset.ownerFacts;\n const ownerFacts = isRecord(inlineOwner) ? inlineOwner : input.ownerFacts;\n const readString = (field: string): string | undefined =>\n requiredString(asset, field) ?? requiredString(ownerFacts ?? {}, field);\n const subjectDigest = readString('digest') ?? input.digest ?? readString('subjectDigest');\n const boundDigest = readString('boundDigest');\n const uvDigest = readString('uvDigest');\n const bindingDigest = readString('bindingDigest');\n const format = readString('format');\n const colorSpace = readString('colorSpace');\n const filter = readString('filter');\n const dimensionsValue = asset.dimensions;\n const dimensions = Array.isArray(dimensionsValue)\n ? dimensionsValue\n : [requiredNumber(asset, 'width'), requiredNumber(asset, 'height')];\n const mipCount = requiredNumber(asset, 'mipCount') ?? requiredNumber(asset, 'mipLevelCount') ?? 1;\n const payloadClass =\n readString('payloadClass') ?? classifyPayload(asset.data, format) ?? undefined;\n if (\n subjectDigest === undefined ||\n boundDigest === undefined ||\n uvDigest === undefined ||\n bindingDigest === undefined ||\n format === undefined ||\n colorSpace === undefined ||\n filter === undefined ||\n dimensions.length !== 2 ||\n dimensions.some(\n (value) => typeof value !== 'number' || !Number.isInteger(value) || value <= 0,\n ) ||\n !Number.isInteger(mipCount) ||\n mipCount <= 0 ||\n !isTexturePayloadClass(payloadClass)\n ) {\n return subjectFailure(\n 'resource-preview-subject-invalid',\n 'TextureAsset dimensions and owner binding facts',\n {\n phase: 'subject',\n guid: input.guid,\n field: 'digest/dimensions/format/colorSpace/mipCount/uv/filter/binding',\n },\n );\n }\n const [width = 0, height = 0] = dimensions;\n return {\n ok: true,\n value: {\n subjectDigest,\n boundDigest,\n dimensions: [width, height],\n format,\n colorSpace,\n mipCount,\n uvDigest,\n filter,\n bindingDigest,\n payloadClass,\n },\n };\n}\n\nexport async function executeTexturePreview(\n args: ResourcePreviewArgs,\n input: {\n readonly assets?: PreviewAssetRegistry;\n readonly renderer?: PreviewRenderRuntime;\n readonly runId: string;\n readonly artifacts?: readonly ArtifactRef[];\n },\n) {\n if (input.assets === undefined)\n return subjectFailure(\n 'resource-preview-subject-invalid',\n 'the existing AssetRegistry capability',\n {\n phase: 'asset-registry',\n runId: input.runId,\n },\n );\n const loaded = await input.assets.loadByGuid<Record<string, unknown>>(args.guid);\n if (!loaded.ok)\n return assetLoadFailure(\n 'AssetRegistry.loadByGuid to resolve the texture',\n input.runId,\n loaded.error,\n );\n const inspected = inspectTextureSubject({\n guid: args.guid,\n asset: loaded.value,\n ...(loaded.digest === undefined ? {} : { digest: loaded.digest }),\n ...(loaded.ownerFacts === undefined ? {} : { ownerFacts: loaded.ownerFacts }),\n });\n if (!inspected.ok) return inspected;\n const renderer = input.renderer;\n const drawCalls = renderer?.texture?.drawCalls ?? renderer?.drawCalls ?? 0;\n if (\n renderer?.rendererReady !== true ||\n renderer.worldReady !== true ||\n drawCalls <= 0 ||\n renderer.observation === undefined\n ) {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'shared World and Renderer texture stage to produce an observed output',\n {\n phase: 'renderer',\n runId: input.runId,\n },\n );\n }\n const observation = renderer.observation;\n const observedPayloadClass = observationPayloadClass(observation);\n if (observedPayloadClass === undefined) {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'the rendered texture observation to classify the actual payload',\n { phase: 'renderer-observation', runId: input.runId },\n );\n }\n const observed: TextureOracleInput['observed'] = {\n subjectDigest: observationString(observation, 'subjectDigest') ?? '',\n boundDigest: observationString(observation, 'boundDigest') ?? '',\n dimensions: observationDimensions(observation) ?? [0, 0],\n format: observationString(observation, 'format') ?? '',\n colorSpace: observationString(observation, 'colorSpace') ?? '',\n mipCount: typeof observation.mipCount === 'number' ? observation.mipCount : 0,\n uvDigest: observationString(observation, 'uvDigest') ?? '',\n filter: observationString(observation, 'filter') ?? '',\n bindingDigest: observationString(observation, 'bindingDigest') ?? '',\n rendererHealthy: renderer.rendererReady && renderer.worldReady,\n drawCalls,\n nonBlackPixels: renderer.nonBlackPixels,\n payloadClass: observedPayloadClass,\n };\n const oracle = evaluateTextureOracle({ requested: inspected.value, observed });\n if (oracle.status !== 'passed') {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'the rendered texture binding observation to match the loaded owner facts',\n { phase: 'oracle', runId: input.runId, ...oracle.detail },\n );\n }\n return {\n ok: true as const,\n value: {\n subject: { kind: 'texture' as const, guid: args.guid, digest: inspected.value.subjectDigest },\n presentation: canonicalPresentation('texture'),\n recipe: createCanonicalPreviewRecipe('texture'),\n quad: { projection: 'orthographic', aspect: 'preserving', stage: 'unlit-checker' },\n binding: { filter: inspected.value.filter, digest: inspected.value.bindingDigest },\n oracle,\n artifacts: input.artifacts ?? [],\n },\n artifacts: input.artifacts ?? [],\n };\n}\n","import type {\n ArtifactRef,\n JsonValue,\n SnapshotRef,\n ToolDomainFailure,\n ToolEvidenceKind,\n ToolExecutionContext,\n ToolSubjectRef,\n} from '@forgeax/engine-tool-runtime';\nimport {\n createPreviewHost as createNativePreviewHost,\n type PreviewHost as NativePreviewHost,\n type PreviewHostMechanisms,\n} from './host/preview-host.js';\n\nexport interface PreviewHostRequest {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n}\n\nexport interface PreviewAssetBinding {\n readonly guid: string;\n readonly bytes: number;\n}\n\nexport interface PreviewFrameInput {\n readonly frame: number;\n readonly deltaSeconds: number;\n}\n\nexport interface PreviewCapture {\n readonly digest: string;\n readonly bytes: number;\n}\n\nexport interface PreviewResourceCensus {\n readonly worlds: number;\n readonly renderers: number;\n readonly canvases: number;\n readonly leases: number;\n}\n\nexport interface PreviewCleanupReport {\n readonly census: PreviewResourceCensus;\n readonly failures: readonly string[];\n}\n\n/**\n * The only resource surface exposed to a preview contribution. The adapter owns\n * the actual Engine resources; callers receive POD bindings and bounded actions.\n */\nexport interface PreviewHostSession {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n readonly loadAsset: (guid: string) => Promise<PreviewAssetBinding>;\n readonly frame: (input: PreviewFrameInput) => Promise<void>;\n readonly capture: () => Promise<PreviewCapture & { readonly artifact?: ArtifactRef }>;\n readonly census: () => PreviewResourceCensus;\n readonly dispose: () => Promise<void>;\n}\n\nexport interface PreviewHostAdapter {\n readonly open: (request: PreviewHostRequest) => PreviewHostSession | Promise<PreviewHostSession>;\n}\n\nexport interface PreviewHost {\n readonly withSession: <TResult>(\n request: PreviewHostRequest,\n run: (session: PreviewHostSession) => TResult | Promise<TResult>,\n ) => Promise<{ readonly value: TResult; readonly cleanup: PreviewCleanupReport }>;\n}\n\nexport interface PreviewDomainValue<TReport = unknown> {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n readonly report: TReport;\n readonly artifacts: readonly ArtifactRef[];\n}\n\nexport type PreviewDomainResult<TReport = unknown> =\n | { readonly ok: true; readonly value: PreviewDomainValue<TReport> }\n | { readonly ok: false; readonly error: ToolDomainFailure };\n\nexport type PreviewDomainRunner<TRequest, TReport = unknown> = (\n request: TRequest,\n context: ToolExecutionContext,\n) => Promise<PreviewDomainResult<TReport>>;\n\nexport const REQUIRED_PREVIEW_EVIDENCE: readonly ToolEvidenceKind[] = [\n 'rhi-tape',\n 'png',\n 'profile-capture',\n];\n\nexport function domainFailure(\n code: string,\n expected: string,\n hint: string,\n detail: Record<string, JsonValue>,\n): { readonly ok: false; readonly error: ToolDomainFailure } {\n return { ok: false, error: { code, expected, hint, detail } };\n}\n\n/**\n * The default contribution is deliberately fail-closed. A real Project GUID\n * loader must install a PreviewHost/Browser/Dawn runner; a data-only request\n * must never manufacture PNG, RHI, or profile references from its arguments.\n */\nexport function previewRuntimeUnavailable(\n subject: ToolSubjectRef,\n snapshot: SnapshotRef,\n domain: string,\n): { readonly ok: false; readonly error: ToolDomainFailure } {\n return domainFailure(\n 'preview-runtime-unavailable',\n 'a Project GUID cold-load and an active PreviewHost/Browser/Dawn runner',\n 'Install the Project preview provider and retry; no synthetic artifact is published.',\n {\n domain,\n subjectKind: subject.kind,\n subjectGuid: subject.guid,\n snapshotRevision: snapshot.revision,\n snapshotDigest: snapshot.digest,\n requiredEvidence: REQUIRED_PREVIEW_EVIDENCE as unknown as JsonValue,\n },\n );\n}\n\nexport function validateDomainValue<TReport>(\n value: PreviewDomainValue<TReport>,\n request: PreviewHostRequest,\n): PreviewDomainResult<TReport> {\n if (\n value.subject.kind !== request.subject.kind ||\n value.subject.guid !== request.subject.guid ||\n value.snapshot.revision !== request.snapshot.revision ||\n value.snapshot.digest !== request.snapshot.digest\n ) {\n return domainFailure(\n 'preview-subject-identity-mismatch',\n 'the terminal subject and snapshot to match the request',\n 'Repair the domain producer so evidence remains bound to the requested subject.',\n {\n requestGuid: request.subject.guid,\n resultGuid: value.subject.guid,\n requestSnapshot: request.snapshot.digest,\n resultSnapshot: value.snapshot.digest,\n },\n );\n }\n const kinds = new Set(value.artifacts.map((artifact) => artifact.kind));\n const missing = REQUIRED_PREVIEW_EVIDENCE.filter((kind) => !kinds.has(kind));\n if (missing.length > 0) {\n return domainFailure(\n 'preview-evidence-incomplete',\n 'one subject-bound artifact for each required evidence kind',\n 'Repair the RHI, PNG, and profile producers before retrying.',\n { missing: missing as unknown as JsonValue },\n );\n }\n return { ok: true, value };\n}\n\nexport class PreviewCleanupError extends Error {\n readonly code = 'preview-cleanup-live-resources';\n readonly census: PreviewResourceCensus;\n\n constructor(census: PreviewResourceCensus, failures: readonly string[] = []) {\n super(\n failures.length === 0\n ? 'preview session left live resources after disposal'\n : `preview session cleanup failed: ${failures.join('; ')}`,\n );\n this.name = 'PreviewCleanupError';\n this.census = census;\n }\n}\n\nfunction hasLiveResources(census: PreviewResourceCensus): boolean {\n return Object.values(census).some((count) => count !== 0);\n}\n\nexport function createPreviewHost(adapter: PreviewHostAdapter): PreviewHost;\nexport function createPreviewHost(input: PreviewHostMechanisms): NativePreviewHost;\nexport function createPreviewHost(\n adapterOrInput: PreviewHostAdapter | PreviewHostMechanisms,\n): PreviewHost | NativePreviewHost {\n if ('runId' in adapterOrInput) return createNativePreviewHost(adapterOrInput);\n const adapter = adapterOrInput;\n const withSession = async <TResult>(\n request: PreviewHostRequest,\n run: (session: PreviewHostSession) => TResult | Promise<TResult>,\n ): Promise<{ readonly value: TResult; readonly cleanup: PreviewCleanupReport }> => {\n const session = await adapter.open(request);\n let result: TResult;\n try {\n result = await run(session);\n } finally {\n await session.dispose();\n }\n const cleanup: PreviewCleanupReport = { census: session.census(), failures: [] };\n if (hasLiveResources(cleanup.census)) {\n throw new PreviewCleanupError(cleanup.census, cleanup.failures);\n }\n return { value: result, cleanup };\n };\n\n return {\n withSession,\n };\n}\n","import {\n defineTool,\n type SnapshotRef,\n type ToolContribution,\n type ToolPreviewContract,\n type ToolSchema,\n type ToolSubjectRef,\n} from '@forgeax/engine-tool-runtime';\nimport { nativePreviewPlugin, subjectDescriptor } from './domains/subject.js';\nimport { executeTexturePreview } from './domains/texture.js';\nimport { previewHostCapability } from './host/preview-host.js';\nimport {\n domainFailure,\n type PreviewDomainResult,\n type PreviewDomainRunner,\n previewRuntimeUnavailable,\n validateDomainValue,\n} from './host.js';\n\nexport type TextureColorSpace = 'linear' | 'srgb' | 'hdr';\n\nexport interface TextureBinding {\n readonly guid: string;\n readonly width: number;\n readonly height: number;\n readonly format: string;\n readonly colorSpace: TextureColorSpace;\n readonly alpha: boolean;\n readonly mipLevels: number;\n readonly channels: number;\n}\n\nexport interface TexturePreviewRequest {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n readonly binding: TextureBinding;\n}\n\nexport interface TexturePreviewReport {\n readonly kind: 'texture';\n readonly bindingGuid: string;\n readonly width: number;\n readonly height: number;\n readonly format: string;\n readonly colorSpace: TextureColorSpace;\n readonly alpha: boolean;\n readonly mipLevels: number;\n readonly channels: number;\n readonly aspectRatio: number;\n readonly checkerPixels: number;\n readonly subjectNonBlackPixels: number;\n}\n\nconst texturePreviewArgsSchema: ToolSchema<TexturePreviewRequest> = {\n parse(value) {\n if (value === null || typeof value !== 'object')\n return { ok: false, error: 'expected a texture preview request object' };\n const request = value as Partial<TexturePreviewRequest>;\n const binding = request.binding;\n if (request.subject?.kind !== 'TextureAsset' || typeof request.subject.guid !== 'string')\n return { ok: false, error: 'expected a TextureAsset subject' };\n if (\n request.snapshot === undefined ||\n !Number.isSafeInteger(request.snapshot.revision) ||\n typeof request.snapshot.digest !== 'string'\n )\n return { ok: false, error: 'expected a revisioned snapshot' };\n if (\n binding === undefined ||\n binding.guid !== request.subject.guid ||\n !Number.isSafeInteger(binding.width) ||\n binding.width < 1 ||\n !Number.isSafeInteger(binding.height) ||\n binding.height < 1 ||\n binding.format.length === 0 ||\n !['linear', 'srgb', 'hdr'].includes(binding.colorSpace) ||\n !Number.isSafeInteger(binding.mipLevels) ||\n binding.mipLevels < 1 ||\n !Number.isSafeInteger(binding.channels) ||\n binding.channels < 1 ||\n binding.channels > 4\n )\n return {\n ok: false,\n error: 'expected complete texture dimensions, format, and color-space facts',\n };\n return { ok: true, value: request as TexturePreviewRequest };\n },\n describe:\n '{\"type\":\"object\",\"required\":[\"subject\",\"snapshot\",\"binding\"],\"properties\":{\"subject\":{\"type\":\"object\",\"required\":[\"kind\",\"guid\"],\"properties\":{\"kind\":{\"const\":\"TextureAsset\"},\"guid\":{\"type\":\"string\"}}},\"snapshot\":{\"type\":\"object\",\"required\":[\"revision\",\"digest\"]},\"binding\":{\"type\":\"object\",\"required\":[\"guid\",\"width\",\"height\",\"format\",\"colorSpace\",\"alpha\",\"mipLevels\",\"channels\"]}}}',\n};\n\nconst texturePreviewResultSchema: ToolSchema<unknown> = {\n parse: (value) => ({ ok: true, value }),\n describe: '{\"type\":\"object\",\"required\":[\"subject\",\"snapshot\",\"report\",\"artifacts\"]}',\n};\n\nexport const texturePreviewDescriptor = {\n id: 'texture.preview',\n title: 'Preview texture asset',\n summary: 'Presents one texture on an aspect-correct quad with alpha checker evidence.',\n realm: 'engine' as const,\n argsSchema: texturePreviewArgsSchema,\n resultSchema: texturePreviewResultSchema,\n evidence: ['rhi-tape', 'png', 'profile-capture'] as const,\n preview: {\n realm: 'engine' as const,\n subject: { kind: 'TextureAsset', guid: '<request>' },\n snapshot: { revision: 0, digest: '<request>' },\n requiredEvidence: ['rhi-tape', 'png', 'profile-capture'] as const,\n } satisfies ToolPreviewContract,\n};\n\nfunction defaultTextureRunner(\n request: TexturePreviewRequest,\n): Promise<PreviewDomainResult<TexturePreviewReport>> {\n return Promise.resolve(previewRuntimeUnavailable(request.subject, request.snapshot, 'texture'));\n}\n\nexport function createTexturePreviewContribution(\n runner: PreviewDomainRunner<TexturePreviewRequest, TexturePreviewReport> = async (request) =>\n defaultTextureRunner(request),\n): ToolContribution<TexturePreviewRequest, unknown> {\n return defineTool(texturePreviewDescriptor, async (request, context) => {\n const result = await runner(request, context);\n if (!result.ok) return result;\n const report = result.value.report;\n const binding = request.binding;\n if (\n report.bindingGuid !== request.subject.guid ||\n report.width !== binding.width ||\n report.height !== binding.height ||\n report.format !== binding.format ||\n report.colorSpace !== binding.colorSpace ||\n report.alpha !== binding.alpha ||\n report.mipLevels !== binding.mipLevels ||\n report.channels !== binding.channels ||\n report.aspectRatio !== binding.width / binding.height ||\n report.checkerPixels <= 0 ||\n report.subjectNonBlackPixels <= 0\n ) {\n return domainFailure(\n 'preview-subject-falsified',\n 'the texture binding facts and aspect-correct checker presentation to agree',\n 'Reject texture replacement, color-space drift, and background-only captures.',\n {\n requestGuid: request.subject.guid,\n reportBindingGuid: report.bindingGuid,\n expectedFormat: binding.format,\n actualFormat: report.format,\n expectedColorSpace: binding.colorSpace,\n actualColorSpace: report.colorSpace,\n expectedAspectRatio: binding.width / binding.height,\n actualAspectRatio: report.aspectRatio,\n },\n );\n }\n const validated = validateDomainValue(result.value, request);\n if (!validated.ok) return validated;\n return { ok: true, value: validated.value };\n });\n}\n\nexport const texturePreview = defineTool(subjectDescriptor('texture'), (args, context) => {\n const host = context.require(previewHostCapability);\n if (!host.ok) return host;\n return host.value.withSession(async (mechanisms) =>\n executeTexturePreview(args, {\n ...(mechanisms.assets === undefined ? {} : { assets: mechanisms.assets }),\n ...(mechanisms.renderer === undefined ? {} : { renderer: mechanisms.renderer }),\n runId: mechanisms.runId,\n ...(mechanisms.artifacts === undefined ? {} : { artifacts: mechanisms.artifacts }),\n }),\n );\n});\nexport const texturePreviewPlugin = nativePreviewPlugin('texture', texturePreview);\nexport default texturePreviewPlugin;\n"]}
1
+ {"version":3,"sources":["../src/host/preview-host.ts","../src/domains/subject.ts","../src/evidence/oracle.ts","../src/kit/canonical.ts","../src/domains/texture.ts","../src/host.ts","../src/texture.ts"],"names":["defineToolPlugin","isRecord","levels"],"mappings":"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","file":"texture.mjs","sourcesContent":["import { defineToolPlugin, type Plugin, type ToolPlugin } from '@forgeax/engine-plugin';\nimport {\n type ArtifactRef,\n defineToolCapability,\n type SnapshotRef,\n} from '@forgeax/engine-tool-runtime';\n\nexport interface PreviewAssetLoadResult<TAsset = unknown> {\n readonly ok: true;\n readonly value: TAsset;\n readonly digest?: string;\n readonly ownerFacts?: Readonly<Record<string, string | number | boolean>>;\n}\n\nexport interface PreviewAssetLoadFailure {\n readonly ok: false;\n readonly error: unknown;\n}\n\nexport interface PreviewAssetRegistry {\n readonly loadByGuid: <TAsset = unknown>(\n guid: string,\n ) => Promise<PreviewAssetLoadResult<TAsset> | PreviewAssetLoadFailure>;\n}\n\nexport interface PreviewRenderRuntime {\n readonly rendererReady: boolean;\n readonly worldReady: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n /**\n * Facts read back from the real render/asset owner path. Domain executors\n * must not manufacture observed identity from the requested subject.\n */\n readonly observation?: Readonly<Record<string, string | number | boolean | readonly number[]>>;\n readonly vfx?: {\n readonly dispatches: number;\n readonly indirectDraws: number;\n readonly subjectOutputs: number;\n };\n readonly texture?: {\n readonly drawCalls: number;\n };\n}\n\nexport interface PreviewHostMechanisms {\n readonly runId: string;\n readonly snapshot: SnapshotRef;\n readonly projectRoot: string;\n readonly backend: 'webgpu';\n readonly signal: AbortSignal;\n readonly assets?: PreviewAssetRegistry;\n readonly renderer?: PreviewRenderRuntime;\n readonly artifacts?: readonly ArtifactRef[];\n}\n\nexport interface PreviewHost {\n readonly withSession: <T>(\n execute: (mechanisms: PreviewHostMechanisms) => Promise<T>,\n ) => Promise<T>;\n}\n\nexport const previewHostCapability = defineToolCapability<PreviewHost>('preview.host');\n\nexport function previewHostPlugin(host: PreviewHost): Plugin {\n return {\n name: 'forgeax-preview-host',\n provide: previewHostCapability.id,\n apply(ctx) {\n ctx.provide(previewHostCapability.id, host);\n },\n };\n}\n\nexport function bindPreviewHost(plugin: ToolPlugin, host: PreviewHost): ToolPlugin {\n return defineToolPlugin(previewHostPlugin(host), plugin.tools);\n}\n\nexport function createPreviewHost(input: PreviewHostMechanisms): PreviewHost {\n let active = true;\n return {\n async withSession(execute) {\n if (!active || input.signal.aborted) throw new Error('preview-host-session-terminal');\n try {\n return await execute(input);\n } finally {\n active = false;\n }\n },\n };\n}\n","import { defineToolPlugin } from '@forgeax/engine-plugin';\nimport type {\n JsonValue,\n ToolContribution,\n ToolDescriptor,\n ToolExecutionContext,\n ToolSchema,\n} from '@forgeax/engine-tool-runtime';\nimport { previewHostCapability } from '../host/preview-host.js';\nimport type { PreviewSubjectKind } from '../kit/presentation.js';\n\nexport interface ResourcePreviewArgs {\n readonly guid: string;\n /** Square screenshot edge in device pixels. Defaults to 512 and must be a power of two. */\n readonly size?: number;\n}\n\nexport const RESOURCE_PREVIEW_DEFAULT_SIZE = 512;\nexport const RESOURCE_PREVIEW_MIN_SIZE = 64;\nexport const RESOURCE_PREVIEW_MAX_SIZE = 4096;\n\nexport function isResourcePreviewSize(value: unknown): value is number {\n return (\n typeof value === 'number' &&\n Number.isSafeInteger(value) &&\n value >= RESOURCE_PREVIEW_MIN_SIZE &&\n value <= RESOURCE_PREVIEW_MAX_SIZE &&\n (value & (value - 1)) === 0\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\n/** Keep the public result contract concrete at the ToolRuntime boundary. */\nfunction isResourcePreviewResult(value: unknown): boolean {\n if (!isRecord(value)) return false;\n const subject = value.subject;\n if (\n !isRecord(subject) ||\n !isString(subject.kind) ||\n !isString(subject.guid) ||\n !isString(subject.digest)\n )\n return false;\n if (!isRecord(value.presentation) || !isString(value.presentation.kind)) return false;\n if (\n !isRecord(value.recipe) ||\n !isString(value.recipe.schemaVersion) ||\n !isString(value.recipe.recipeDigest)\n )\n return false;\n if (!isRecord(value.oracle) || !isString(value.oracle.status)) return false;\n return Array.isArray(value.artifacts);\n}\n\nexport const resourcePreviewResultSchema: ToolSchema<unknown> = {\n parse(value) {\n return isResourcePreviewResult(value)\n ? { ok: true, value }\n : {\n ok: false,\n error:\n 'resource preview result must include subject, presentation, recipe, oracle, and artifacts',\n };\n },\n describe: '{\"type\":\"object\",\"required\":[\"subject\",\"presentation\",\"recipe\",\"oracle\",\"artifacts\"]}',\n};\n\nexport const resourcePreviewArgsSchema: ToolSchema<ResourcePreviewArgs> = {\n parse(value) {\n if (\n value === null ||\n typeof value !== 'object' ||\n typeof Reflect.get(value, 'guid') !== 'string'\n ) {\n return { ok: false, error: 'expected { guid: string }' };\n }\n const guid = Reflect.get(value, 'guid');\n if (guid.length === 0) return { ok: false, error: 'guid must not be empty' };\n const size = Reflect.get(value, 'size');\n if (size === undefined) return { ok: true, value: { guid } };\n return isResourcePreviewSize(size)\n ? { ok: true, value: { guid, size } }\n : {\n ok: false,\n error: `size must be a power of two between ${RESOURCE_PREVIEW_MIN_SIZE} and ${RESOURCE_PREVIEW_MAX_SIZE}`,\n };\n },\n describe: `{\"type\":\"object\",\"required\":[\"guid\"],\"properties\":{\"guid\":{\"type\":\"string\"},\"size\":{\"type\":\"integer\",\"minimum\":${RESOURCE_PREVIEW_MIN_SIZE},\"maximum\":${RESOURCE_PREVIEW_MAX_SIZE},\"description\":\"square power-of-two screenshot edge; defaults to ${RESOURCE_PREVIEW_DEFAULT_SIZE}\"}}}`,\n};\n\nexport function subjectDescriptor(\n kind: PreviewSubjectKind,\n): ToolDescriptor<ResourcePreviewArgs, unknown> {\n return {\n id: `${kind}.preview`,\n title: `Preview ${kind}`,\n summary: `Preview one ${kind} asset in the Engine-owned resource host.`,\n realm: 'host',\n argsSchema: resourcePreviewArgsSchema,\n resultSchema: resourcePreviewResultSchema,\n evidence: ['rhi-tape', 'profile-capture', 'png'],\n };\n}\n\nexport type SubjectExecutor = (args: ResourcePreviewArgs, context: ToolExecutionContext) => unknown;\n\nexport interface ResourceSubjectFailure {\n readonly ok: false;\n readonly error: {\n readonly code:\n | 'resource-preview-subject-invalid'\n | 'resource-preview-kind-mismatch'\n | 'resource-preview-oracle-failed';\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<Record<string, JsonValue>>;\n };\n}\n\nexport function subjectFailure(\n code: ResourceSubjectFailure['error']['code'],\n expected: string,\n detail: Readonly<Record<string, JsonValue>>,\n): ResourceSubjectFailure {\n return {\n ok: false,\n error: {\n code,\n expected,\n hint: 'Load the requested GUID through AssetRegistry.loadByGuid and repair the owner facts before retrying.',\n detail,\n },\n };\n}\n\nexport function assetLoadFailure(\n expected: string,\n runId: string,\n error: unknown,\n): ResourceSubjectFailure {\n const owner = isRecord(error) ? error : undefined;\n const ownerCode = typeof owner?.code === 'string' ? owner.code : undefined;\n const ownerExpected = typeof owner?.expected === 'string' ? owner.expected : undefined;\n const ownerHint = typeof owner?.hint === 'string' ? owner.hint : undefined;\n const ownerDetail = owner?.detail;\n return subjectFailure('resource-preview-subject-invalid', expected, {\n phase: 'asset-load',\n runId,\n ...(ownerCode === undefined ? {} : { ownerCode }),\n ...(ownerExpected === undefined ? {} : { ownerExpected }),\n ...(ownerHint === undefined ? {} : { ownerHint }),\n ...(ownerDetail === undefined ? {} : { ownerDetail: toJsonValue(ownerDetail) }),\n });\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (Array.isArray(value)) return value.map((entry) => toJsonValue(entry));\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, toJsonValue(entry)]),\n );\n }\n return String(value);\n}\n\nexport function nativePreviewPlugin(\n kind: PreviewSubjectKind,\n contribution: ToolContribution<ResourcePreviewArgs, unknown>,\n) {\n return defineToolPlugin({ name: `forgeax-preview-${kind}`, apply() {} }, [\n contribution as ToolContribution<unknown, unknown>,\n ]);\n}\n\nexport async function failUnboundSubject(\n kind: PreviewSubjectKind,\n args: ResourcePreviewArgs,\n context: ToolExecutionContext,\n): Promise<unknown> {\n const host = context.require(previewHostCapability);\n if (!host.ok) return host;\n return host.value.withSession(async (mechanisms) => ({\n ...subjectFailure(\n 'resource-preview-subject-invalid',\n `${kind} asset ${args.guid} to be bound by its owner before rendering`,\n { phase: 'subject-binding', runId: mechanisms.runId },\n ),\n }));\n}\n","export type PreviewOracleStatus = PreviewOracle['status'];\n\nexport type PreviewOracle =\n | {\n readonly status: 'passed';\n readonly subjectBound: true;\n readonly drawCalls: number;\n readonly dispatches: number;\n readonly rendererHealthy: true;\n readonly detail: Record<string, string | number | boolean>;\n }\n | {\n readonly status: 'failed';\n readonly subjectBound: false;\n readonly drawCalls: number;\n readonly dispatches: number;\n readonly rendererHealthy: boolean;\n readonly detail: Record<string, string | number | boolean>;\n };\n\nexport function passedPreviewOracle(input: {\n readonly drawCalls: number;\n readonly dispatches?: number;\n readonly detail: Record<string, string | number | boolean>;\n}): PreviewOracle {\n return {\n status: 'passed',\n subjectBound: true,\n drawCalls: input.drawCalls,\n dispatches: input.dispatches ?? 0,\n rendererHealthy: true,\n detail: { ...input.detail },\n };\n}\n\nexport function failedPreviewOracle(input: {\n readonly drawCalls?: number;\n readonly dispatches?: number;\n readonly rendererHealthy?: boolean;\n readonly detail: Record<string, string | number | boolean>;\n}): PreviewOracle {\n return {\n status: 'failed',\n subjectBound: false,\n drawCalls: input.drawCalls ?? 0,\n dispatches: input.dispatches ?? 0,\n rendererHealthy: input.rendererHealthy ?? false,\n detail: { ...input.detail },\n };\n}\n\nexport interface MaterialOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly program: string;\n readonly pass: string;\n readonly bindingsDigest: string;\n readonly closureDigest: string;\n };\n readonly observed: MaterialOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n };\n}\n\nexport interface MeshOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly vertexDigest: string;\n readonly indexDigest: string;\n readonly submeshDigest: string;\n readonly aabbDigest: string;\n readonly aabb?: readonly [number, number, number, number, number, number];\n readonly submeshCount?: number;\n readonly materialSlotCount?: number;\n };\n readonly observed: MeshOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n };\n}\n\nfunction oracleDetail(\n kind: 'material' | 'mesh',\n requested: Record<string, unknown>,\n observed: Record<string, unknown>,\n mismatch: string | undefined,\n): Record<string, string | number | boolean> {\n return {\n kind,\n mismatch: mismatch ?? 'none',\n requestedSubjectDigest:\n typeof requested.subjectDigest === 'string' ? requested.subjectDigest : 'unknown',\n observedSubjectDigest:\n typeof observed.subjectDigest === 'string' ? observed.subjectDigest : 'unknown',\n requestedOwnerDigest: JSON.stringify(requested),\n observedOwnerDigest: JSON.stringify(observed),\n };\n}\n\nfunction firstMismatch(\n requested: Record<string, unknown>,\n observed: Record<string, unknown>,\n): string | undefined {\n for (const key of Object.keys(requested)) {\n const requestedValue = requested[key];\n const observedValue = observed[key];\n if (\n Array.isArray(requestedValue) ||\n Array.isArray(observedValue) ||\n typeof requestedValue === 'object' ||\n typeof observedValue === 'object'\n ) {\n if (JSON.stringify(requestedValue) !== JSON.stringify(observedValue)) return key;\n } else if (requestedValue !== observedValue) {\n return key;\n }\n }\n return undefined;\n}\n\nexport function evaluateMaterialOracle(input: MaterialOracleInput): PreviewOracle {\n const requested = input.requested as unknown as Record<string, string>;\n const observed = input.observed as unknown as Record<string, string>;\n const mismatch = firstMismatch(requested, observed);\n const healthy = input.observed.rendererHealthy && input.observed.drawCalls > 0;\n const detail = oracleDetail('material', requested, observed, mismatch);\n if (mismatch !== undefined || !healthy) {\n return failedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n rendererHealthy: input.observed.rendererHealthy,\n detail: { ...detail, rendererHealthy: input.observed.rendererHealthy },\n });\n }\n return passedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n detail: { ...detail, rendererHealthy: true },\n });\n}\n\nexport function evaluateMeshOracle(input: MeshOracleInput): PreviewOracle {\n const requested = input.requested as unknown as Record<string, string>;\n const observed = input.observed as unknown as Record<string, string>;\n const mismatch = firstMismatch(requested, observed);\n const healthy = input.observed.rendererHealthy && input.observed.drawCalls > 0;\n const detail = oracleDetail('mesh', requested, observed, mismatch);\n if (mismatch !== undefined || !healthy) {\n return failedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n rendererHealthy: input.observed.rendererHealthy,\n detail: { ...detail, rendererHealthy: input.observed.rendererHealthy },\n });\n }\n return passedPreviewOracle({\n drawCalls: input.observed.drawCalls,\n detail: { ...detail, rendererHealthy: true },\n });\n}\n\nexport interface VfxOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly programFingerprint: string;\n readonly emitterDigest: string;\n readonly sampleDigest: string;\n readonly boundsDigest: string;\n readonly computeDigest: string;\n readonly indirectDigest: string;\n readonly contactSheetDigest?: string;\n readonly authoredBounds?: readonly [number, number, number, number, number, number];\n readonly seed?: number;\n readonly fixedDelta?: number;\n readonly timelineFrames?: number;\n };\n readonly observed: VfxOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly dispatches: number;\n readonly indirectDraws: number;\n readonly subjectOutputs: number;\n readonly nonBlackPixels: number;\n };\n}\n\nexport interface TextureOracleInput {\n readonly requested: {\n readonly subjectDigest: string;\n readonly boundDigest: string;\n readonly dimensions: readonly [number, number];\n readonly format: string;\n readonly colorSpace: string;\n readonly mipCount: number;\n readonly uvDigest: string;\n readonly filter: string;\n readonly bindingDigest: string;\n };\n readonly observed: TextureOracleInput['requested'] & {\n readonly rendererHealthy: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n readonly payloadClass: 'black' | 'transparent' | 'single-channel' | 'color';\n };\n}\n\nfunction identityRecord(input: Record<string, unknown>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => [\n key,\n Array.isArray(value) ? JSON.stringify(value) : String(value),\n ]),\n );\n}\n\nfunction evaluateIdentityOracle(\n kind: 'vfx' | 'texture',\n requestedInput: Record<string, unknown>,\n observedInput: Record<string, unknown>,\n healthy: boolean,\n drawCalls: number,\n dispatches: number,\n detailOverrides: Record<string, string | number | boolean>,\n): PreviewOracle {\n const requested = identityRecord(requestedInput);\n const observed = identityRecord(observedInput);\n const mismatch = firstMismatch(requested, observed);\n const detail = {\n kind,\n mismatch: mismatch ?? 'none',\n requestedSubjectDigest: requested.subjectDigest ?? 'unknown',\n observedSubjectDigest: observed.subjectDigest ?? 'unknown',\n requestedOwnerDigest: JSON.stringify(requested),\n observedOwnerDigest: JSON.stringify(observed),\n ...detailOverrides,\n };\n if (mismatch !== undefined || !healthy) {\n return failedPreviewOracle({ drawCalls, dispatches, rendererHealthy: healthy, detail });\n }\n return passedPreviewOracle({ drawCalls, dispatches, detail });\n}\n\nexport function evaluateVfxOracle(input: VfxOracleInput): PreviewOracle {\n const observed = input.observed;\n const healthy =\n observed.rendererHealthy &&\n observed.dispatches > 0 &&\n observed.indirectDraws > 0 &&\n observed.subjectOutputs > 0;\n return evaluateIdentityOracle(\n 'vfx',\n input.requested,\n input.observed,\n healthy,\n observed.indirectDraws,\n observed.dispatches,\n {\n rendererHealthy: observed.rendererHealthy,\n indirectDraws: observed.indirectDraws,\n subjectOutputs: observed.subjectOutputs,\n nonBlackPixels: observed.nonBlackPixels,\n },\n );\n}\n\nexport function evaluateTextureOracle(input: TextureOracleInput): PreviewOracle {\n const observed = input.observed;\n return evaluateIdentityOracle(\n 'texture',\n input.requested,\n input.observed,\n observed.rendererHealthy && observed.drawCalls > 0,\n observed.drawCalls,\n 0,\n {\n rendererHealthy: observed.rendererHealthy,\n payloadClass: observed.payloadClass,\n nonBlackPixels: observed.nonBlackPixels,\n },\n );\n}\n","import type { PreviewPresentation, PreviewSubjectKind } from './presentation.js';\n\nexport interface CanonicalPreviewRecipe {\n readonly schemaVersion: '1.0.0';\n readonly rig:\n | Extract<PreviewPresentation, { readonly kind: 'lit-asset' }>['geometry']\n | 'asset-quad';\n readonly environment: 'engine-canonical' | 'black';\n readonly skybox: 'engine-canonical' | 'none';\n readonly skylight: 'engine-canonical' | 'none';\n readonly directionalLight: 'engine-canonical' | 'none';\n readonly stage: 'neutral-material-checker-unlit' | 'texture-unlit-black';\n readonly camera: 'bounds-derived' | 'texture-orthographic';\n readonly recipeDigest: string;\n}\n\nexport function createCanonicalPreviewRecipe(kind: PreviewSubjectKind): CanonicalPreviewRecipe {\n const texture = kind === 'texture';\n return {\n schemaVersion: '1.0.0',\n rig: kind === 'mesh' ? 'asset-mesh' : texture ? 'asset-quad' : 'handle-sphere',\n environment: texture ? 'black' : 'engine-canonical',\n skybox: texture ? 'none' : 'engine-canonical',\n skylight: texture ? 'none' : 'engine-canonical',\n directionalLight: texture ? 'none' : 'engine-canonical',\n stage: texture ? 'texture-unlit-black' : 'neutral-material-checker-unlit',\n camera: texture ? 'texture-orthographic' : 'bounds-derived',\n recipeDigest: `canonical:${kind}:${texture ? 'texture-orthographic' : 'bounds-derived'}`,\n };\n}\n\nexport function canonicalPresentation(kind: PreviewSubjectKind): PreviewPresentation {\n if (kind === 'texture') {\n return {\n kind: 'texture-unlit',\n geometry: 'aspect-quad',\n checkerboard: 'linear-alpha',\n };\n }\n return {\n kind: 'lit-asset',\n geometry: kind === 'mesh' ? 'asset-mesh' : 'handle-sphere',\n skylight: 'engine-canonical',\n directionalLight: 'engine-canonical',\n skybox: 'engine-canonical',\n };\n}\n","import type { ArtifactRef } from '@forgeax/engine-tool-runtime';\nimport { evaluateTextureOracle, type TextureOracleInput } from '../evidence/oracle.js';\nimport type { PreviewAssetRegistry, PreviewRenderRuntime } from '../host/preview-host.js';\nimport { canonicalPresentation, createCanonicalPreviewRecipe } from '../kit/canonical.js';\nimport { assetLoadFailure, type ResourcePreviewArgs, subjectFailure } from './subject.js';\n\nexport interface TextureSubjectInspection {\n readonly subjectDigest: string;\n readonly boundDigest: string;\n readonly dimensions: readonly [number, number];\n readonly format: string;\n readonly colorSpace: string;\n readonly mipCount: number;\n readonly uvDigest: string;\n readonly filter: string;\n readonly bindingDigest: string;\n readonly payloadClass: TextureOracleInput['observed']['payloadClass'];\n}\n\ntype InspectionResult =\n | { readonly ok: true; readonly value: TextureSubjectInspection }\n | ReturnType<typeof subjectFailure>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction requiredString(asset: Record<string, unknown>, field: string): string | undefined {\n const value = asset[field];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction requiredNumber(asset: Record<string, unknown>, field: string): number | undefined {\n const value = asset[field];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction authoredMipCount(\n asset: Record<string, unknown>,\n shapeDimensions: readonly (number | undefined)[] | undefined,\n): number | undefined {\n const mips = isRecord(asset.mips) ? asset.mips : undefined;\n if (mips?.kind === 'packed') {\n const levels = requiredNumber(mips, 'levelCount');\n return levels !== undefined && Number.isInteger(levels) && levels > 0 ? levels : undefined;\n }\n if (mips?.kind !== 'generate') return mips?.kind === 'none' ? 1 : undefined;\n const [width, height] = shapeDimensions ?? [undefined, undefined];\n if (width === undefined || height === undefined) return undefined;\n const shape = isRecord(asset.shape) ? asset.shape : undefined;\n const extent = shape !== undefined && isRecord(shape.extent) ? shape.extent : undefined;\n const depth =\n shape?.viewDimension === '3d' && extent !== undefined\n ? (requiredNumber(extent, 'depth') ?? 1)\n : 1;\n let largest = Math.max(width, height, depth);\n let levels = 1;\n while (largest > 1) {\n largest = Math.max(1, Math.floor(largest / 2));\n levels += 1;\n }\n return levels;\n}\n\nfunction isTexturePayloadClass(value: unknown): value is TextureSubjectInspection['payloadClass'] {\n return (\n value === 'black' || value === 'transparent' || value === 'single-channel' || value === 'color'\n );\n}\n\nfunction classifyPayload(\n data: unknown,\n format: string | undefined,\n): TextureSubjectInspection['payloadClass'] | undefined {\n const bytes =\n data instanceof Uint8Array || data instanceof Uint8ClampedArray\n ? [...data]\n : Array.isArray(data) && data.every((value) => typeof value === 'number')\n ? data\n : undefined;\n if (bytes === undefined || bytes.length === 0) return undefined;\n const normalizedFormat = format?.toLowerCase() ?? '';\n const singleChannel = normalizedFormat.startsWith('r') && !normalizedFormat.startsWith('rg');\n if (bytes.every((value) => value === 0)) return 'black';\n if (singleChannel) return 'single-channel';\n // RG carries two color/data channels and has no alpha lane. Only the\n // explicitly four-channel formats below permit a transparent classification;\n // compressed and packed formats remain an opaque color observation here.\n if (normalizedFormat.startsWith('rgba') || normalizedFormat.startsWith('bgra')) {\n const alpha = bytes.filter((_, index) => (index + 1) % 4 === 0);\n if (alpha.length > 0 && alpha.every((value) => value === 0)) return 'transparent';\n }\n return 'color';\n}\n\ntype Observation = Readonly<Record<string, string | number | boolean | readonly number[]>>;\n\nfunction observationString(observation: Observation, field: string): string | undefined {\n const value = observation[field];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction observationDimensions(observation: Observation): readonly [number, number] | undefined {\n const value = observation.dimensions;\n if (\n !Array.isArray(value) ||\n value.length !== 2 ||\n value.some((entry) => typeof entry !== 'number' || !Number.isInteger(entry) || entry <= 0)\n )\n return undefined;\n return [value[0] as number, value[1] as number];\n}\n\nfunction observationPayloadClass(\n observation: Observation,\n): TextureSubjectInspection['payloadClass'] | undefined {\n const value = observation.payloadClass;\n return isTexturePayloadClass(value) ? value : undefined;\n}\n\nexport function inspectTextureSubject(input: {\n readonly guid: string;\n readonly asset: unknown;\n readonly digest?: string;\n readonly ownerFacts?: Readonly<Record<string, string | number | boolean>>;\n}): InspectionResult {\n if (!isRecord(input.asset) || input.asset.kind !== 'texture') {\n return subjectFailure('resource-preview-kind-mismatch', 'a TextureAsset with kind texture', {\n phase: 'subject',\n guid: input.guid,\n actualKind:\n isRecord(input.asset) && typeof input.asset.kind === 'string'\n ? input.asset.kind\n : 'unknown',\n });\n }\n const asset = input.asset;\n const inlineOwner = asset.ownerFacts;\n const ownerFacts = isRecord(inlineOwner) ? inlineOwner : input.ownerFacts;\n const readString = (field: string): string | undefined =>\n requiredString(asset, field) ?? requiredString(ownerFacts ?? {}, field);\n const subjectDigest = readString('digest') ?? input.digest ?? readString('subjectDigest');\n const boundDigest = readString('boundDigest');\n const uvDigest = readString('uvDigest');\n const bindingDigest = readString('bindingDigest');\n const format = readString('format');\n const colorSpace = readString('colorSpace');\n const filter = readString('filter');\n const shape = isRecord(asset.shape) ? asset.shape : undefined;\n const extent = shape !== undefined && isRecord(shape.extent) ? shape.extent : undefined;\n const shapeDimensions =\n extent !== undefined\n ? [requiredNumber(extent, 'width'), requiredNumber(extent, 'height')]\n : undefined;\n const dimensionsValue = asset.dimensions;\n const dimensions = Array.isArray(dimensionsValue)\n ? dimensionsValue\n : shapeDimensions?.[0] !== undefined && shapeDimensions[1] !== undefined\n ? shapeDimensions\n : [requiredNumber(asset, 'width'), requiredNumber(asset, 'height')];\n const authoredMips = isRecord(asset.mips) ? asset.mips : undefined;\n const packedLevelCount =\n authoredMips?.kind === 'packed' ? requiredNumber(authoredMips, 'levelCount') : undefined;\n if (\n authoredMips?.kind === 'packed' &&\n (packedLevelCount === undefined || !Number.isInteger(packedLevelCount) || packedLevelCount <= 0)\n ) {\n return subjectFailure('resource-preview-subject-invalid', 'TextureAsset packed mip metadata', {\n phase: 'subject',\n guid: input.guid,\n field: 'mips.levelCount',\n });\n }\n const mipCount =\n authoredMipCount(asset, shapeDimensions) ??\n requiredNumber(asset, 'mipCount') ??\n requiredNumber(asset, 'mipLevelCount') ??\n requiredNumber(ownerFacts ?? {}, 'mipCount') ??\n requiredNumber(ownerFacts ?? {}, 'mipLevelCount') ??\n 1;\n const payloadClass =\n readString('payloadClass') ?? classifyPayload(asset.data, format) ?? undefined;\n if (\n subjectDigest === undefined ||\n boundDigest === undefined ||\n uvDigest === undefined ||\n bindingDigest === undefined ||\n format === undefined ||\n colorSpace === undefined ||\n filter === undefined ||\n dimensions.length !== 2 ||\n dimensions.some(\n (value) => typeof value !== 'number' || !Number.isInteger(value) || value <= 0,\n ) ||\n !Number.isInteger(mipCount) ||\n mipCount <= 0 ||\n !isTexturePayloadClass(payloadClass)\n ) {\n return subjectFailure(\n 'resource-preview-subject-invalid',\n 'TextureAsset dimensions and owner binding facts',\n {\n phase: 'subject',\n guid: input.guid,\n field: 'digest/dimensions/format/colorSpace/mipCount/uv/filter/binding',\n },\n );\n }\n const [width = 0, height = 0] = dimensions;\n return {\n ok: true,\n value: {\n subjectDigest,\n boundDigest,\n dimensions: [width, height],\n format,\n colorSpace,\n mipCount,\n uvDigest,\n filter,\n bindingDigest,\n payloadClass,\n },\n };\n}\n\nexport async function executeTexturePreview(\n args: ResourcePreviewArgs,\n input: {\n readonly assets?: PreviewAssetRegistry;\n readonly renderer?: PreviewRenderRuntime;\n readonly runId: string;\n readonly artifacts?: readonly ArtifactRef[];\n },\n) {\n if (input.assets === undefined)\n return subjectFailure(\n 'resource-preview-subject-invalid',\n 'the existing AssetRegistry capability',\n {\n phase: 'asset-registry',\n runId: input.runId,\n },\n );\n const loaded = await input.assets.loadByGuid<Record<string, unknown>>(args.guid);\n if (!loaded.ok)\n return assetLoadFailure(\n 'AssetRegistry.loadByGuid to resolve the texture',\n input.runId,\n loaded.error,\n );\n const inspected = inspectTextureSubject({\n guid: args.guid,\n asset: loaded.value,\n ...(loaded.digest === undefined ? {} : { digest: loaded.digest }),\n ...(loaded.ownerFacts === undefined ? {} : { ownerFacts: loaded.ownerFacts }),\n });\n if (!inspected.ok) return inspected;\n const renderer = input.renderer;\n const drawCalls = renderer?.texture?.drawCalls ?? renderer?.drawCalls ?? 0;\n if (\n renderer?.rendererReady !== true ||\n renderer.worldReady !== true ||\n drawCalls <= 0 ||\n renderer.observation === undefined\n ) {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'shared World and Renderer texture stage to produce an observed output',\n {\n phase: 'renderer',\n runId: input.runId,\n },\n );\n }\n const observation = renderer.observation;\n const observedPayloadClass = observationPayloadClass(observation);\n if (observedPayloadClass === undefined) {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'the rendered texture observation to classify the actual payload',\n { phase: 'renderer-observation', runId: input.runId },\n );\n }\n if (observation.rendererTextureResident !== true) {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'the Renderer to report a resident texture binding for the preview draw',\n { phase: 'renderer-texture-binding', runId: input.runId },\n );\n }\n const observed: TextureOracleInput['observed'] = {\n subjectDigest: observationString(observation, 'subjectDigest') ?? '',\n boundDigest: observationString(observation, 'boundDigest') ?? '',\n dimensions: observationDimensions(observation) ?? [0, 0],\n format: observationString(observation, 'format') ?? '',\n colorSpace: observationString(observation, 'colorSpace') ?? '',\n mipCount: typeof observation.mipCount === 'number' ? observation.mipCount : 0,\n uvDigest: observationString(observation, 'uvDigest') ?? '',\n filter: observationString(observation, 'filter') ?? '',\n bindingDigest: observationString(observation, 'bindingDigest') ?? '',\n rendererHealthy: renderer.rendererReady && renderer.worldReady,\n drawCalls,\n nonBlackPixels: renderer.nonBlackPixels,\n payloadClass: observedPayloadClass,\n };\n const oracle = evaluateTextureOracle({ requested: inspected.value, observed });\n if (oracle.status !== 'passed') {\n return subjectFailure(\n 'resource-preview-oracle-failed',\n 'the rendered texture binding observation to match the loaded owner facts',\n { phase: 'oracle', runId: input.runId, ...oracle.detail },\n );\n }\n return {\n ok: true as const,\n value: {\n subject: { kind: 'texture' as const, guid: args.guid, digest: inspected.value.subjectDigest },\n presentation: canonicalPresentation('texture'),\n recipe: createCanonicalPreviewRecipe('texture'),\n quad: { projection: 'orthographic', aspect: 'preserving', stage: 'unlit-checker' },\n binding: { filter: inspected.value.filter, digest: inspected.value.bindingDigest },\n oracle,\n artifacts: input.artifacts ?? [],\n },\n artifacts: input.artifacts ?? [],\n };\n}\n","import type {\n ArtifactRef,\n JsonValue,\n SnapshotRef,\n ToolDomainFailure,\n ToolEvidenceKind,\n ToolExecutionContext,\n ToolSubjectRef,\n} from '@forgeax/engine-tool-runtime';\nimport {\n createPreviewHost as createNativePreviewHost,\n type PreviewHost as NativePreviewHost,\n type PreviewHostMechanisms,\n} from './host/preview-host.js';\n\nexport interface PreviewHostRequest {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n}\n\nexport interface PreviewAssetBinding {\n readonly guid: string;\n readonly bytes: number;\n}\n\nexport interface PreviewFrameInput {\n readonly frame: number;\n readonly deltaSeconds: number;\n}\n\nexport interface PreviewCapture {\n readonly digest: string;\n readonly bytes: number;\n}\n\nexport interface PreviewResourceCensus {\n readonly worlds: number;\n readonly renderers: number;\n readonly canvases: number;\n readonly leases: number;\n}\n\nexport interface PreviewCleanupReport {\n readonly census: PreviewResourceCensus;\n readonly failures: readonly string[];\n}\n\n/**\n * The only resource surface exposed to a preview contribution. The adapter owns\n * the actual Engine resources; callers receive POD bindings and bounded actions.\n */\nexport interface PreviewHostSession {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n readonly loadAsset: (guid: string) => Promise<PreviewAssetBinding>;\n readonly frame: (input: PreviewFrameInput) => Promise<void>;\n readonly capture: () => Promise<PreviewCapture & { readonly artifact?: ArtifactRef }>;\n readonly census: () => PreviewResourceCensus;\n readonly dispose: () => Promise<void>;\n}\n\nexport interface PreviewHostAdapter {\n readonly open: (request: PreviewHostRequest) => PreviewHostSession | Promise<PreviewHostSession>;\n}\n\nexport interface PreviewHost {\n readonly withSession: <TResult>(\n request: PreviewHostRequest,\n run: (session: PreviewHostSession) => TResult | Promise<TResult>,\n ) => Promise<{ readonly value: TResult; readonly cleanup: PreviewCleanupReport }>;\n}\n\nexport interface PreviewDomainValue<TReport = unknown> {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n readonly report: TReport;\n readonly artifacts: readonly ArtifactRef[];\n}\n\nexport type PreviewDomainResult<TReport = unknown> =\n | { readonly ok: true; readonly value: PreviewDomainValue<TReport> }\n | { readonly ok: false; readonly error: ToolDomainFailure };\n\nexport type PreviewDomainRunner<TRequest, TReport = unknown> = (\n request: TRequest,\n context: ToolExecutionContext,\n) => Promise<PreviewDomainResult<TReport>>;\n\nexport const REQUIRED_PREVIEW_EVIDENCE: readonly ToolEvidenceKind[] = [\n 'rhi-tape',\n 'png',\n 'profile-capture',\n];\n\nexport function domainFailure(\n code: string,\n expected: string,\n hint: string,\n detail: Record<string, JsonValue>,\n): { readonly ok: false; readonly error: ToolDomainFailure } {\n return { ok: false, error: { code, expected, hint, detail } };\n}\n\n/**\n * The default contribution is deliberately fail-closed. A real Project GUID\n * loader must install a PreviewHost/Browser/Dawn runner; a data-only request\n * must never manufacture PNG, RHI, or profile references from its arguments.\n */\nexport function previewRuntimeUnavailable(\n subject: ToolSubjectRef,\n snapshot: SnapshotRef,\n domain: string,\n): { readonly ok: false; readonly error: ToolDomainFailure } {\n return domainFailure(\n 'preview-runtime-unavailable',\n 'a Project GUID cold-load and an active PreviewHost/Browser/Dawn runner',\n 'Install the Project preview provider and retry; no synthetic artifact is published.',\n {\n domain,\n subjectKind: subject.kind,\n subjectGuid: subject.guid,\n snapshotRevision: snapshot.revision,\n snapshotDigest: snapshot.digest,\n requiredEvidence: REQUIRED_PREVIEW_EVIDENCE as unknown as JsonValue,\n },\n );\n}\n\nexport function validateDomainValue<TReport>(\n value: PreviewDomainValue<TReport>,\n request: PreviewHostRequest,\n): PreviewDomainResult<TReport> {\n if (\n value.subject.kind !== request.subject.kind ||\n value.subject.guid !== request.subject.guid ||\n value.snapshot.revision !== request.snapshot.revision ||\n value.snapshot.digest !== request.snapshot.digest\n ) {\n return domainFailure(\n 'preview-subject-identity-mismatch',\n 'the terminal subject and snapshot to match the request',\n 'Repair the domain producer so evidence remains bound to the requested subject.',\n {\n requestGuid: request.subject.guid,\n resultGuid: value.subject.guid,\n requestSnapshot: request.snapshot.digest,\n resultSnapshot: value.snapshot.digest,\n },\n );\n }\n const kinds = new Set(value.artifacts.map((artifact) => artifact.kind));\n const missing = REQUIRED_PREVIEW_EVIDENCE.filter((kind) => !kinds.has(kind));\n if (missing.length > 0) {\n return domainFailure(\n 'preview-evidence-incomplete',\n 'one subject-bound artifact for each required evidence kind',\n 'Repair the RHI, PNG, and profile producers before retrying.',\n { missing: missing as unknown as JsonValue },\n );\n }\n return { ok: true, value };\n}\n\nexport class PreviewCleanupError extends Error {\n readonly code = 'preview-cleanup-live-resources';\n readonly census: PreviewResourceCensus;\n\n constructor(census: PreviewResourceCensus, failures: readonly string[] = []) {\n super(\n failures.length === 0\n ? 'preview session left live resources after disposal'\n : `preview session cleanup failed: ${failures.join('; ')}`,\n );\n this.name = 'PreviewCleanupError';\n this.census = census;\n }\n}\n\nfunction hasLiveResources(census: PreviewResourceCensus): boolean {\n return Object.values(census).some((count) => count !== 0);\n}\n\nexport function createPreviewHost(adapter: PreviewHostAdapter): PreviewHost;\nexport function createPreviewHost(input: PreviewHostMechanisms): NativePreviewHost;\nexport function createPreviewHost(\n adapterOrInput: PreviewHostAdapter | PreviewHostMechanisms,\n): PreviewHost | NativePreviewHost {\n if ('runId' in adapterOrInput) return createNativePreviewHost(adapterOrInput);\n const adapter = adapterOrInput;\n const withSession = async <TResult>(\n request: PreviewHostRequest,\n run: (session: PreviewHostSession) => TResult | Promise<TResult>,\n ): Promise<{ readonly value: TResult; readonly cleanup: PreviewCleanupReport }> => {\n const session = await adapter.open(request);\n let result: TResult;\n try {\n result = await run(session);\n } finally {\n await session.dispose();\n }\n const cleanup: PreviewCleanupReport = { census: session.census(), failures: [] };\n if (hasLiveResources(cleanup.census)) {\n throw new PreviewCleanupError(cleanup.census, cleanup.failures);\n }\n return { value: result, cleanup };\n };\n\n return {\n withSession,\n };\n}\n","import {\n defineTool,\n type SnapshotRef,\n type ToolContribution,\n type ToolPreviewContract,\n type ToolSchema,\n type ToolSubjectRef,\n} from '@forgeax/engine-tool-runtime';\nimport { nativePreviewPlugin, subjectDescriptor } from './domains/subject.js';\nimport { executeTexturePreview } from './domains/texture.js';\nimport { previewHostCapability } from './host/preview-host.js';\nimport {\n domainFailure,\n type PreviewDomainResult,\n type PreviewDomainRunner,\n previewRuntimeUnavailable,\n validateDomainValue,\n} from './host.js';\n\nexport type TextureColorSpace = 'linear' | 'srgb' | 'hdr';\n\nexport interface TextureBinding {\n readonly guid: string;\n readonly width: number;\n readonly height: number;\n readonly format: string;\n readonly colorSpace: TextureColorSpace;\n readonly alpha: boolean;\n readonly mipLevels: number;\n readonly channels: number;\n}\n\nexport interface TexturePreviewRequest {\n readonly subject: ToolSubjectRef;\n readonly snapshot: SnapshotRef;\n readonly binding: TextureBinding;\n}\n\nexport interface TexturePreviewReport {\n readonly kind: 'texture';\n readonly bindingGuid: string;\n readonly width: number;\n readonly height: number;\n readonly format: string;\n readonly colorSpace: TextureColorSpace;\n readonly alpha: boolean;\n readonly mipLevels: number;\n readonly channels: number;\n readonly aspectRatio: number;\n readonly checkerPixels: number;\n readonly subjectNonBlackPixels: number;\n}\n\nconst texturePreviewArgsSchema: ToolSchema<TexturePreviewRequest> = {\n parse(value) {\n if (value === null || typeof value !== 'object')\n return { ok: false, error: 'expected a texture preview request object' };\n const request = value as Partial<TexturePreviewRequest>;\n const binding = request.binding;\n if (request.subject?.kind !== 'TextureAsset' || typeof request.subject.guid !== 'string')\n return { ok: false, error: 'expected a TextureAsset subject' };\n if (\n request.snapshot === undefined ||\n !Number.isSafeInteger(request.snapshot.revision) ||\n typeof request.snapshot.digest !== 'string'\n )\n return { ok: false, error: 'expected a revisioned snapshot' };\n if (\n binding === undefined ||\n binding.guid !== request.subject.guid ||\n !Number.isSafeInteger(binding.width) ||\n binding.width < 1 ||\n !Number.isSafeInteger(binding.height) ||\n binding.height < 1 ||\n binding.format.length === 0 ||\n !['linear', 'srgb', 'hdr'].includes(binding.colorSpace) ||\n !Number.isSafeInteger(binding.mipLevels) ||\n binding.mipLevels < 1 ||\n !Number.isSafeInteger(binding.channels) ||\n binding.channels < 1 ||\n binding.channels > 4\n )\n return {\n ok: false,\n error: 'expected complete texture dimensions, format, and color-space facts',\n };\n return { ok: true, value: request as TexturePreviewRequest };\n },\n describe:\n '{\"type\":\"object\",\"required\":[\"subject\",\"snapshot\",\"binding\"],\"properties\":{\"subject\":{\"type\":\"object\",\"required\":[\"kind\",\"guid\"],\"properties\":{\"kind\":{\"const\":\"TextureAsset\"},\"guid\":{\"type\":\"string\"}}},\"snapshot\":{\"type\":\"object\",\"required\":[\"revision\",\"digest\"]},\"binding\":{\"type\":\"object\",\"required\":[\"guid\",\"width\",\"height\",\"format\",\"colorSpace\",\"alpha\",\"mipLevels\",\"channels\"]}}}',\n};\n\nconst texturePreviewResultSchema: ToolSchema<unknown> = {\n parse: (value) => ({ ok: true, value }),\n describe: '{\"type\":\"object\",\"required\":[\"subject\",\"snapshot\",\"report\",\"artifacts\"]}',\n};\n\nexport const texturePreviewDescriptor = {\n id: 'texture.preview',\n title: 'Preview texture asset',\n summary: 'Presents one texture on an aspect-correct quad with alpha checker evidence.',\n realm: 'engine' as const,\n argsSchema: texturePreviewArgsSchema,\n resultSchema: texturePreviewResultSchema,\n evidence: ['rhi-tape', 'png', 'profile-capture'] as const,\n preview: {\n realm: 'engine' as const,\n subject: { kind: 'TextureAsset', guid: '<request>' },\n snapshot: { revision: 0, digest: '<request>' },\n requiredEvidence: ['rhi-tape', 'png', 'profile-capture'] as const,\n } satisfies ToolPreviewContract,\n};\n\nfunction defaultTextureRunner(\n request: TexturePreviewRequest,\n): Promise<PreviewDomainResult<TexturePreviewReport>> {\n return Promise.resolve(previewRuntimeUnavailable(request.subject, request.snapshot, 'texture'));\n}\n\nexport function createTexturePreviewContribution(\n runner: PreviewDomainRunner<TexturePreviewRequest, TexturePreviewReport> = async (request) =>\n defaultTextureRunner(request),\n): ToolContribution<TexturePreviewRequest, unknown> {\n return defineTool(texturePreviewDescriptor, async (request, context) => {\n const result = await runner(request, context);\n if (!result.ok) return result;\n const report = result.value.report;\n const binding = request.binding;\n if (\n report.bindingGuid !== request.subject.guid ||\n report.width !== binding.width ||\n report.height !== binding.height ||\n report.format !== binding.format ||\n report.colorSpace !== binding.colorSpace ||\n report.alpha !== binding.alpha ||\n report.mipLevels !== binding.mipLevels ||\n report.channels !== binding.channels ||\n report.aspectRatio !== binding.width / binding.height ||\n report.checkerPixels <= 0 ||\n report.subjectNonBlackPixels <= 0\n ) {\n return domainFailure(\n 'preview-subject-falsified',\n 'the texture binding facts and aspect-correct checker presentation to agree',\n 'Reject texture replacement, color-space drift, and background-only captures.',\n {\n requestGuid: request.subject.guid,\n reportBindingGuid: report.bindingGuid,\n expectedFormat: binding.format,\n actualFormat: report.format,\n expectedColorSpace: binding.colorSpace,\n actualColorSpace: report.colorSpace,\n expectedAspectRatio: binding.width / binding.height,\n actualAspectRatio: report.aspectRatio,\n },\n );\n }\n const validated = validateDomainValue(result.value, request);\n if (!validated.ok) return validated;\n return { ok: true, value: validated.value };\n });\n}\n\nexport const texturePreview = defineTool(subjectDescriptor('texture'), (args, context) => {\n const host = context.require(previewHostCapability);\n if (!host.ok) return host;\n return host.value.withSession(async (mechanisms) =>\n executeTexturePreview(args, {\n ...(mechanisms.assets === undefined ? {} : { assets: mechanisms.assets }),\n ...(mechanisms.renderer === undefined ? {} : { renderer: mechanisms.renderer }),\n runId: mechanisms.runId,\n ...(mechanisms.artifacts === undefined ? {} : { artifacts: mechanisms.artifacts }),\n }),\n );\n});\nexport const texturePreviewPlugin = nativePreviewPlugin('texture', texturePreview);\nexport default texturePreviewPlugin;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-preview",
3
- "version": "0.1.31",
3
+ "version": "0.1.32",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -38,9 +38,9 @@
38
38
  "LICENSE"
39
39
  ],
40
40
  "dependencies": {
41
- "@forgeax/engine-plugin": "0.1.31",
42
- "@forgeax/engine-tool-runtime": "0.1.31",
43
- "@forgeax/engine-types": "0.1.31"
41
+ "@forgeax/engine-plugin": "0.1.32",
42
+ "@forgeax/engine-tool-runtime": "0.1.32",
43
+ "@forgeax/engine-types": "0.1.32"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^20.14.0",