@vgai/engine 0.5.22 → 0.5.23

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 (291) hide show
  1. package/README.md +6 -3
  2. package/dist/adapter/adapter-module.d.ts.map +1 -1
  3. package/dist/adapter/adapter-module.js +2 -4
  4. package/dist/adapter/adapter-surface.d.ts +1 -1
  5. package/dist/adapter/adapter-surface.js +1 -1
  6. package/dist/adapter/authoring.d.ts +19 -21
  7. package/dist/adapter/authoring.d.ts.map +1 -1
  8. package/dist/adapter/authoring.js +2 -2
  9. package/dist/adapter/binding.d.ts +341 -0
  10. package/dist/adapter/binding.d.ts.map +1 -0
  11. package/dist/adapter/binding.js +148 -0
  12. package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -1
  13. package/dist/adapter/colyseus-networking-adapter.js +23 -4
  14. package/dist/adapter/entrypoint-selection-readers.d.ts +24 -0
  15. package/dist/adapter/entrypoint-selection-readers.d.ts.map +1 -0
  16. package/dist/adapter/entrypoint-selection-readers.js +63 -0
  17. package/dist/adapter/entrypoint-selection-source.d.ts.map +1 -1
  18. package/dist/adapter/entrypoint-selection-source.js +1 -44
  19. package/dist/adapter/finders/scenes-from-entrypoint-selection.d.ts.map +1 -1
  20. package/dist/adapter/finders/scenes-from-entrypoint-selection.js +1 -52
  21. package/dist/adapter/host-context.d.ts +46 -15
  22. package/dist/adapter/host-context.d.ts.map +1 -1
  23. package/dist/adapter/host-context.js +2 -9
  24. package/dist/adapter/index.d.ts +11 -12
  25. package/dist/adapter/index.d.ts.map +1 -1
  26. package/dist/adapter/index.js +9 -10
  27. package/dist/adapter/ingest/game-contract.d.ts +0 -3
  28. package/dist/adapter/ingest/game-contract.d.ts.map +1 -1
  29. package/dist/adapter/ingest/game-contract.js +0 -3
  30. package/dist/adapter/ingest/scene-capture.d.ts +19 -23
  31. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -1
  32. package/dist/adapter/ingest/scene-capture.js +143 -17
  33. package/dist/adapter/ingest/visible-capture-window.d.ts +34 -0
  34. package/dist/adapter/ingest/visible-capture-window.d.ts.map +1 -1
  35. package/dist/adapter/native-debug-module.d.ts +31 -5
  36. package/dist/adapter/native-debug-module.d.ts.map +1 -1
  37. package/dist/adapter/native-debug-module.js +25 -7
  38. package/dist/adapter/rapier-physics-adapter.d.ts +31 -1
  39. package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -1
  40. package/dist/adapter/rapier-physics-adapter.js +50 -36
  41. package/dist/adapter/renderer-config.d.ts +2 -2
  42. package/dist/adapter/renderer-config.js +2 -2
  43. package/dist/adapter/root-adapter.d.ts +7 -7
  44. package/dist/adapter/root-adapter.js +4 -4
  45. package/dist/adapter/system-adapter.d.ts +45 -7
  46. package/dist/adapter/system-adapter.d.ts.map +1 -1
  47. package/dist/adapter/system-seam-contract.d.ts +3 -3
  48. package/dist/adapter/system-seam-contract.js +3 -3
  49. package/dist/adapter/system-slot.d.ts +168 -0
  50. package/dist/adapter/system-slot.d.ts.map +1 -0
  51. package/dist/adapter/system-slot.js +229 -0
  52. package/dist/adapter/transform.d.ts +11 -1
  53. package/dist/adapter/transform.d.ts.map +1 -1
  54. package/dist/ai/navigation.d.ts +17 -1
  55. package/dist/ai/navigation.d.ts.map +1 -1
  56. package/dist/ai/navigation.js +26 -5
  57. package/dist/animation/anim-graph-types.d.ts +11 -3
  58. package/dist/animation/anim-graph-types.d.ts.map +1 -1
  59. package/dist/animation/theatre-clock-binding.d.ts +4 -4
  60. package/dist/animation/theatre-clock-binding.js +4 -4
  61. package/dist/animation/xstate-animation-binding.d.ts.map +1 -1
  62. package/dist/animation/xstate-animation-binding.js +2 -2
  63. package/dist/animation/xstate-animation-meta.d.ts +13 -0
  64. package/dist/animation/xstate-animation-meta.d.ts.map +1 -1
  65. package/dist/animation/xstate-animation-meta.js +14 -0
  66. package/dist/asset-formats/index.d.ts +4 -7
  67. package/dist/asset-formats/index.d.ts.map +1 -1
  68. package/dist/asset-formats/index.js +4 -7
  69. package/dist/asset-formats/render-env.d.ts +5 -8
  70. package/dist/asset-formats/render-env.d.ts.map +1 -1
  71. package/dist/asset-formats/render-env.js +3 -6
  72. package/dist/asset-parse-error.d.ts +2 -5
  73. package/dist/asset-parse-error.d.ts.map +1 -1
  74. package/dist/asset-parse-error.js +2 -5
  75. package/dist/audio/bus-mixer.d.ts +101 -0
  76. package/dist/audio/bus-mixer.d.ts.map +1 -0
  77. package/dist/audio/bus-mixer.js +115 -0
  78. package/dist/core/frame-pacing.d.ts +1 -1
  79. package/dist/core/frame-pacing.js +2 -2
  80. package/dist/core/game-loop.d.ts +1 -3
  81. package/dist/core/game-loop.d.ts.map +1 -1
  82. package/dist/core/game-loop.js +1 -3
  83. package/dist/core/seeded-random.d.ts +1 -1
  84. package/dist/core/sim-clock.d.ts +5 -6
  85. package/dist/core/sim-clock.d.ts.map +1 -1
  86. package/dist/core/sim-clock.js +4 -5
  87. package/dist/core/types.d.ts +1 -3
  88. package/dist/core/types.d.ts.map +1 -1
  89. package/dist/defaults.d.ts +6 -14
  90. package/dist/defaults.d.ts.map +1 -1
  91. package/dist/defaults.js +6 -14
  92. package/dist/dev/register-render-vitals.d.ts +1 -4
  93. package/dist/dev/register-render-vitals.d.ts.map +1 -1
  94. package/dist/dev/register-render-vitals.js +1 -4
  95. package/dist/dev/render-debug-adapter.d.ts +2 -3
  96. package/dist/dev/render-debug-adapter.d.ts.map +1 -1
  97. package/dist/dev/render-debug-adapter.js +2 -3
  98. package/dist/dev/render-vitals.d.ts +3 -3
  99. package/dist/dev/render-vitals.js +3 -3
  100. package/dist/dev/webgl-frame-capture.d.ts +1 -1
  101. package/dist/dev/webgl-frame-capture.js +1 -1
  102. package/dist/index.d.ts +2 -5
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +2 -4
  105. package/dist/input/host-pointer.d.ts +122 -0
  106. package/dist/input/host-pointer.d.ts.map +1 -0
  107. package/dist/input/host-pointer.js +160 -0
  108. package/dist/input/input-manager.d.ts +18 -5
  109. package/dist/input/input-manager.d.ts.map +1 -1
  110. package/dist/input/input-manager.js +33 -13
  111. package/dist/input/rebind-controller.d.ts.map +1 -1
  112. package/dist/input/rebind-controller.js +6 -8
  113. package/dist/input/schema.d.ts.map +1 -1
  114. package/dist/input/schema.js +56 -28
  115. package/dist/manifest/filename.d.ts.map +1 -1
  116. package/dist/manifest/filename.js +8 -12
  117. package/dist/manifest/load.d.ts +10 -10
  118. package/dist/manifest/load.d.ts.map +1 -1
  119. package/dist/manifest/load.js +9 -6
  120. package/dist/manifest/schema.d.ts +17 -21
  121. package/dist/manifest/schema.d.ts.map +1 -1
  122. package/dist/manifest/schema.js +45 -35
  123. package/dist/physics/collider-dimensions.d.ts +8 -12
  124. package/dist/physics/collider-dimensions.d.ts.map +1 -1
  125. package/dist/physics/collider-dimensions.js +8 -12
  126. package/dist/pixi/scene-capture.d.ts +11 -13
  127. package/dist/pixi/scene-capture.d.ts.map +1 -1
  128. package/dist/react/world-state.d.ts +1 -1
  129. package/dist/react/world-state.d.ts.map +1 -1
  130. package/dist/render/light-camera-factory.d.ts +5 -7
  131. package/dist/render/light-camera-factory.d.ts.map +1 -1
  132. package/dist/render/light-camera-factory.js +8 -11
  133. package/dist/render/material-factory.js +1 -1
  134. package/dist/render/render-batch-system.d.ts.map +1 -1
  135. package/dist/render/render-features.d.ts +17 -6
  136. package/dist/render/render-features.d.ts.map +1 -1
  137. package/dist/render/render-features.js +0 -28
  138. package/dist/runtime/create-runtime.d.ts +34 -25
  139. package/dist/runtime/create-runtime.d.ts.map +1 -1
  140. package/dist/runtime/create-runtime.js +218 -93
  141. package/dist/runtime/debug-registry.d.ts +77 -8
  142. package/dist/runtime/debug-registry.d.ts.map +1 -1
  143. package/dist/runtime/debug-registry.js +3 -3
  144. package/dist/runtime/dev-build.d.ts +2 -2
  145. package/dist/runtime/dev-build.js +2 -2
  146. package/dist/runtime/game-input-seams.d.ts +2 -2
  147. package/dist/runtime/game-input-seams.d.ts.map +1 -1
  148. package/dist/runtime/game.d.ts +90 -41
  149. package/dist/runtime/game.d.ts.map +1 -1
  150. package/dist/runtime/game.js +80 -54
  151. package/dist/runtime/mount-game.d.ts +0 -16
  152. package/dist/runtime/mount-game.d.ts.map +1 -1
  153. package/dist/runtime/mount-game.js +8 -39
  154. package/dist/runtime/mount-manifest.d.ts +22 -14
  155. package/dist/runtime/mount-manifest.d.ts.map +1 -1
  156. package/dist/runtime/mount-manifest.js +18 -18
  157. package/dist/runtime/playtest.d.ts +22 -0
  158. package/dist/runtime/playtest.d.ts.map +1 -0
  159. package/dist/runtime/playtest.js +12 -0
  160. package/dist/runtime/state-bridge.d.ts +2 -3
  161. package/dist/runtime/state-bridge.d.ts.map +1 -1
  162. package/dist/runtime/state-bridge.js +1 -0
  163. package/dist/setup/setup-audio.d.ts +12 -0
  164. package/dist/setup/setup-audio.d.ts.map +1 -1
  165. package/dist/setup/setup-audio.js +9 -10
  166. package/dist/setup/setup-renderer.d.ts +2 -25
  167. package/dist/setup/setup-renderer.d.ts.map +1 -1
  168. package/dist/setup/setup-renderer.js +2 -31
  169. package/dist/world3d-react/r3f-root-factory.d.ts +7 -7
  170. package/dist/world3d-react/r3f-root-factory.js +7 -7
  171. package/dist/world3d-react/rapier-physics-bridge.d.ts +9 -8
  172. package/dist/world3d-react/rapier-physics-bridge.d.ts.map +1 -1
  173. package/dist/world3d-react/rapier-physics-bridge.js +100 -48
  174. package/package.json +1 -1
  175. package/schemas/engine-capabilities.json +16 -14
  176. package/schemas/vgai-project.schema.json +35 -26
  177. package/src/adapter/adapter-module.ts +2 -4
  178. package/src/adapter/adapter-surface.ts +1 -1
  179. package/src/adapter/authoring.ts +19 -21
  180. package/src/adapter/binding.ts +468 -0
  181. package/src/adapter/colyseus-networking-adapter.ts +20 -5
  182. package/src/adapter/entrypoint-selection-readers.ts +66 -0
  183. package/src/adapter/entrypoint-selection-source.ts +1 -40
  184. package/src/adapter/finders/scenes-from-entrypoint-selection.ts +1 -48
  185. package/src/adapter/host-context.ts +45 -15
  186. package/src/adapter/index.ts +23 -11
  187. package/src/adapter/ingest/game-contract.ts +0 -3
  188. package/src/adapter/ingest/scene-capture.ts +190 -39
  189. package/src/adapter/ingest/visible-capture-window.ts +35 -0
  190. package/src/adapter/native-debug-module.ts +43 -7
  191. package/src/adapter/rapier-physics-adapter.ts +76 -20
  192. package/src/adapter/renderer-config.ts +2 -2
  193. package/src/adapter/root-adapter.ts +7 -7
  194. package/src/adapter/system-adapter.ts +43 -8
  195. package/src/adapter/system-seam-contract.ts +3 -3
  196. package/src/adapter/system-slot.ts +291 -0
  197. package/src/adapter/transform.ts +18 -1
  198. package/src/ai/navigation.ts +30 -3
  199. package/src/animation/anim-graph-types.ts +11 -3
  200. package/src/animation/theatre-clock-binding.ts +4 -4
  201. package/src/animation/xstate-animation-binding.ts +2 -2
  202. package/src/animation/xstate-animation-meta.ts +16 -0
  203. package/src/asset-formats/index.ts +4 -7
  204. package/src/asset-formats/render-env.ts +3 -6
  205. package/src/asset-parse-error.ts +2 -5
  206. package/src/audio/bus-mixer.ts +161 -0
  207. package/src/core/frame-pacing.ts +2 -2
  208. package/src/core/game-loop.ts +1 -3
  209. package/src/core/seeded-random.ts +1 -1
  210. package/src/core/sim-clock.ts +5 -6
  211. package/src/core/types.ts +1 -3
  212. package/src/defaults.ts +6 -14
  213. package/src/dev/register-render-vitals.ts +1 -4
  214. package/src/dev/render-debug-adapter.ts +2 -3
  215. package/src/dev/render-vitals.ts +3 -3
  216. package/src/dev/webgl-frame-capture.ts +1 -1
  217. package/src/index.ts +2 -5
  218. package/src/input/host-pointer.ts +230 -0
  219. package/src/input/input-manager.ts +34 -13
  220. package/src/input/input-types.ts +1 -1
  221. package/src/input/rebind-controller.ts +6 -8
  222. package/src/input/schema.ts +216 -188
  223. package/src/manifest/filename.ts +8 -12
  224. package/src/manifest/load.ts +17 -13
  225. package/src/manifest/schema.ts +55 -47
  226. package/src/physics/collider-dimensions.ts +8 -12
  227. package/src/pixi/scene-capture.ts +12 -15
  228. package/src/react/world-state.tsx +1 -1
  229. package/src/render/light-camera-factory.ts +8 -11
  230. package/src/render/material-factory.ts +1 -1
  231. package/src/render/render-batch-system.ts +14 -6
  232. package/src/render/render-features.ts +17 -35
  233. package/src/runtime/create-runtime.ts +270 -108
  234. package/src/runtime/debug-registry.ts +84 -8
  235. package/src/runtime/dev-build.ts +2 -2
  236. package/src/runtime/game-input-seams.ts +2 -2
  237. package/src/runtime/game.ts +168 -80
  238. package/src/runtime/mount-game.ts +8 -56
  239. package/src/runtime/mount-manifest.ts +43 -34
  240. package/src/runtime/playtest.ts +22 -0
  241. package/src/runtime/state-bridge.ts +3 -3
  242. package/src/setup/setup-audio.ts +21 -11
  243. package/src/setup/setup-renderer.ts +2 -61
  244. package/src/world3d-react/r3f-root-factory.tsx +7 -7
  245. package/src/world3d-react/rapier-physics-bridge.tsx +107 -50
  246. package/dist/adapter/setup-three-root-adapter.d.ts +0 -86
  247. package/dist/adapter/setup-three-root-adapter.d.ts.map +0 -1
  248. package/dist/adapter/setup-three-root-adapter.js +0 -908
  249. package/dist/animation/clip-map.d.ts +0 -12
  250. package/dist/animation/clip-map.d.ts.map +0 -1
  251. package/dist/animation/clip-map.js +0 -31
  252. package/dist/asset-registry.d.ts +0 -38
  253. package/dist/asset-registry.d.ts.map +0 -1
  254. package/dist/asset-registry.js +0 -66
  255. package/dist/canvas-react/engine-bridge.d.ts +0 -45
  256. package/dist/canvas-react/engine-bridge.d.ts.map +0 -1
  257. package/dist/canvas-react/engine-bridge.js +0 -45
  258. package/dist/canvas-react/pixi-react-adapter.d.ts +0 -77
  259. package/dist/canvas-react/pixi-react-adapter.d.ts.map +0 -1
  260. package/dist/canvas-react/pixi-react-adapter.js +0 -294
  261. package/dist/canvas-react/world-context.d.ts +0 -98
  262. package/dist/canvas-react/world-context.d.ts.map +0 -1
  263. package/dist/canvas-react/world-context.js +0 -173
  264. package/dist/dev/debug-draw.d.ts +0 -24
  265. package/dist/dev/debug-draw.d.ts.map +0 -1
  266. package/dist/dev/debug-draw.js +0 -73
  267. package/dist/render/auto-batcher.d.ts +0 -34
  268. package/dist/render/auto-batcher.d.ts.map +0 -1
  269. package/dist/render/auto-batcher.js +0 -140
  270. package/dist/render/lod.d.ts +0 -13
  271. package/dist/render/lod.d.ts.map +0 -1
  272. package/dist/render/lod.js +0 -16
  273. package/dist/runtime/types.d.ts +0 -303
  274. package/dist/runtime/types.d.ts.map +0 -1
  275. package/dist/runtime/types.js +0 -1
  276. package/dist/world3d-react/engine-bridge.d.ts +0 -47
  277. package/dist/world3d-react/engine-bridge.d.ts.map +0 -1
  278. package/dist/world3d-react/engine-bridge.js +0 -73
  279. package/dist/world3d-react/r3f-adapter.d.ts +0 -58
  280. package/dist/world3d-react/r3f-adapter.d.ts.map +0 -1
  281. package/dist/world3d-react/r3f-adapter.js +0 -634
  282. package/dist/world3d-react/world-context.d.ts +0 -182
  283. package/dist/world3d-react/world-context.d.ts.map +0 -1
  284. package/dist/world3d-react/world-context.js +0 -235
  285. package/src/adapter/setup-three-root-adapter.ts +0 -1032
  286. package/src/animation/clip-map.ts +0 -34
  287. package/src/asset-registry.ts +0 -89
  288. package/src/dev/debug-draw.ts +0 -80
  289. package/src/render/auto-batcher.ts +0 -168
  290. package/src/render/lod.ts +0 -17
  291. package/src/runtime/types.ts +0 -328
@@ -0,0 +1,229 @@
1
+ /**
2
+ * `createSystemSlot` — THE implementation of the declared-slot façade, the
3
+ * seam between a STATIC `systems` declaration and a LIVE adapter that only
4
+ * exists once the world tree is mounted.
5
+ *
6
+ * WHY IT EXISTS. An entry declares its systems statically
7
+ * (`export const systems = { networking: networkingSystem() }`), while the
8
+ * thing being declared — a joined Colyseus room, a baked navmesh, a mounted
9
+ * `<Physics>`, a cutscene's camera ownership — is built inside the world tree,
10
+ * later, and may be replaced (reconnect, remount, hot restart) or go away
11
+ * (stop). The slot is a stable object the host installs at mount and holds
12
+ * forever; every call forwards to whatever is attached right now.
13
+ *
14
+ * ── THE HONESTY RULE, STATED IN ONE PLACE ───────────────────────────────────
15
+ * This is why the pattern is centralized: five hand-rolled copies disagreed
16
+ * about it, and each disagreement was found by a separate review.
17
+ *
18
+ * - An **action** with no live target REFUSES BY NAME
19
+ * (`<name>: <unattachedMessage>`). Never a silent no-op — a caller that
20
+ * told the game to DO something must learn that it did not happen. An
21
+ * action against a live adapter that lacks the member refuses the same
22
+ * way, naming the member.
23
+ * - A **read** answers its declared HONEST EMPTY — `'disconnected'`, `[]`,
24
+ * `null`, `false`. That is not a fabrication: it is the truth of the
25
+ * not-attached state, in the same vocabulary the editor's own edit-mode
26
+ * adapters use. Reads are also the only kind safe to call from a per-frame
27
+ * debug draw, which is why a throw into a rAF loop is never the answer.
28
+ * - An **optional** member MIRRORS THE LIVE ADAPTER'S PRESENCE: absent while
29
+ * unattached, and absent afterwards when the live adapter itself does not
30
+ * provide it. Presence IS the consume-by-presence protocol's signal, so
31
+ * the slot may never invent it. Each presence read CAPTURES the adapter it
32
+ * saw and forwards to that same instance, so a detach between the read and
33
+ * the call answers as the adapter the caller was handed rather than a
34
+ * mid-flight swap.
35
+ * - A **subscribe** member SURVIVES REATTACHMENT: listeners live on the
36
+ * slot, never on the instance, and the slot re-binds its own single
37
+ * subscription on every attach/detach. A panel that subscribed once to the
38
+ * stable slot object is therefore never left holding a disposed system, and
39
+ * it is notified when the live half appears or disappears.
40
+ * - A member the config DOES NOT LIST does not exist on the slot at all.
41
+ * That is how the anti-shim rule spells omission — e.g. `PhysicsAdapter`'s
42
+ * `debugDraw`/`contactPoints` over `@react-three/rapier`, whose debug line
43
+ * segments live inside the fiber tree and expose no handle. Absence is a
44
+ * capability answer; a stub is a lie.
45
+ *
46
+ * ── RESOURCE OWNERSHIP ──────────────────────────────────────────────────────
47
+ * OWNER: whoever built the live adapter (the hook, the bridge component). The
48
+ * slot owns only the POINTER to it plus its own listener set and its own
49
+ * subscription to the live half. SHARERS: every reader of the declared
50
+ * system — editor inspectors, instruments. TEARDOWN: the function `attach`
51
+ * returns, and nothing else. It is IDENTITY-GUARDED — it clears only while
52
+ * the same instance is still attached, so a replace-then-teardown-the-old
53
+ * ordering cannot detach the new one — and detaching never disposes the
54
+ * adapter, because the slot did not create it.
55
+ *
56
+ * WHERE the slot module lives decides how many games share it. A slot in
57
+ * PROJECT-owned source (the four capability/example façades) is per Play
58
+ * instance, because the editor stamps mount ids onto project-owned import
59
+ * specifiers (`server/project-module-instance.ts`) — N instances get N module
60
+ * graphs and N slots. A slot in an ENGINE module is reached by bare
61
+ * specifier, which that stamping deliberately never touches, so it is ONE per
62
+ * page: every Play instance shares it, and concurrent instances' attaches
63
+ * contend (last attach wins; the loser's detach is dropped by the identity
64
+ * guard). `rapier-physics-bridge.tsx` is the one such slot today and warns
65
+ * loudly when contended — prefer project-owned slot modules for anything new.
66
+ *
67
+ * NOT A WRAPPER. The slot's members have the adapter interface's own exact
68
+ * signatures and hand back the implementation's own values; nothing stands
69
+ * between a caller and the live library object.
70
+ */
71
+ /**
72
+ * `absent(reason)` — THE WHOLE-SLOT counterpart of the four per-member policies
73
+ * above, and the fifth line of the same honesty rule.
74
+ *
75
+ * The four policies answer "this slot exists but nothing is attached yet". This
76
+ * one answers a different question entirely: **this game will never have that
77
+ * subsystem, and here is what was searched.** A slot simply left out of the
78
+ * `systems` table cannot say that — an omitted key means "unsupported", which is
79
+ * the same shape as "nobody looked", and the coverage report has to file it as a
80
+ * work order forever. Declaring the absence turns an UNANSWERED row into a
81
+ * terminal one.
82
+ *
83
+ * ```ts
84
+ * export const systems = {
85
+ * audio: sfxAudioSystem(),
86
+ * physics: rapierPhysicsSystem(),
87
+ * networking: absent('single-player: no Colyseus client anywhere in `src/`'),
88
+ * };
89
+ * ```
90
+ *
91
+ * ## It is a CONSTRUCTOR for the shape that already exists, not a second one
92
+ *
93
+ * The returned value IS `VgaiGameSystemEmpty` — the plain
94
+ * `{ present: false, evidence }` record an INGESTED game declares on
95
+ * `window.vgaiGame.systems.systemAdapters`, validated by the same single
96
+ * projection (`ingest/contract-system-adapters.ts`). There is one shape law, not
97
+ * two: a foreign game cannot import this helper and must stay able to write the
98
+ * record by hand, so nothing here may brand the runtime value. What the helper
99
+ * buys a FIRST-PARTY author is the reason-quality check moved to the call site —
100
+ * our own code failing its own contract fails fast, where an ingested game's
101
+ * same mistake is filed as a `malformed` verdict for its coverage report.
102
+ *
103
+ * ## It is a MARKER, never a stub adapter
104
+ *
105
+ * Do not answer an absent slot with an adapter whose methods return zeros. A
106
+ * `getConnectionState()` of `'disconnected'` on a game with no transport implies
107
+ * a connection that could exist; that is the fabrication the anti-shim rule
108
+ * forbids. The absence is STATED, and the host installs nothing for it.
109
+ *
110
+ * @param reason What was searched and what was found, in the game's own source
111
+ * terms. "no netcode anywhere in `src/`" is a finished answer a reviewer can
112
+ * re-run; "not implemented yet" is a plan, and is rejected here.
113
+ */
114
+ export function absent(reason) {
115
+ if (typeof reason !== 'string' || reason.trim() === '') {
116
+ throw new Error('absent(): an absence needs evidence — say what was searched and what was found ' +
117
+ '(e.g. "no Colyseus client anywhere in `src/`"), so a reviewer can re-run it. ' +
118
+ 'An unevidenced absence asserts something nobody can re-check.');
119
+ }
120
+ return { present: false, evidence: reason };
121
+ }
122
+ export function createSystemSlot(config) {
123
+ const { name, unattachedMessage, members } = config;
124
+ let live = null;
125
+ /** Subscribers to the stable slot object; they outlive any one live instance. */
126
+ const listeners = new Set();
127
+ /** The slot's own single subscription to whatever is attached. */
128
+ let liveUnsubscribe = null;
129
+ let subscribeMember = null;
130
+ const asRecord = (value) => value;
131
+ const liveMember = (member) => {
132
+ if (!live)
133
+ return undefined;
134
+ const value = asRecord(live)[member];
135
+ return typeof value === 'function' ? value : undefined;
136
+ };
137
+ const notify = () => {
138
+ for (const listener of [...listeners])
139
+ listener();
140
+ };
141
+ const bindLive = () => {
142
+ liveUnsubscribe?.();
143
+ liveUnsubscribe = null;
144
+ if (!live || subscribeMember === null || listeners.size === 0)
145
+ return;
146
+ const subscribe = liveMember(subscribeMember);
147
+ if (!subscribe)
148
+ return;
149
+ const result = subscribe.call(live, notify);
150
+ liveUnsubscribe = typeof result === 'function' ? result : null;
151
+ };
152
+ const target = {};
153
+ const declared = Object.entries(members);
154
+ for (const [member, spec] of declared) {
155
+ switch (spec.kind) {
156
+ case 'action': {
157
+ // Refuse by name, twice over: no live adapter at all, or a live
158
+ // adapter that does not carry this member (only ever a foreign
159
+ // replacement — the blessed implementations carry all of theirs).
160
+ target[member] = (...args) => {
161
+ if (!live)
162
+ throw new Error(`${name}: ${unattachedMessage}`);
163
+ const fn = liveMember(member);
164
+ if (!fn)
165
+ throw new Error(`${name}: the live adapter has no ${member}().`);
166
+ return fn.apply(live, args);
167
+ };
168
+ break;
169
+ }
170
+ case 'read': {
171
+ const { empty } = spec;
172
+ target[member] = (...args) => {
173
+ const current = live;
174
+ const fn = liveMember(member);
175
+ const value = fn ? fn.apply(current, args) : undefined;
176
+ return value ?? empty;
177
+ };
178
+ break;
179
+ }
180
+ case 'subscribe': {
181
+ if (subscribeMember !== null) {
182
+ throw new Error(`${name}: a slot declares at most one 'subscribe' member (${subscribeMember} and ${member}).`);
183
+ }
184
+ subscribeMember = member;
185
+ target[member] = (listener) => {
186
+ listeners.add(listener);
187
+ bindLive();
188
+ return () => {
189
+ listeners.delete(listener);
190
+ bindLive();
191
+ };
192
+ };
193
+ break;
194
+ }
195
+ case 'optional': {
196
+ Object.defineProperty(target, member, {
197
+ enumerable: true,
198
+ configurable: true,
199
+ get() {
200
+ const current = live;
201
+ const fn = liveMember(member);
202
+ if (!fn)
203
+ return undefined;
204
+ return (...args) => fn.apply(current, args);
205
+ },
206
+ });
207
+ break;
208
+ }
209
+ }
210
+ }
211
+ const attach = (next) => {
212
+ live = next;
213
+ bindLive();
214
+ notify();
215
+ return () => {
216
+ if (live !== next)
217
+ return;
218
+ live = null;
219
+ bindLive();
220
+ notify();
221
+ };
222
+ };
223
+ // THE ONE CAST. `exactOptionalPropertyTypes` forbids an optional member
224
+ // whose getter can yield `undefined`, but that is precisely the honest
225
+ // shape here — the getter IS how presence mirrors the live adapter — and a
226
+ // reflectively built object cannot be typed structurally anyway. Callers
227
+ // see exactly the absent/present behavior the adapter interface documents.
228
+ return { attach, slot: target };
229
+ }
@@ -14,5 +14,15 @@ export interface Transform {
14
14
  * needs simulation coordination (`physics`), or is best-effort/inspect-only
15
15
  * (`script`/`network`/`external`).
16
16
  */
17
- export type TransformOwner = 'editor' | 'physics' | 'animation' | 'script' | 'network' | 'external';
17
+ /**
18
+ * Who drives a node's transform right now.
19
+ *
20
+ * `'unresolved'` is the answer for a node THIS ADAPTER DOES NOT KNOW, and it is
21
+ * a distinct answer on purpose: every other member names a driver, so returning
22
+ * one of them for an unknown id is a positive claim about a node the
23
+ * implementer has never seen. A game-scoped physics adapter is asked about
24
+ * every node the editor touches, including nodes belonging to another root —
25
+ * "not mine" has to be sayable.
26
+ */
27
+ export type TransformOwner = 'editor' | 'physics' | 'animation' | 'script' | 'network' | 'external' | 'unresolved';
18
28
  //# sourceMappingURL=transform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/adapter/transform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/adapter/transform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,UAAU,GACV,YAAY,CAAC"}
@@ -55,7 +55,23 @@ export declare class NavMeshManager {
55
55
  private destroyRecast;
56
56
  /** True once a navmesh has been built (for the NavigationAdapter to gate on). */
57
57
  hasNavMesh(): boolean;
58
- /** Find a straight path between two world positions. Returns [] if no path. */
58
+ /**
59
+ * Find a straight path between two world positions.
60
+ *
61
+ * THREE OUTCOMES, and only one of them is an empty array:
62
+ *
63
+ * - **No pathfinder.** No navmesh has been built, so there is nothing to
64
+ * query. THROWS, the same way {@link createCrowd} does — `[]` here would
65
+ * say "I searched and there is no route between these points", which is a
66
+ * claim about the level rather than about this manager's state. Callers
67
+ * that can be in this position gate on {@link hasNavMesh} first.
68
+ * - **The query failed.** recast answered `success: false` WITH an error
69
+ * (bad half-extents, no polygon near an endpoint, a status code). THROWS,
70
+ * naming recast's own error — a failed search is not a searched-and-empty
71
+ * one, and the editor's probe already surfaces this separately from "no
72
+ * path found".
73
+ * - **Genuinely no route.** The query ran and found nothing. `[]`.
74
+ */
59
75
  findPath(start: Vector3Like, end: Vector3Like): Vector3Like[];
60
76
  /** Create a crowd with up to maxAgents agents. */
61
77
  createCrowd(maxAgents: number): Crowd;
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/ai/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAoD,MAAM,mBAAmB,CAAC;AAC5F,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGzC,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;iEACiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAID,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,MAAM,CAA8B;IAE5C,2EAA2E;IAC3E,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO;IA4BrE;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoBrB,iFAAiF;IACjF,UAAU,IAAI,OAAO;IAIrB,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,WAAW,EAAE;IAO7D,kDAAkD;IAClD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;IAMrC,sDAAsD;IACtD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;OAIG;IACH,cAAc,IAAI,kBAAkB,EAAE;IActC,iGAAiG;IACjG,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,IAAI;IAShD,sDAAsD;IACtD,UAAU,IAAI,UAAU;IAKxB,6DAA6D;IAC7D,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAQpC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAM5B"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/ai/navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAoD,MAAM,mBAAmB,CAAC;AAC5F,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGzC,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;iEACiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAID,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,MAAM,CAA8B;IAE5C,2EAA2E;IAC3E,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO;IA4BrE;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoBrB,iFAAiF;IACjF,UAAU,IAAI,OAAO;IAIrB;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,WAAW,EAAE;IAkB7D,kDAAkD;IAClD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;IAMrC,sDAAsD;IACtD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;OAIG;IACH,cAAc,IAAI,kBAAkB,EAAE;IActC,iGAAiG;IACjG,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,IAAI;IAShD,sDAAsD;IACtD,UAAU,IAAI,UAAU;IAKxB,6DAA6D;IAC7D,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAQpC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAM5B"}
@@ -79,13 +79,34 @@ export class NavMeshManager {
79
79
  hasNavMesh() {
80
80
  return this.navMesh !== null;
81
81
  }
82
- /** Find a straight path between two world positions. Returns [] if no path. */
82
+ /**
83
+ * Find a straight path between two world positions.
84
+ *
85
+ * THREE OUTCOMES, and only one of them is an empty array:
86
+ *
87
+ * - **No pathfinder.** No navmesh has been built, so there is nothing to
88
+ * query. THROWS, the same way {@link createCrowd} does — `[]` here would
89
+ * say "I searched and there is no route between these points", which is a
90
+ * claim about the level rather than about this manager's state. Callers
91
+ * that can be in this position gate on {@link hasNavMesh} first.
92
+ * - **The query failed.** recast answered `success: false` WITH an error
93
+ * (bad half-extents, no polygon near an endpoint, a status code). THROWS,
94
+ * naming recast's own error — a failed search is not a searched-and-empty
95
+ * one, and the editor's probe already surfaces this separately from "no
96
+ * path found".
97
+ * - **Genuinely no route.** The query ran and found nothing. `[]`.
98
+ */
83
99
  findPath(start, end) {
84
- if (!this.query)
85
- return [];
100
+ if (!this.query) {
101
+ throw new Error('NavMeshManager.findPath: no navmesh has been built, so no path can be queried. ' +
102
+ 'Build one first (buildFromMeshes/importNavMesh) — gate on hasNavMesh() if the ' +
103
+ 'caller can run before a bake.');
104
+ }
86
105
  const result = this.query.computePath(start, end);
87
- if (!result.success)
88
- return [];
106
+ if (!result.success && result.error) {
107
+ throw new Error(`NavMeshManager.findPath: recast could not complete the query (${result.error.name}` +
108
+ `${result.error.status === undefined ? '' : `, status ${result.error.status}`}).`);
109
+ }
89
110
  return result.path;
90
111
  }
91
112
  /** Create a crowd with up to maxAgents agents. */
@@ -10,16 +10,24 @@
10
10
  * the old `.animgraph.json` format) was deleted with the runtime that read
11
11
  * them (`anim-graph.ts`).
12
12
  */
13
+ /**
14
+ * The optional fields spell `| undefined` explicitly because the repo compiles
15
+ * with `exactOptionalPropertyTypes`, and the one producer of these values is
16
+ * `xstate-animation-meta.ts`'s Zod schema, whose `.optional()` infers
17
+ * `?: T | undefined`. Without the explicit union the parsed value is not
18
+ * assignable here and the call site needs a cast — which is exactly what used
19
+ * to hide field drift between the two declarations (see `asBlendTreeDef`).
20
+ */
13
21
  export interface BlendTreeDef {
14
22
  type: '1D' | '2D' | 'direct';
15
23
  parameter: string;
16
- parameterY?: string;
24
+ parameterY?: string | undefined;
17
25
  children: BlendChild[];
18
26
  }
19
27
  export interface BlendChild {
20
28
  clip: string;
21
29
  threshold: number;
22
- thresholdY?: number;
23
- weight?: number;
30
+ thresholdY?: number | undefined;
31
+ weight?: number | undefined;
24
32
  }
25
33
  //# sourceMappingURL=anim-graph-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anim-graph-types.d.ts","sourceRoot":"","sources":["../../src/animation/anim-graph-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"anim-graph-types.d.ts","sourceRoot":"","sources":["../../src/animation/anim-graph-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B"}
@@ -74,10 +74,10 @@ export interface TheatreClockBinding {
74
74
  /**
75
75
  * Subscribe `sequence.position = clock.time` to every crossing of `clock` in
76
76
  * the given phase (default `'animation'`). Returns a disposer; call it to
77
- * stop driving the sequence (e.g. on `GameCleanup.dispose()` or before
78
- * rebinding on hot reload — this is what keeps HMR from accumulating
79
- * duplicate listeners, since re-running `setup()` disposes the old binding
80
- * before creating a new one).
77
+ * stop driving the sequence (e.g. in the owning component's unmount cleanup,
78
+ * or before rebinding on hot reload — this is what keeps HMR from
79
+ * accumulating duplicate listeners: dispose the old binding before creating
80
+ * a new one).
81
81
  *
82
82
  * Multiple sheets/sequences can each get their own binding with no shared
83
83
  * mutable state on VGAI's side — collision avoidance for the underlying
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Subscribe `sequence.position = clock.time` to every crossing of `clock` in
3
3
  * the given phase (default `'animation'`). Returns a disposer; call it to
4
- * stop driving the sequence (e.g. on `GameCleanup.dispose()` or before
5
- * rebinding on hot reload — this is what keeps HMR from accumulating
6
- * duplicate listeners, since re-running `setup()` disposes the old binding
7
- * before creating a new one).
4
+ * stop driving the sequence (e.g. in the owning component's unmount cleanup,
5
+ * or before rebinding on hot reload — this is what keeps HMR from
6
+ * accumulating duplicate listeners: dispose the old binding before creating
7
+ * a new one).
8
8
  *
9
9
  * Multiple sheets/sequences can each get their own binding with no shared
10
10
  * mutable state on VGAI's side — collision avoidance for the underlying
@@ -1 +1 @@
1
- {"version":3,"file":"xstate-animation-binding.d.ts","sourceRoot":"","sources":["../../src/animation/xstate-animation-binding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xstate-animation-binding.d.ts","sourceRoot":"","sources":["../../src/animation/xstate-animation-binding.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import * as THREE from 'three';
2
2
  import { deleteUserData, getUserData, setUserData } from '../ecs/user-data';
3
3
  import { evaluateBlendTree } from './blend-node';
4
4
  import { attachAnimationRuntimeInspection, } from './runtime-inspection';
5
- import { clipNamesOf, collectMachineAnimationMeta, isBlendTreeAnimationMeta, } from './xstate-animation-meta';
5
+ import { asBlendTreeDef, clipNamesOf, collectMachineAnimationMeta, isBlendTreeAnimationMeta, } from './xstate-animation-meta';
6
6
  /** A binding-time problem such as a missing clip, bone, or ambiguous layer. */
7
7
  export class AnimationBindingError extends Error {
8
8
  stateId;
@@ -188,7 +188,7 @@ export function bindXStateAnimation(actor, mixer, clips, options = {}) {
188
188
  }
189
189
  function weightsOf(stateId, meta, context) {
190
190
  const weights = isBlendTreeAnimationMeta(meta)
191
- ? evaluateBlendTree(meta.blendTree, readParameters(context))
191
+ ? evaluateBlendTree(asBlendTreeDef(meta.blendTree), readParameters(context))
192
192
  : [{ clip: meta.clip, weight: 1 }];
193
193
  return weights.map(({ clip, weight }) => ({
194
194
  clip,
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import type { BlendTreeDef } from './anim-graph-types';
2
3
  /**
3
4
  * E1 — Zod/TypeScript metadata attached to XState state `meta.animation`
4
5
  * (spec §11 E1, §5.6, §3.3).
@@ -69,6 +70,18 @@ export declare const AnimationBlendTreeSchema: z.ZodDiscriminatedUnion<[z.ZodObj
69
70
  }, z.core.$strict>>;
70
71
  }, z.core.$strict>], "type">;
71
72
  export type AnimationBlendTree = z.infer<typeof AnimationBlendTreeSchema>;
73
+ /**
74
+ * The structural-identity claim in this file's header, made COMPILER-CHECKED.
75
+ *
76
+ * `evaluateBlendTree` takes `anim-graph-types.ts`'s `BlendTreeDef`, and the
77
+ * whole reason this schema mirrors that shape field-for-field is so a parsed
78
+ * value can be handed over with zero conversion. The binding used to spell that
79
+ * hand-over `as unknown as BlendTreeDef` — a double cast that would have gone on
80
+ * compiling if either declaration drifted, silently feeding the blend math a
81
+ * shape it does not describe. This identity function is the assignability
82
+ * assertion instead: drift here is a type error at the seam that claims it.
83
+ */
84
+ export declare function asBlendTreeDef(tree: AnimationBlendTree): BlendTreeDef;
72
85
  declare const AnimationCrossfadeMetaSchema: z.ZodObject<{
73
86
  duration: z.ZodDefault<z.ZodNumber>;
74
87
  warp: z.ZodDefault<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"xstate-animation-meta.d.ts","sourceRoot":"","sources":["../../src/animation/xstate-animation-meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAMH,QAAA,MAAM,yBAAyB;;;;;kBAcpB,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAwC5E,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAInC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAM1E,QAAA,MAAM,4BAA4B;;;kBAmBkC,CAAC;AAErE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,QAAA,MAAM,uBAAuB;;;kBAiB0C,CAAC;AAExE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AA2BxE,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;kBAiBlB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,QAAA,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAQvB,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAGnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,IAAI,iBAAiB,CAEvF;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,IAAI,sBAAsB,CAEjG;AAMD,iFAAiF;AACjF,qBAAa,4BAA6B,SAAQ,KAAK;IAGnD,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAF7B,OAAO,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAKhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAazF;AAMD,4EAA4E;AAC5E,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,0BAA0B,GAC/B,yBAAyB,EAAE,CAU7B;AAED,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAE9D"}
1
+ {"version":3,"file":"xstate-animation-meta.d.ts","sourceRoot":"","sources":["../../src/animation/xstate-animation-meta.ts"],"names":[],"mappings":"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"}
@@ -90,6 +90,20 @@ export const AnimationBlendTreeSchema = z.discriminatedUnion('type', [
90
90
  AnimationBlendTree2DSchema,
91
91
  AnimationBlendTreeDirectSchema,
92
92
  ]);
93
+ /**
94
+ * The structural-identity claim in this file's header, made COMPILER-CHECKED.
95
+ *
96
+ * `evaluateBlendTree` takes `anim-graph-types.ts`'s `BlendTreeDef`, and the
97
+ * whole reason this schema mirrors that shape field-for-field is so a parsed
98
+ * value can be handed over with zero conversion. The binding used to spell that
99
+ * hand-over `as unknown as BlendTreeDef` — a double cast that would have gone on
100
+ * compiling if either declaration drifted, silently feeding the blend math a
101
+ * shape it does not describe. This identity function is the assignability
102
+ * assertion instead: drift here is a type error at the seam that claims it.
103
+ */
104
+ export function asBlendTreeDef(tree) {
105
+ return tree;
106
+ }
93
107
  // ---------------------------------------------------------------------------
94
108
  // Crossfade / blend-in-out metadata (shared by clip and blend-tree states)
95
109
  // ---------------------------------------------------------------------------
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * The engine's runtime descriptor schemas.
3
3
  *
4
- * WO-8 deleted the `.vscn.json` scene format and everything under
5
- * `engine/src/scene/`. What survived is here, and each module is here because a
6
- * real runtime reader still consumes it:
4
+ * Each module is here because a real runtime READER consumes it — nothing in
5
+ * this directory exists as documentation of a format:
7
6
  *
8
7
  * - `material.ts` — the inline material descriptor `render/material-factory.ts` reads
9
8
  * - `mesh.ts` — the geometry descriptor `render/material-factory.ts`'s `createGeometry` reads
@@ -16,10 +15,8 @@
16
15
  * - `tuples.ts` — the shared Vec3/Quat/Transform tuples the above build on
17
16
  *
18
17
  * These are DESCRIPTORS, not documents: each names a slice of authored data a
19
- * render/physics factory reads, and none of them is a scene. They carried a
20
- * `Scene*` prefix until WO-9 task #6 renamed them to `*Descriptor` — the prefix
21
- * was a leftover of the deleted `.vscn.json` format, not a statement about what
22
- * they describe.
18
+ * render/physics factory reads, and none of them is a scene which is why
19
+ * every one of them is named `*Descriptor`.
23
20
  */
24
21
  export type { CameraDescriptor } from './camera';
25
22
  export { CameraDescriptorSchema } from './camera';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/asset-formats/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/asset-formats/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * The engine's runtime descriptor schemas.
3
3
  *
4
- * WO-8 deleted the `.vscn.json` scene format and everything under
5
- * `engine/src/scene/`. What survived is here, and each module is here because a
6
- * real runtime reader still consumes it:
4
+ * Each module is here because a real runtime READER consumes it — nothing in
5
+ * this directory exists as documentation of a format:
7
6
  *
8
7
  * - `material.ts` — the inline material descriptor `render/material-factory.ts` reads
9
8
  * - `mesh.ts` — the geometry descriptor `render/material-factory.ts`'s `createGeometry` reads
@@ -16,10 +15,8 @@
16
15
  * - `tuples.ts` — the shared Vec3/Quat/Transform tuples the above build on
17
16
  *
18
17
  * These are DESCRIPTORS, not documents: each names a slice of authored data a
19
- * render/physics factory reads, and none of them is a scene. They carried a
20
- * `Scene*` prefix until WO-9 task #6 renamed them to `*Descriptor` — the prefix
21
- * was a leftover of the deleted `.vscn.json` format, not a statement about what
22
- * they describe.
18
+ * render/physics factory reads, and none of them is a scene which is why
19
+ * every one of them is named `*Descriptor`.
23
20
  */
24
21
  export { CameraDescriptorSchema } from './camera';
25
22
  export { ColliderDescriptorSchema } from './collider';
@@ -2,12 +2,9 @@
2
2
  * Render settings — the tone-mapping / post-processing / render-feature scope
3
3
  * the engine's renderer setup reads (`setup/setup-renderer.ts`).
4
4
  *
5
- * This used to be the `environment` block of the retired `.vscn.json` scene
6
- * format (WO-8). The format is gone; these three scopes stayed because
7
- * `setup-renderer.ts` genuinely reads every field and builds the
8
- * postprocessing chain from them. Everything that was `.vscn`-only (`skybox`,
9
- * `fog`, `ambient`, `background`, `envMapIntensity`, `navigation`, `physics`)
10
- * went with the format.
5
+ * Exactly THREE scopes, and each is here because `setup-renderer.ts` reads
6
+ * every one of its fields to build the postprocessing chain. A setting with
7
+ * no such reader does not belong in this descriptor.
11
8
  */
12
9
  import { z } from 'zod';
13
10
  export declare const ToneMappingDescriptorSchema: z.ZodObject<{
@@ -128,8 +125,8 @@ export declare const PostProcessingDescriptorSchema: z.ZodObject<{
128
125
  enabled: z.ZodOptional<z.ZodBoolean>;
129
126
  preset: z.ZodOptional<z.ZodEnum<{
130
127
  high: "high";
131
- low: "low";
132
128
  medium: "medium";
129
+ low: "low";
133
130
  ultra: "ultra";
134
131
  }>>;
135
132
  }, z.core.$strip>>;
@@ -314,8 +311,8 @@ export declare const RenderEnvironmentSchema: z.ZodObject<{
314
311
  enabled: z.ZodOptional<z.ZodBoolean>;
315
312
  preset: z.ZodOptional<z.ZodEnum<{
316
313
  high: "high";
317
- low: "low";
318
314
  medium: "medium";
315
+ low: "low";
319
316
  ultra: "ultra";
320
317
  }>>;
321
318
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"render-env.d.ts","sourceRoot":"","sources":["../../src/asset-formats/render-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAQC,CAAC;AAE1C,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoRL,CAAC;AAEvC,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYkC,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
1
+ {"version":3,"file":"render-env.d.ts","sourceRoot":"","sources":["../../src/asset-formats/render-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAQC,CAAC;AAE1C,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoRL,CAAC;AAEvC,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYkC,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -2,12 +2,9 @@
2
2
  * Render settings — the tone-mapping / post-processing / render-feature scope
3
3
  * the engine's renderer setup reads (`setup/setup-renderer.ts`).
4
4
  *
5
- * This used to be the `environment` block of the retired `.vscn.json` scene
6
- * format (WO-8). The format is gone; these three scopes stayed because
7
- * `setup-renderer.ts` genuinely reads every field and builds the
8
- * postprocessing chain from them. Everything that was `.vscn`-only (`skybox`,
9
- * `fog`, `ambient`, `background`, `envMapIntensity`, `navigation`, `physics`)
10
- * went with the format.
5
+ * Exactly THREE scopes, and each is here because `setup-renderer.ts` reads
6
+ * every one of its fields to build the postprocessing chain. A setting with
7
+ * no such reader does not belong in this descriptor.
11
8
  */
12
9
  import { z } from 'zod';
13
10
  import { buildRenderingZod } from '../render/render-features';
@@ -7,11 +7,8 @@
7
7
  * every caller (currently the input-map loader in `input/input-manager.ts`)
8
8
  * does not have to reach into an unrelated subsystem for it.
9
9
  *
10
- * It was called `SceneParseError` until WO-9 task #6. The extraction that gave
11
- * this file its name deliberately deferred the class rename ("extraction, not
12
- * redesign"); with `.vscn` gone the old name described nothing — an
13
- * `.inputmap.json` failure is not a scene failure — so the class and its
14
- * message header now say `asset`.
10
+ * The name says ASSET, not scene: an `.inputmap.json` failure is not a scene
11
+ * failure, and the class covers every structured fetched asset.
15
12
  */
16
13
  import type { ZodIssue } from 'zod';
17
14
  export declare class AssetParseError extends Error {