@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
@@ -11,6 +11,26 @@ export interface MaterialCookArtifact {
11
11
  readonly digest: string;
12
12
  readonly bytes: Uint8Array;
13
13
  }
14
+ /** Domain-owned inputs used to compile and select a material program. */
15
+ export interface MaterialCookProgramContext {
16
+ readonly backend: 'webgpu' | 'webgl2' | 'wgpu-native';
17
+ readonly capability: 'storage-buffer' | 'uniform-fallback';
18
+ readonly pipeline: 'forward' | 'deferred';
19
+ readonly geometry: 'mesh' | 'skinned' | 'sprite';
20
+ readonly pass: 'forward' | 'shadow' | 'depth';
21
+ readonly profile: 'forgeax-material-wgsl-v1';
22
+ readonly toolchain: 'naga-oil';
23
+ readonly instrumentation: 'none' | 'validation';
24
+ }
25
+ /** Programs are derived artifacts, never independently authored assets. */
26
+ export interface MaterialCookProgram {
27
+ readonly specializationKey: string;
28
+ readonly artifact: MaterialCookArtifact;
29
+ readonly selections: readonly {
30
+ readonly pass: string;
31
+ readonly context: MaterialCookProgramContext;
32
+ }[];
33
+ }
14
34
  export interface MaterialCookWasmProvenance {
15
35
  readonly sourceContentKey: string;
16
36
  readonly artifactSha256: string;
@@ -34,7 +54,7 @@ export interface MaterialCookIdentity {
34
54
  }
35
55
  export type MaterialCookIdentityInput = Omit<MaterialCookIdentity, 'cookIdentity'>;
36
56
  export interface MaterialCookReceipt {
37
- readonly schemaVersion: 'material-cook/3';
57
+ readonly schemaVersion: 'material-cook/4';
38
58
  readonly sourceClosure: readonly string[];
39
59
  readonly profile: string;
40
60
  readonly compilerVersion: string;
@@ -50,12 +70,14 @@ export interface MaterialParameterContract {
50
70
  readonly values: Readonly<Record<string, MaterialValue | null>>;
51
71
  }
52
72
  export interface CookedMaterialRecord {
53
- readonly schemaVersion: 'material-cook/3';
73
+ readonly schemaVersion: 'material-cook/4';
54
74
  readonly guid: string;
55
75
  readonly authored?: MaterialAsset;
56
76
  readonly materialGuid?: string;
57
77
  readonly publicationGeneration?: number;
58
78
  readonly specializationKey?: string;
79
+ readonly programs: readonly MaterialCookProgram[];
80
+ /** Digest of the complete program/Pass/context manifest. */
59
81
  readonly artifactDigest?: string;
60
82
  readonly sourceClosure?: readonly string[];
61
83
  readonly parameterContract?: MaterialParameterContract;
@@ -65,7 +87,6 @@ export interface CookedMaterialRecord {
65
87
  readonly values: Readonly<Record<string, MaterialValue | null>>;
66
88
  };
67
89
  readonly refs: MaterialCookRefs;
68
- readonly artifact: MaterialCookArtifact;
69
90
  readonly receipt: MaterialCookReceipt;
70
91
  }
71
92
  export interface MaterialCookRecordError {
@@ -100,4 +121,9 @@ export declare function serializeMaterialCookReceipt(receipt: MaterialCookReceip
100
121
  export declare function validateMaterialCookReceipt(value: unknown, expected?: MaterialCookIdentityExpectation): Result<MaterialCookReceipt, MaterialCookRecordError>;
101
122
  export declare function validateCookedMaterialRecord(value: unknown): Result<CookedMaterialRecord, MaterialCookRecordError>;
102
123
  export declare function projectCookedMaterialRecord(record: CookedMaterialRecord): Omit<CookedMaterialRecord, 'guid' | 'authored'>;
124
+ /** Canonical context key shared by publication validation and runtime selection. */
125
+ export declare function materialProgramContextKey(context: MaterialCookProgramContext): string;
126
+ export declare function validateMaterialCookProgramContext(value: unknown): Result<MaterialCookProgramContext, MaterialCookRecordError>;
127
+ /** Covers every selection and artifact while excluding transport copies of the bytes. */
128
+ export declare function createMaterialProgramSetDigest(programs: readonly MaterialCookProgram[], passes: readonly MaterialPass[]): string;
103
129
  //# sourceMappingURL=material-cook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"material-cook.d.ts","sourceRoot":"","sources":["../../src/evidence/material-cook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"material-cook.d.ts","sourceRoot":"","sources":["../../src/evidence/material-cook.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { type CookedMaterialRecord, collectMaterialCookRefs, createMaterialArtifactDigest, createMaterialCookIdentity, isStandardMaterialRecord, isStandardRootModule, type MaterialCookArtifact, type MaterialCookIdentity, type MaterialCookIdentityExpectation, type MaterialCookIdentityInput, type MaterialCookReceipt, type MaterialCookRecordError, type MaterialCookRefs, type MaterialCookWasmProvenance, materialLayerPlanIdentity, projectCookedMaterialRecord, serializeCookedMaterialRecord, serializeMaterialCookReceipt, validateCookedMaterialRecord, validateMaterialCookReceipt, } from './evidence/material-cook.js';
1
+ export { type CookedMaterialRecord, collectMaterialCookRefs, createMaterialArtifactDigest, createMaterialCookIdentity, createMaterialProgramSetDigest, isStandardMaterialRecord, isStandardRootModule, type MaterialCookArtifact, type MaterialCookIdentity, type MaterialCookIdentityExpectation, type MaterialCookIdentityInput, type MaterialCookProgram, type MaterialCookProgramContext, type MaterialCookReceipt, type MaterialCookRecordError, type MaterialCookRefs, type MaterialCookWasmProvenance, materialLayerPlanIdentity, materialProgramContextKey, projectCookedMaterialRecord, serializeCookedMaterialRecord, serializeMaterialCookReceipt, validateCookedMaterialRecord, validateMaterialCookProgramContext, validateMaterialCookReceipt, } from './evidence/material-cook.js';
2
2
  export { buildOfflineAssetEvidence, packageVerification } from './evidence/offline-evidence.js';
3
3
  export { AssetGuid, isValidAssetGuidString, isValidPackSourceKey, PACK_SOURCE_KEY_RE, PackageId, } from './guid.js';
4
4
  export { decodeMeshBinHeader, MESH_BIN_DIGEST_BYTES, MESH_BIN_HEADER_V4_BYTES, MESH_BIN_PROJECTION_VERSION, MESH_BIN_VERSION, type MeshBinContractError, type MeshBinHeaderResult, type MeshBinHeaderV4, writeMeshBinHeader, } from './mesh-bin-contract.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACpC,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,yBAAyB,EACzB,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,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,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EACL,KAAK,WAAW,EAChB,yBAAyB,EACzB,oCAAoC,EACpC,2BAA2B,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,GACtC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAW,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE5F,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI1D,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,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,GAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAElF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAWvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACpC,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,EAC5B,kCAAkC,EAClC,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,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,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EACL,KAAK,WAAW,EAChB,yBAAyB,EACzB,oCAAoC,EACpC,2BAA2B,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,GACtC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAW,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE5F,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI1D,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,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,GAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAElF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAWvE"}
package/dist/index.mjs CHANGED
@@ -6918,7 +6918,7 @@ function serializeMaterialCookReceipt(receipt) {
6918
6918
  function invalid(field, actual) {
6919
6919
  return err({
6920
6920
  code: "material-cook-record-invalid",
6921
- expected: "a complete material-cook/3 record with layered identity and provenance",
6921
+ expected: "a complete material-cook/4 record with layered identity and provenance",
6922
6922
  hint: "re-cook the material and publish its record, artifact, references, and receipt together",
6923
6923
  detail: {
6924
6924
  field,
@@ -6927,6 +6927,14 @@ function invalid(field, actual) {
6927
6927
  }
6928
6928
  });
6929
6929
  }
6930
+ function normalizeArtifactBytes(value) {
6931
+ if (Array.isArray(value)) {
6932
+ return value.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255) ? Uint8Array.from(value) : void 0;
6933
+ }
6934
+ if (!ArrayBuffer.isView(value)) return void 0;
6935
+ const view = value;
6936
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength).slice();
6937
+ }
6930
6938
  var IDENTITY_FIELDS = [
6931
6939
  "materialContractDigest",
6932
6940
  "sourceRevision",
@@ -6971,7 +6979,7 @@ function validateIdentity(value) {
6971
6979
  function validateMaterialCookReceipt(value, expected = {}) {
6972
6980
  if (value === null || typeof value !== "object") return invalid("receipt");
6973
6981
  const candidate = value;
6974
- if (candidate.schemaVersion !== "material-cook/3")
6982
+ if (candidate.schemaVersion !== "material-cook/4")
6975
6983
  return invalid("receipt.schemaVersion", candidate.schemaVersion);
6976
6984
  const identityResult = validateIdentity(candidate.identity);
6977
6985
  if (!identityResult.ok) return identityResult;
@@ -7009,7 +7017,7 @@ function validateMaterialCookReceipt(value, expected = {}) {
7009
7017
  return invalid("receipt.identity.cookIdentity", identity.cookIdentity);
7010
7018
  }
7011
7019
  return ok({
7012
- schemaVersion: "material-cook/3",
7020
+ schemaVersion: "material-cook/4",
7013
7021
  sourceClosure: candidate.sourceClosure,
7014
7022
  profile: candidate.profile,
7015
7023
  compilerVersion: candidate.compilerVersion,
@@ -7023,7 +7031,7 @@ function validateMaterialCookReceipt(value, expected = {}) {
7023
7031
  function validateCookedMaterialRecord(value) {
7024
7032
  if (value === null || typeof value !== "object") return invalid("record");
7025
7033
  const candidate = value;
7026
- if (candidate.schemaVersion !== "material-cook/3")
7034
+ if (candidate.schemaVersion !== "material-cook/4")
7027
7035
  return invalid("schemaVersion", candidate.schemaVersion);
7028
7036
  if (typeof candidate.guid !== "string" || !candidate.guid) return invalid("guid");
7029
7037
  if (candidate.materialGuid !== void 0 && typeof candidate.materialGuid !== "string")
@@ -7032,6 +7040,8 @@ function validateCookedMaterialRecord(value) {
7032
7040
  return invalid("publicationGeneration", candidate.publicationGeneration);
7033
7041
  if (candidate.specializationKey !== void 0 && typeof candidate.specializationKey !== "string")
7034
7042
  return invalid("specializationKey");
7043
+ if ("artifact" in candidate || "variants" in candidate || "variantContext" in candidate)
7044
+ return invalid("programs", "legacy single-artifact publication");
7035
7045
  if (candidate.artifactDigest !== void 0 && typeof candidate.artifactDigest !== "string")
7036
7046
  return invalid("artifactDigest");
7037
7047
  if (candidate.sourceClosure !== void 0 && (!Array.isArray(candidate.sourceClosure) || candidate.sourceClosure.some((path) => typeof path !== "string")))
@@ -7048,24 +7058,72 @@ function validateCookedMaterialRecord(value) {
7048
7058
  if (candidate.resolved === null || typeof candidate.resolved !== "object")
7049
7059
  return invalid("resolved");
7050
7060
  if (candidate.refs === null || typeof candidate.refs !== "object") return invalid("refs");
7051
- if (candidate.artifact === null || typeof candidate.artifact !== "object")
7052
- return invalid("artifact");
7053
7061
  if (candidate.receipt === null || typeof candidate.receipt !== "object")
7054
7062
  return invalid("receipt");
7055
- const artifact = candidate.artifact;
7056
- if (typeof artifact.digest !== "string" || !Array.isArray(artifact.bytes) && !ArrayBuffer.isView(artifact.bytes)) {
7057
- return invalid("artifact");
7058
- }
7059
- const receiptResult = validateMaterialCookReceipt(candidate.receipt, {
7060
- artifactDigest: artifact.digest
7061
- });
7062
- if (!receiptResult.ok) return receiptResult;
7063
7063
  const resolved = candidate.resolved;
7064
7064
  if (!Array.isArray(resolved.passes)) return invalid("resolved.passes", resolved.passes);
7065
7065
  if (!Array.isArray(resolved.parameters))
7066
7066
  return invalid("resolved.parameters", resolved.parameters);
7067
7067
  if (resolved.values === null || typeof resolved.values !== "object" || Array.isArray(resolved.values))
7068
7068
  return invalid("resolved.values", resolved.values);
7069
+ const passes = resolved.passes;
7070
+ const passNames = /* @__PURE__ */ new Set();
7071
+ for (const [index, pass] of passes.entries()) {
7072
+ 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")
7073
+ return invalid(`resolved.passes[${index}]`);
7074
+ passNames.add(pass.name);
7075
+ }
7076
+ if (!Array.isArray(candidate.programs) || candidate.programs.length === 0)
7077
+ return invalid("programs");
7078
+ const programs = [];
7079
+ const programKeys = /* @__PURE__ */ new Set();
7080
+ const selections = /* @__PURE__ */ new Set();
7081
+ const selectedPasses = /* @__PURE__ */ new Set();
7082
+ for (const [index, entry] of candidate.programs.entries()) {
7083
+ const field = `programs[${index}]`;
7084
+ if (entry === null || typeof entry !== "object") return invalid(field);
7085
+ const program = entry;
7086
+ if (typeof program.specializationKey !== "string" || !program.specializationKey || programKeys.has(program.specializationKey))
7087
+ return invalid(`${field}.specializationKey`);
7088
+ programKeys.add(program.specializationKey);
7089
+ if (program.artifact === null || typeof program.artifact !== "object")
7090
+ return invalid(`${field}.artifact`);
7091
+ const artifact = program.artifact;
7092
+ const bytes = normalizeArtifactBytes(artifact.bytes);
7093
+ if (artifact.mediaType !== "text/wgsl" || typeof artifact.path !== "string" || !artifact.path || typeof artifact.digest !== "string" || !artifact.digest || bytes === void 0)
7094
+ return invalid(`${field}.artifact`);
7095
+ if (!Array.isArray(program.selections) || program.selections.length === 0)
7096
+ return invalid(`${field}.selections`);
7097
+ const programSelections = [];
7098
+ for (const [selectionIndex, selection] of program.selections.entries()) {
7099
+ const selectionField = `${field}.selections[${selectionIndex}]`;
7100
+ if (selection === null || typeof selection !== "object" || !passNames.has(selection.pass))
7101
+ return invalid(selectionField);
7102
+ const context = validateMaterialCookProgramContext(selection.context);
7103
+ if (!context.ok)
7104
+ return invalid(
7105
+ `${selectionField}.${context.error.detail.field}`,
7106
+ context.error.detail.actual
7107
+ );
7108
+ const key = JSON.stringify([selection.pass, materialProgramContextKey(context.value)]);
7109
+ if (selections.has(key)) return invalid(selectionField, "ambiguous Pass/context selection");
7110
+ selections.add(key);
7111
+ selectedPasses.add(selection.pass);
7112
+ programSelections.push({ pass: selection.pass, context: context.value });
7113
+ }
7114
+ programs.push({
7115
+ specializationKey: program.specializationKey,
7116
+ artifact: { mediaType: "text/wgsl", path: artifact.path, digest: artifact.digest, bytes },
7117
+ selections: programSelections
7118
+ });
7119
+ }
7120
+ if ([...passNames].some((pass) => !selectedPasses.has(pass)))
7121
+ return invalid("programs.selections", "unpublished Pass");
7122
+ const manifestDigest = createMaterialProgramSetDigest(programs, passes);
7123
+ const receiptResult = validateMaterialCookReceipt(candidate.receipt, {
7124
+ artifactDigest: manifestDigest
7125
+ });
7126
+ if (!receiptResult.ok) return receiptResult;
7069
7127
  let expectedLayerPlanIdentity;
7070
7128
  try {
7071
7129
  expectedLayerPlanIdentity = materialLayerPlanIdentity({
@@ -7080,29 +7138,70 @@ function validateCookedMaterialRecord(value) {
7080
7138
  receiptResult.value.derivedInterface.layerPlanIdentity
7081
7139
  );
7082
7140
  }
7083
- if (candidate.artifactDigest !== void 0 && candidate.artifactDigest !== artifact.digest)
7141
+ if (candidate.artifactDigest !== void 0 && candidate.artifactDigest !== manifestDigest)
7084
7142
  return invalid("artifactDigest", candidate.artifactDigest);
7085
7143
  if (candidate.publicationGeneration !== void 0 && receiptResult.value.identity.cookGeneration !== candidate.publicationGeneration)
7086
7144
  return invalid("receipt.identity.cookGeneration", receiptResult.value.identity.cookGeneration);
7087
- const normalized = {
7145
+ return ok({
7088
7146
  ...candidate,
7089
- artifact: {
7090
- ...artifact,
7091
- bytes: ArrayBuffer.isView(artifact.bytes) ? Uint8Array.from(artifact.bytes) : Uint8Array.from(artifact.bytes)
7092
- },
7147
+ programs,
7093
7148
  receipt: receiptResult.value
7094
- };
7095
- return ok(normalized);
7149
+ });
7096
7150
  }
7097
7151
  function projectCookedMaterialRecord(record) {
7098
7152
  return {
7099
7153
  resolved: record.resolved,
7100
7154
  refs: record.refs,
7101
- artifact: record.artifact,
7155
+ programs: record.programs,
7102
7156
  receipt: record.receipt,
7103
7157
  schemaVersion: record.schemaVersion
7104
7158
  };
7105
7159
  }
7160
+ function materialProgramContextKey(context) {
7161
+ return JSON.stringify(jsonValue(context));
7162
+ }
7163
+ function validateMaterialCookProgramContext(value) {
7164
+ if (value === null || typeof value !== "object" || Array.isArray(value))
7165
+ return invalid("context", value);
7166
+ const context = value;
7167
+ const fields = {
7168
+ backend: ["webgpu", "webgl2", "wgpu-native"],
7169
+ capability: ["storage-buffer", "uniform-fallback"],
7170
+ pipeline: ["forward", "deferred"],
7171
+ geometry: ["mesh", "skinned", "sprite"],
7172
+ pass: ["forward", "shadow", "depth"],
7173
+ profile: ["forgeax-material-wgsl-v1"],
7174
+ toolchain: ["naga-oil"],
7175
+ instrumentation: ["none", "validation"]
7176
+ };
7177
+ for (const field of Object.keys(context)) {
7178
+ if (!(field in fields)) return invalid(`context.${field}`, context[field]);
7179
+ }
7180
+ for (const [field, allowed] of Object.entries(fields)) {
7181
+ if (!allowed.includes(context[field]))
7182
+ return invalid(`context.${field}`, context[field]);
7183
+ }
7184
+ return ok({ ...context });
7185
+ }
7186
+ function createMaterialProgramSetDigest(programs, passes) {
7187
+ const manifest = {
7188
+ passes,
7189
+ programs: programs.map((program) => ({
7190
+ specializationKey: program.specializationKey,
7191
+ artifact: {
7192
+ path: program.artifact.path,
7193
+ mediaType: program.artifact.mediaType,
7194
+ digest: program.artifact.digest
7195
+ },
7196
+ selections: [...program.selections].sort(
7197
+ (a, b) => JSON.stringify(jsonValue(a)).localeCompare(JSON.stringify(jsonValue(b)))
7198
+ )
7199
+ })).sort((a, b) => a.specializationKey.localeCompare(b.specializationKey))
7200
+ };
7201
+ return createMaterialArtifactDigest(
7202
+ new TextEncoder().encode(JSON.stringify(jsonValue(manifest)))
7203
+ );
7204
+ }
7106
7205
  function packageEvidence(input) {
7107
7206
  return {
7108
7207
  guid: input.guid,
@@ -9344,6 +9443,6 @@ function parsePackV2(value) {
9344
9443
  return ok(value);
9345
9444
  }
9346
9445
 
9347
- export { AssetGuid, MESH_BIN_DIGEST_BYTES, MESH_BIN_HEADER_V4_BYTES, MESH_BIN_PROJECTION_VERSION, MESH_BIN_VERSION, PACK_AUTHORING_OPERATION_DESCRIPTORS, PACK_AUTHORING_OPERATION_IDS, PACK_PARAMETER_TYPES, PACK_SOURCE_KEY_RE, PackageId, SCRIPTABLE_PACK_ASSET_KINDS, buildOfflineAssetEvidence, calculateTopologyDiff, collectMaterialCookRefs, createMaterialArtifactDigest, createMaterialCookIdentity, createPackAuthoringGateway, decodeMeshBinHeader, definePack, definePackageId, diffTopology, hasPackParameters, isScriptablePackAssetKind, isStandardMaterialRecord, isStandardRootModule, isValidAssetGuidString, isValidPackSourceKey, materialLayerPlanIdentity, packageVerification, parsePackSourceJson, parsePackV2, projectCookedMaterialRecord, projectDirectPackJson, projectRuntimePack, projectScriptablePackMeta, projectScriptablePackSceneComponents, resolvePackInheritance, resolvePackParameterInheritance, resolvePackParameterValues, serializeCookedMaterialRecord, serializeMaterialCookReceipt, validateArtifactPath, validateCookedMaterialRecord, validateMaterialCookReceipt, validateMeta, validatePack, validatePackDefinition, validatePackV2, validateProducerContract, validateProducerOutputs, writeMaterialArtifact, writeMeshBinHeader };
9446
+ export { AssetGuid, MESH_BIN_DIGEST_BYTES, MESH_BIN_HEADER_V4_BYTES, MESH_BIN_PROJECTION_VERSION, MESH_BIN_VERSION, PACK_AUTHORING_OPERATION_DESCRIPTORS, PACK_AUTHORING_OPERATION_IDS, PACK_PARAMETER_TYPES, PACK_SOURCE_KEY_RE, PackageId, SCRIPTABLE_PACK_ASSET_KINDS, buildOfflineAssetEvidence, calculateTopologyDiff, collectMaterialCookRefs, createMaterialArtifactDigest, createMaterialCookIdentity, createMaterialProgramSetDigest, createPackAuthoringGateway, decodeMeshBinHeader, definePack, definePackageId, diffTopology, hasPackParameters, isScriptablePackAssetKind, isStandardMaterialRecord, isStandardRootModule, isValidAssetGuidString, isValidPackSourceKey, materialLayerPlanIdentity, materialProgramContextKey, packageVerification, parsePackSourceJson, parsePackV2, projectCookedMaterialRecord, projectDirectPackJson, projectRuntimePack, projectScriptablePackMeta, projectScriptablePackSceneComponents, resolvePackInheritance, resolvePackParameterInheritance, resolvePackParameterValues, serializeCookedMaterialRecord, serializeMaterialCookReceipt, validateArtifactPath, validateCookedMaterialRecord, validateMaterialCookProgramContext, validateMaterialCookReceipt, validateMeta, validatePack, validatePackDefinition, validatePackV2, validateProducerContract, validateProducerOutputs, writeMaterialArtifact, writeMeshBinHeader };
9348
9447
  //# sourceMappingURL=index.mjs.map
9349
9448
  //# sourceMappingURL=index.mjs.map