@forgeax/engine-pack 0.1.24 → 0.1.26

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.
Files changed (122) hide show
  1. package/README.md +1 -1
  2. package/dist/build.d.ts +1 -1
  3. package/dist/build.d.ts.map +1 -1
  4. package/dist/build.mjs +129 -26
  5. package/dist/build.mjs.map +1 -1
  6. package/dist/cli-asset.mjs.map +1 -1
  7. package/dist/evidence/material-cook.d.ts +29 -3
  8. package/dist/evidence/material-cook.d.ts.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.mjs +123 -24
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/material-cook.d.ts +1 -1
  14. package/dist/material-cook.d.ts.map +1 -1
  15. package/dist/material-cook.mjs +123 -24
  16. package/dist/material-cook.mjs.map +1 -1
  17. package/dist/pack-authoring-node.mjs.map +1 -1
  18. package/dist/scanner.d.ts +3 -1
  19. package/dist/scanner.d.ts.map +1 -1
  20. package/dist/scanner.mjs +7 -3
  21. package/dist/scanner.mjs.map +1 -1
  22. package/package.json +2 -2
  23. package/src/__tests__/material-cook-receipt.unit.test.ts +9 -9
  24. package/src/__tests__/material-cook-schema.unit.test.ts +172 -21
  25. package/src/__tests__/material-declaration-boundary.unit.test.ts +35 -0
  26. package/src/__tests__/material-surface-consumer-census.test.ts +24 -0
  27. package/src/__tests__/material-surface-publication.unit.test.ts +162 -0
  28. package/src/__tests__/material-surface-wire.unit.test.ts +30 -0
  29. package/src/build.ts +2 -0
  30. package/src/evidence/material-cook.ts +183 -31
  31. package/src/index.ts +5 -0
  32. package/src/material-cook.ts +5 -0
  33. package/src/scanner.ts +7 -3
  34. package/src/schema/material-cook.schema.json +254 -50
  35. package/dist/__tests__/ai-recovery.unit.test.d.ts +0 -2
  36. package/dist/__tests__/ai-recovery.unit.test.d.ts.map +0 -1
  37. package/dist/__tests__/artifact-path.test.d.ts +0 -2
  38. package/dist/__tests__/artifact-path.test.d.ts.map +0 -1
  39. package/dist/__tests__/asset-evidence-error-hints.test.d.ts +0 -2
  40. package/dist/__tests__/asset-evidence-error-hints.test.d.ts.map +0 -1
  41. package/dist/__tests__/asset-evidence-lifecycle.test.d.ts +0 -2
  42. package/dist/__tests__/asset-evidence-lifecycle.test.d.ts.map +0 -1
  43. package/dist/__tests__/asset-evidence-schema.test.d.ts +0 -2
  44. package/dist/__tests__/asset-evidence-schema.test.d.ts.map +0 -1
  45. package/dist/__tests__/atlas-cli-region-mismatch.test.d.ts +0 -2
  46. package/dist/__tests__/atlas-cli-region-mismatch.test.d.ts.map +0 -1
  47. package/dist/__tests__/atlas-error-code-owner.test-d.d.ts +0 -2
  48. package/dist/__tests__/atlas-error-code-owner.test-d.d.ts.map +0 -1
  49. package/dist/__tests__/cli-asset-evidence.integration.test.d.ts +0 -2
  50. package/dist/__tests__/cli-asset-evidence.integration.test.d.ts.map +0 -1
  51. package/dist/__tests__/cli.unit.test.d.ts +0 -2
  52. package/dist/__tests__/cli.unit.test.d.ts.map +0 -1
  53. package/dist/__tests__/evidence-source-inventory.unit.test.d.ts +0 -2
  54. package/dist/__tests__/evidence-source-inventory.unit.test.d.ts.map +0 -1
  55. package/dist/__tests__/guid-collision.unit.test.d.ts +0 -2
  56. package/dist/__tests__/guid-collision.unit.test.d.ts.map +0 -1
  57. package/dist/__tests__/guid-validator-surface.unit.test.d.ts +0 -2
  58. package/dist/__tests__/guid-validator-surface.unit.test.d.ts.map +0 -1
  59. package/dist/__tests__/inventory-schema.test.d.ts +0 -2
  60. package/dist/__tests__/inventory-schema.test.d.ts.map +0 -1
  61. package/dist/__tests__/material-cook-dependencies.unit.test.d.ts +0 -2
  62. package/dist/__tests__/material-cook-dependencies.unit.test.d.ts.map +0 -1
  63. package/dist/__tests__/material-cook-receipt-layer-plan.unit.test.d.ts +0 -2
  64. package/dist/__tests__/material-cook-receipt-layer-plan.unit.test.d.ts.map +0 -1
  65. package/dist/__tests__/material-cook-receipt.unit.test.d.ts +0 -2
  66. package/dist/__tests__/material-cook-receipt.unit.test.d.ts.map +0 -1
  67. package/dist/__tests__/material-cook-schema.unit.test.d.ts +0 -2
  68. package/dist/__tests__/material-cook-schema.unit.test.d.ts.map +0 -1
  69. package/dist/__tests__/mesh-bin-consumer-surface.unit.test.d.ts +0 -2
  70. package/dist/__tests__/mesh-bin-consumer-surface.unit.test.d.ts.map +0 -1
  71. package/dist/__tests__/mesh-bin-contract.unit.test.d.ts +0 -2
  72. package/dist/__tests__/mesh-bin-contract.unit.test.d.ts.map +0 -1
  73. package/dist/__tests__/meta-schema-optional.test.d.ts +0 -2
  74. package/dist/__tests__/meta-schema-optional.test.d.ts.map +0 -1
  75. package/dist/__tests__/meta-source-overrides.unit.test.d.ts +0 -2
  76. package/dist/__tests__/meta-source-overrides.unit.test.d.ts.map +0 -1
  77. package/dist/__tests__/native-cooker-registry.test.d.ts +0 -2
  78. package/dist/__tests__/native-cooker-registry.test.d.ts.map +0 -1
  79. package/dist/__tests__/offline-evidence-artifact-verification-owner.test-d.d.ts +0 -2
  80. package/dist/__tests__/offline-evidence-artifact-verification-owner.test-d.d.ts.map +0 -1
  81. package/dist/__tests__/offline-evidence.integration.test.d.ts +0 -2
  82. package/dist/__tests__/offline-evidence.integration.test.d.ts.map +0 -1
  83. package/dist/__tests__/owner-chain.integration.test.d.ts +0 -2
  84. package/dist/__tests__/owner-chain.integration.test.d.ts.map +0 -1
  85. package/dist/__tests__/pack-authoring-gateway.unit.test.d.ts +0 -2
  86. package/dist/__tests__/pack-authoring-gateway.unit.test.d.ts.map +0 -1
  87. package/dist/__tests__/pack-authoring.unit.test.d.ts +0 -2
  88. package/dist/__tests__/pack-authoring.unit.test.d.ts.map +0 -1
  89. package/dist/__tests__/pack-scanner.unit.test.d.ts +0 -2
  90. package/dist/__tests__/pack-scanner.unit.test.d.ts.map +0 -1
  91. package/dist/__tests__/pack-v2-fixture-migration.test.d.ts +0 -2
  92. package/dist/__tests__/pack-v2-fixture-migration.test.d.ts.map +0 -1
  93. package/dist/__tests__/pack-v2-schema.test.d.ts +0 -2
  94. package/dist/__tests__/pack-v2-schema.test.d.ts.map +0 -1
  95. package/dist/__tests__/pack.unit.test.d.ts +0 -2
  96. package/dist/__tests__/pack.unit.test.d.ts.map +0 -1
  97. package/dist/__tests__/package-finalizer.contract.test.d.ts +0 -2
  98. package/dist/__tests__/package-finalizer.contract.test.d.ts.map +0 -1
  99. package/dist/__tests__/producer-contract-schema.unit.test.d.ts +0 -2
  100. package/dist/__tests__/producer-contract-schema.unit.test.d.ts.map +0 -1
  101. package/dist/__tests__/resolve-asset-source.test.d.ts +0 -2
  102. package/dist/__tests__/resolve-asset-source.test.d.ts.map +0 -1
  103. package/dist/__tests__/runtime-projection.unit.test.d.ts +0 -2
  104. package/dist/__tests__/runtime-projection.unit.test.d.ts.map +0 -1
  105. package/dist/__tests__/runtime.browser.test.d.ts +0 -2
  106. package/dist/__tests__/runtime.browser.test.d.ts.map +0 -1
  107. package/dist/__tests__/scanner-blacklist.test.d.ts +0 -2
  108. package/dist/__tests__/scanner-blacklist.test.d.ts.map +0 -1
  109. package/dist/__tests__/scanner-inventory.contract.test.d.ts +0 -2
  110. package/dist/__tests__/scanner-inventory.contract.test.d.ts.map +0 -1
  111. package/dist/__tests__/scanner-inventory.test.d.ts +0 -2
  112. package/dist/__tests__/scanner-inventory.test.d.ts.map +0 -1
  113. package/dist/__tests__/scanner-mount-cycle.test.d.ts +0 -2
  114. package/dist/__tests__/scanner-mount-cycle.test.d.ts.map +0 -1
  115. package/dist/__tests__/scriptable-pack-cli.integration.test.d.ts +0 -2
  116. package/dist/__tests__/scriptable-pack-cli.integration.test.d.ts.map +0 -1
  117. package/dist/__tests__/scriptable-pack-ddc-key.unit.test.d.ts +0 -2
  118. package/dist/__tests__/scriptable-pack-ddc-key.unit.test.d.ts.map +0 -1
  119. package/dist/__tests__/topology-actions.unit.test.d.ts +0 -2
  120. package/dist/__tests__/topology-actions.unit.test.d.ts.map +0 -1
  121. package/dist/__tests__/topology.unit.test.d.ts +0 -2
  122. package/dist/__tests__/topology.unit.test.d.ts.map +0 -1
package/README.md CHANGED
@@ -426,7 +426,7 @@ When `kind: 'material'`, the `payload` object carries `passes[]` + `values` (fea
426
426
  | `values` | `Record<string, unknown>` | Child-owned values, including per-slot texture coordinates. |
427
427
  | `parent` | `AssetGuid` | Optional serialized parent edge. |
428
428
 
429
- **Validation** is performed by the material schema and build-time cook. The cook resolves the parent chain, validates values and pass programs, and emits a `material-cook/3` record, artifact, references, and receipt. The receipt keeps material, source, layout, program, pipeline, publication, and cook identities together with compiler/WASM provenance and generation counters. Runtime reports a structured missing-cook error instead of compiling a material; stale generations are recooked by the producer.
429
+ **Validation** is performed by the material schema and build-time cook. The cook resolves the parent chain, validates values and pass programs, and emits a `material-cook/4` record, artifact, references, and receipt. The receipt keeps material, source, layout, program, pipeline, publication, and cook identities together with compiler/WASM provenance and generation counters. Runtime reports a structured missing-cook error instead of compiling a material; stale generations are recooked by the producer.
430
430
 
431
431
  ## `AssetGuid` API
432
432
 
package/dist/build.d.ts CHANGED
@@ -4,7 +4,7 @@ export { validateArtifactPath } from './artifact-path.js';
4
4
  export { buildCatalogProjection, type CatalogAuthority, type CatalogBuildError, type CatalogBuildErrorCode, type CatalogBuildProjectionOptions, type CatalogBuildResult, type CatalogImporterPolicy, type CatalogProducerVisibility, catalogSourcePathFor, metaPathForGuid, } from './catalog-builder.js';
5
5
  export { calculateCatalogDelta } from './catalog-delta.js';
6
6
  export { type CatalogOutputDeclaration, type CatalogProducerMeta, type CookedPackageProjection, catalogProjectionFor, currentProjectionFor, findReservedAssetKindConflict, type PackageCatalogInput, projectCookedPackageEntry, projectExternalCatalogEntries, projectPackageCatalog, projectRuntimeCatalogRow, type RuntimeCatalogRowInput, } from './catalog-projection.js';
7
- export { type CookedMaterialRecord, collectMaterialCookRefs, createMaterialArtifactDigest, type MaterialCookArtifact, type MaterialCookIdentityExpectation, type MaterialCookReceipt, type MaterialCookRecordError, type MaterialCookRefs, projectCookedMaterialRecord, serializeCookedMaterialRecord, serializeMaterialCookReceipt, validateCookedMaterialRecord, validateMaterialCookReceipt, } from './evidence/material-cook.js';
7
+ export { type CookedMaterialRecord, collectMaterialCookRefs, createMaterialArtifactDigest, type MaterialCookArtifact, type MaterialCookIdentityExpectation, type MaterialCookProgram, type MaterialCookProgramContext, type MaterialCookReceipt, type MaterialCookRecordError, type MaterialCookRefs, projectCookedMaterialRecord, serializeCookedMaterialRecord, serializeMaterialCookReceipt, validateCookedMaterialRecord, validateMaterialCookReceipt, } from './evidence/material-cook.js';
8
8
  export { buildOfflineAssetEvidence, packageVerification } from './evidence/offline-evidence.js';
9
9
  export { AssetGuid, isValidAssetGuidString, isValidPackSourceKey, PACK_SOURCE_KEY_RE, PackageId, } from './guid.js';
10
10
  export { projectAssetRefs, projectSceneEntityRefs } from './inventory/binding.js';
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,EACb,cAAc,EACd,KAAK,EACL,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,SAAS,EACT,MAAM,EACN,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,aAAa,EACb,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACpC,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAChG,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,EAC3B,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,oCAAoC,EACpC,iCAAiC,EACjC,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,uBAAuB,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EACL,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,GACjC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,qCAAqC,EACrC,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,WAAW,EAChB,yBAAyB,EACzB,oCAAoC,EACpC,2BAA2B,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,gCAAgC,GACtC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
package/dist/build.mjs CHANGED
@@ -9245,9 +9245,13 @@ function packErr(error) {
9245
9245
  function record(value) {
9246
9246
  return value !== null && typeof value === "object" && !Array.isArray(value);
9247
9247
  }
9248
- var STANDARD_SCRIPTABLE_PACK_SCAN_OPTIONS = Object.freeze(
9249
- {}
9250
- );
9248
+ var STANDARD_SCRIPTABLE_PACK_SCAN_OPTIONS = Object.freeze({
9249
+ // Scriptable Packs execute in an isolated worker. A cold worker must
9250
+ // compile the authored source closure before it can return metadata;
9251
+ // heavy procedural packs otherwise make the shared catalog fall back to
9252
+ // an empty degraded projection at the old 15-second budget.
9253
+ timeoutMs: 6e4
9254
+ });
9251
9255
  var BLACKLIST = /* @__PURE__ */ new Set([
9252
9256
  "node_modules",
9253
9257
  "__tests__",
@@ -10374,7 +10378,7 @@ function serializeMaterialCookReceipt(receipt) {
10374
10378
  function invalid(field, actual) {
10375
10379
  return err({
10376
10380
  code: "material-cook-record-invalid",
10377
- expected: "a complete material-cook/3 record with layered identity and provenance",
10381
+ expected: "a complete material-cook/4 record with layered identity and provenance",
10378
10382
  hint: "re-cook the material and publish its record, artifact, references, and receipt together",
10379
10383
  detail: {
10380
10384
  field,
@@ -10383,6 +10387,14 @@ function invalid(field, actual) {
10383
10387
  }
10384
10388
  });
10385
10389
  }
10390
+ function normalizeArtifactBytes(value) {
10391
+ if (Array.isArray(value)) {
10392
+ return value.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255) ? Uint8Array.from(value) : void 0;
10393
+ }
10394
+ if (!ArrayBuffer.isView(value)) return void 0;
10395
+ const view = value;
10396
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength).slice();
10397
+ }
10386
10398
  var IDENTITY_FIELDS = [
10387
10399
  "materialContractDigest",
10388
10400
  "sourceRevision",
@@ -10427,7 +10439,7 @@ function validateIdentity(value) {
10427
10439
  function validateMaterialCookReceipt(value, expected = {}) {
10428
10440
  if (value === null || typeof value !== "object") return invalid("receipt");
10429
10441
  const candidate = value;
10430
- if (candidate.schemaVersion !== "material-cook/3")
10442
+ if (candidate.schemaVersion !== "material-cook/4")
10431
10443
  return invalid("receipt.schemaVersion", candidate.schemaVersion);
10432
10444
  const identityResult = validateIdentity(candidate.identity);
10433
10445
  if (!identityResult.ok) return identityResult;
@@ -10465,7 +10477,7 @@ function validateMaterialCookReceipt(value, expected = {}) {
10465
10477
  return invalid("receipt.identity.cookIdentity", identity.cookIdentity);
10466
10478
  }
10467
10479
  return ok({
10468
- schemaVersion: "material-cook/3",
10480
+ schemaVersion: "material-cook/4",
10469
10481
  sourceClosure: candidate.sourceClosure,
10470
10482
  profile: candidate.profile,
10471
10483
  compilerVersion: candidate.compilerVersion,
@@ -10479,7 +10491,7 @@ function validateMaterialCookReceipt(value, expected = {}) {
10479
10491
  function validateCookedMaterialRecord(value) {
10480
10492
  if (value === null || typeof value !== "object") return invalid("record");
10481
10493
  const candidate = value;
10482
- if (candidate.schemaVersion !== "material-cook/3")
10494
+ if (candidate.schemaVersion !== "material-cook/4")
10483
10495
  return invalid("schemaVersion", candidate.schemaVersion);
10484
10496
  if (typeof candidate.guid !== "string" || !candidate.guid) return invalid("guid");
10485
10497
  if (candidate.materialGuid !== void 0 && typeof candidate.materialGuid !== "string")
@@ -10488,6 +10500,8 @@ function validateCookedMaterialRecord(value) {
10488
10500
  return invalid("publicationGeneration", candidate.publicationGeneration);
10489
10501
  if (candidate.specializationKey !== void 0 && typeof candidate.specializationKey !== "string")
10490
10502
  return invalid("specializationKey");
10503
+ if ("artifact" in candidate || "variants" in candidate || "variantContext" in candidate)
10504
+ return invalid("programs", "legacy single-artifact publication");
10491
10505
  if (candidate.artifactDigest !== void 0 && typeof candidate.artifactDigest !== "string")
10492
10506
  return invalid("artifactDigest");
10493
10507
  if (candidate.sourceClosure !== void 0 && (!Array.isArray(candidate.sourceClosure) || candidate.sourceClosure.some((path) => typeof path !== "string")))
@@ -10504,24 +10518,72 @@ function validateCookedMaterialRecord(value) {
10504
10518
  if (candidate.resolved === null || typeof candidate.resolved !== "object")
10505
10519
  return invalid("resolved");
10506
10520
  if (candidate.refs === null || typeof candidate.refs !== "object") return invalid("refs");
10507
- if (candidate.artifact === null || typeof candidate.artifact !== "object")
10508
- return invalid("artifact");
10509
10521
  if (candidate.receipt === null || typeof candidate.receipt !== "object")
10510
10522
  return invalid("receipt");
10511
- const artifact = candidate.artifact;
10512
- if (typeof artifact.digest !== "string" || !Array.isArray(artifact.bytes) && !ArrayBuffer.isView(artifact.bytes)) {
10513
- return invalid("artifact");
10514
- }
10515
- const receiptResult = validateMaterialCookReceipt(candidate.receipt, {
10516
- artifactDigest: artifact.digest
10517
- });
10518
- if (!receiptResult.ok) return receiptResult;
10519
10523
  const resolved = candidate.resolved;
10520
10524
  if (!Array.isArray(resolved.passes)) return invalid("resolved.passes", resolved.passes);
10521
10525
  if (!Array.isArray(resolved.parameters))
10522
10526
  return invalid("resolved.parameters", resolved.parameters);
10523
10527
  if (resolved.values === null || typeof resolved.values !== "object" || Array.isArray(resolved.values))
10524
10528
  return invalid("resolved.values", resolved.values);
10529
+ const passes = resolved.passes;
10530
+ const passNames = /* @__PURE__ */ new Set();
10531
+ for (const [index, pass] of passes.entries()) {
10532
+ if (pass === null || typeof pass !== "object" || typeof pass.name !== "string" || !pass.name || passNames.has(pass.name) || pass.program === null || typeof pass.program !== "object" || typeof pass.program.module !== "string")
10533
+ return invalid(`resolved.passes[${index}]`);
10534
+ passNames.add(pass.name);
10535
+ }
10536
+ if (!Array.isArray(candidate.programs) || candidate.programs.length === 0)
10537
+ return invalid("programs");
10538
+ const programs = [];
10539
+ const programKeys = /* @__PURE__ */ new Set();
10540
+ const selections = /* @__PURE__ */ new Set();
10541
+ const selectedPasses = /* @__PURE__ */ new Set();
10542
+ for (const [index, entry] of candidate.programs.entries()) {
10543
+ const field = `programs[${index}]`;
10544
+ if (entry === null || typeof entry !== "object") return invalid(field);
10545
+ const program = entry;
10546
+ if (typeof program.specializationKey !== "string" || !program.specializationKey || programKeys.has(program.specializationKey))
10547
+ return invalid(`${field}.specializationKey`);
10548
+ programKeys.add(program.specializationKey);
10549
+ if (program.artifact === null || typeof program.artifact !== "object")
10550
+ return invalid(`${field}.artifact`);
10551
+ const artifact = program.artifact;
10552
+ const bytes = normalizeArtifactBytes(artifact.bytes);
10553
+ if (artifact.mediaType !== "text/wgsl" || typeof artifact.path !== "string" || !artifact.path || typeof artifact.digest !== "string" || !artifact.digest || bytes === void 0)
10554
+ return invalid(`${field}.artifact`);
10555
+ if (!Array.isArray(program.selections) || program.selections.length === 0)
10556
+ return invalid(`${field}.selections`);
10557
+ const programSelections = [];
10558
+ for (const [selectionIndex, selection] of program.selections.entries()) {
10559
+ const selectionField = `${field}.selections[${selectionIndex}]`;
10560
+ if (selection === null || typeof selection !== "object" || !passNames.has(selection.pass))
10561
+ return invalid(selectionField);
10562
+ const context = validateMaterialCookProgramContext(selection.context);
10563
+ if (!context.ok)
10564
+ return invalid(
10565
+ `${selectionField}.${context.error.detail.field}`,
10566
+ context.error.detail.actual
10567
+ );
10568
+ const key = JSON.stringify([selection.pass, materialProgramContextKey(context.value)]);
10569
+ if (selections.has(key)) return invalid(selectionField, "ambiguous Pass/context selection");
10570
+ selections.add(key);
10571
+ selectedPasses.add(selection.pass);
10572
+ programSelections.push({ pass: selection.pass, context: context.value });
10573
+ }
10574
+ programs.push({
10575
+ specializationKey: program.specializationKey,
10576
+ artifact: { mediaType: "text/wgsl", path: artifact.path, digest: artifact.digest, bytes },
10577
+ selections: programSelections
10578
+ });
10579
+ }
10580
+ if ([...passNames].some((pass) => !selectedPasses.has(pass)))
10581
+ return invalid("programs.selections", "unpublished Pass");
10582
+ const manifestDigest = createMaterialProgramSetDigest(programs, passes);
10583
+ const receiptResult = validateMaterialCookReceipt(candidate.receipt, {
10584
+ artifactDigest: manifestDigest
10585
+ });
10586
+ if (!receiptResult.ok) return receiptResult;
10525
10587
  let expectedLayerPlanIdentity;
10526
10588
  try {
10527
10589
  expectedLayerPlanIdentity = materialLayerPlanIdentity({
@@ -10536,29 +10598,70 @@ function validateCookedMaterialRecord(value) {
10536
10598
  receiptResult.value.derivedInterface.layerPlanIdentity
10537
10599
  );
10538
10600
  }
10539
- if (candidate.artifactDigest !== void 0 && candidate.artifactDigest !== artifact.digest)
10601
+ if (candidate.artifactDigest !== void 0 && candidate.artifactDigest !== manifestDigest)
10540
10602
  return invalid("artifactDigest", candidate.artifactDigest);
10541
10603
  if (candidate.publicationGeneration !== void 0 && receiptResult.value.identity.cookGeneration !== candidate.publicationGeneration)
10542
10604
  return invalid("receipt.identity.cookGeneration", receiptResult.value.identity.cookGeneration);
10543
- const normalized = {
10605
+ return ok({
10544
10606
  ...candidate,
10545
- artifact: {
10546
- ...artifact,
10547
- bytes: ArrayBuffer.isView(artifact.bytes) ? Uint8Array.from(artifact.bytes) : Uint8Array.from(artifact.bytes)
10548
- },
10607
+ programs,
10549
10608
  receipt: receiptResult.value
10550
- };
10551
- return ok(normalized);
10609
+ });
10552
10610
  }
10553
10611
  function projectCookedMaterialRecord(record2) {
10554
10612
  return {
10555
10613
  resolved: record2.resolved,
10556
10614
  refs: record2.refs,
10557
- artifact: record2.artifact,
10615
+ programs: record2.programs,
10558
10616
  receipt: record2.receipt,
10559
10617
  schemaVersion: record2.schemaVersion
10560
10618
  };
10561
10619
  }
10620
+ function materialProgramContextKey(context) {
10621
+ return JSON.stringify(jsonValue(context));
10622
+ }
10623
+ function validateMaterialCookProgramContext(value) {
10624
+ if (value === null || typeof value !== "object" || Array.isArray(value))
10625
+ return invalid("context", value);
10626
+ const context = value;
10627
+ const fields = {
10628
+ backend: ["webgpu", "webgl2", "wgpu-native"],
10629
+ capability: ["storage-buffer", "uniform-fallback"],
10630
+ pipeline: ["forward", "deferred"],
10631
+ geometry: ["mesh", "skinned", "sprite"],
10632
+ pass: ["forward", "shadow", "depth"],
10633
+ profile: ["forgeax-material-wgsl-v1"],
10634
+ toolchain: ["naga-oil"],
10635
+ instrumentation: ["none", "validation"]
10636
+ };
10637
+ for (const field of Object.keys(context)) {
10638
+ if (!(field in fields)) return invalid(`context.${field}`, context[field]);
10639
+ }
10640
+ for (const [field, allowed] of Object.entries(fields)) {
10641
+ if (!allowed.includes(context[field]))
10642
+ return invalid(`context.${field}`, context[field]);
10643
+ }
10644
+ return ok({ ...context });
10645
+ }
10646
+ function createMaterialProgramSetDigest(programs, passes) {
10647
+ const manifest = {
10648
+ passes,
10649
+ programs: programs.map((program) => ({
10650
+ specializationKey: program.specializationKey,
10651
+ artifact: {
10652
+ path: program.artifact.path,
10653
+ mediaType: program.artifact.mediaType,
10654
+ digest: program.artifact.digest
10655
+ },
10656
+ selections: [...program.selections].sort(
10657
+ (a, b) => JSON.stringify(jsonValue(a)).localeCompare(JSON.stringify(jsonValue(b)))
10658
+ )
10659
+ })).sort((a, b) => a.specializationKey.localeCompare(b.specializationKey))
10660
+ };
10661
+ return createMaterialArtifactDigest(
10662
+ new TextEncoder().encode(JSON.stringify(jsonValue(manifest)))
10663
+ );
10664
+ }
10562
10665
  function packageEvidence(input) {
10563
10666
  return {
10564
10667
  guid: input.guid,