@forgeax/engine-pack 0.1.2

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 (228) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +370 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/ai-recovery.unit.test.d.ts +2 -0
  5. package/dist/__tests__/ai-recovery.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/artifact-path.test.d.ts +2 -0
  7. package/dist/__tests__/artifact-path.test.d.ts.map +1 -0
  8. package/dist/__tests__/asset-evidence-error-hints.test.d.ts +2 -0
  9. package/dist/__tests__/asset-evidence-error-hints.test.d.ts.map +1 -0
  10. package/dist/__tests__/asset-evidence-lifecycle.test.d.ts +2 -0
  11. package/dist/__tests__/asset-evidence-lifecycle.test.d.ts.map +1 -0
  12. package/dist/__tests__/asset-evidence-schema.test.d.ts +2 -0
  13. package/dist/__tests__/asset-evidence-schema.test.d.ts.map +1 -0
  14. package/dist/__tests__/atlas-cli-region-mismatch.test.d.ts +2 -0
  15. package/dist/__tests__/atlas-cli-region-mismatch.test.d.ts.map +1 -0
  16. package/dist/__tests__/atlas-error-code-owner.test-d.d.ts +2 -0
  17. package/dist/__tests__/atlas-error-code-owner.test-d.d.ts.map +1 -0
  18. package/dist/__tests__/cli-asset-evidence.integration.test.d.ts +2 -0
  19. package/dist/__tests__/cli-asset-evidence.integration.test.d.ts.map +1 -0
  20. package/dist/__tests__/cli.unit.test.d.ts +2 -0
  21. package/dist/__tests__/cli.unit.test.d.ts.map +1 -0
  22. package/dist/__tests__/evidence-source-inventory.unit.test.d.ts +2 -0
  23. package/dist/__tests__/evidence-source-inventory.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/guid-collision.unit.test.d.ts +2 -0
  25. package/dist/__tests__/guid-collision.unit.test.d.ts.map +1 -0
  26. package/dist/__tests__/guid-validator-surface.unit.test.d.ts +2 -0
  27. package/dist/__tests__/guid-validator-surface.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/load-asset-config.test.d.ts +2 -0
  29. package/dist/__tests__/load-asset-config.test.d.ts.map +1 -0
  30. package/dist/__tests__/material-cook-dependencies.unit.test.d.ts +2 -0
  31. package/dist/__tests__/material-cook-dependencies.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/material-cook-receipt.unit.test.d.ts +2 -0
  33. package/dist/__tests__/material-cook-receipt.unit.test.d.ts.map +1 -0
  34. package/dist/__tests__/material-cook-schema.unit.test.d.ts +2 -0
  35. package/dist/__tests__/material-cook-schema.unit.test.d.ts.map +1 -0
  36. package/dist/__tests__/mesh-bin-consumer-surface.unit.test.d.ts +2 -0
  37. package/dist/__tests__/mesh-bin-consumer-surface.unit.test.d.ts.map +1 -0
  38. package/dist/__tests__/mesh-bin-contract.unit.test.d.ts +2 -0
  39. package/dist/__tests__/mesh-bin-contract.unit.test.d.ts.map +1 -0
  40. package/dist/__tests__/meta-schema-optional.test.d.ts +2 -0
  41. package/dist/__tests__/meta-schema-optional.test.d.ts.map +1 -0
  42. package/dist/__tests__/meta-source-overrides.unit.test.d.ts +2 -0
  43. package/dist/__tests__/meta-source-overrides.unit.test.d.ts.map +1 -0
  44. package/dist/__tests__/native-cooker-registry.test.d.ts +2 -0
  45. package/dist/__tests__/native-cooker-registry.test.d.ts.map +1 -0
  46. package/dist/__tests__/offline-evidence-artifact-verification-owner.test-d.d.ts +2 -0
  47. package/dist/__tests__/offline-evidence-artifact-verification-owner.test-d.d.ts.map +1 -0
  48. package/dist/__tests__/offline-evidence.integration.test.d.ts +2 -0
  49. package/dist/__tests__/offline-evidence.integration.test.d.ts.map +1 -0
  50. package/dist/__tests__/pack-v2-fixture-migration.test.d.ts +2 -0
  51. package/dist/__tests__/pack-v2-fixture-migration.test.d.ts.map +1 -0
  52. package/dist/__tests__/pack-v2-schema.test.d.ts +2 -0
  53. package/dist/__tests__/pack-v2-schema.test.d.ts.map +1 -0
  54. package/dist/__tests__/pack.unit.test.d.ts +2 -0
  55. package/dist/__tests__/pack.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/producer-contract-schema.unit.test.d.ts +2 -0
  57. package/dist/__tests__/producer-contract-schema.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/resolve-asset-source.test.d.ts +2 -0
  59. package/dist/__tests__/resolve-asset-source.test.d.ts.map +1 -0
  60. package/dist/__tests__/runtime-projection.unit.test.d.ts +2 -0
  61. package/dist/__tests__/runtime-projection.unit.test.d.ts.map +1 -0
  62. package/dist/__tests__/scanner-inventory.test.d.ts +2 -0
  63. package/dist/__tests__/scanner-inventory.test.d.ts.map +1 -0
  64. package/dist/__tests__/scanner-mount-cycle.test.d.ts +2 -0
  65. package/dist/__tests__/scanner-mount-cycle.test.d.ts.map +1 -0
  66. package/dist/__tests__/scriptable-pack-cli.integration.test.d.ts +2 -0
  67. package/dist/__tests__/scriptable-pack-cli.integration.test.d.ts.map +1 -0
  68. package/dist/__tests__/scriptable-pack-ddc-key.unit.test.d.ts +2 -0
  69. package/dist/__tests__/scriptable-pack-ddc-key.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/scriptable-pack.test-d.d.ts +2 -0
  71. package/dist/__tests__/scriptable-pack.test-d.d.ts.map +1 -0
  72. package/dist/__tests__/scriptable-pack.unit.test.d.ts +2 -0
  73. package/dist/__tests__/scriptable-pack.unit.test.d.ts.map +1 -0
  74. package/dist/__tests__/topology-actions.unit.test.d.ts +2 -0
  75. package/dist/__tests__/topology-actions.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/topology.unit.test.d.ts +2 -0
  77. package/dist/__tests__/topology.unit.test.d.ts.map +1 -0
  78. package/dist/artifact-path.d.ts +9 -0
  79. package/dist/artifact-path.d.ts.map +1 -0
  80. package/dist/atlas/run-atlas.d.ts +8 -0
  81. package/dist/atlas/run-atlas.d.ts.map +1 -0
  82. package/dist/atlas/shelf-pack.d.ts +55 -0
  83. package/dist/atlas/shelf-pack.d.ts.map +1 -0
  84. package/dist/bridge.d.ts +2 -0
  85. package/dist/bridge.d.ts.map +1 -0
  86. package/dist/bridge.mjs +3 -0
  87. package/dist/bridge.mjs.map +1 -0
  88. package/dist/builtin.d.ts +24 -0
  89. package/dist/builtin.d.ts.map +1 -0
  90. package/dist/cli-asset.d.ts +22 -0
  91. package/dist/cli-asset.d.ts.map +1 -0
  92. package/dist/cli-asset.mjs +9950 -0
  93. package/dist/cli-asset.mjs.map +1 -0
  94. package/dist/config.d.ts +6 -0
  95. package/dist/config.d.ts.map +1 -0
  96. package/dist/config.mjs +29 -0
  97. package/dist/config.mjs.map +1 -0
  98. package/dist/deriveAssetName.d.ts +15 -0
  99. package/dist/deriveAssetName.d.ts.map +1 -0
  100. package/dist/errors.d.ts +30 -0
  101. package/dist/errors.d.ts.map +1 -0
  102. package/dist/errors.mjs +19 -0
  103. package/dist/errors.mjs.map +1 -0
  104. package/dist/evidence/material-cook.d.ts +70 -0
  105. package/dist/evidence/material-cook.d.ts.map +1 -0
  106. package/dist/evidence/offline-evidence.d.ts +25 -0
  107. package/dist/evidence/offline-evidence.d.ts.map +1 -0
  108. package/dist/evidence/source-inventory.d.ts +29 -0
  109. package/dist/evidence/source-inventory.d.ts.map +1 -0
  110. package/dist/guid.d.ts +45 -0
  111. package/dist/guid.d.ts.map +1 -0
  112. package/dist/guid.mjs +94 -0
  113. package/dist/guid.mjs.map +1 -0
  114. package/dist/index.d.ts +15 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.mjs +8475 -0
  117. package/dist/index.mjs.map +1 -0
  118. package/dist/material/artifact-writer.d.ts +14 -0
  119. package/dist/material/artifact-writer.d.ts.map +1 -0
  120. package/dist/mesh-bin-contract.d.ts +36 -0
  121. package/dist/mesh-bin-contract.d.ts.map +1 -0
  122. package/dist/name.mjs +22 -0
  123. package/dist/name.mjs.map +1 -0
  124. package/dist/native-cooker-registry.d.ts +28 -0
  125. package/dist/native-cooker-registry.d.ts.map +1 -0
  126. package/dist/native-cooker.d.ts +3 -0
  127. package/dist/native-cooker.d.ts.map +1 -0
  128. package/dist/native-cooker.mjs +105 -0
  129. package/dist/native-cooker.mjs.map +1 -0
  130. package/dist/producer-contract.d.ts +19 -0
  131. package/dist/producer-contract.d.ts.map +1 -0
  132. package/dist/resolve-asset-source.d.ts +4 -0
  133. package/dist/resolve-asset-source.d.ts.map +1 -0
  134. package/dist/resolve-asset-source.mjs +99 -0
  135. package/dist/resolve-asset-source.mjs.map +1 -0
  136. package/dist/runtime-projection.d.ts +14 -0
  137. package/dist/runtime-projection.d.ts.map +1 -0
  138. package/dist/scanner.d.ts +80 -0
  139. package/dist/scanner.d.ts.map +1 -0
  140. package/dist/scanner.mjs +9015 -0
  141. package/dist/scanner.mjs.map +1 -0
  142. package/dist/schema-compiled.d.ts +12 -0
  143. package/dist/schema-compiled.d.ts.map +1 -0
  144. package/dist/schema.mjs +7369 -0
  145. package/dist/schema.mjs.map +1 -0
  146. package/dist/scriptable-pack-node.d.ts +67 -0
  147. package/dist/scriptable-pack-node.d.ts.map +1 -0
  148. package/dist/scriptable-pack-node.mjs +1590 -0
  149. package/dist/scriptable-pack-node.mjs.map +1 -0
  150. package/dist/scriptable-pack-worker.d.ts +2 -0
  151. package/dist/scriptable-pack-worker.d.ts.map +1 -0
  152. package/dist/scriptable-pack-worker.mjs +223 -0
  153. package/dist/scriptable-pack-worker.mjs.map +1 -0
  154. package/dist/scriptable-pack.d.ts +525 -0
  155. package/dist/scriptable-pack.d.ts.map +1 -0
  156. package/dist/scriptable-pack.mjs +583 -0
  157. package/dist/scriptable-pack.mjs.map +1 -0
  158. package/dist/topology.d.ts +10 -0
  159. package/dist/topology.d.ts.map +1 -0
  160. package/package.json +129 -0
  161. package/schema/meta.schema.json +173 -0
  162. package/schema/pack.schema.json +232 -0
  163. package/src/__tests__/ai-recovery.unit.test.ts +114 -0
  164. package/src/__tests__/artifact-path.test.ts +41 -0
  165. package/src/__tests__/asset-evidence-error-hints.test.ts +46 -0
  166. package/src/__tests__/asset-evidence-lifecycle.test.ts +104 -0
  167. package/src/__tests__/asset-evidence-schema.test.ts +86 -0
  168. package/src/__tests__/atlas-cli-region-mismatch.test.ts +134 -0
  169. package/src/__tests__/atlas-error-code-owner.test-d.ts +23 -0
  170. package/src/__tests__/cli-asset-evidence.integration.test.ts +172 -0
  171. package/src/__tests__/cli.unit.test.ts +448 -0
  172. package/src/__tests__/evidence-source-inventory.unit.test.ts +37 -0
  173. package/src/__tests__/guid-collision.unit.test.ts +112 -0
  174. package/src/__tests__/guid-validator-surface.unit.test.ts +20 -0
  175. package/src/__tests__/load-asset-config.test.ts +121 -0
  176. package/src/__tests__/material-cook-dependencies.unit.test.ts +45 -0
  177. package/src/__tests__/material-cook-receipt.unit.test.ts +91 -0
  178. package/src/__tests__/material-cook-schema.unit.test.ts +98 -0
  179. package/src/__tests__/mesh-bin-consumer-surface.unit.test.ts +21 -0
  180. package/src/__tests__/mesh-bin-contract.unit.test.ts +32 -0
  181. package/src/__tests__/meta-schema-optional.test.ts +116 -0
  182. package/src/__tests__/meta-source-overrides.unit.test.ts +71 -0
  183. package/src/__tests__/native-cooker-registry.test.ts +64 -0
  184. package/src/__tests__/offline-evidence-artifact-verification-owner.test-d.ts +64 -0
  185. package/src/__tests__/offline-evidence.integration.test.ts +106 -0
  186. package/src/__tests__/pack-v2-fixture-migration.test.ts +64 -0
  187. package/src/__tests__/pack-v2-schema.test.ts +142 -0
  188. package/src/__tests__/pack.unit.test.ts +2218 -0
  189. package/src/__tests__/producer-contract-schema.unit.test.ts +92 -0
  190. package/src/__tests__/resolve-asset-source.test.ts +121 -0
  191. package/src/__tests__/runtime-projection.unit.test.ts +87 -0
  192. package/src/__tests__/scanner-inventory.test.ts +72 -0
  193. package/src/__tests__/scanner-mount-cycle.test.ts +232 -0
  194. package/src/__tests__/scriptable-pack-cli.integration.test.ts +47 -0
  195. package/src/__tests__/scriptable-pack-ddc-key.unit.test.ts +63 -0
  196. package/src/__tests__/scriptable-pack.test-d.ts +131 -0
  197. package/src/__tests__/scriptable-pack.unit.test.ts +747 -0
  198. package/src/__tests__/topology-actions.unit.test.ts +94 -0
  199. package/src/__tests__/topology.unit.test.ts +85 -0
  200. package/src/artifact-path.ts +69 -0
  201. package/src/atlas/run-atlas.ts +358 -0
  202. package/src/atlas/shelf-pack.ts +176 -0
  203. package/src/atlas/upng-ambient.d.ts +13 -0
  204. package/src/bridge.ts +2 -0
  205. package/src/builtin.ts +79 -0
  206. package/src/cli-asset.ts +590 -0
  207. package/src/config.ts +36 -0
  208. package/src/deriveAssetName.ts +42 -0
  209. package/src/errors.ts +47 -0
  210. package/src/evidence/material-cook.ts +332 -0
  211. package/src/evidence/offline-evidence.ts +90 -0
  212. package/src/evidence/source-inventory.ts +193 -0
  213. package/src/guid.ts +99 -0
  214. package/src/index.ts +104 -0
  215. package/src/material/artifact-writer.ts +26 -0
  216. package/src/mesh-bin-contract.ts +150 -0
  217. package/src/native-cooker-registry.ts +163 -0
  218. package/src/native-cooker.ts +2 -0
  219. package/src/producer-contract.ts +277 -0
  220. package/src/resolve-asset-source.ts +93 -0
  221. package/src/runtime-projection.ts +100 -0
  222. package/src/scanner.ts +716 -0
  223. package/src/schema/material-cook.schema.json +79 -0
  224. package/src/schema-compiled.ts +238 -0
  225. package/src/scriptable-pack-node.ts +1390 -0
  226. package/src/scriptable-pack-worker.ts +306 -0
  227. package/src/scriptable-pack.ts +884 -0
  228. package/src/topology.ts +156 -0
@@ -0,0 +1,14 @@
1
+ export interface MaterialArtifactWriteInput {
2
+ readonly key: string;
3
+ readonly bytes: Uint8Array;
4
+ readonly mediaType?: string;
5
+ }
6
+ export interface MaterialArtifactWriteResult {
7
+ readonly key: string;
8
+ readonly bytes: Uint8Array;
9
+ readonly mediaType: string;
10
+ readonly digest: string;
11
+ }
12
+ /** Pack owns the immutable cooked material artifact tuple. */
13
+ export declare function writeMaterialArtifact(input: MaterialArtifactWriteInput): MaterialArtifactWriteResult;
14
+ //# sourceMappingURL=artifact-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-writer.d.ts","sourceRoot":"","sources":["../../src/material/artifact-writer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,2BAA2B,CAO7B"}
@@ -0,0 +1,36 @@
1
+ /** Canonical mesh binary wire facts shared by build-time and runtime owners. */
2
+ export declare const MESH_BIN_VERSION: 4;
3
+ export declare const MESH_BIN_PROJECTION_VERSION: 1;
4
+ export declare const MESH_BIN_HEADER_V4_BYTES = 80;
5
+ export declare const MESH_BIN_DIGEST_BYTES = 32;
6
+ export interface MeshBinHeaderV4 {
7
+ readonly version: 4;
8
+ readonly projectionVersion: 1;
9
+ readonly mask: number;
10
+ readonly digest: string;
11
+ readonly stride: number;
12
+ readonly vertexCount: number;
13
+ readonly vertexBytes: number;
14
+ readonly indexCount: number;
15
+ readonly indexWidth: 0 | 2 | 4;
16
+ readonly indexBytes: number;
17
+ readonly jsonBytes: number;
18
+ }
19
+ export interface MeshBinContractError {
20
+ readonly code: 'mesh-bin-header-truncated' | 'mesh-bin-version-unsupported' | 'mesh-bin-header-invalid';
21
+ readonly subject: 'mesh-bin';
22
+ readonly sourceKey: string;
23
+ readonly expected: string;
24
+ readonly actual: string;
25
+ readonly recovery: string;
26
+ }
27
+ export type MeshBinHeaderResult = {
28
+ readonly ok: true;
29
+ readonly value: MeshBinHeaderV4;
30
+ } | {
31
+ readonly ok: false;
32
+ readonly error: MeshBinContractError;
33
+ };
34
+ export declare function writeMeshBinHeader(header: MeshBinHeaderV4, out: Uint8Array): void;
35
+ export declare function decodeMeshBinHeader(bytes: Uint8Array, sourceKey?: string): MeshBinHeaderResult;
36
+ //# sourceMappingURL=mesh-bin-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-bin-contract.d.ts","sourceRoot":"","sources":["../src/mesh-bin-contract.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAC3C,eAAO,MAAM,2BAA2B,EAAG,CAAU,CAAC;AACtD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EACT,2BAA2B,GAC3B,8BAA8B,GAC9B,yBAAyB,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AA+BjE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAgBjF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,SAAS,SAA0B,GAClC,mBAAmB,CA8DrB"}
package/dist/name.mjs ADDED
@@ -0,0 +1,22 @@
1
+ // src/deriveAssetName.ts
2
+ function baseName(p) {
3
+ const trimmed = p.replace(/[/\\]+$/, "");
4
+ const idx = Math.max(trimmed.lastIndexOf("/"), trimmed.lastIndexOf("\\"));
5
+ return idx === -1 ? trimmed : trimmed.slice(idx + 1);
6
+ }
7
+ function deriveAssetName(packagePath, assetCount, storedName) {
8
+ if (packagePath === null) {
9
+ return storedName ?? "";
10
+ }
11
+ if (assetCount === 1) {
12
+ return baseName(packagePath);
13
+ }
14
+ if (storedName !== void 0) {
15
+ return storedName;
16
+ }
17
+ return baseName(packagePath);
18
+ }
19
+
20
+ export { deriveAssetName };
21
+ //# sourceMappingURL=name.mjs.map
22
+ //# sourceMappingURL=name.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deriveAssetName.ts"],"names":[],"mappings":";AAOA,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA,EAAG,OAAA,CAAQ,WAAA,CAAY,IAAI,CAAC,CAAA;AACxE,EAAA,OAAO,QAAQ,EAAA,GAAK,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AACrD;AAeO,SAAS,eAAA,CACd,WAAA,EACA,UAAA,EACA,UAAA,EACQ;AACR,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,UAAA,IAAc,EAAA;AAAA,EACvB;AACA,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,SAAS,WAAW,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAS,WAAW,CAAA;AAC7B","file":"name.mjs","sourcesContent":["/**\n * Last path segment of a `/`- or `\\`-separated path, trailing separators\n * stripped. Inlined rather than imported from `node:path` so this module stays\n * browser-safe: the dev-server pack path (`vite-plugin-pack` `/__pack/`) runs\n * `buildCatalog` -> `deriveAssetName` in client code where `node:path` is\n * externalized and `path.basename` throws.\n */\nfunction baseName(p: string): string {\n const trimmed = p.replace(/[/\\\\]+$/, '');\n const idx = Math.max(trimmed.lastIndexOf('/'), trimmed.lastIndexOf('\\\\'));\n return idx === -1 ? trimmed : trimmed.slice(idx + 1);\n}\n\n/**\n * Derive an asset's display name from package metadata.\n *\n * Pure function -- zero IO, zero side effects, browser-safe. Build-time\n * (build-catalog) and runtime (resolveName) share this single source of truth\n * for the XOR name-resolution rules (plan-strategy D-6).\n *\n * Branches:\n * 1. single-asset package (assetCount === 1) -> baseName(packagePath)\n * 2. multi-asset package + storedName -> storedName\n * 3. multi-asset package + no storedName (AC-15.1) -> baseName(packagePath)\n * 4. null packagePath + no storedName (AC-15.2) -> ''\n */\nexport function deriveAssetName(\n packagePath: string | null,\n assetCount: number,\n storedName?: string,\n): string {\n if (packagePath === null) {\n return storedName ?? '';\n }\n if (assetCount === 1) {\n return baseName(packagePath);\n }\n if (storedName !== undefined) {\n return storedName;\n }\n return baseName(packagePath);\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import type { AssetCodec, AssetStageError, CookProduct, Result } from '@forgeax/engine-types';
2
+ export interface NativeCookArtifact {
3
+ readonly mediaType: string;
4
+ readonly assetCodec?: AssetCodec;
5
+ readonly bytes: Uint8Array;
6
+ }
7
+ export interface NativeCookDraft<P = unknown> {
8
+ readonly guid: string;
9
+ readonly payload: P;
10
+ readonly refs: readonly string[];
11
+ readonly artifacts: Readonly<Record<string, NativeCookArtifact>>;
12
+ readonly inputFingerprint: string;
13
+ }
14
+ export interface NativeCooker<P = unknown, I = unknown> {
15
+ readonly key: string;
16
+ readonly discover?: (input: unknown) => I | Promise<I>;
17
+ cook(input: I): NativeCookDraft<P> | Promise<NativeCookDraft<P>>;
18
+ }
19
+ /** Injectable build-time table for native authored Pack producers. */
20
+ export declare class NativeCookerRegistry {
21
+ private readonly cookers;
22
+ register(cooker: NativeCooker): void;
23
+ get(key: string): NativeCooker | undefined;
24
+ registeredCookers(): readonly string[];
25
+ runDraft<P = unknown, I = unknown>(key: string, input: I): Promise<Result<NativeCookDraft<P>, AssetStageError>>;
26
+ run<P = unknown, I = unknown>(key: string, input: I): Promise<Result<CookProduct<P>, AssetStageError>>;
27
+ }
28
+ //# sourceMappingURL=native-cooker-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-cooker-registry.d.ts","sourceRoot":"","sources":["../src/native-cooker-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,UAAU,EACV,eAAe,EACf,WAAW,EACX,MAAM,EACP,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;CAClE;AAyCD,sEAAsE;AACtE,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAUpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI1C,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAIhC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,GACP,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAkCjD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,GACP,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;CA+BpD"}
@@ -0,0 +1,3 @@
1
+ /** Node/build-time native cooker registry. The browser-safe pack root excludes this seam. */
2
+ export * from './native-cooker-registry.js';
3
+ //# sourceMappingURL=native-cooker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-cooker.d.ts","sourceRoot":"","sources":["../src/native-cooker.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { createHash } from 'crypto';
2
+ import { ok, err } from '@forgeax/engine-types';
3
+
4
+ // src/native-cooker-registry.ts
5
+ function canonicalize(value) {
6
+ if (value instanceof Uint8Array) return Buffer.from(value).toString("base64");
7
+ if (Array.isArray(value)) return value.map(canonicalize);
8
+ if (typeof value !== "object" || value === null) return value;
9
+ return Object.fromEntries(
10
+ Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, nested]) => [key, canonicalize(nested)])
11
+ );
12
+ }
13
+ function digestDraft(draft) {
14
+ const bytes = JSON.stringify(
15
+ canonicalize({
16
+ guid: draft.guid,
17
+ payload: draft.payload,
18
+ refs: draft.refs,
19
+ artifacts: draft.artifacts
20
+ })
21
+ );
22
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
23
+ }
24
+ function failure(key, detail) {
25
+ return err({
26
+ stage: "native-cook",
27
+ code: "native-cook-failed",
28
+ expected: "a registered native cooker to produce a complete draft",
29
+ hint: "register the cooker or repair its draft, then rerun recovery",
30
+ detail,
31
+ recovery: { action: `rerun native cooker ${key}`, retryable: true }
32
+ });
33
+ }
34
+ var NativeCookerRegistry = class {
35
+ cookers = /* @__PURE__ */ new Map();
36
+ register(cooker) {
37
+ if (typeof cooker.key !== "string" || cooker.key.length === 0) {
38
+ throw new TypeError("NativeCookerRegistry.register: key must be a non-empty string");
39
+ }
40
+ if (typeof cooker.cook !== "function") {
41
+ throw new TypeError(`NativeCookerRegistry.register: cooker ${cooker.key} must expose cook`);
42
+ }
43
+ this.cookers.set(cooker.key, cooker);
44
+ }
45
+ get(key) {
46
+ return this.cookers.get(key);
47
+ }
48
+ registeredCookers() {
49
+ return [...this.cookers.keys()];
50
+ }
51
+ async runDraft(key, input) {
52
+ const cooker = this.cookers.get(key);
53
+ if (cooker === void 0) {
54
+ return failure(key, { guid: "unknown", producer: key });
55
+ }
56
+ let draft;
57
+ try {
58
+ const typedInput = cooker.discover === void 0 ? input : await cooker.discover(input);
59
+ draft = await cooker.cook(typedInput);
60
+ } catch (error) {
61
+ return failure(key, { guid: "unknown", producer: String(error) });
62
+ }
63
+ if (draft.guid.length === 0 || draft.inputFingerprint.length === 0 || !Array.isArray(draft.refs) || typeof draft.payload !== "object" || draft.payload === null || typeof draft.artifacts !== "object" || draft.artifacts === null || Object.entries(draft.artifacts).some(
64
+ ([, artifact]) => artifact === null || typeof artifact !== "object" || typeof artifact.mediaType !== "string" || artifact.mediaType.length === 0 || !(artifact.bytes instanceof Uint8Array)
65
+ )) {
66
+ return failure(key, { guid: draft.guid || "unknown", producer: key });
67
+ }
68
+ return ok(draft);
69
+ }
70
+ async run(key, input) {
71
+ const draftResult = await this.runDraft(key, input);
72
+ if (!draftResult.ok) return draftResult;
73
+ const draft = draftResult.value;
74
+ const digest = digestDraft(draft);
75
+ const artifacts = {};
76
+ for (const [path, artifact] of Object.entries(draft.artifacts)) {
77
+ artifacts[path] = {
78
+ path,
79
+ mediaType: artifact.mediaType,
80
+ ...artifact.assetCodec === void 0 ? {} : { assetCodec: artifact.assetCodec },
81
+ byteLength: artifact.bytes.byteLength
82
+ };
83
+ }
84
+ const receipt = {
85
+ guid: draft.guid,
86
+ origin: "authoredPack",
87
+ status: "succeeded",
88
+ inputFingerprint: draft.inputFingerprint,
89
+ outputDigest: digest
90
+ };
91
+ const product = {
92
+ guid: draft.guid,
93
+ payload: draft.payload,
94
+ refs: draft.refs,
95
+ artifacts,
96
+ digest,
97
+ receipt
98
+ };
99
+ return ok(product);
100
+ }
101
+ };
102
+
103
+ export { NativeCookerRegistry };
104
+ //# sourceMappingURL=native-cooker.mjs.map
105
+ //# sourceMappingURL=native-cooker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/native-cooker-registry.ts"],"names":[],"mappings":"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","file":"native-cooker.mjs","sourcesContent":["import { createHash } from 'node:crypto';\nimport type {\n ArtifactDescriptor,\n AssetCodec,\n AssetStageError,\n CookProduct,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\n\nexport interface NativeCookArtifact {\n readonly mediaType: string;\n readonly assetCodec?: AssetCodec;\n readonly bytes: Uint8Array;\n}\n\nexport interface NativeCookDraft<P = unknown> {\n readonly guid: string;\n readonly payload: P;\n readonly refs: readonly string[];\n readonly artifacts: Readonly<Record<string, NativeCookArtifact>>;\n readonly inputFingerprint: string;\n}\n\nexport interface NativeCooker<P = unknown, I = unknown> {\n readonly key: string;\n readonly discover?: (input: unknown) => I | Promise<I>;\n cook(input: I): NativeCookDraft<P> | Promise<NativeCookDraft<P>>;\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (value instanceof Uint8Array) return Buffer.from(value).toString('base64');\n if (Array.isArray(value)) return value.map(canonicalize);\n if (typeof value !== 'object' || value === null) return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, canonicalize(nested)]),\n );\n}\n\nfunction digestDraft<P>(draft: NativeCookDraft<P>): string {\n const bytes = JSON.stringify(\n canonicalize({\n guid: draft.guid,\n payload: draft.payload,\n refs: draft.refs,\n artifacts: draft.artifacts,\n }),\n );\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;\n}\n\ntype NativeCookErrorDetail = Extract<\n AssetStageError['detail'],\n { readonly guid: string; readonly producer: string }\n>;\n\nfunction failure(key: string, detail: NativeCookErrorDetail): Result<never, AssetStageError> {\n return err({\n stage: 'native-cook',\n code: 'native-cook-failed',\n expected: 'a registered native cooker to produce a complete draft',\n hint: 'register the cooker or repair its draft, then rerun recovery',\n detail,\n recovery: { action: `rerun native cooker ${key}`, retryable: true },\n });\n}\n\n/** Injectable build-time table for native authored Pack producers. */\nexport class NativeCookerRegistry {\n private readonly cookers = new Map<string, NativeCooker>();\n\n register(cooker: NativeCooker): void {\n if (typeof cooker.key !== 'string' || cooker.key.length === 0) {\n throw new TypeError('NativeCookerRegistry.register: key must be a non-empty string');\n }\n if (typeof cooker.cook !== 'function') {\n throw new TypeError(`NativeCookerRegistry.register: cooker ${cooker.key} must expose cook`);\n }\n this.cookers.set(cooker.key, cooker);\n }\n\n get(key: string): NativeCooker | undefined {\n return this.cookers.get(key);\n }\n\n registeredCookers(): readonly string[] {\n return [...this.cookers.keys()];\n }\n\n async runDraft<P = unknown, I = unknown>(\n key: string,\n input: I,\n ): Promise<Result<NativeCookDraft<P>, AssetStageError>> {\n const cooker = this.cookers.get(key) as NativeCooker<P, I> | undefined;\n if (cooker === undefined) {\n return failure(key, { guid: 'unknown', producer: key });\n }\n let draft: NativeCookDraft<P>;\n try {\n const typedInput = cooker.discover === undefined ? input : await cooker.discover(input);\n draft = await cooker.cook(typedInput);\n } catch (error) {\n return failure(key, { guid: 'unknown', producer: String(error) });\n }\n if (\n draft.guid.length === 0 ||\n draft.inputFingerprint.length === 0 ||\n !Array.isArray(draft.refs) ||\n typeof draft.payload !== 'object' ||\n draft.payload === null ||\n typeof draft.artifacts !== 'object' ||\n draft.artifacts === null ||\n Object.entries(draft.artifacts).some(\n ([, artifact]) =>\n artifact === null ||\n typeof artifact !== 'object' ||\n typeof artifact.mediaType !== 'string' ||\n artifact.mediaType.length === 0 ||\n !(artifact.bytes instanceof Uint8Array),\n )\n ) {\n return failure(key, { guid: draft.guid || 'unknown', producer: key });\n }\n return ok(draft);\n }\n\n async run<P = unknown, I = unknown>(\n key: string,\n input: I,\n ): Promise<Result<CookProduct<P>, AssetStageError>> {\n const draftResult = await this.runDraft<P, I>(key, input);\n if (!draftResult.ok) return draftResult;\n const draft = draftResult.value;\n const digest = digestDraft(draft);\n const artifacts: Record<string, ArtifactDescriptor> = {};\n for (const [path, artifact] of Object.entries(draft.artifacts)) {\n artifacts[path] = {\n path,\n mediaType: artifact.mediaType,\n ...(artifact.assetCodec === undefined ? {} : { assetCodec: artifact.assetCodec }),\n byteLength: artifact.bytes.byteLength,\n };\n }\n const receipt = {\n guid: draft.guid,\n origin: 'authoredPack' as const,\n status: 'succeeded' as const,\n inputFingerprint: draft.inputFingerprint,\n outputDigest: digest,\n };\n const product: CookProduct<P> = {\n guid: draft.guid,\n payload: draft.payload,\n refs: draft.refs,\n artifacts,\n digest,\n receipt,\n };\n return ok(product);\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { ImportedOutputDeclaration, ProducerContractResult } from '@forgeax/engine-types';
2
+ type ProducerObject = Record<string, unknown>;
3
+ /**
4
+ * Validate one package or imported-output producer declaration.
5
+ *
6
+ * The accepted fields mirror the engine-types POD contract. This function
7
+ * validates that schema without creating a second schema or interpreting
8
+ * diagnostic messages.
9
+ */
10
+ export declare function validateProducerContract(value: unknown): ProducerContractResult<ProducerObject>;
11
+ /**
12
+ * Validate output topology without ever treating `sourceIndex` as identity.
13
+ *
14
+ * AI-readable callers should use the discriminated result and its structured
15
+ * `code`, `expected`, `actual`, and `hint` fields for recovery decisions.
16
+ */
17
+ export declare function validateProducerOutputs(outputs: readonly ImportedOutputDeclaration[]): ProducerContractResult<readonly ImportedOutputDeclaration[]>;
18
+ export {};
19
+ //# sourceMappingURL=producer-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"producer-contract.d.ts","sourceRoot":"","sources":["../src/producer-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EAEzB,sBAAsB,EAEvB,MAAM,uBAAuB,CAAC;AAG/B,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA4I9C;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAiF/F;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,yBAAyB,EAAE,GAC5C,sBAAsB,CAAC,SAAS,yBAAyB,EAAE,CAAC,CA6B9D"}
@@ -0,0 +1,4 @@
1
+ import type { Result } from '@forgeax/engine-types';
2
+ import { PackError } from './errors.js';
3
+ export declare function resolveAssetSource(metaPath: string, source: string | undefined, paths: Record<string, string>): Result<string, PackError>;
4
+ //# sourceMappingURL=resolve-asset-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-asset-source.d.ts","sourceRoot":"","sources":["../src/resolve-asset-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmBxC,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAkE3B"}
@@ -0,0 +1,99 @@
1
+ import { dirname, resolve, posix } from 'path';
2
+ import { ok, err, PACK_ERROR_HINTS } from '@forgeax/engine-types';
3
+
4
+ // src/resolve-asset-source.ts
5
+
6
+ // src/errors.ts
7
+ var PackError = class extends Error {
8
+ code;
9
+ expected;
10
+ hint;
11
+ detail;
12
+ constructor(args) {
13
+ super(`[PackError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);
14
+ this.name = "PackError";
15
+ this.code = args.code;
16
+ this.expected = args.expected;
17
+ this.hint = args.hint;
18
+ this.detail = args.detail;
19
+ }
20
+ };
21
+
22
+ // src/resolve-asset-source.ts
23
+ function baseName(p) {
24
+ const trimmed = p.replace(/[/\\]+$/, "");
25
+ const idx = Math.max(trimmed.lastIndexOf("/"), trimmed.lastIndexOf("\\"));
26
+ return idx === -1 ? trimmed : trimmed.slice(idx + 1);
27
+ }
28
+ function deriveSourceName(metaFileName) {
29
+ return metaFileName.replace(/\.meta\.json$/, "");
30
+ }
31
+ var PATH_REF_RE = /^@([^/]+)\/(.+)$/;
32
+ function isPathEscape(pathDir, resolved) {
33
+ const rel = posix.relative(pathDir, resolved);
34
+ return rel.startsWith("..") || posix.isAbsolute(rel);
35
+ }
36
+ function resolveAssetSource(metaPath, source, paths) {
37
+ if (source === void 0) {
38
+ const metaDir = dirname(metaPath);
39
+ const metaName = baseName(metaPath);
40
+ const derived = deriveSourceName(metaName);
41
+ return ok(resolve(metaDir, derived));
42
+ }
43
+ if (source.startsWith("@")) {
44
+ const match = source.match(PATH_REF_RE);
45
+ if (!match) {
46
+ return err(
47
+ new PackError({
48
+ code: "pack-malformed-path-ref",
49
+ expected: "source in format @<name>/<rest>",
50
+ hint: PACK_ERROR_HINTS["pack-malformed-path-ref"],
51
+ detail: {
52
+ code: "pack-malformed-path-ref",
53
+ reason: "format",
54
+ rawSource: source,
55
+ expectedFormat: "@<name>/<rest>"
56
+ }
57
+ })
58
+ );
59
+ }
60
+ const [, name, rest] = match;
61
+ const pathDir = paths[name];
62
+ if (pathDir === void 0) {
63
+ return err(
64
+ new PackError({
65
+ code: "pack-unknown-path",
66
+ expected: "path name found in package.json#forgeax.assets.paths",
67
+ hint: PACK_ERROR_HINTS["pack-unknown-path"],
68
+ detail: {
69
+ code: "pack-unknown-path",
70
+ pathName: name,
71
+ knownNames: Object.keys(paths)
72
+ }
73
+ })
74
+ );
75
+ }
76
+ const resolved = resolve(pathDir, rest);
77
+ if (isPathEscape(pathDir, resolved)) {
78
+ return err(
79
+ new PackError({
80
+ code: "pack-malformed-path-ref",
81
+ expected: "rest path must not escape the declared path directory",
82
+ hint: PACK_ERROR_HINTS["pack-malformed-path-ref"],
83
+ detail: {
84
+ code: "pack-malformed-path-ref",
85
+ reason: "escape",
86
+ rawSource: source,
87
+ expectedFormat: "@<name>/<rest>"
88
+ }
89
+ })
90
+ );
91
+ }
92
+ return ok(resolved);
93
+ }
94
+ return ok(resolve(dirname(metaPath), source));
95
+ }
96
+
97
+ export { resolveAssetSource };
98
+ //# sourceMappingURL=resolve-asset-source.mjs.map
99
+ //# sourceMappingURL=resolve-asset-source.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/resolve-asset-source.ts"],"names":["resultOk","resultErr"],"mappings":"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","file":"resolve-asset-source.mjs","sourcesContent":["// errors.ts — PackError class (feat-20260513-guid-asset-package-system w15)\n//\n// Four-field surface: .code / .expected / .hint / .detail\n// Structurally parallel to AssetError / RhiError / RemoteError\n// (charter proposition 5 consistent abstraction).\n//\n// .detail is narrowed per .code via PackErrorDetail discriminated union\n// (requirements §6.2 AC-07; plan-strategy §D-5).\n\nimport type { PackErrorCode, PackErrorDetail } from '@forgeax/engine-types';\n\n/**\n * Structured error for the engine-pack disk scanner fail-fast chain.\n *\n * AI users consume via exhaustive switch on .code — no default case needed:\n * ```ts\n * switch (err.code) {\n * case 'pack-guid-collision':\n * console.error(err.detail.paths);\n * break;\n * case 'pack-cyclic-reference':\n * console.error(err.detail.cycle);\n * break;\n * // ...all 8 cases\n * }\n * ```\n */\nexport class PackError extends Error {\n readonly code: PackErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: PackErrorDetail;\n\n constructor(args: {\n code: PackErrorCode;\n expected: string;\n hint: string;\n detail: PackErrorDetail;\n }) {\n super(`[PackError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = 'PackError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n","import { dirname, posix, resolve } from 'node:path';\nimport type { Result } from '@forgeax/engine-types';\nimport { PACK_ERROR_HINTS, err as resultErr, ok as resultOk } from '@forgeax/engine-types';\nimport { PackError } from './errors.js';\n\nfunction baseName(p: string): string {\n const trimmed = p.replace(/[/\\\\]+$/, '');\n const idx = Math.max(trimmed.lastIndexOf('/'), trimmed.lastIndexOf('\\\\'));\n return idx === -1 ? trimmed : trimmed.slice(idx + 1);\n}\n\nfunction deriveSourceName(metaFileName: string): string {\n return metaFileName.replace(/\\.meta\\.json$/, '');\n}\n\nconst PATH_REF_RE = /^@([^/]+)\\/(.+)$/;\n\nfunction isPathEscape(pathDir: string, resolved: string): boolean {\n const rel = posix.relative(pathDir, resolved);\n return rel.startsWith('..') || posix.isAbsolute(rel);\n}\n\nexport function resolveAssetSource(\n metaPath: string,\n source: string | undefined,\n paths: Record<string, string>,\n): Result<string, PackError> {\n if (source === undefined) {\n const metaDir = dirname(metaPath);\n const metaName = baseName(metaPath);\n const derived = deriveSourceName(metaName);\n return resultOk(resolve(metaDir, derived));\n }\n\n if (source.startsWith('@')) {\n const match = source.match(PATH_REF_RE);\n if (!match) {\n return resultErr(\n new PackError({\n code: 'pack-malformed-path-ref',\n expected: 'source in format @<name>/<rest>',\n hint: PACK_ERROR_HINTS['pack-malformed-path-ref'],\n detail: {\n code: 'pack-malformed-path-ref',\n reason: 'format',\n rawSource: source,\n expectedFormat: '@<name>/<rest>',\n },\n }),\n );\n }\n\n const [, name, rest] = match as [string, string, string];\n const pathDir = paths[name];\n\n if (pathDir === undefined) {\n return resultErr(\n new PackError({\n code: 'pack-unknown-path',\n expected: 'path name found in package.json#forgeax.assets.paths',\n hint: PACK_ERROR_HINTS['pack-unknown-path'],\n detail: {\n code: 'pack-unknown-path',\n pathName: name,\n knownNames: Object.keys(paths),\n },\n }),\n );\n }\n\n const resolved = resolve(pathDir, rest);\n\n if (isPathEscape(pathDir, resolved)) {\n return resultErr(\n new PackError({\n code: 'pack-malformed-path-ref',\n expected: 'rest path must not escape the declared path directory',\n hint: PACK_ERROR_HINTS['pack-malformed-path-ref'],\n detail: {\n code: 'pack-malformed-path-ref',\n reason: 'escape',\n rawSource: source,\n expectedFormat: '@<name>/<rest>',\n },\n }),\n );\n }\n\n return resultOk(resolved);\n }\n\n return resultOk(resolve(dirname(metaPath), source));\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { AssetPublicationTuple, AssetRuntimeArtifactDescriptor, PackV2, PackV2Error, Result } from '@forgeax/engine-types';
2
+ export interface RuntimeAssetProjectionInput<P = unknown> {
3
+ readonly guid: string;
4
+ readonly kind: string;
5
+ readonly payload: P;
6
+ readonly refs: readonly string[];
7
+ readonly artifacts: Readonly<Record<string, AssetRuntimeArtifactDescriptor>>;
8
+ }
9
+ export interface RuntimePackProjectionInput<P = unknown> extends AssetPublicationTuple {
10
+ readonly assets: readonly RuntimeAssetProjectionInput<P>[];
11
+ }
12
+ /** Project producer facts into the only runtime Pack v2 envelope. */
13
+ export declare function projectRuntimePack<P = unknown>(value: unknown): Result<PackV2<P>, PackV2Error>;
14
+ //# sourceMappingURL=runtime-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-projection.d.ts","sourceRoot":"","sources":["../src/runtime-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EACrB,8BAA8B,EAC9B,MAAM,EACN,WAAW,EACX,MAAM,EACP,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,OAAO;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,0BAA0B,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,qBAAqB;IACpF,QAAQ,CAAC,MAAM,EAAE,SAAS,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5D;AA2CD,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAmC9F"}
@@ -0,0 +1,80 @@
1
+ import { PackError } from './errors.js';
2
+ import { type ScriptablePackMetaJson } from './scriptable-pack.js';
3
+ import { type LoadScriptablePackOptions, type ScriptablePackSourceClosureEntry } from './scriptable-pack-node.js';
4
+ export type ScanResult<T, E> = {
5
+ readonly ok: true;
6
+ readonly value: T;
7
+ } | {
8
+ readonly ok: false;
9
+ readonly error: E;
10
+ };
11
+ /** Host-owned source paths that should not enter the Pack catalog. */
12
+ export interface ScanOptions {
13
+ readonly ignorePath?: (path: string) => boolean;
14
+ /** Timeout/executor owner for ScriptablePack metadata loading. */
15
+ readonly scriptablePackLoad?: LoadScriptablePackOptions;
16
+ }
17
+ export type AssetInventoryProducerKind = 'direct-pack' | 'source-meta' | 'scriptable-pack';
18
+ export interface AssetInventoryOutput {
19
+ readonly guid: string;
20
+ readonly sourceKey?: string;
21
+ readonly sourceIndex?: number;
22
+ readonly kind: string;
23
+ readonly name?: string;
24
+ readonly execution?: 'direct' | 'cooked';
25
+ readonly refs: readonly string[];
26
+ }
27
+ export interface AssetInventoryProjectedMeta {
28
+ readonly schemaVersion?: string;
29
+ readonly packageId?: string;
30
+ readonly importer?: string;
31
+ readonly source?: string;
32
+ readonly name?: string;
33
+ readonly outputs: readonly AssetInventoryOutput[];
34
+ readonly externalGuids: readonly string[];
35
+ }
36
+ export interface AssetInventoryDiagnostic {
37
+ readonly code: string;
38
+ readonly message: string;
39
+ }
40
+ export interface AssetInventoryDeclaration {
41
+ readonly sourcePath: string;
42
+ readonly canonicalSourcePath: string;
43
+ readonly producer: AssetInventoryProducerKind;
44
+ readonly packageId?: string;
45
+ readonly projectedMeta: AssetInventoryProjectedMeta;
46
+ readonly outputs: readonly AssetInventoryOutput[];
47
+ readonly externalGuids: readonly string[];
48
+ readonly sourceClosure?: readonly ScriptablePackSourceClosureEntry[];
49
+ readonly diagnostics: readonly AssetInventoryDiagnostic[];
50
+ }
51
+ export interface AssetInventory {
52
+ readonly paths: readonly string[];
53
+ readonly scriptablePackMeta: ReadonlyMap<string, ScriptablePackMetaJson>;
54
+ /** One declaration record per authored package/source, keyed by source path. */
55
+ readonly declarations: readonly AssetInventoryDeclaration[];
56
+ readonly declarationsByPath: ReadonlyMap<string, AssetInventoryDeclaration>;
57
+ /** Producer ownership map used by Catalog, watcher, and demand cook. */
58
+ readonly sourceByGuid: ReadonlyMap<string, string>;
59
+ readonly metaByGuid: ReadonlyMap<string, string>;
60
+ }
61
+ export declare const SCANNER_BLACKLIST: ReadonlySet<string>;
62
+ /**
63
+ * Scan one or more root directories for `.meta.json`, `.pack.json`, and `.pack.ts` files.
64
+ * Runs a 7-step fail-fast validation chain (w17 + M7-T01):
65
+ * Step 1 - collect all .meta.json + .pack.json + .pack.ts paths (blacklist skipped)
66
+ * Step 2 - schema validation (ajv strict)
67
+ * Step 3 - GUID string format validation
68
+ * Step 4 - GUID collision detection
69
+ * Step 5 - orphan .meta.json detection
70
+ * Step 6 - cyclic reference detection (hand-written DFS)
71
+ * Step 7 - complete pack and source closure validation
72
+ *
73
+ * Returns one reusable `AssetInventory` or `Err(PackError)` on the first violation.
74
+ *
75
+ * NOTE: source files without a .meta.json are logged but not fatal (requirements §5).
76
+ */
77
+ export declare function scanInventory(roots: readonly string[], opts?: ScanOptions): Promise<ScanResult<AssetInventory, PackError>>;
78
+ /** Compatibility projection for callers that only need discovered paths. */
79
+ export declare function scan(roots: readonly string[], opts?: ScanOptions): Promise<ScanResult<string[], PackError>>;
80
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}