create-aura3d 1.1.1 → 1.3.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 (212) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -4
  4. package/dist/index.js.map +1 -1
  5. package/package.json +11 -9
  6. package/templates/{cartoon-channel → animation-channel}/README.md +20 -10
  7. package/templates/{cartoon-studio → animation-channel}/index.html +1 -1
  8. package/templates/{cartoon-channel → animation-channel}/package.json +2 -2
  9. package/templates/{cartoon-channel → animation-channel}/src/episode.ts +22 -22
  10. package/templates/animation-channel/src/experimental/README.md +24 -0
  11. package/templates/{cartoon-channel/src → animation-channel/src/experimental}/concept-episode-2-5d.css +3 -3
  12. package/templates/{cartoon-channel/src → animation-channel/src/experimental}/concept-episode-2-5d.ts +8 -8
  13. package/templates/{cartoon-channel/src → animation-channel/src/experimental}/image-puppet-episode.css +4 -4
  14. package/templates/{cartoon-channel/src → animation-channel/src/experimental}/image-puppet-episode.ts +7 -7
  15. package/templates/{cartoon-channel/src → animation-channel/src/experimental}/puppet-episode-2d.css +3 -3
  16. package/templates/{cartoon-channel/src → animation-channel/src/experimental}/puppet-episode-2d.ts +8 -8
  17. package/templates/{cartoon-channel → animation-channel}/src/main.ts +32 -32
  18. package/templates/{cartoon-channel → animation-channel}/src/render-plan.ts +13 -13
  19. package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.css +34 -34
  20. package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.ts +20 -20
  21. package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d-animation.spec.ts +3 -3
  22. package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d.spec.ts +6 -6
  23. package/templates/{cartoon-channel → animation-channel}/tests/image-puppet-animation.spec.ts +3 -3
  24. package/templates/{cartoon-channel → animation-channel}/tests/image-puppet.spec.ts +5 -5
  25. package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d-animation.spec.ts +3 -3
  26. package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d.spec.ts +4 -4
  27. package/templates/{prompt-cartoon-channel → animation-channel}/tests/route-health.spec.ts +1 -1
  28. package/templates/{cartoon-channel → animation-channel}/tests/sample-episode-visual.spec.ts +5 -5
  29. package/templates/{cartoon-channel → animation-channel}/tests/storyboard-playback.spec.ts +7 -7
  30. package/templates/animation-studio/AGENTS.md +71 -0
  31. package/templates/animation-studio/ASSET-LICENSES.md +41 -0
  32. package/templates/{cartoon-studio → animation-studio}/README.md +6 -6
  33. package/templates/animation-studio/aura.assets.json +669 -0
  34. package/templates/animation-studio/dist/episodes/scene/episode-3d.webm +0 -0
  35. package/templates/animation-studio/dist/episodes/scene/frames/action.png +0 -0
  36. package/templates/animation-studio/dist/episodes/scene/frames/dialogue.png +0 -0
  37. package/templates/animation-studio/dist/episodes/scene/frames/final.png +0 -0
  38. package/templates/animation-studio/dist/episodes/scene/frames/first.png +0 -0
  39. package/templates/animation-studio/dist/episodes/scene/frames/mouth-closed.png +0 -0
  40. package/templates/animation-studio/dist/episodes/scene/frames/mouth-open.png +0 -0
  41. package/templates/animation-studio/dist/episodes/scene/render-live-summary.json +10284 -0
  42. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-1.png +0 -0
  43. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-2.png +0 -0
  44. package/templates/animation-studio/dist/generated/second-scene.document.json +1210 -0
  45. package/templates/animation-studio/dist/generated/studio-edited.document.json +1196 -0
  46. package/templates/animation-studio/dist/scene/inshader-accept.document.json +1 -0
  47. package/templates/animation-studio/dist/scene/inshader-test.document.json +1 -0
  48. package/templates/animation-studio/dist/scene/integ.document.json +1 -0
  49. package/templates/animation-studio/dist/scene/working.document.json +723 -0
  50. package/templates/animation-studio/dist/scene/working.history.json +1 -0
  51. package/templates/{cartoon-channel/index.html → animation-studio/live-route.html} +3 -4
  52. package/templates/{cartoon-studio → animation-studio}/package-lock.json +2 -2
  53. package/templates/animation-studio/package.json +32 -0
  54. package/templates/animation-studio/public/aura-assets/cast-a.catalog.glb +0 -0
  55. package/templates/animation-studio/public/aura-assets/cast-b.catalog.glb +0 -0
  56. package/templates/animation-studio/public/aura-assets/luma.catalog.glb +0 -0
  57. package/templates/animation-studio/public/aura-assets/luma2.catalog.glb +0 -0
  58. package/templates/animation-studio/public/aura-assets/miko.catalog.glb +0 -0
  59. package/templates/{cartoon-studio → animation-studio}/public/aura-assets/moonGarden.gltf +1 -1
  60. package/templates/animation-studio/public/aura-assets/mushroom.catalog.glb +0 -0
  61. package/templates/animation-studio/public/aura-assets/rusty.catalog.glb +0 -0
  62. package/templates/animation-studio/public/cast-library/cast-library.json +71 -0
  63. package/templates/animation-studio/public/clip-library/gesture.json +173903 -0
  64. package/templates/animation-studio/public/clip-library/idle.json +23035 -0
  65. package/templates/animation-studio/public/clip-library/manifest.json +154 -0
  66. package/templates/animation-studio/public/clip-library/nod.json +173903 -0
  67. package/templates/animation-studio/public/clip-library/point.json +69879 -0
  68. package/templates/animation-studio/public/clip-library/react.json +66084 -0
  69. package/templates/animation-studio/public/clip-library/run.json +9648 -0
  70. package/templates/animation-studio/public/clip-library/talk.json +69879 -0
  71. package/templates/animation-studio/public/clip-library/walk.json +8283 -0
  72. package/templates/animation-studio/public/hifi-cast/BrainStem.glb +0 -0
  73. package/templates/animation-studio/public/hifi-cast/CesiumMan.glb +0 -0
  74. package/templates/animation-studio/public/hifi-cast/RiggedFigure.glb +0 -0
  75. package/templates/animation-studio/public/hifi-cast/kaykit/Barbarian.glb +0 -0
  76. package/templates/animation-studio/public/hifi-cast/kaykit/Knight.glb +0 -0
  77. package/templates/animation-studio/public/hifi-cast/kaykit/Mage.glb +0 -0
  78. package/templates/animation-studio/public/hifi-cast/kaykit/Rogue.glb +0 -0
  79. package/templates/animation-studio/public/hifi-cast/kaykit/Rogue_Hooded.glb +0 -0
  80. package/templates/animation-studio/public/hifi-cast/khronos-report.json +295 -0
  81. package/templates/animation-studio/public/hifi-cast/quaternius-report.json +449 -0
  82. package/templates/animation-studio/public/hifi-cast/rpm/cesiumman.glb +0 -0
  83. package/templates/animation-studio/public/hifi-cast/rpm/fox.glb +0 -0
  84. package/templates/animation-studio/public/hifi-cast/rpm/riggedfigure.glb +0 -0
  85. package/templates/animation-studio/public/hifi-cast/rpm-report.json +301 -0
  86. package/templates/animation-studio/scripts/anim.ts +103 -0
  87. package/templates/animation-studio/scripts/animation-scene.ts +457 -0
  88. package/templates/animation-studio/scripts/asset-motion-probe.ts +450 -0
  89. package/templates/animation-studio/scripts/asset-render-probe.ts +152 -0
  90. package/templates/animation-studio/scripts/author-office-scene.ts +65 -0
  91. package/templates/animation-studio/scripts/build-cast-library.ts +97 -0
  92. package/templates/animation-studio/scripts/build-characters.ts +1543 -0
  93. package/templates/animation-studio/scripts/build-clip-library.ts +972 -0
  94. package/templates/animation-studio/scripts/clip-decision-cli.ts +51 -0
  95. package/templates/animation-studio/scripts/determinism-check.ts +48 -0
  96. package/templates/animation-studio/scripts/generate-scene.ts +95 -0
  97. package/templates/animation-studio/scripts/hifi-cast-validate.ts +572 -0
  98. package/templates/animation-studio/scripts/motion-evidence-cli.ts +150 -0
  99. package/templates/animation-studio/scripts/motion-evidence.ts +362 -0
  100. package/templates/animation-studio/scripts/preview-server.ts +52 -0
  101. package/templates/animation-studio/scripts/regen-manifest.ts +156 -0
  102. package/templates/animation-studio/scripts/render-core.ts +360 -0
  103. package/templates/animation-studio/scripts/render-live.ts +813 -0
  104. package/templates/animation-studio/scripts/render-parallel.ts +70 -0
  105. package/templates/animation-studio/scripts/render-server.ts +119 -0
  106. package/templates/animation-studio/scripts/resolve-asset.ts +669 -0
  107. package/templates/animation-studio/scripts/skeleton-overlay-cli.ts +82 -0
  108. package/templates/animation-studio/scripts/skeleton-overlay.ts +293 -0
  109. package/templates/animation-studio/scripts/studio-tools-demo.ts +45 -0
  110. package/templates/animation-studio/scripts/texture-bake.ts +297 -0
  111. package/templates/animation-studio/scripts/validate-characters.ts +0 -0
  112. package/templates/animation-studio/scripts/verify-extracted-overlay-cli.ts +264 -0
  113. package/templates/animation-studio/src/animation-episode-validator.ts +97 -0
  114. package/templates/animation-studio/src/animation-performance.ts +556 -0
  115. package/templates/animation-studio/src/aura-assets.ts +71 -0
  116. package/templates/animation-studio/src/character.ts +40 -0
  117. package/templates/animation-studio/src/director/compile-episode-document.ts +45 -0
  118. package/templates/animation-studio/src/director/director-heuristics.ts +697 -0
  119. package/templates/animation-studio/src/director/prompt-to-scene.ts +369 -0
  120. package/templates/animation-studio/src/empty-document.ts +77 -0
  121. package/templates/animation-studio/src/episode-document.ts +442 -0
  122. package/templates/animation-studio/src/examples/moon-garden.example.ts +183 -0
  123. package/templates/animation-studio/src/fidelity.ts +129 -0
  124. package/templates/animation-studio/src/graph.ts +14 -0
  125. package/templates/animation-studio/src/procedural-hdri.ts +243 -0
  126. package/templates/animation-studio/src/profile.ts +97 -0
  127. package/templates/animation-studio/src/render-live-route.ts +42 -0
  128. package/templates/animation-studio/src/render-modes.ts +137 -0
  129. package/templates/animation-studio/src/scene-player.ts +867 -0
  130. package/templates/animation-studio/src/set-templates.ts +361 -0
  131. package/templates/animation-studio/src/studio/episode-document-store.ts +72 -0
  132. package/templates/animation-studio/src/studio/scene-tool-registry.ts +86 -0
  133. package/templates/animation-studio/src/studio/scene-tools.ts +169 -0
  134. package/templates/animation-studio/tests/reports/animation-studio/hifi-cast-validation.json +938 -0
  135. package/templates/animation-studio/tsconfig.json +26 -0
  136. package/templates/animation-studio/vite.config.ts +18 -0
  137. package/templates/character-controller/README.md +33 -0
  138. package/templates/character-controller/index.html +19 -0
  139. package/templates/character-controller/package.json +23 -0
  140. package/templates/character-controller/playwright.config.ts +14 -0
  141. package/templates/character-controller/src/controller.ts +44 -0
  142. package/templates/character-controller/src/main.ts +62 -0
  143. package/templates/character-controller/tests/route-health.spec.ts +26 -0
  144. package/templates/character-controller/tests/screenshot.spec.ts +9 -0
  145. package/templates/character-controller/tsconfig.json +15 -0
  146. package/templates/cinematic-scene/package.json +1 -1
  147. package/templates/episode-builder/README.md +6 -2
  148. package/templates/episode-builder/package.json +1 -1
  149. package/templates/episode-builder/src/aura-assets.ts +1 -1
  150. package/templates/episode-builder/src/builder.ts +4 -4
  151. package/templates/episode-builder/src/episode.ts +21 -21
  152. package/templates/episode-builder/src/main.ts +20 -20
  153. package/templates/episode-builder/src/render-plan.ts +13 -13
  154. package/templates/episode-builder/tests/storyboard-playback.spec.ts +7 -7
  155. package/templates/fighting-game/README.md +16 -0
  156. package/templates/fighting-game/package.json +1 -1
  157. package/templates/mini-game/package.json +1 -1
  158. package/templates/product-viewer/package.json +1 -1
  159. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/README.md +7 -3
  160. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/index.html +1 -1
  161. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/package.json +2 -2
  162. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/aura-assets.ts +1 -1
  163. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/episode.ts +22 -22
  164. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/main.ts +28 -28
  165. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/render-plan.ts +13 -13
  166. package/templates/{cartoon-channel → prompt-animation-channel}/tests/route-health.spec.ts +1 -1
  167. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tests/storyboard-playback.spec.ts +8 -8
  168. package/templates/cartoon-studio/aura.assets.json +0 -157
  169. package/templates/cartoon-studio/package.json +0 -32
  170. package/templates/cartoon-studio/public/aura-assets/luma.047f5e5f.glb +0 -0
  171. package/templates/cartoon-studio/public/aura-assets/luma.humanoid-fixture.glb +0 -0
  172. package/templates/cartoon-studio/public/aura-assets/miko.047f5e5f.glb +0 -0
  173. package/templates/cartoon-studio/scripts/episode.ts +0 -276
  174. package/templates/cartoon-studio/src/aura-assets.ts +0 -61
  175. package/templates/cartoon-studio/src/characters.ts +0 -65
  176. package/templates/cartoon-studio/src/episode-renderer.ts +0 -605
  177. package/templates/cartoon-studio/src/episode.ts +0 -306
  178. package/templates/cartoon-studio/src/main.ts +0 -333
  179. package/templates/cartoon-studio/src/render-plan.ts +0 -567
  180. package/templates/cartoon-studio/src/review.ts +0 -99
  181. package/templates/cartoon-studio/src/studio.ts +0 -101
  182. package/templates/cartoon-studio/test-results/.last-run.json +0 -4
  183. package/templates/cartoon-studio/tests/episode-render.spec.ts +0 -44
  184. package/templates/cartoon-studio/tests/motion-quality.spec.ts +0 -45
  185. package/templates/cartoon-studio/tests/route-health.spec.ts +0 -7
  186. package/templates/cartoon-studio/tests/storyboard-playback.spec.ts +0 -99
  187. package/templates/cartoon-studio/tests/visual-review.spec.ts +0 -21
  188. package/templates/prompt-cartoon-channel/src/sets.ts +0 -14
  189. package/templates/prompt-cartoon-channel/tsconfig.json +0 -12
  190. /package/templates/{cartoon-channel → animation-channel}/aura.assets.json +0 -0
  191. /package/templates/{cartoon-channel → animation-channel}/playwright.config.ts +0 -0
  192. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.047f5e5f.glb +0 -0
  193. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.thumb.svg +0 -0
  194. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.047f5e5f.glb +0 -0
  195. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.thumb.svg +0 -0
  196. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/moon-garden-feature-frame.png +0 -0
  197. /package/templates/{cartoon-channel → animation-channel}/src/aura-assets.ts +0 -0
  198. /package/templates/{cartoon-channel → animation-channel}/src/characters.ts +0 -0
  199. /package/templates/{cartoon-channel → animation-channel}/src/contract.ts +0 -0
  200. /package/templates/{cartoon-channel → animation-channel}/src/sets.ts +0 -0
  201. /package/templates/{cartoon-channel → animation-channel}/test-results/.last-run.json +0 -0
  202. /package/templates/{cartoon-channel → animation-channel}/tests/reports/prompt-animation/cartoon-sample-episode.png +0 -0
  203. /package/templates/{cartoon-channel → animation-channel}/tsconfig.json +0 -0
  204. /package/templates/{cartoon-studio → animation-studio}/playwright.config.ts +0 -0
  205. /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/luma.thumb.svg +0 -0
  206. /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/miko.thumb.svg +0 -0
  207. /package/templates/{cartoon-studio → animation-studio}/src/contract.ts +0 -0
  208. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/playwright.config.ts +0 -0
  209. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/characters.ts +0 -0
  210. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/contract.ts +0 -0
  211. /package/templates/{cartoon-studio → prompt-animation-channel}/src/sets.ts +0 -0
  212. /package/templates/{cartoon-studio → prompt-animation-channel}/tsconfig.json +0 -0
@@ -1,306 +0,0 @@
1
- import { compilePromptEpisodePlan, type AuraAssetRef } from "@aura3d/engine";
2
- import { assets } from "./aura-assets";
3
- import { AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID } from "./contract";
4
-
5
- export const episodeContractId = AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID;
6
-
7
- export type CartoonAssetKey = "miko" | "luma" | "moonGarden" | "glowBroom" | "glowStones" | "moonLilies";
8
-
9
- type TypedCartoonAssets = Partial<Record<CartoonAssetKey, AuraAssetRef<"model">>>;
10
-
11
- const typedCartoonAssets = assets as TypedCartoonAssets;
12
-
13
- export const requiredCartoonCharacterAssets = ["miko", "luma"] as const;
14
- export const requiredCartoonSetAssets = ["moonGarden"] as const;
15
- export const optionalCartoonPropAssets = ["glowBroom", "glowStones", "moonLilies"] as const;
16
- export const publicCartoonAssetInstructions = [
17
- "npx @aura3d/cli@latest assets resolve \"stylized rigged cartoon child robot\" --name miko --profile cartoon-character",
18
- "npx @aura3d/cli@latest assets resolve \"stylized rigged cartoon helper robot\" --name luma --profile cartoon-character",
19
- "npx @aura3d/cli@latest assets resolve \"stylized moon garden set\" --name moonGarden --profile cartoon-set",
20
- "npx @aura3d/cli@latest assets validate-cartoon --episode --require-license --no-placeholders"
21
- ] as const;
22
-
23
- export const missingCartoonCharacterAssets = requiredCartoonCharacterAssets.filter((key) => !typedCartoonAssets[key]);
24
- export const missingCartoonSetAssets = requiredCartoonSetAssets.filter((key) => !typedCartoonAssets[key]);
25
- export const typedCartoonAssetSummary = {
26
- requiredCharacterAssets: requiredCartoonCharacterAssets,
27
- requiredSetAssets: requiredCartoonSetAssets,
28
- optionalPropAssets: optionalCartoonPropAssets,
29
- typedCharacterAssetCount: requiredCartoonCharacterAssets.length - missingCartoonCharacterAssets.length,
30
- typedSetAssetCount: requiredCartoonSetAssets.length - missingCartoonSetAssets.length,
31
- missingCharacterAssets: missingCartoonCharacterAssets,
32
- missingSetAssets: missingCartoonSetAssets
33
- } as const;
34
-
35
- function typedAsset(key: CartoonAssetKey): AuraAssetRef<"model"> | undefined {
36
- return typedCartoonAssets[key];
37
- }
38
-
39
- export const youtubeDraftMetadata = {
40
- contractId: episodeContractId,
41
- title: "Moon Garden Cleanup | Aura3D Cartoon Studio",
42
- description: "Two tiny robots clean a glowing moon garden with soft captions and reduced-flash visuals.",
43
- tags: ["Aura3D", "kids cartoon", "moon garden", "robots"],
44
- madeForKids: true,
45
- thumbnailCaptureTime: 10,
46
- defaultLanguage: "en",
47
- privacyStatus: "private"
48
- } as const;
49
-
50
- export const episodeAudioCues = [
51
- {
52
- id: "music:moon-garden-lullaby",
53
- role: "music",
54
- path: "assets/audio/music/moon-garden-lullaby-loop.wav",
55
- startTime: 0,
56
- duration: 60,
57
- gainDb: -18,
58
- ducking: "under-dialogue"
59
- },
60
- {
61
- id: "ambience:moon-garden-night",
62
- role: "ambience",
63
- path: "assets/audio/ambience/moon-garden-night.wav",
64
- startTime: 0,
65
- duration: 60,
66
- gainDb: -22,
67
- ducking: "none"
68
- },
69
- {
70
- id: "sfx:glow-stone-chime",
71
- role: "sfx",
72
- path: "assets/audio/sfx/glow-stone-chime.wav",
73
- startTime: 38.5,
74
- duration: 1.25,
75
- gainDb: -9,
76
- ducking: "none"
77
- }
78
- ] as const;
79
-
80
- export const episodeSampleDescription = {
81
- contractId: episodeContractId,
82
- runtimeSeconds: 60,
83
- shotCount: 3,
84
- speakingCharacters: ["miko", "luma"],
85
- captionSource: "captions are derived one-to-one from the AuraVoice dialogue track",
86
- performanceSource: "body, facial, gesture, blocking, and gaze cues are generated from the cartoon director",
87
- musicAmbience: ["music:moon-garden-lullaby", "ambience:moon-garden-night"],
88
- sfxCue: "sfx:glow-stone-chime",
89
- thumbnailCaptureTime: youtubeDraftMetadata.thumbnailCaptureTime,
90
- thumbnailSource: "same Aura3D scene state and AuraVoice timestamp as the render queue capture",
91
- typedAssetSource: "./src/aura-assets",
92
- requiredTypedAssets: requiredCartoonCharacterAssets,
93
- missingTypedAssets: missingCartoonCharacterAssets,
94
- assetCommands: publicCartoonAssetInstructions,
95
- reviewPackageRequiredPaths: ["video", "captions", "thumbnail", "timeline", "audio-stems", "evidence-json", "youtube-draft-metadata"],
96
- accessibilityProof: ["captions", "reduced motion", "high contrast"]
97
- } as const;
98
-
99
- export const episode = compilePromptEpisodePlan({
100
- episodeId: "moon-garden-cleanup-001",
101
- title: "Moon Garden Cleanup",
102
- prompt: "Two tiny robots clean a glowing moon garden.",
103
- language: "en",
104
- runtime: {
105
- duration: 60,
106
- frameRate: 30,
107
- resolution: { width: 1280, height: 720 },
108
- aspectRatio: "16:9",
109
- reducedMotion: true,
110
- highContrast: true,
111
- maxTimingDriftFrames: 1
112
- },
113
- route: "/",
114
- characters: [
115
- {
116
- id: "miko",
117
- name: "Miko",
118
- role: "hero",
119
- voiceId: "auravoice-miko-soft",
120
- style: "round cyan robot",
121
- ...(typedAsset("miko") ? { asset: typedAsset("miko") } : {})
122
- },
123
- {
124
- id: "luma",
125
- name: "Luma",
126
- role: "sidekick",
127
- voiceId: "auravoice-luma-bright",
128
- style: "small gold garden helper",
129
- ...(typedAsset("luma") ? { asset: typedAsset("luma") } : {})
130
- }
131
- ],
132
- locations: [
133
- {
134
- id: "moon-garden",
135
- name: "Moon Garden",
136
- description: "A tiny crater garden with glowing pebbles, sleepy flowers, and a blue planet skyline.",
137
- mood: "soft neon bedtime"
138
- }
139
- ],
140
- props: [
141
- {
142
- id: "glow-broom",
143
- name: "Glow Broom",
144
- role: "hero-prop",
145
- description: "A soft crescent broom that sweeps moon dust without sharp motion.",
146
- ownerCharacterId: "miko",
147
- locationId: "moon-garden",
148
- ...(typedAsset("glowBroom") ? { asset: typedAsset("glowBroom") } : {}),
149
- primitiveFallback: "thin rounded cylinder handle with a crescent brush head",
150
- styleNotes: ["cyan rim light", "oversized safe silhouette"],
151
- safetyNotes: ["not a weapon", "slow sweeping arcs only"]
152
- },
153
- {
154
- id: "glow-stones",
155
- name: "Glow Stones",
156
- role: "interactive",
157
- description: "Small moon pebbles that pulse gently after cleanup.",
158
- locationId: "moon-garden",
159
- ...(typedAsset("glowStones") ? { asset: typedAsset("glowStones") } : {}),
160
- primitiveFallback: "small low-poly spheres with bloom",
161
- styleNotes: ["warm yellow glow", "reduced-flash pulse"],
162
- safetyNotes: ["no rapid flashing"]
163
- },
164
- {
165
- id: "moon-lilies",
166
- name: "Moon Lilies",
167
- role: "set-dressing",
168
- description: "Sleepy flowers that brighten when the garden is clean.",
169
- locationId: "moon-garden",
170
- ...(typedAsset("moonLilies") ? { asset: typedAsset("moonLilies") } : {}),
171
- primitiveFallback: "rounded petal cards around tiny stems",
172
- styleNotes: ["soft white petals", "blue shadow edges"]
173
- }
174
- ],
175
- styleGuide: {
176
- visualStyle: "rounded bedtime sci-fi cartoon with toy-like robot silhouettes",
177
- palette: ["#081b2a", "#7de2ff", "#ffe18e", "#40ffbf", "#f8fff2"],
178
- shapeLanguage: "circles, capsules, crescent props, and chunky moon-garden forms",
179
- lighting: "soft blue night key, warm prop glows, no hard flashes",
180
- cameraLanguage: "wide establishing shot, medium teamwork shot, gentle final push-in, cuts only at shot boundaries",
181
- motionRules: [
182
- "Keep brooms, waves, and glow pulses reduced-motion safe.",
183
- "Mouth cards and GLB blendshapes sample AuraVoice visemes at the same frame rate as captions.",
184
- "Do not change storyboard, shot, line, caption, or character ids during dubbing."
185
- ],
186
- captionStyle: "bottom-center high-contrast rounded plate with line-safe captions",
187
- continuityRules: [
188
- "Miko stays cyan on screen-left unless shot blocking explicitly moves them.",
189
- "Luma stays warm gold on screen-right unless shot blocking explicitly moves them.",
190
- "Glow stones brighten only after the teamwork shot begins."
191
- ]
192
- },
193
- continuityRules: [
194
- "Story bible ids, shot ids, caption ids, and AuraVoice line ids stay stable across language dubs.",
195
- "Props can upgrade to typed GLBs only through generated ./aura-assets imports."
196
- ],
197
- safety: {
198
- childSafe: true,
199
- captionRequired: true,
200
- reducedMotionDefault: true,
201
- highContrastDefault: true,
202
- flashing: "reduced"
203
- },
204
- beats: [
205
- {
206
- id: "beat-open",
207
- sceneId: "storyboard-moon-garden",
208
- shotId: "shot-moon-garden-open",
209
- locationId: "moon-garden",
210
- summary: "Miko notices moon dust dimming the garden lights.",
211
- visualIntent: "Wide moon-garden reveal with two robot silhouettes and readable bottom captions.",
212
- duration: 20,
213
- characters: ["miko", "luma"],
214
- props: ["moon-lilies", "glow-stones"],
215
- gestureByCharacterId: { miko: "gentle-point", luma: "soft-nod" },
216
- blockingByCharacterId: {
217
- miko: { position: [-0.8, 0.75, 0], layer: "midground" },
218
- luma: { position: [0.8, 0.72, 0], layer: "midground" }
219
- },
220
- dialogue: [
221
- {
222
- speakerId: "miko",
223
- text: "Luma, the moon lilies are losing their sparkle.",
224
- emotion: "concerned",
225
- delivery: "natural",
226
- audioFile: "assets/audio/en/shot-moon-garden-open-line-1.wav"
227
- },
228
- {
229
- speakerId: "luma",
230
- text: "Then we sweep softly and wake the glow stones.",
231
- emotion: "happy",
232
- delivery: "slow",
233
- audioFile: "assets/audio/en/shot-moon-garden-open-line-2.wav"
234
- }
235
- ]
236
- },
237
- {
238
- id: "beat-teamwork",
239
- sceneId: "storyboard-moon-garden",
240
- shotId: "shot-glow-stone-teamwork",
241
- locationId: "moon-garden",
242
- summary: "The robots clean in rhythm while the glow stones pulse back on.",
243
- visualIntent: "Medium two-shot with gentle broom arcs, stable character ids, and no flashing.",
244
- duration: 22,
245
- characters: ["miko", "luma"],
246
- props: ["glow-broom", "glow-stones"],
247
- gestureByCharacterId: { miko: "curious-lean", luma: "small-wave" },
248
- blockingByCharacterId: {
249
- miko: { position: [-0.55, 0.75, 0.05], layer: "foreground" },
250
- luma: { position: [0.62, 0.72, -0.02], layer: "foreground" }
251
- },
252
- dialogue: [
253
- {
254
- speakerId: "miko",
255
- text: "I will polish the blue stones one tiny circle at a time.",
256
- emotion: "curious",
257
- delivery: "natural",
258
- audioFile: "assets/audio/en/shot-glow-stone-teamwork-line-1.wav"
259
- },
260
- {
261
- speakerId: "luma",
262
- text: "And I will hum the garden's sleepy cleanup song.",
263
- emotion: "happy",
264
- delivery: "sing-song",
265
- audioFile: "assets/audio/en/shot-glow-stone-teamwork-line-2.wav"
266
- }
267
- ]
268
- },
269
- {
270
- id: "beat-finish",
271
- sceneId: "storyboard-moon-garden",
272
- shotId: "shot-moon-garden-finish",
273
- locationId: "moon-garden",
274
- summary: "The moon garden glows again and the robots wave goodnight.",
275
- visualIntent: "Soft push-in to a finished garden, thumbnail-safe framing, and final caption hold.",
276
- duration: 18,
277
- characters: ["miko", "luma"],
278
- props: ["moon-lilies", "glow-stones"],
279
- gestureByCharacterId: { miko: "small-wave", luma: "two-hand-wave" },
280
- blockingByCharacterId: {
281
- miko: { position: [-0.65, 0.75, 0], layer: "midground" },
282
- luma: { position: [0.68, 0.72, 0], layer: "midground" }
283
- },
284
- dialogue: [
285
- {
286
- speakerId: "luma",
287
- text: "The moon lilies are twinkling again.",
288
- emotion: "excited",
289
- delivery: "natural",
290
- audioFile: "assets/audio/en/shot-moon-garden-finish-line-1.wav"
291
- },
292
- {
293
- speakerId: "miko",
294
- text: "Goodnight, little garden. Keep glowing.",
295
- emotion: "happy",
296
- delivery: "slow",
297
- audioFile: "assets/audio/en/shot-moon-garden-finish-line-2.wav"
298
- }
299
- ]
300
- }
301
- ],
302
- generatedAt: "2026-06-03T00:00:00.000Z"
303
- });
304
-
305
- export const storyBible = episode.storyBible;
306
- export const shotList = storyBible.shotList;
@@ -1,333 +0,0 @@
1
- import {
2
- camera,
3
- captionCueAtTime,
4
- createAuraApp,
5
- createShotPlaybackPlan,
6
- effects,
7
- game,
8
- group,
9
- installShotPlayback,
10
- labels,
11
- lights,
12
- material,
13
- model,
14
- primitives,
15
- sampleAuraVoiceBridgeAtTime,
16
- sampleShotPlaybackPlan,
17
- scene
18
- } from "@aura3d/engine";
19
- import { assets } from "./aura-assets";
20
- import {
21
- episode,
22
- episodeContractId,
23
- missingCartoonCharacterAssets,
24
- publicCartoonAssetInstructions,
25
- requiredCartoonCharacterAssets,
26
- typedCartoonAssetSummary
27
- } from "./episode";
28
- import {
29
- accessibilityProofMetadata,
30
- auraVoicePackage,
31
- bridgeIssues,
32
- bridgeSampleAtThumbnail,
33
- captionFrameSyncSourceProof,
34
- captionTimingProof,
35
- deterministicScreenshotFixtures,
36
- glbVisemeRuntimeExample,
37
- promptAnimationEvidence,
38
- primitiveMouthRuntimeExample,
39
- phonemeVisemeDubSyncSourceProof,
40
- publishReadiness,
41
- renderOutputPackage,
42
- renderPlan,
43
- sampleRenderSourceWorkflow,
44
- visemeFrameSyncSourceProof,
45
- visemeTrack
46
- } from "./render-plan";
47
- import { cartoonStudioSupport, installCartoonStudioPanel } from "./studio";
48
-
49
- declare global {
50
- interface Window {
51
- __AURA3D_CARTOON_EPISODE_SEEK__?: (time: number) => void;
52
- __AURA3D_CARTOON_EPISODE_PROOF__?: CartoonEpisodeRouteProof;
53
- __AURA3D_CARTOON_TEMPLATE__?: CartoonEpisodeRouteProof;
54
- }
55
- }
56
-
57
- interface CartoonEpisodeRouteProof {
58
- readonly proofKind: "aura3d-cartoon-episode-proof";
59
- readonly contractId: string;
60
- readonly template: string;
61
- readonly storyBible: unknown;
62
- readonly shots: readonly unknown[];
63
- readonly captions: readonly unknown[];
64
- readonly visemes: readonly unknown[];
65
- readonly gestures: readonly unknown[];
66
- readonly assets: unknown;
67
- readonly renderStatus: unknown;
68
- readonly errors: readonly string[];
69
- readonly sourceOnlyAcceptedAsPublishProof: false;
70
- readonly shotIds: readonly string[];
71
- readonly captionIds: readonly string[];
72
- readonly playbackProbeTimes: readonly number[];
73
- readonly playbackProbeSamples: readonly unknown[];
74
- readonly renderQueueItems: number;
75
- readonly renderPreset: unknown;
76
- readonly typedAssets: unknown;
77
- readonly requiredTypedAssets: readonly string[];
78
- readonly missingTypedAssets: readonly string[];
79
- readonly assetCommands: readonly string[];
80
- readonly bridgeIssues: readonly unknown[];
81
- readonly promptAnimationEvidence: unknown;
82
- readonly publishReadiness: unknown;
83
- readonly studio: unknown;
84
- readonly sourceProofs: unknown;
85
- readonly sampleRenderSourceWorkflow: unknown;
86
- sampleAt(time: number): unknown;
87
- }
88
-
89
- const firstStoryboardShot = episode.storyboard.scenes[0]?.shots[0];
90
- const firstCaption = episode.captionTrack.cues[0];
91
- const thumbnailCapture = renderOutputPackage.thumbnailCapture;
92
- const thumbnailCaption = captionCueAtTime(episode.captionTrack, thumbnailCapture.time);
93
- const storyBible = episode.storyBible;
94
- const captureMode = new URLSearchParams(window.location.search).get("capture") === "thumbnail";
95
- const cartoonRenderPreset = createCartoonStudioRouteRenderPreset({
96
- name: "moon-garden-cartoon-studio",
97
- resolution: episode.episodePlan.runtime.resolution,
98
- materialStyle: { treatment: "cel" },
99
- reducedMotion: episode.episodePlan.runtime.reducedMotion,
100
- reducedFlash: true
101
- });
102
-
103
- const captionOverlay = document.createElement("div");
104
- captionOverlay.id = "caption-overlay";
105
- captionOverlay.textContent = firstCaption?.text ?? firstStoryboardShot?.storyBeat ?? "Aura3D cartoon studio";
106
- captionOverlay.style.cssText = [
107
- "position:fixed",
108
- captureMode ? "display:none" : "",
109
- "left:50%",
110
- "bottom:28px",
111
- "transform:translateX(-50%)",
112
- "max-width:min(840px,calc(100vw - 32px))",
113
- "padding:12px 18px",
114
- "border-radius:14px",
115
- "background:rgba(3,12,20,0.88)",
116
- "color:#f8fff2",
117
- "font:700 18px/1.35 ui-rounded, Trebuchet MS, sans-serif",
118
- "letter-spacing:0.01em",
119
- "text-align:center",
120
- "box-shadow:0 10px 30px rgba(0,0,0,0.28)",
121
- "z-index:10"
122
- ].join(";");
123
- document.body.appendChild(captionOverlay);
124
-
125
- const shotPlaybackPlan = createShotPlaybackPlan({
126
- timeline: episode.shotTimeline,
127
- performance: episode.performance,
128
- captions: episode.captionTrack,
129
- visemes: visemeTrack,
130
- runtimeNodeByCharacterId: {
131
- miko: "miko",
132
- luma: "luma"
133
- },
134
- loop: true
135
- });
136
-
137
- const playbackProbeTimes = [1, 21, 43] as const;
138
- const playbackProbeSamples = playbackProbeTimes.map((time) => sampleCartoonRouteAt(time));
139
- captionOverlay.dataset.shotId = playbackProbeSamples[0]?.shotId ?? "";
140
- captionOverlay.dataset.captionId = playbackProbeSamples[0]?.captionId ?? firstCaption?.captionId ?? "";
141
- document.body.dataset.cartoonShotCount = String(episode.shotTimeline.shots.length);
142
- document.body.dataset.cartoonCaptionCount = String(episode.captionTrack.cues.length);
143
- document.body.dataset.cartoonStoryBibleProps = String(storyBible.props.length);
144
- document.body.dataset.cartoonStudioPanels = cartoonStudioSupport.panels.join(",");
145
- if (!captureMode) installCartoonStudioPanel(document.body);
146
-
147
- const app = createAuraApp("#app", {
148
- scene: scene()
149
- .background("#081b2a")
150
- .add(
151
- model(assets.moonGarden, { name: "Moon Garden typed set asset" })
152
- .position(0, 0, -0.02)
153
- .scale(1)
154
- .runtime(game.runtimeNode("moonGarden", { tags: ["set", "typed-asset", "moon-garden"] }))
155
- )
156
- .add(
157
- model(assets.miko, { name: "Miko typed cartoon character" })
158
- .position(-0.8, 0.75, 0)
159
- .scale(0.72)
160
- .runtime(game.runtimeNode("miko", { tags: ["character", "miko", "typed-asset"] }))
161
- )
162
- .add(createMouthCard("miko:mouth", "Miko", [-0.8, 0.8, 0.32], "#f8fff2"))
163
- .add(
164
- model(assets.luma, { name: "Luma typed cartoon character" })
165
- .position(0.8, 0.72, 0)
166
- .scale(0.68)
167
- .runtime(game.runtimeNode("luma", { tags: ["character", "luma", "typed-asset"] }))
168
- )
169
- .add(createMouthCard("luma:mouth", "Luma", [0.8, 0.77, 0.32], "#40ffbf"))
170
- .add(
171
- primitives
172
- .box({ name: "moon garden path", material: material.pbr({ color: "#182d3f", roughness: 0.78 }) })
173
- .position(0, 0.05, 0)
174
- .scale([2.8, 0.04, 0.8])
175
- )
176
- .add(
177
- primitives
178
- .sphere({ name: "glow stones primitive fallback", material: material.emissive({ color: "#ffe18e", emissive: "#ffe18e", emissiveIntensity: 0.42 }) })
179
- .position(0.18, 0.16, 0.28)
180
- .scale([0.16, 0.08, 0.16])
181
- )
182
- .add(
183
- primitives
184
- .box({ name: "moon lilies primitive fallback", material: material.pbr({ color: "#f8fff2", roughness: 0.5 }) })
185
- .position(-0.38, 0.2, 0.18)
186
- .scale([0.12, 0.24, 0.04])
187
- )
188
- .add(captureMode ? group("thumbnail capture label placeholder") : labels.hud(firstCaption?.text ?? firstStoryboardShot?.storyBeat ?? "Aura3D cartoon studio"))
189
- .add(lights.studio({ intensity: 1.2 }))
190
- .add(effects.bloom({ intensity: 0.18, color: "#7de2ff" }))
191
- .camera(camera.perspective({ position: [0, 1.4, 4.2], target: [0, 0.7, 0], fov: 42 })),
192
- diagnostics: !captureMode
193
- });
194
-
195
- const cartoonEpisodeProof: CartoonEpisodeRouteProof = {
196
- proofKind: "aura3d-cartoon-episode-proof",
197
- contractId: episodeContractId,
198
- template: "cartoon-studio",
199
- storyBible,
200
- shots: episode.shotTimeline.shots,
201
- captions: episode.captionTrack.cues,
202
- visemes: visemeTrack.cues,
203
- gestures: episode.performance.cues,
204
- assets: typedCartoonAssetSummary,
205
- renderStatus: {
206
- route: renderPlan.route,
207
- renderQueueItems: renderPlan.items.length,
208
- outputs: renderPlan.outputs.map((output) => output.kind),
209
- preset: cartoonRenderPreset,
210
- sourceOnlyAcceptedAsPublishProof: false,
211
- publishReadyFromCurrentEvidence: publishReadiness.ready,
212
- issueCount: publishReadiness.issues.length
213
- },
214
- errors: bridgeIssues.map((issue) => String((issue as { message?: unknown }).message ?? issue)),
215
- sourceOnlyAcceptedAsPublishProof: false,
216
- shotIds: episode.shotTimeline.shots.map((shot) => shot.shotId),
217
- captionIds: episode.captionTrack.cues.map((caption) => caption.captionId),
218
- playbackProbeTimes,
219
- playbackProbeSamples,
220
- renderQueueItems: renderPlan.items.length,
221
- renderPreset: cartoonRenderPreset,
222
- typedAssets: typedCartoonAssetSummary,
223
- requiredTypedAssets: requiredCartoonCharacterAssets,
224
- missingTypedAssets: missingCartoonCharacterAssets,
225
- assetCommands: publicCartoonAssetInstructions,
226
- bridgeIssues,
227
- promptAnimationEvidence,
228
- publishReadiness,
229
- studio: cartoonStudioSupport,
230
- sourceProofs: {
231
- captionFrameSyncSourceProof,
232
- visemeFrameSyncSourceProof,
233
- phonemeVisemeDubSyncSourceProof
234
- },
235
- sampleRenderSourceWorkflow,
236
- sampleAt(time: number) {
237
- return sampleCartoonRouteAt(time);
238
- }
239
- };
240
- window.__AURA3D_CARTOON_EPISODE_PROOF__ = cartoonEpisodeProof;
241
- window.__AURA3D_CARTOON_TEMPLATE__ = cartoonEpisodeProof;
242
- window.__AURA3D_CARTOON_EPISODE_SEEK__ = (time: number) => {
243
- const sample = sampleCartoonRouteAt(time);
244
- captionOverlay.textContent = sample.captionText ?? firstCaption?.text ?? "";
245
- captionOverlay.dataset.shotId = sample.shotId ?? "";
246
- captionOverlay.dataset.captionId = sample.captionId ?? "";
247
- };
248
-
249
- installShotPlayback(app, shotPlaybackPlan, {
250
- primitiveMouthNodeByCharacterId: {
251
- miko: "miko:mouth",
252
- luma: "luma:mouth"
253
- },
254
- onCaption(caption, framePlan) {
255
- captionOverlay.textContent = caption?.text ?? firstCaption?.text ?? "";
256
- captionOverlay.dataset.shotId = framePlan.shotId ?? "";
257
- captionOverlay.dataset.captionId = caption?.captionId ?? "";
258
- }
259
- });
260
-
261
- function createMouthCard(id: "miko:mouth" | "luma:mouth", name: string, position: readonly [number, number, number], color: string) {
262
- return primitives
263
- .box({
264
- name: `${name} primitive mouth card`,
265
- material: material.emissive({ color, emissive: color, emissiveIntensity: 0.32 })
266
- })
267
- .position(position[0], position[1], position[2])
268
- .scale([0.22, 0.035, 0.025])
269
- .runtime(game.runtimeNode(id, { tags: ["mouth", "primitive", name.toLowerCase()] }));
270
- }
271
-
272
- function createCartoonStudioRouteRenderPreset(input: {
273
- readonly name: string;
274
- readonly resolution: { readonly width: number; readonly height: number };
275
- readonly materialStyle: { readonly treatment: "cel" | "preserve-pbr" };
276
- readonly reducedMotion?: boolean | undefined;
277
- readonly reducedFlash?: boolean | undefined;
278
- }) {
279
- return {
280
- kind: "cartoon-render-preset-evidence",
281
- name: input.name,
282
- resolution: input.resolution,
283
- lights: ["soft-key", "cool-rim", "set-fill", "emissive-practicals"],
284
- shadows: { soft: true, contact: true },
285
- postprocess: {
286
- bloom: input.reducedFlash ? 0.08 : 0.18,
287
- colorGrade: "storybook-night",
288
- fogDepthCue: true
289
- },
290
- materialStyle: {
291
- treatment: input.materialStyle.treatment,
292
- outline: input.materialStyle.treatment === "cel",
293
- rampSteps: input.materialStyle.treatment === "cel" ? 4 : 7,
294
- saturation: 1.08,
295
- blackLineWeight: input.materialStyle.treatment === "cel" ? 0.9 : 0
296
- },
297
- frameBudgetMs: 16.7,
298
- debugOverlaysAllowedInExport: false,
299
- reducedMotion: input.reducedMotion ?? false,
300
- reducedFlash: input.reducedFlash ?? false
301
- } as const;
302
- }
303
-
304
- function sampleCartoonRouteAt(time: number) {
305
- const bridgeSample = sampleAuraVoiceBridgeAtTime(auraVoicePackage, time);
306
- const playbackSample = sampleShotPlaybackPlan(shotPlaybackPlan, time);
307
- const caption = captionCueAtTime(episode.captionTrack, time);
308
- const speakingCharacterId = bridgeSample.dialogue?.speakerId;
309
- return {
310
- time,
311
- frame: bridgeSample.frame,
312
- shotId: bridgeSample.shot?.shotId,
313
- sceneId: bridgeSample.shot?.sceneId,
314
- captionId: caption?.captionId,
315
- captionText: caption?.text,
316
- cameraMove: bridgeSample.shot?.camera.move,
317
- transitionOut: bridgeSample.shot?.transitionOut,
318
- dialogueLineId: bridgeSample.dialogue?.lineId,
319
- visemeId: bridgeSample.viseme?.primaryVisemeId,
320
- nodeUpdates: playbackSample.nodeUpdates.map((update) => ({
321
- characterId: update.characterId,
322
- action: speakingCharacterId === update.characterId ? "speak" : update.action,
323
- emotion: update.emotion,
324
- position: update.position
325
- })),
326
- sourceShotCharacters: (bridgeSample.shot?.characters ?? []).map((character) => ({
327
- characterId: character.characterId,
328
- action: speakingCharacterId === character.characterId ? "speak" : character.action,
329
- emotion: character.emotion,
330
- position: character.position
331
- }))
332
- };
333
- }