create-aura3d 1.3.3 → 1.4.0

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 (145) hide show
  1. package/dist/cli.js +10 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/showcase-spec-artifacts.d.ts +104 -0
  8. package/dist/showcase-spec-artifacts.d.ts.map +1 -0
  9. package/dist/showcase-spec-artifacts.js +142 -0
  10. package/dist/showcase-spec-artifacts.js.map +1 -0
  11. package/dist/showcase-spec-category-plan.d.ts +15 -0
  12. package/dist/showcase-spec-category-plan.d.ts.map +1 -0
  13. package/dist/showcase-spec-category-plan.js +45 -0
  14. package/dist/showcase-spec-category-plan.js.map +1 -0
  15. package/dist/showcase-spec-compiler.d.ts +5 -0
  16. package/dist/showcase-spec-compiler.d.ts.map +1 -0
  17. package/dist/showcase-spec-compiler.js +240 -0
  18. package/dist/showcase-spec-compiler.js.map +1 -0
  19. package/dist/showcase-spec-evidence.d.ts +7 -0
  20. package/dist/showcase-spec-evidence.d.ts.map +1 -0
  21. package/dist/showcase-spec-evidence.js +815 -0
  22. package/dist/showcase-spec-evidence.js.map +1 -0
  23. package/dist/showcase-spec-game-geometry-extractor.d.ts +21 -0
  24. package/dist/showcase-spec-game-geometry-extractor.d.ts.map +1 -0
  25. package/dist/showcase-spec-game-geometry-extractor.js +725 -0
  26. package/dist/showcase-spec-game-geometry-extractor.js.map +1 -0
  27. package/dist/showcase-spec-game-replacement-evidence.d.ts +14 -0
  28. package/dist/showcase-spec-game-replacement-evidence.d.ts.map +1 -0
  29. package/dist/showcase-spec-game-replacement-evidence.js +219 -0
  30. package/dist/showcase-spec-game-replacement-evidence.js.map +1 -0
  31. package/dist/showcase-spec-game-template-evidence.d.ts +72 -0
  32. package/dist/showcase-spec-game-template-evidence.d.ts.map +1 -0
  33. package/dist/showcase-spec-game-template-evidence.js +435 -0
  34. package/dist/showcase-spec-game-template-evidence.js.map +1 -0
  35. package/dist/showcase-spec-gameplay-evidence.d.ts +3 -0
  36. package/dist/showcase-spec-gameplay-evidence.d.ts.map +1 -0
  37. package/dist/showcase-spec-gameplay-evidence.js +108 -0
  38. package/dist/showcase-spec-gameplay-evidence.js.map +1 -0
  39. package/dist/showcase-spec-parser.d.ts +3 -0
  40. package/dist/showcase-spec-parser.d.ts.map +1 -0
  41. package/dist/showcase-spec-parser.js +662 -0
  42. package/dist/showcase-spec-parser.js.map +1 -0
  43. package/dist/showcase-spec-platformer-artifacts.d.ts +3 -0
  44. package/dist/showcase-spec-platformer-artifacts.d.ts.map +1 -0
  45. package/dist/showcase-spec-platformer-artifacts.js +276 -0
  46. package/dist/showcase-spec-platformer-artifacts.js.map +1 -0
  47. package/dist/showcase-spec-racing-artifacts.d.ts +3 -0
  48. package/dist/showcase-spec-racing-artifacts.d.ts.map +1 -0
  49. package/dist/showcase-spec-racing-artifacts.js +273 -0
  50. package/dist/showcase-spec-racing-artifacts.js.map +1 -0
  51. package/dist/showcase-spec-replacement-apply.d.ts +10 -0
  52. package/dist/showcase-spec-replacement-apply.d.ts.map +1 -0
  53. package/dist/showcase-spec-replacement-apply.js +166 -0
  54. package/dist/showcase-spec-replacement-apply.js.map +1 -0
  55. package/dist/showcase-spec-replacement-candidates.d.ts +16 -0
  56. package/dist/showcase-spec-replacement-candidates.d.ts.map +1 -0
  57. package/dist/showcase-spec-replacement-candidates.js +244 -0
  58. package/dist/showcase-spec-replacement-candidates.js.map +1 -0
  59. package/dist/showcase-spec-replacement-game-geometry.d.ts +4 -0
  60. package/dist/showcase-spec-replacement-game-geometry.d.ts.map +1 -0
  61. package/dist/showcase-spec-replacement-game-geometry.js +175 -0
  62. package/dist/showcase-spec-replacement-game-geometry.js.map +1 -0
  63. package/dist/showcase-spec-replacement-manifest.d.ts +41 -0
  64. package/dist/showcase-spec-replacement-manifest.d.ts.map +1 -0
  65. package/dist/showcase-spec-replacement-manifest.js +62 -0
  66. package/dist/showcase-spec-replacement-manifest.js.map +1 -0
  67. package/dist/showcase-spec-replacement-values.d.ts +9 -0
  68. package/dist/showcase-spec-replacement-values.d.ts.map +1 -0
  69. package/dist/showcase-spec-replacement-values.js +41 -0
  70. package/dist/showcase-spec-replacement-values.js.map +1 -0
  71. package/dist/showcase-spec-replacement.d.ts +13 -0
  72. package/dist/showcase-spec-replacement.d.ts.map +1 -0
  73. package/dist/showcase-spec-replacement.js +144 -0
  74. package/dist/showcase-spec-replacement.js.map +1 -0
  75. package/dist/showcase-spec-types.d.ts +304 -0
  76. package/dist/showcase-spec-types.d.ts.map +1 -0
  77. package/dist/showcase-spec-types.js +2 -0
  78. package/dist/showcase-spec-types.js.map +1 -0
  79. package/package.json +13 -2
  80. package/templates/animation-studio/scripts/animation-scene.ts +1 -1
  81. package/templates/animation-studio/scripts/author-office-scene.ts +1 -1
  82. package/templates/animation-studio/scripts/build-characters.ts +1 -1
  83. package/templates/animation-studio/src/director/director-heuristics.ts +2 -2
  84. package/templates/animation-studio/src/director/{prompt-to-scene.ts → prompt-scene.ts} +1 -1
  85. package/templates/cinematic-scene/tests/screenshot.spec.ts +2 -4
  86. package/templates/falling-blocks-starter/README.md +18 -0
  87. package/templates/falling-blocks-starter/index.html +23 -0
  88. package/templates/falling-blocks-starter/package.json +21 -0
  89. package/templates/falling-blocks-starter/playwright.config.ts +12 -0
  90. package/templates/falling-blocks-starter/public/aura-assets/showcaseBlockfallCabinet.679d52fe.glb +0 -0
  91. package/templates/falling-blocks-starter/public/aura-assets/showcaseBlockfallCabinet.thumb.svg +1 -0
  92. package/templates/falling-blocks-starter/src/aura-assets.ts +20 -0
  93. package/templates/falling-blocks-starter/src/main.ts +358 -0
  94. package/templates/falling-blocks-starter/tests/playable.spec.ts +85 -0
  95. package/templates/falling-blocks-starter/tests/route-health.spec.ts +34 -0
  96. package/templates/falling-blocks-starter/tsconfig.json +13 -0
  97. package/templates/mini-game/README.md +13 -0
  98. package/templates/mini-game/index.html +1 -1
  99. package/templates/mini-game/package.json +1 -1
  100. package/templates/mini-game/src/main.ts +251 -21
  101. package/templates/mini-game/tests/playable.spec.ts +49 -0
  102. package/templates/mini-game/tests/screenshot.spec.ts +37 -32
  103. package/templates/product-viewer/tests/screenshot.spec.ts +3 -5
  104. package/templates/racing-starter/README.md +27 -0
  105. package/templates/racing-starter/index.html +23 -0
  106. package/templates/racing-starter/package.json +21 -0
  107. package/templates/racing-starter/playwright.config.ts +12 -0
  108. package/templates/racing-starter/public/aura-assets/showcaseCleanSportsCar.1c69283f.glb +0 -0
  109. package/templates/racing-starter/public/aura-assets/showcaseCleanSportsCar.thumb.svg +1 -0
  110. package/templates/racing-starter/public/aura-assets/showcaseReadableKartCircuit.5cbb912e.glb +0 -0
  111. package/templates/racing-starter/public/aura-assets/showcaseReadableKartCircuit.thumb.svg +1 -0
  112. package/templates/racing-starter/src/aura-assets.ts +36 -0
  113. package/templates/racing-starter/src/main.ts +280 -0
  114. package/templates/racing-starter/tests/playable.spec.ts +93 -0
  115. package/templates/racing-starter/tests/route-health.spec.ts +40 -0
  116. package/templates/racing-starter/tsconfig.json +13 -0
  117. package/templates/animation-channel/public/aura-assets/moon-garden-feature-frame.png +0 -0
  118. package/templates/animation-channel/tests/reports/prompt-animation/cartoon-sample-episode.png +0 -0
  119. package/templates/animation-studio/dist/episodes/prompt-to-scene-proof/two-robots-fixing-a-car.document.json +0 -680
  120. package/templates/animation-studio/dist/episodes/scene/episode-3d.webm +0 -0
  121. package/templates/animation-studio/dist/episodes/scene/frames/action.png +0 -0
  122. package/templates/animation-studio/dist/episodes/scene/frames/dialogue.png +0 -0
  123. package/templates/animation-studio/dist/episodes/scene/frames/final.png +0 -0
  124. package/templates/animation-studio/dist/episodes/scene/frames/first.png +0 -0
  125. package/templates/animation-studio/dist/episodes/scene/frames/mouth-closed.png +0 -0
  126. package/templates/animation-studio/dist/episodes/scene/frames/mouth-open.png +0 -0
  127. package/templates/animation-studio/dist/episodes/scene/render-live-summary.json +0 -9763
  128. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/broken.png +0 -0
  129. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/chefs.png +0 -0
  130. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/customer.png +0 -0
  131. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/friend-1.png +0 -0
  132. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/friend-2.png +0 -0
  133. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-1.png +0 -0
  134. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-2.png +0 -0
  135. package/templates/animation-studio/dist/generated/second-scene.document.json +0 -1210
  136. package/templates/animation-studio/dist/generated/studio-edited.document.json +0 -1196
  137. package/templates/animation-studio/dist/scene/inshader-accept.document.json +0 -1
  138. package/templates/animation-studio/dist/scene/inshader-test.document.json +0 -1
  139. package/templates/animation-studio/dist/scene/integ.document.json +0 -1
  140. package/templates/animation-studio/dist/scene/working.document.json +0 -673
  141. package/templates/animation-studio/dist/scene/working.history.json +0 -1
  142. package/templates/animation-studio/studio/dist/assets/index-C7f8tHfi.css +0 -1
  143. package/templates/animation-studio/studio/dist/assets/index-CLo3GXyN.js +0 -43
  144. package/templates/animation-studio/studio/dist/index.html +0 -19
  145. package/templates/animation-studio/tests/reports/animation-studio/hifi-cast-validation.json +0 -938
@@ -0,0 +1,166 @@
1
+ export function applySelectedReplacement(options) {
2
+ const existingSelected = options.spec.primaryAssets.find((asset) => asset.id === options.selectedAsset.id);
3
+ const primaryAssets = options.spec.primaryAssets
4
+ .filter((asset) => asset.id !== options.rejectedAssetId)
5
+ .map((asset) => asset.id === options.selectedAsset.id ? { ...asset, role: options.selectedAsset.role } : asset);
6
+ const nextAssets = existingSelected ? primaryAssets : [...primaryAssets, options.selectedAsset];
7
+ const releaseAssetProbes = { ...(options.spec.evidence.releaseAssetProbes ?? {}) };
8
+ delete releaseAssetProbes[options.rejectedAssetId];
9
+ if (options.selectedEvidence)
10
+ releaseAssetProbes[options.selectedAsset.id] = options.selectedEvidence;
11
+ return {
12
+ ...options.spec,
13
+ primaryAssets: nextAssets,
14
+ platformer: options.spec.platformer
15
+ ? replacePlatformerAsset({
16
+ platformer: options.spec.platformer,
17
+ rejectedAssetId: options.rejectedAssetId,
18
+ selectedAssetId: options.selectedAsset.id,
19
+ selectedSurfaceMap: options.selectedPlayableSurfaceMap
20
+ })
21
+ : options.spec.platformer,
22
+ racing: options.spec.racing
23
+ ? replaceRacingAsset({
24
+ racing: options.spec.racing,
25
+ rejectedAssetId: options.rejectedAssetId,
26
+ selectedAssetId: options.selectedAsset.id,
27
+ selectedTopology: options.selectedRacingTopology
28
+ })
29
+ : options.spec.racing,
30
+ categoryPlan: options.spec.categoryPlan
31
+ ? {
32
+ ...options.spec.categoryPlan,
33
+ primaryAsset: options.spec.categoryPlan.primaryAsset === options.rejectedAssetId ? options.selectedAsset.id : options.spec.categoryPlan.primaryAsset
34
+ }
35
+ : options.spec.categoryPlan,
36
+ layout: {
37
+ ...options.spec.layout,
38
+ heroAsset: options.spec.layout.heroAsset === options.rejectedAssetId ? options.selectedAsset.id : options.spec.layout.heroAsset
39
+ },
40
+ evidence: {
41
+ ...options.spec.evidence,
42
+ deployCommand: replaceDeployAsset(options.spec.evidence.deployCommand, options.rejectedAssetId, options.selectedAsset.id),
43
+ releaseAssetProbes
44
+ }
45
+ };
46
+ }
47
+ function replacePlatformerAsset(input) {
48
+ const { platformer, rejectedAssetId, selectedAssetId, selectedSurfaceMap } = input;
49
+ const characterAsset = platformer.characterAsset === rejectedAssetId ? selectedAssetId : platformer.characterAsset;
50
+ const worldAssets = unique(platformer.worldAssets.map((assetId) => assetId === rejectedAssetId ? selectedAssetId : assetId));
51
+ const replacingWorldAsset = platformer.worldAssets.includes(rejectedAssetId);
52
+ const replacingCharacterAsset = platformer.characterAsset === rejectedAssetId;
53
+ if (!replacingWorldAsset && !replacingCharacterAsset) {
54
+ return { ...platformer, characterAsset, worldAssets };
55
+ }
56
+ if (replacingWorldAsset && selectedSurfaceMap) {
57
+ return {
58
+ ...platformer,
59
+ characterAsset,
60
+ worldAssets,
61
+ levelDesign: {
62
+ minPlayableSeconds: platformer.levelDesign.minPlayableSeconds,
63
+ minCheckpoints: platformer.levelDesign.minCheckpoints,
64
+ requiresHazardRespawn: platformer.levelDesign.requiresHazardRespawn,
65
+ requiresFinish: platformer.levelDesign.requiresFinish,
66
+ authoredLevelFlow: platformer.levelDesign.authoredLevelFlow,
67
+ playableSurfaceSource: playableSurfaceSourceForGeometry(selectedSurfaceMap.source),
68
+ playableSurfaceLayoutValidated: true,
69
+ playableSurfaceMap: selectedSurfaceMap,
70
+ characterWorldScaleCompatible: characterScaleRatioIsCompatible(selectedSurfaceMap.characterScaleRatio),
71
+ styleCompatible: retainedAssetPairStillMatches(platformer.levelDesign.assetPairEvidence, selectedAssetId),
72
+ primitivePrimaryWorldRejected: platformer.levelDesign.primitivePrimaryWorldRejected
73
+ }
74
+ };
75
+ }
76
+ return {
77
+ ...platformer,
78
+ characterAsset,
79
+ worldAssets,
80
+ levelDesign: {
81
+ minPlayableSeconds: platformer.levelDesign.minPlayableSeconds,
82
+ minCheckpoints: platformer.levelDesign.minCheckpoints,
83
+ requiresHazardRespawn: platformer.levelDesign.requiresHazardRespawn,
84
+ requiresFinish: platformer.levelDesign.requiresFinish,
85
+ authoredLevelFlow: platformer.levelDesign.authoredLevelFlow,
86
+ playableSurfaceSource: "authored-route-rectangles",
87
+ playableSurfaceLayoutValidated: false,
88
+ characterWorldScaleCompatible: false,
89
+ styleCompatible: false,
90
+ primitivePrimaryWorldRejected: platformer.levelDesign.primitivePrimaryWorldRejected
91
+ }
92
+ };
93
+ }
94
+ function replaceRacingAsset(input) {
95
+ const { racing, rejectedAssetId, selectedAssetId, selectedTopology } = input;
96
+ const vehicleAsset = racing.vehicleAsset === rejectedAssetId ? selectedAssetId : racing.vehicleAsset;
97
+ const trackAsset = racing.trackAsset === rejectedAssetId ? selectedAssetId : racing.trackAsset;
98
+ const replacingTrackAsset = racing.trackAsset === rejectedAssetId;
99
+ const replacingVehicleAsset = racing.vehicleAsset === rejectedAssetId;
100
+ if (!replacingTrackAsset && !replacingVehicleAsset)
101
+ return { ...racing, vehicleAsset, trackAsset };
102
+ if (replacingTrackAsset && selectedTopology) {
103
+ return {
104
+ ...racing,
105
+ vehicleAsset,
106
+ trackAsset,
107
+ raceDesign: {
108
+ minCheckpoints: racing.raceDesign.minCheckpoints,
109
+ minLaps: racing.raceDesign.minLaps,
110
+ minLapSeconds: racing.raceDesign.minLapSeconds,
111
+ routeAlignedToTrackAsset: true,
112
+ visibleTrackTopology: racingTopologyVisibility(selectedTopology.source),
113
+ trackTopology: selectedTopology,
114
+ carTrackScaleCompatible: true,
115
+ noDebugLocatorDisk: racing.raceDesign.noDebugLocatorDisk
116
+ }
117
+ };
118
+ }
119
+ return {
120
+ ...racing,
121
+ vehicleAsset,
122
+ trackAsset,
123
+ raceDesign: {
124
+ minCheckpoints: racing.raceDesign.minCheckpoints,
125
+ minLaps: racing.raceDesign.minLaps,
126
+ minLapSeconds: racing.raceDesign.minLapSeconds,
127
+ routeAlignedToTrackAsset: false,
128
+ visibleTrackTopology: "authored-route-over-visible-track",
129
+ carTrackScaleCompatible: false,
130
+ noDebugLocatorDisk: racing.raceDesign.noDebugLocatorDisk
131
+ }
132
+ };
133
+ }
134
+ function replaceDeployAsset(command, rejectedAssetId, selectedAssetId) {
135
+ const tokens = command.split(" ");
136
+ const result = [];
137
+ let selectedPresent = false;
138
+ for (let index = 0; index < tokens.length; index += 1) {
139
+ const token = tokens[index];
140
+ const next = tokens[index + 1];
141
+ if (token === "--asset" && next === rejectedAssetId) {
142
+ index += 1;
143
+ continue;
144
+ }
145
+ if (token === "--asset" && next === selectedAssetId)
146
+ selectedPresent = true;
147
+ result.push(token);
148
+ }
149
+ return selectedPresent ? result.join(" ") : `${result.join(" ")} --asset ${selectedAssetId}`;
150
+ }
151
+ function unique(values) {
152
+ return [...new Set(values)];
153
+ }
154
+ function racingTopologyVisibility(source) {
155
+ return source === "asset-mesh-extracted" ? "mesh-road-topology" : "asset-bound-road-topology";
156
+ }
157
+ function playableSurfaceSourceForGeometry(source) {
158
+ return source === "asset-mesh-extracted" ? "asset-derived-playable-surfaces" : "asset-bound-playable-surfaces";
159
+ }
160
+ function characterScaleRatioIsCompatible(value) {
161
+ return value >= 0.2 && value <= 0.75;
162
+ }
163
+ function retainedAssetPairStillMatches(evidence, selectedAssetId) {
164
+ return evidence?.verdict === "pass" && evidence.assets.includes(selectedAssetId);
165
+ }
166
+ //# sourceMappingURL=showcase-spec-replacement-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase-spec-replacement-apply.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-replacement-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ManifestAsset } from "./showcase-spec-replacement-manifest.js";
2
+ import type { ShowcasePlatformerPlayableSurfaceMap, ShowcaseRacingTrackTopology, ShowcaseSpec, ShowcaseSpecAsset, ShowcaseSpecAssetPolicy, ShowcaseSpecReplacementCandidate } from "./showcase-spec-types.js";
3
+ export interface CandidateEvaluation {
4
+ readonly candidate: ShowcaseSpecReplacementCandidate;
5
+ readonly specAsset: ShowcaseSpecAsset;
6
+ readonly racingTopology?: ShowcaseRacingTrackTopology;
7
+ readonly playableSurfaceMap?: ShowcasePlatformerPlayableSurfaceMap;
8
+ }
9
+ export declare function rankManifestReplacementCandidates(options: {
10
+ readonly spec: ShowcaseSpec;
11
+ readonly rejectedAsset: ShowcaseSpecAsset;
12
+ readonly policy: ShowcaseSpecAssetPolicy;
13
+ readonly manifest: readonly ManifestAsset[];
14
+ readonly projectDir: string;
15
+ }): readonly CandidateEvaluation[];
16
+ //# sourceMappingURL=showcase-spec-replacement-candidates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase-spec-replacement-candidates.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-replacement-candidates.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,KAAK,EACV,oCAAoC,EACpC,2BAA2B,EAC3B,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACvB,gCAAgC,EACjC,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,gCAAgC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,2BAA2B,CAAC;IACtD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,oCAAoC,CAAC;CACpE;AAID,wBAAgB,iCAAiC,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,SAAS,mBAAmB,EAAE,CAgBjC"}
@@ -0,0 +1,244 @@
1
+ import { normalizeLicense, scoreAsset } from "@aura3d/asset-index";
2
+ import { createProvenance, hasDurableProvenance } from "./showcase-spec-replacement-manifest.js";
3
+ import { readJson, recordValue, roundScore, stringArray } from "./showcase-spec-replacement-values.js";
4
+ import { gameGeometryGate } from "./showcase-spec-game-replacement-evidence.js";
5
+ const MAX_RANKED_REPLACEMENT_CANDIDATES = 20;
6
+ export function rankManifestReplacementCandidates(options) {
7
+ const rejectedHash = options.manifest.find((asset) => asset.id === options.rejectedAsset.id)?.hash;
8
+ const query = options.policy.replacementQuery ?? `${options.rejectedAsset.role} replacement`;
9
+ const evaluated = options.manifest
10
+ .filter((asset) => asset.id !== options.rejectedAsset.id)
11
+ .map((asset) => evaluateCandidate({
12
+ spec: options.spec,
13
+ asset,
14
+ query,
15
+ rejectedHash,
16
+ policy: options.policy,
17
+ projectDir: options.projectDir
18
+ }))
19
+ .filter(isPolicyRelevantCandidate)
20
+ .sort(compareCandidateEvaluations);
21
+ return retainGeometryCandidates(evaluated);
22
+ }
23
+ function isPolicyRelevantCandidate(candidate) {
24
+ return !candidate.candidate.penalties.some((penalty) => penalty.startsWith("role mismatch:"));
25
+ }
26
+ function compareCandidateEvaluations(left, right) {
27
+ if (left.candidate.accepted !== right.candidate.accepted)
28
+ return left.candidate.accepted ? -1 : 1;
29
+ const leftHasGeometry = hasGameGeometryEvidence(left);
30
+ const rightHasGeometry = hasGameGeometryEvidence(right);
31
+ if (leftHasGeometry !== rightHasGeometry)
32
+ return leftHasGeometry ? -1 : 1;
33
+ return right.candidate.score - left.candidate.score || left.candidate.id.localeCompare(right.candidate.id);
34
+ }
35
+ function retainGeometryCandidates(candidates) {
36
+ const retained = candidates.slice(0, MAX_RANKED_REPLACEMENT_CANDIDATES);
37
+ const retainedIds = new Set(retained.map((candidate) => candidate.candidate.id));
38
+ const extraGeometryCandidates = candidates.filter((candidate) => hasGameGeometryEvidence(candidate) && !retainedIds.has(candidate.candidate.id));
39
+ return [...retained, ...extraGeometryCandidates];
40
+ }
41
+ function hasGameGeometryEvidence(candidate) {
42
+ return Boolean(candidate.racingTopology || candidate.playableSurfaceMap);
43
+ }
44
+ function evaluateCandidate(options) {
45
+ const asset = options.asset;
46
+ const role = normalizeRole(asset.role, options.policy.requiredRole);
47
+ const provenance = createProvenance(asset);
48
+ const canonical = toCanonicalAsset(asset, role, provenance);
49
+ const baseScore = scoreAsset(canonical, options.query);
50
+ const reasons = [`asset-index scoreAsset ${roundScore(baseScore)}`];
51
+ const penalties = [];
52
+ if (roleMatchesPolicy(role, options.policy))
53
+ reasons.push(`role ${role} matches replacement policy`);
54
+ else
55
+ penalties.push(`role mismatch: ${role}`);
56
+ if (hasDurableProvenance(provenance))
57
+ reasons.push("durable provenance preserved");
58
+ else
59
+ penalties.push("missing durable provenance");
60
+ if (options.policy.minQuality === "release" && asset.quality !== "release")
61
+ penalties.push("quality is not release");
62
+ else if (asset.quality === "release")
63
+ reasons.push("release quality metadata present");
64
+ const releaseProbePath = `tests/reports/showcase-release-asset-probes/${asset.id}.json`;
65
+ const releaseProbePasses = releaseAssetProbePasses(releaseProbePath);
66
+ if (releaseProbePasses)
67
+ reasons.push("passing retained release probe");
68
+ else if (options.policy.requireRenderedProbe)
69
+ penalties.push("missing passing release probe");
70
+ if (options.rejectedHash && asset.hash === options.rejectedHash)
71
+ penalties.push("same content hash as rejected asset");
72
+ if (baseScore <= 0)
73
+ penalties.push("no resolver ranking match for replacement query");
74
+ penalties.push(...gameAssetPenalties(role, asset, options.query));
75
+ const geometryGate = gameGeometryGate(options.spec, role, asset, { projectDir: options.projectDir });
76
+ reasons.push(...geometryGate.reasons);
77
+ penalties.push(...geometryGate.penalties);
78
+ const penaltyCost = penalties.reduce((total, penalty) => {
79
+ if (penalty.startsWith("same content hash"))
80
+ return total + 100;
81
+ if (penalty.includes("provenance") || penalty.includes("release probe"))
82
+ return total + 50;
83
+ if (penalty.includes("quality") || penalty.includes("role mismatch"))
84
+ return total + 20;
85
+ if (penalty.includes("game asset"))
86
+ return total + 18;
87
+ return total + 8;
88
+ }, 0);
89
+ const score = Math.max(0, roundScore(baseScore + qualityBonus(asset) + evidenceBonus(releaseProbePasses) + gameAssetBonus(role, asset, options.query) - penaltyCost));
90
+ const accepted = score > 0 && penalties.length === 0;
91
+ return {
92
+ candidate: {
93
+ id: asset.id,
94
+ role,
95
+ typedRef: `assets.${asset.id}`,
96
+ score,
97
+ reasons,
98
+ penalties,
99
+ provenance,
100
+ evidence: releaseProbePasses ? releaseProbePath : undefined,
101
+ accepted,
102
+ selected: false
103
+ },
104
+ specAsset: {
105
+ id: asset.id,
106
+ role,
107
+ typedRef: `assets.${asset.id}`,
108
+ quality: asset.quality ?? "candidate",
109
+ hasDurableProvenance: hasDurableProvenance(provenance),
110
+ hasRenderedProbe: releaseProbePasses,
111
+ hasOrientationEvidence: Boolean(asset.orientation),
112
+ hasForegroundBounds: releaseProbePasses
113
+ },
114
+ ...(geometryGate.racingTopology ? { racingTopology: geometryGate.racingTopology } : {}),
115
+ ...(geometryGate.playableSurfaceMap ? { playableSurfaceMap: geometryGate.playableSurfaceMap } : {})
116
+ };
117
+ }
118
+ function toCanonicalAsset(asset, role, provenance) {
119
+ return {
120
+ id: `manifest:${asset.id}`,
121
+ source: provenance.sourcePage ?? asset.source ?? "aura-assets-manifest",
122
+ title: splitAssetId(asset.id).join(" "),
123
+ description: asset.suitabilityReason,
124
+ url: provenance.downloadUrl ?? asset.url ?? asset.source ?? "",
125
+ downloadUrl: provenance.downloadUrl ?? asset.url,
126
+ access: "direct-download",
127
+ format: "glb",
128
+ license: normalizeLicense(provenance.license, provenance.licenseUrl ?? provenance.sourcePage),
129
+ licenseName: provenance.license,
130
+ licenseUrl: provenance.licenseUrl,
131
+ tags: [...splitAssetId(asset.id), role.toLowerCase()],
132
+ sourcePage: provenance.sourcePage,
133
+ author: provenance.author,
134
+ attribution: provenance.author,
135
+ intendedRole: toCanonicalRole(role),
136
+ roleSuitability: asset.suitabilityReason,
137
+ bounds: asset.bounds ? { size: asset.bounds } : undefined,
138
+ dimensions: asset.boundsMetadata?.size,
139
+ materialCount: asset.materials?.length,
140
+ textureCount: asset.textures?.length,
141
+ animationClipCount: asset.animations?.length,
142
+ skinCount: asset.skeleton?.skinCount,
143
+ morphTargetCount: asset.morphTargets?.targetCount,
144
+ qualityWarnings: asset.warnings
145
+ };
146
+ }
147
+ function releaseAssetProbePasses(relativePath) {
148
+ const probe = readJson(relativePath);
149
+ const probeRecord = recordValue(probe);
150
+ const evidence = recordValue(probeRecord?.evidence);
151
+ const renderedProbe = recordValue(probeRecord?.renderedProbe);
152
+ return evidence?.pass === true &&
153
+ stringArray(evidence.failures).length === 0 &&
154
+ typeof renderedProbe?.sha256 === "string" &&
155
+ Boolean(recordValue(renderedProbe.foregroundBounds));
156
+ }
157
+ function normalizeRole(role, requiredRole) {
158
+ if (role && role.trim())
159
+ return role;
160
+ return requiredRole === "platformer-world" ? "world" : requiredRole ?? "world";
161
+ }
162
+ function roleMatchesPolicy(role, policy) {
163
+ if (!policy.requiredRole)
164
+ return true;
165
+ if (policy.requiredRole === "architecture")
166
+ return role === "architecture" || role === "building" || role === "environment";
167
+ if (policy.requiredRole === "building")
168
+ return role === "building" || role === "architecture" || role === "environment";
169
+ if (policy.requiredRole === "data-station")
170
+ return role === "data-station" || role === "abstract" || role === "effect-core";
171
+ if (policy.requiredRole === "effect-core")
172
+ return role === "effect-core" || role === "prop";
173
+ if (policy.requiredRole === "facility" || policy.requiredRole === "industrial")
174
+ return role === "facility" || role === "industrial" || role === "workcell" || role === "prop";
175
+ if (policy.requiredRole === "platformer-world")
176
+ return role === "world" || role === "stage" || role === "level";
177
+ if (policy.requiredRole === "level")
178
+ return role === "level" || role === "stage" || role === "world";
179
+ return role === policy.requiredRole;
180
+ }
181
+ function toCanonicalRole(role) {
182
+ if (role === "character")
183
+ return "character";
184
+ if (role === "vehicle")
185
+ return "vehicle";
186
+ if (role === "architecture" || role === "building" || role === "facility" || role === "industrial" || role === "workcell")
187
+ return "environment";
188
+ if (role === "abstract" || role === "data-station" || role === "effect-core" || role === "prop")
189
+ return "prop";
190
+ if (role === "level" || role === "stage")
191
+ return "world";
192
+ if (role === "environment")
193
+ return "environment";
194
+ if (role === "track")
195
+ return "track";
196
+ if (role === "world")
197
+ return "world";
198
+ return "unknown";
199
+ }
200
+ function qualityBonus(asset) {
201
+ return asset.quality === "release" ? 18 : asset.quality === "candidate" ? 8 : 0;
202
+ }
203
+ function evidenceBonus(releaseProbePasses) {
204
+ return releaseProbePasses ? 24 : 0;
205
+ }
206
+ function gameAssetBonus(role, asset, query) {
207
+ const tokens = gameTokens(asset, query);
208
+ if (role === "vehicle")
209
+ return hasAny(tokens, ["car", "kart", "sports", "race", "vehicle"]) ? 20 : 0;
210
+ if (role === "track")
211
+ return hasAny(tokens, ["track", "circuit", "road", "race", "route"]) ? 20 : 0;
212
+ if (role === "character")
213
+ return hasAny(tokens, ["runner", "character", "animated", "walk", "hero"]) ? 20 : 0;
214
+ if (role === "world" || role === "stage" || role === "level")
215
+ return hasAny(tokens, ["platform", "platformer", "side", "scroller", "level", "stage", "world"]) ? 20 : 0;
216
+ return 0;
217
+ }
218
+ function gameAssetPenalties(role, asset, query) {
219
+ const tokens = gameTokens(asset, query);
220
+ if (role === "vehicle" && !hasAny(tokens, ["car", "kart", "sports", "race", "vehicle"]))
221
+ return ["game asset vehicle role lacks readable racing vehicle terms"];
222
+ if (role === "track" && !hasAny(tokens, ["track", "circuit", "road", "race", "route"]))
223
+ return ["game asset track role lacks visible road/circuit terms"];
224
+ if (role === "character" && !hasAny(tokens, ["runner", "character", "animated", "walk", "hero"]))
225
+ return ["game asset character role lacks locomotion/runner terms"];
226
+ if ((role === "world" || role === "stage" || role === "level") && !hasAny(tokens, ["platform", "platformer", "side", "scroller", "level", "stage", "world"])) {
227
+ return ["game asset platformer world role lacks side-scroller/platform terms"];
228
+ }
229
+ return [];
230
+ }
231
+ function gameTokens(asset, query) {
232
+ return new Set([...splitAssetId(asset.id), ...splitAssetId(query), ...splitAssetId(asset.suitabilityReason ?? ""), String(asset.role ?? "").toLowerCase()].filter(Boolean));
233
+ }
234
+ function hasAny(tokens, expected) {
235
+ return expected.some((token) => tokens.has(token));
236
+ }
237
+ function splitAssetId(id) {
238
+ return id
239
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
240
+ .toLowerCase()
241
+ .split(/[^a-z0-9]+/)
242
+ .filter(Boolean);
243
+ }
244
+ //# sourceMappingURL=showcase-spec-replacement-candidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase-spec-replacement-candidates.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-replacement-candidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ShowcasePlatformerPlayableSurfaceMap, ShowcaseRacingTrackTopology } from "./showcase-spec-types.js";
2
+ export declare function parseRacingTrackTopology(value: unknown): ShowcaseRacingTrackTopology | undefined;
3
+ export declare function parsePlatformerPlayableSurfaceMap(value: unknown): ShowcasePlatformerPlayableSurfaceMap | undefined;
4
+ //# sourceMappingURL=showcase-spec-replacement-game-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase-spec-replacement-game-geometry.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-replacement-game-geometry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,oCAAoC,EAGpC,2BAA2B,EAG5B,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,2BAA2B,GAAG,SAAS,CAyBhG;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,oCAAoC,GAAG,SAAS,CAyBlH"}
@@ -0,0 +1,175 @@
1
+ import { numberValue, recordValue, stringValue, vectorValue } from "./showcase-spec-replacement-values.js";
2
+ export function parseRacingTrackTopology(value) {
3
+ const record = recordValue(value);
4
+ const assetId = stringValue(record?.assetId);
5
+ const assetHash = stringValue(record?.assetHash);
6
+ const source = geometrySourceValue(record?.source);
7
+ const roadCenterline = arrayOf(record?.roadCenterline, parseRacingTrackTopologyPoint);
8
+ const checkpoints = arrayOf(record?.checkpoints, parseRacingTrackTopologyCheckpoint);
9
+ const estimatedLapSeconds = numberValue(record?.estimatedLapSeconds);
10
+ const confidence = numberValue(record?.confidence);
11
+ const modelAlignment = parseRacingModelAlignment(record?.modelAlignment);
12
+ const evidence = parseGeometryEvidenceRef(record?.evidence);
13
+ if (!assetId || !assetHash || !source || !roadCenterline || !checkpoints || estimatedLapSeconds === undefined || confidence === undefined || !modelAlignment || !evidence)
14
+ return undefined;
15
+ const lapLengthMeters = numberValue(record?.lapLengthMeters);
16
+ return {
17
+ assetId,
18
+ assetHash,
19
+ source,
20
+ roadCenterline,
21
+ checkpoints,
22
+ ...(lapLengthMeters === undefined ? {} : { lapLengthMeters }),
23
+ estimatedLapSeconds,
24
+ confidence,
25
+ modelAlignment,
26
+ evidence
27
+ };
28
+ }
29
+ export function parsePlatformerPlayableSurfaceMap(value) {
30
+ const record = recordValue(value);
31
+ const assetId = stringValue(record?.assetId);
32
+ const assetHash = stringValue(record?.assetHash);
33
+ const source = geometrySourceValue(record?.source);
34
+ const surfaces = arrayOf(record?.surfaces, parsePlatformerPlayableSurface);
35
+ const levelLength = numberValue(record?.levelLength);
36
+ const estimatedCompletionSeconds = numberValue(record?.estimatedCompletionSeconds);
37
+ const characterScaleRatio = numberValue(record?.characterScaleRatio);
38
+ const confidence = numberValue(record?.confidence);
39
+ const modelAlignment = parsePlatformerModelAlignment(record?.modelAlignment);
40
+ const evidence = parseGeometryEvidenceRef(record?.evidence);
41
+ if (!assetId || !assetHash || !source || !surfaces || levelLength === undefined || estimatedCompletionSeconds === undefined || characterScaleRatio === undefined || confidence === undefined || !modelAlignment || !evidence)
42
+ return undefined;
43
+ return {
44
+ assetId,
45
+ assetHash,
46
+ source,
47
+ surfaces,
48
+ levelLength,
49
+ estimatedCompletionSeconds,
50
+ characterScaleRatio,
51
+ confidence,
52
+ modelAlignment,
53
+ evidence
54
+ };
55
+ }
56
+ function arrayOf(value, parse) {
57
+ return Array.isArray(value) ? value.flatMap(parse) : undefined;
58
+ }
59
+ function parseRacingTrackTopologyPoint(value) {
60
+ const record = recordValue(value);
61
+ const x = numberValue(record?.x);
62
+ const z = numberValue(record?.z);
63
+ if (x === undefined || z === undefined)
64
+ return [];
65
+ const width = numberValue(record?.width);
66
+ return [{ x, z, ...(width === undefined ? {} : { width }) }];
67
+ }
68
+ function parseRacingTrackTopologyCheckpoint(value) {
69
+ const record = recordValue(value);
70
+ const progress = numberValue(record?.progress);
71
+ const width = numberValue(record?.width);
72
+ return progress === undefined || width === undefined ? [] : [{ progress, width }];
73
+ }
74
+ function parsePlatformerPlayableSurface(value) {
75
+ const record = recordValue(value);
76
+ const id = stringValue(record?.id);
77
+ const x = numberValue(record?.x);
78
+ const y = numberValue(record?.y);
79
+ const width = numberValue(record?.width);
80
+ const height = numberValue(record?.height);
81
+ const kind = playableSurfaceKindValue(record?.kind);
82
+ return !id || x === undefined || y === undefined || width === undefined || height === undefined || !kind
83
+ ? []
84
+ : [{ id, x, y, width, height, kind }];
85
+ }
86
+ function parseRacingModelAlignment(value) {
87
+ const record = recordValue(value);
88
+ const source = geometrySourceValue(record?.source);
89
+ const modelBounds = parseModelBounds(record?.modelBounds);
90
+ const modelPoint = vectorValue(record?.modelPoint);
91
+ const gamePointRecord = recordValue(record?.gamePoint);
92
+ const x = numberValue(gamePointRecord?.x);
93
+ const z = numberValue(gamePointRecord?.z);
94
+ const evidence = parseAlignmentEvidence(record?.evidence);
95
+ const anchorPairs = arrayOf(record?.anchorPairs, parseRacingModelAnchor);
96
+ return !source || !modelBounds || !modelPoint || x === undefined || z === undefined || !evidence
97
+ ? undefined
98
+ : { source, modelBounds, modelPoint, gamePoint: { x, z }, ...(anchorPairs ? { anchorPairs } : {}), evidence };
99
+ }
100
+ function parsePlatformerModelAlignment(value) {
101
+ const record = recordValue(value);
102
+ const source = geometrySourceValue(record?.source);
103
+ const modelBounds = parseModelBounds(record?.modelBounds);
104
+ const modelPoint = vectorValue(record?.modelPoint);
105
+ const gamePointRecord = recordValue(record?.gamePoint);
106
+ const x = numberValue(gamePointRecord?.x);
107
+ const y = numberValue(gamePointRecord?.y);
108
+ const evidence = parseAlignmentEvidence(record?.evidence);
109
+ const anchorPairs = arrayOf(record?.anchorPairs, parsePlatformerModelAnchor);
110
+ return !source || !modelBounds || !modelPoint || x === undefined || y === undefined || !evidence
111
+ ? undefined
112
+ : { source, modelBounds, modelPoint, gamePoint: { x, y }, ...(anchorPairs ? { anchorPairs } : {}), evidence };
113
+ }
114
+ function parseRacingModelAnchor(value) {
115
+ const record = recordValue(value);
116
+ const id = stringValue(record?.id);
117
+ const modelPoint = vectorValue(record?.modelPoint);
118
+ const gamePointRecord = recordValue(record?.gamePoint);
119
+ const x = numberValue(gamePointRecord?.x);
120
+ const z = numberValue(gamePointRecord?.z);
121
+ return !id || !modelPoint || x === undefined || z === undefined ? [] : [{ id, modelPoint, gamePoint: { x, z } }];
122
+ }
123
+ function parsePlatformerModelAnchor(value) {
124
+ const record = recordValue(value);
125
+ const id = stringValue(record?.id);
126
+ const modelPoint = vectorValue(record?.modelPoint);
127
+ const gamePointRecord = recordValue(record?.gamePoint);
128
+ const x = numberValue(gamePointRecord?.x);
129
+ const y = numberValue(gamePointRecord?.y);
130
+ return !id || !modelPoint || x === undefined || y === undefined ? [] : [{ id, modelPoint, gamePoint: { x, y } }];
131
+ }
132
+ function parseModelBounds(value) {
133
+ const record = recordValue(value);
134
+ const min = vectorValue(record?.min);
135
+ const max = vectorValue(record?.max);
136
+ return min && max ? { min, max } : undefined;
137
+ }
138
+ function parseGeometryEvidenceRef(value) {
139
+ const record = recordValue(value);
140
+ const sourceAsset = stringValue(record?.sourceAsset);
141
+ const notes = stringValue(record?.notes);
142
+ if (!sourceAsset || !notes)
143
+ return undefined;
144
+ const renderedProbe = stringValue(record?.renderedProbe);
145
+ const routeOverlay = stringValue(record?.routeOverlay);
146
+ return { sourceAsset, ...(renderedProbe ? { renderedProbe } : {}), ...(routeOverlay ? { routeOverlay } : {}), notes };
147
+ }
148
+ function parseAlignmentEvidence(value) {
149
+ const record = recordValue(value);
150
+ const notes = stringValue(record?.notes);
151
+ if (!notes)
152
+ return undefined;
153
+ const routeOverlay = stringValue(record?.routeOverlay);
154
+ return { ...(routeOverlay ? { routeOverlay } : {}), notes };
155
+ }
156
+ function geometrySourceValue(value) {
157
+ return value === "asset-mesh-extracted" ||
158
+ value === "manifest-authored" ||
159
+ value === "manifest-authored-overlay-validated" ||
160
+ value === "compiler-authored" ||
161
+ value === "compiler-authored-overlay-validated"
162
+ ? value
163
+ : undefined;
164
+ }
165
+ function playableSurfaceKindValue(value) {
166
+ return value === "ground" ||
167
+ value === "platform" ||
168
+ value === "moving" ||
169
+ value === "hazard" ||
170
+ value === "checkpoint" ||
171
+ value === "finish"
172
+ ? value
173
+ : undefined;
174
+ }
175
+ //# sourceMappingURL=showcase-spec-replacement-game-geometry.js.map