@jgengine/core 0.10.0 → 0.12.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 (727) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Scene ownership boundary — gives every editor-visible object an explicit
3
+ * provenance and a single verdict (expose / bake / reject) so the editor never
4
+ * presents unauthored content as broken authored content.
5
+ *
6
+ * The product invariant is "author world content in the editor": the scene
7
+ * document is the source of truth. Runtime code, procedural generators, and
8
+ * simulation still put objects in front of the player that the document never
9
+ * described. This module classifies each such object by where it comes from and
10
+ * decides whether the editor may author it, may offer to bake it into the
11
+ * document, or must reject it as read-only runtime content — with a diagnostic
12
+ * that explains the decision. Genuinely runtime-only content is then declared
13
+ * with a reason rather than silently tolerated or exempted by game name.
14
+ *
15
+ * Everything here is plain serializable data and pure functions, so a
16
+ * {@link SceneOwnershipManifest} round-trips through JSON and the verdict for an
17
+ * object is deterministic given its declaration.
18
+ */
19
+ /** Where an editor-visible object comes from — its authorship provenance. */
20
+ export type SceneProvenanceKind = "authored" | "generated" | "runtime" | "transient";
21
+ /** A first-class entry in the scene document — the editor fully owns and persists it. */
22
+ export interface AuthoredProvenance {
23
+ readonly kind: "authored";
24
+ /** Stable id of the object in the scene document. */
25
+ readonly documentId: string;
26
+ }
27
+ /**
28
+ * An object derived from an authored document object — instances scattered from a
29
+ * painted layer, walls extruded from an authored footprint. Edits belong on the
30
+ * source object, not the generated instance.
31
+ */
32
+ export interface GeneratedProvenance {
33
+ readonly kind: "generated";
34
+ /** Document object this instance was generated from. */
35
+ readonly sourceDocumentId: string;
36
+ /** Stable id of the generated instance. */
37
+ readonly instanceId: string;
38
+ }
39
+ /**
40
+ * An object owned entirely by runtime or procedural code with no document entry.
41
+ * Not authorable unless its provider can bake it into schema-valid authored data.
42
+ */
43
+ export interface RuntimeProvenance {
44
+ readonly kind: "runtime";
45
+ /** Stable id of the runtime provider that owns this object. */
46
+ readonly providerId: string;
47
+ /** Stable id of the object within the provider. */
48
+ readonly instanceId: string;
49
+ }
50
+ /** An ephemeral simulation object — a spawned agent, projectile, or particle that never persists. */
51
+ export interface TransientProvenance {
52
+ readonly kind: "transient";
53
+ /** Stable id of the runtime provider that spawned this object. */
54
+ readonly providerId: string;
55
+ /** Stable id of the object within the provider. */
56
+ readonly instanceId: string;
57
+ }
58
+ /** The provenance of one editor-visible object — authored, generated, runtime, or transient. */
59
+ export type SceneProvenance = AuthoredProvenance | GeneratedProvenance | RuntimeProvenance | TransientProvenance;
60
+ /** What a provider lets the editor do with one of its objects. Absent flags default to `false`. */
61
+ export interface ProviderCapabilities {
62
+ /** Editor may select the object. */
63
+ readonly select?: boolean;
64
+ /** Editor may focus/frame the camera on it. */
65
+ readonly focus?: boolean;
66
+ /** Editor may hide it from the viewport. */
67
+ readonly hide?: boolean;
68
+ /** Provider can emit schema-valid authored data (stable ids, undoable) to bake this object into the document. */
69
+ readonly bake?: boolean;
70
+ }
71
+ /** A provider's explicit ownership declaration for one editor-visible object. */
72
+ export interface SceneOwnershipDeclaration {
73
+ /** Where the object comes from. */
74
+ readonly provenance: SceneProvenance;
75
+ /** What the provider lets the editor do with it. */
76
+ readonly capabilities?: ProviderCapabilities;
77
+ /**
78
+ * Human-readable justification for why this object is not an authored document
79
+ * object. Required for `runtime`/`transient` provenance without a `bake`
80
+ * capability — its absence is a boundary violation (unowned content
81
+ * masquerading as scene content).
82
+ */
83
+ readonly reason?: string;
84
+ }
85
+ /** The boundary's resolution for one object. */
86
+ export type OwnershipDecision = "expose" | "bake" | "reject";
87
+ /** The full verdict for one object: its decision plus the flags and diagnostic the editor needs to act on it. */
88
+ export interface OwnershipVerdict {
89
+ /** `expose` (authorable), `bake` (offer import), or `reject` (read-only runtime content). */
90
+ readonly decision: OwnershipDecision;
91
+ /** The provenance kind that produced this decision. */
92
+ readonly provenance: SceneProvenanceKind;
93
+ /** The editor must present the object read-only — authoring edits are not accepted. */
94
+ readonly readOnly: boolean;
95
+ /** A "bake/import to document" action should be offered for this object. */
96
+ readonly bakeable: boolean;
97
+ /** Diagnostic string the editor can surface next to the object. */
98
+ readonly reason: string;
99
+ /** Set when the declaration breaks the ownership contract; the editor and content gate should flag it. */
100
+ readonly violation?: string;
101
+ }
102
+ /** One boundary problem found while auditing a set of declarations. */
103
+ export interface OwnershipDiagnostic {
104
+ /** Key identifying the offending object (its provenance id when audited from a manifest). */
105
+ readonly key: string;
106
+ /** Provenance kind of the offending object. */
107
+ readonly provenance: SceneProvenanceKind;
108
+ /** The decision the object resolved to (always `reject` for a violation). */
109
+ readonly decision: OwnershipDecision;
110
+ /** Human-readable violation message. */
111
+ readonly message: string;
112
+ }
113
+ /** Serializable record of a world's ownership declarations — persisted next to the scene document or shipped by a game. */
114
+ export interface SceneOwnershipManifest {
115
+ /** Schema version; currently {@link SCENE_OWNERSHIP_MANIFEST_VERSION}. */
116
+ readonly version: 1;
117
+ /** Optional label for the provider/world these declarations describe. */
118
+ readonly provider?: string;
119
+ /** The per-object ownership declarations. */
120
+ readonly declarations: readonly SceneOwnershipDeclaration[];
121
+ }
122
+ /** Current {@link SceneOwnershipManifest} schema version. */
123
+ export declare const SCENE_OWNERSHIP_MANIFEST_VERSION = 1;
124
+ /**
125
+ * Resolve one declaration into a single boundary verdict.
126
+ *
127
+ * - `authored` and `generated` provenance -> **expose** (generated objects are
128
+ * read-only; edit their source document object).
129
+ * - `runtime`/`transient` with a `bake` capability -> **bake** (offer import).
130
+ * - `runtime`/`transient` without `bake` -> **reject** (read-only); a missing
131
+ * `reason` marks it a boundary violation — content bypassing the document with
132
+ * no authored home, no way to bake, and no declared justification.
133
+ *
134
+ * @capability scene-ownership classify an editor-visible object as expose/bake/reject with a diagnostic
135
+ */
136
+ export declare function classifyOwnership(declaration: SceneOwnershipDeclaration): OwnershipVerdict;
137
+ /**
138
+ * Stable identity string for a provenance (e.g. `runtime:town/building-3`), suitable
139
+ * for keying an object in an editor tree or a diagnostics table.
140
+ *
141
+ * @capability scene-ownership derive a stable object key from its provenance
142
+ */
143
+ export declare function ownershipKey(provenance: SceneProvenance): string;
144
+ /**
145
+ * Audit a keyed set of declarations and return one diagnostic per object that
146
+ * breaks the boundary contract (a `reject` verdict carrying a `violation`).
147
+ * Deterministic: diagnostics come back in the iteration order of `entries`.
148
+ *
149
+ * @capability scene-ownership audit editor-visible objects and report boundary violations
150
+ */
151
+ export declare function collectOwnershipDiagnostics(entries: Iterable<readonly [string, SceneOwnershipDeclaration]>): OwnershipDiagnostic[];
152
+ /**
153
+ * Audit every declaration in a manifest, keying diagnostics by each object's
154
+ * provenance id. An empty result means the manifest declares all of its content
155
+ * cleanly — every object is authored, generated, bakeable, or a reasoned
156
+ * runtime/transient object.
157
+ *
158
+ * @capability scene-ownership audit a whole ownership manifest for boundary violations
159
+ */
160
+ export declare function auditManifest(manifest: SceneOwnershipManifest): OwnershipDiagnostic[];
161
+ /**
162
+ * Narrow unknown parsed JSON to a {@link SceneOwnershipManifest}. Structural only —
163
+ * verifies the version, the declarations array, and each declaration's provenance
164
+ * shape; it does not judge whether declarations satisfy the boundary (use
165
+ * {@link auditManifest} for that).
166
+ *
167
+ * @capability scene-ownership validate a serialized ownership manifest loaded from disk
168
+ */
169
+ export declare function isSceneOwnershipManifest(value: unknown): value is SceneOwnershipManifest;
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Scene ownership boundary — gives every editor-visible object an explicit
3
+ * provenance and a single verdict (expose / bake / reject) so the editor never
4
+ * presents unauthored content as broken authored content.
5
+ *
6
+ * The product invariant is "author world content in the editor": the scene
7
+ * document is the source of truth. Runtime code, procedural generators, and
8
+ * simulation still put objects in front of the player that the document never
9
+ * described. This module classifies each such object by where it comes from and
10
+ * decides whether the editor may author it, may offer to bake it into the
11
+ * document, or must reject it as read-only runtime content — with a diagnostic
12
+ * that explains the decision. Genuinely runtime-only content is then declared
13
+ * with a reason rather than silently tolerated or exempted by game name.
14
+ *
15
+ * Everything here is plain serializable data and pure functions, so a
16
+ * {@link SceneOwnershipManifest} round-trips through JSON and the verdict for an
17
+ * object is deterministic given its declaration.
18
+ */
19
+ /** Current {@link SceneOwnershipManifest} schema version. */
20
+ export const SCENE_OWNERSHIP_MANIFEST_VERSION = 1;
21
+ /**
22
+ * Resolve one declaration into a single boundary verdict.
23
+ *
24
+ * - `authored` and `generated` provenance -> **expose** (generated objects are
25
+ * read-only; edit their source document object).
26
+ * - `runtime`/`transient` with a `bake` capability -> **bake** (offer import).
27
+ * - `runtime`/`transient` without `bake` -> **reject** (read-only); a missing
28
+ * `reason` marks it a boundary violation — content bypassing the document with
29
+ * no authored home, no way to bake, and no declared justification.
30
+ *
31
+ * @capability scene-ownership classify an editor-visible object as expose/bake/reject with a diagnostic
32
+ */
33
+ export function classifyOwnership(declaration) {
34
+ const { provenance, capabilities, reason } = declaration;
35
+ const kind = provenance.kind;
36
+ if (kind === "authored") {
37
+ return {
38
+ decision: "expose",
39
+ provenance: kind,
40
+ readOnly: false,
41
+ bakeable: false,
42
+ reason: `authored document object "${provenance.documentId}"`,
43
+ };
44
+ }
45
+ if (kind === "generated") {
46
+ return {
47
+ decision: "expose",
48
+ provenance: kind,
49
+ readOnly: true,
50
+ bakeable: false,
51
+ reason: `generated from authored object "${provenance.sourceDocumentId}"; edit the source`,
52
+ };
53
+ }
54
+ const canBake = capabilities?.bake === true;
55
+ if (canBake) {
56
+ return {
57
+ decision: "bake",
58
+ provenance: kind,
59
+ readOnly: true,
60
+ bakeable: true,
61
+ reason: reason ?? `runtime provider "${provenance.providerId}" can bake this into the document`,
62
+ };
63
+ }
64
+ const hasReason = reason !== undefined && reason.trim() !== "";
65
+ const violation = hasReason
66
+ ? undefined
67
+ : `${kind} object "${provenance.instanceId}" from provider "${provenance.providerId}" has no authored ` +
68
+ `document entry, no bake capability, and no declared reason — it bypasses the scene-ownership boundary`;
69
+ return {
70
+ decision: "reject",
71
+ provenance: kind,
72
+ readOnly: true,
73
+ bakeable: false,
74
+ reason: hasReason ? reason : `runtime-only content owned by provider "${provenance.providerId}"`,
75
+ violation,
76
+ };
77
+ }
78
+ /** Stable id string for a provenance — used to key diagnostics deterministically. */
79
+ function provenanceKey(provenance) {
80
+ switch (provenance.kind) {
81
+ case "authored":
82
+ return `authored:${provenance.documentId}`;
83
+ case "generated":
84
+ return `generated:${provenance.sourceDocumentId}/${provenance.instanceId}`;
85
+ default:
86
+ return `${provenance.kind}:${provenance.providerId}/${provenance.instanceId}`;
87
+ }
88
+ }
89
+ /**
90
+ * Stable identity string for a provenance (e.g. `runtime:town/building-3`), suitable
91
+ * for keying an object in an editor tree or a diagnostics table.
92
+ *
93
+ * @capability scene-ownership derive a stable object key from its provenance
94
+ */
95
+ export function ownershipKey(provenance) {
96
+ return provenanceKey(provenance);
97
+ }
98
+ /**
99
+ * Audit a keyed set of declarations and return one diagnostic per object that
100
+ * breaks the boundary contract (a `reject` verdict carrying a `violation`).
101
+ * Deterministic: diagnostics come back in the iteration order of `entries`.
102
+ *
103
+ * @capability scene-ownership audit editor-visible objects and report boundary violations
104
+ */
105
+ export function collectOwnershipDiagnostics(entries) {
106
+ const out = [];
107
+ for (const [key, declaration] of entries) {
108
+ const verdict = classifyOwnership(declaration);
109
+ if (verdict.violation !== undefined) {
110
+ out.push({
111
+ key,
112
+ provenance: verdict.provenance,
113
+ decision: verdict.decision,
114
+ message: `${key}: ${verdict.violation}`,
115
+ });
116
+ }
117
+ }
118
+ return out;
119
+ }
120
+ /**
121
+ * Audit every declaration in a manifest, keying diagnostics by each object's
122
+ * provenance id. An empty result means the manifest declares all of its content
123
+ * cleanly — every object is authored, generated, bakeable, or a reasoned
124
+ * runtime/transient object.
125
+ *
126
+ * @capability scene-ownership audit a whole ownership manifest for boundary violations
127
+ */
128
+ export function auditManifest(manifest) {
129
+ return collectOwnershipDiagnostics(manifest.declarations.map((declaration) => [provenanceKey(declaration.provenance), declaration]));
130
+ }
131
+ function isProvenance(value) {
132
+ if (typeof value !== "object" || value === null)
133
+ return false;
134
+ const record = value;
135
+ switch (record.kind) {
136
+ case "authored":
137
+ return typeof record.documentId === "string";
138
+ case "generated":
139
+ return typeof record.sourceDocumentId === "string" && typeof record.instanceId === "string";
140
+ case "runtime":
141
+ case "transient":
142
+ return typeof record.providerId === "string" && typeof record.instanceId === "string";
143
+ default:
144
+ return false;
145
+ }
146
+ }
147
+ function isDeclaration(value) {
148
+ if (typeof value !== "object" || value === null)
149
+ return false;
150
+ const record = value;
151
+ if (!isProvenance(record.provenance))
152
+ return false;
153
+ if (record.reason !== undefined && typeof record.reason !== "string")
154
+ return false;
155
+ if (record.capabilities !== undefined && (typeof record.capabilities !== "object" || record.capabilities === null)) {
156
+ return false;
157
+ }
158
+ return true;
159
+ }
160
+ /**
161
+ * Narrow unknown parsed JSON to a {@link SceneOwnershipManifest}. Structural only —
162
+ * verifies the version, the declarations array, and each declaration's provenance
163
+ * shape; it does not judge whether declarations satisfy the boundary (use
164
+ * {@link auditManifest} for that).
165
+ *
166
+ * @capability scene-ownership validate a serialized ownership manifest loaded from disk
167
+ */
168
+ export function isSceneOwnershipManifest(value) {
169
+ if (typeof value !== "object" || value === null)
170
+ return false;
171
+ const record = value;
172
+ if (record.version !== SCENE_OWNERSHIP_MANIFEST_VERSION)
173
+ return false;
174
+ if (record.provider !== undefined && typeof record.provider !== "string")
175
+ return false;
176
+ if (!Array.isArray(record.declarations))
177
+ return false;
178
+ return record.declarations.every(isDeclaration);
179
+ }
@@ -1,4 +1,5 @@
1
1
  import { colliderBounds, colliderWorldCenter, defaultEntityColliders, defaultObjectColliders, resolveColliders, } from "./colliders.js";
2
+ import { raycastCollisionMesh } from "./collisionMesh.js";
2
3
  import { intersectAabb, normalizeDirection } from "./objectQuery.js";
3
4
  function excluded(exclude, id) {
4
5
  if (exclude === undefined)
@@ -54,6 +55,20 @@ function rayHitsCollider(origin, direction, maxDistance, collider, position, rot
54
55
  ],
55
56
  };
56
57
  }
58
+ if (collider.shape.kind === "mesh") {
59
+ const hit = raycastCollisionMesh(collider.shape.mesh, origin, direction, maxDistance, position, rotationY, collider.shape.meshScale, collider.shape.meshTranslate);
60
+ if (hit === null)
61
+ return null;
62
+ return {
63
+ distance: hit.distance,
64
+ normal: hit.normal,
65
+ point: [
66
+ origin[0] + direction[0] * hit.distance,
67
+ origin[1] + direction[1] * hit.distance,
68
+ origin[2] + direction[2] * hit.distance,
69
+ ],
70
+ };
71
+ }
57
72
  const bounds = colliderBounds(collider, position, rotationY);
58
73
  const hit = intersectAabb(origin, direction, bounds.min, bounds.max, maxDistance);
59
74
  if (hit === null)
@@ -0,0 +1,93 @@
1
+ import type { SelectionSet } from "./selection.js";
2
+ /**
3
+ * The serializable shape of a {@link SelectionBookmarks} store: each key maps to
4
+ * its ordered, deduplicated id list. Plain data — safe to persist in a save file
5
+ * or replicate over the wire, and the exact input {@link createSelectionBookmarks}
6
+ * restores.
7
+ */
8
+ export interface SelectionBookmarkSnapshot {
9
+ bookmarks: Record<string, readonly string[]>;
10
+ }
11
+ /** Outcome of a {@link SelectionBookmarks.prune} pass — what the validity predicate removed. */
12
+ export interface SelectionPruneResult {
13
+ /** Ids dropped from at least one bookmark because the predicate rejected them. */
14
+ removedIds: string[];
15
+ /** Bookmark keys deleted because pruning emptied them. */
16
+ clearedKeys: string[];
17
+ }
18
+ /**
19
+ * A generic, keyed store of saved id sets ("bookmarks") over stable string ids —
20
+ * the reusable layer under RTS control groups, camera bookmarks, saved squads,
21
+ * editor selection presets, and accessibility recall. It owns storage only:
22
+ * binding, recall, enumeration, pruning, and serialization. It never touches the
23
+ * active {@link SelectionSet} or the camera — replacement/merge and focus stay
24
+ * caller hooks (see {@link recallSelectionBookmark}) so one store serves any
25
+ * genre, input scheme, or focus policy.
26
+ *
27
+ * Keys are opaque strings, so numbered control groups (`"1"`…`"9"`), named
28
+ * bookmarks (`"home"`, `"base"`), or per-owner namespaces all coexist. Each
29
+ * bookmark preserves insertion order and dedupes, matching {@link SelectionSet}.
30
+ */
31
+ export interface SelectionBookmarks {
32
+ /** Replace the set under `key` with `ids` (ordered, deduped). Binding an empty set removes the key, so `has(key)` is then false and it drops out of {@link serialize}. */
33
+ bind(key: string, ids: Iterable<string>): void;
34
+ /** Add `ids` to the set under `key` (creating it if absent), skipping ones already present so order is stable. */
35
+ append(key: string, ids: Iterable<string>): void;
36
+ /** Remove `ids` from the set under `key`; if that empties the set, the key is deleted. No-op when the key is absent. */
37
+ remove(key: string, ids: Iterable<string>): void;
38
+ /** The ordered ids saved under `key`, or an empty array when the key is absent. The returned array is a fresh copy — mutating it never touches the store. */
39
+ recall(key: string): string[];
40
+ /** True when `key` holds a non-empty set. */
41
+ has(key: string): boolean;
42
+ /** Delete `key`; returns true when a set was removed. */
43
+ clear(key: string): boolean;
44
+ /** Delete every bookmark. */
45
+ clearAll(): void;
46
+ /** All bookmark keys in insertion order. */
47
+ keys(): string[];
48
+ /** Count of ids saved under `key`, or 0 when absent. */
49
+ size(key: string): number;
50
+ /**
51
+ * Drop every id the `isValid` predicate rejects from all bookmarks — the seam
52
+ * for destroyed entities, cross-scene ids, and ownership changes: the caller
53
+ * supplies validity, the store applies it. Bookmarks emptied by pruning are
54
+ * removed. Returns what was removed so callers can surface it.
55
+ */
56
+ prune(isValid: (id: string) => boolean): SelectionPruneResult;
57
+ /** A plain-data copy of every bookmark — the exact input {@link createSelectionBookmarks} restores. */
58
+ serialize(): SelectionBookmarkSnapshot;
59
+ }
60
+ /**
61
+ * Create a keyed bookmark store, optionally restored from a {@link serialize}
62
+ * snapshot. Restoration re-dedupes and drops empty sets, so a hand-authored or
63
+ * migrated snapshot always normalizes to the same invariants a live store holds.
64
+ *
65
+ * @capability selection-bookmarks keyed saved-set store (RTS control groups, camera bookmarks, saved squads) with prune + serialize
66
+ */
67
+ export declare function createSelectionBookmarks(snapshot?: SelectionBookmarkSnapshot): SelectionBookmarks;
68
+ /** How a recalled bookmark folds into the active selection. */
69
+ export type BookmarkRecallMode = "replace" | "merge";
70
+ /** Caller hooks for {@link recallSelectionBookmark} — kept out of the store so focus and validity stay genre-owned. */
71
+ export interface RecallBookmarkOptions {
72
+ /** `"replace"` (default) swaps the active selection for the bookmark; `"merge"` unions it in. */
73
+ mode?: BookmarkRecallMode;
74
+ /**
75
+ * Validity predicate applied to the bookmark before it reaches the selection —
76
+ * stale ids (destroyed entities, wrong scene, lost ownership) are pruned from
77
+ * the stored bookmark in place, so recall self-heals. Omit to recall verbatim.
78
+ */
79
+ isValid?: (id: string) => boolean;
80
+ /** Focus hook fired with the surviving ids (e.g. center/follow the camera). Never called when recall yields nothing. */
81
+ onFocus?: (ids: readonly string[]) => void;
82
+ }
83
+ /**
84
+ * Compose a bookmark recall onto an active {@link SelectionSet}: optionally prune
85
+ * stale ids (updating the stored bookmark), fold the survivors into the selection
86
+ * by `mode`, then fire the caller's focus hook. This is the one place the store,
87
+ * the selection, and the camera meet — kept as an explicit helper, not a store
88
+ * side effect, so games opt into the exact replacement/merge and focus policy
89
+ * they want. Returns the surviving ids that were applied.
90
+ *
91
+ * @capability selection-bookmark-recall fold a saved set into the active selection with stale-ref pruning and a caller focus hook
92
+ */
93
+ export declare function recallSelectionBookmark(bookmarks: SelectionBookmarks, key: string, selection: SelectionSet, options?: RecallBookmarkOptions): string[];
@@ -0,0 +1,122 @@
1
+ function dedupe(ids) {
2
+ const out = [];
3
+ const seen = new Set();
4
+ for (const id of ids) {
5
+ if (seen.has(id))
6
+ continue;
7
+ seen.add(id);
8
+ out.push(id);
9
+ }
10
+ return out;
11
+ }
12
+ /**
13
+ * Create a keyed bookmark store, optionally restored from a {@link serialize}
14
+ * snapshot. Restoration re-dedupes and drops empty sets, so a hand-authored or
15
+ * migrated snapshot always normalizes to the same invariants a live store holds.
16
+ *
17
+ * @capability selection-bookmarks keyed saved-set store (RTS control groups, camera bookmarks, saved squads) with prune + serialize
18
+ */
19
+ export function createSelectionBookmarks(snapshot) {
20
+ const groups = new Map();
21
+ if (snapshot !== undefined) {
22
+ for (const [key, ids] of Object.entries(snapshot.bookmarks)) {
23
+ const list = dedupe(ids);
24
+ if (list.length > 0)
25
+ groups.set(key, list);
26
+ }
27
+ }
28
+ return {
29
+ bind(key, ids) {
30
+ const list = dedupe(ids);
31
+ if (list.length === 0)
32
+ groups.delete(key);
33
+ else
34
+ groups.set(key, list);
35
+ },
36
+ append(key, ids) {
37
+ const existing = groups.get(key);
38
+ if (existing === undefined) {
39
+ const list = dedupe(ids);
40
+ if (list.length > 0)
41
+ groups.set(key, list);
42
+ return;
43
+ }
44
+ const seen = new Set(existing);
45
+ for (const id of ids) {
46
+ if (seen.has(id))
47
+ continue;
48
+ seen.add(id);
49
+ existing.push(id);
50
+ }
51
+ },
52
+ remove(key, ids) {
53
+ const existing = groups.get(key);
54
+ if (existing === undefined)
55
+ return;
56
+ const drop = new Set(ids);
57
+ const next = existing.filter((id) => !drop.has(id));
58
+ if (next.length === 0)
59
+ groups.delete(key);
60
+ else
61
+ groups.set(key, next);
62
+ },
63
+ recall(key) {
64
+ const existing = groups.get(key);
65
+ return existing === undefined ? [] : [...existing];
66
+ },
67
+ has: (key) => (groups.get(key)?.length ?? 0) > 0,
68
+ clear: (key) => groups.delete(key),
69
+ clearAll: () => groups.clear(),
70
+ keys: () => [...groups.keys()],
71
+ size: (key) => groups.get(key)?.length ?? 0,
72
+ prune(isValid) {
73
+ const removedIds = new Set();
74
+ const clearedKeys = [];
75
+ for (const [key, list] of [...groups]) {
76
+ const next = list.filter((id) => {
77
+ const keep = isValid(id);
78
+ if (!keep)
79
+ removedIds.add(id);
80
+ return keep;
81
+ });
82
+ if (next.length === list.length)
83
+ continue;
84
+ if (next.length === 0) {
85
+ groups.delete(key);
86
+ clearedKeys.push(key);
87
+ }
88
+ else {
89
+ groups.set(key, next);
90
+ }
91
+ }
92
+ return { removedIds: [...removedIds], clearedKeys };
93
+ },
94
+ serialize: () => ({
95
+ bookmarks: Object.fromEntries([...groups].map(([key, list]) => [key, [...list]])),
96
+ }),
97
+ };
98
+ }
99
+ /**
100
+ * Compose a bookmark recall onto an active {@link SelectionSet}: optionally prune
101
+ * stale ids (updating the stored bookmark), fold the survivors into the selection
102
+ * by `mode`, then fire the caller's focus hook. This is the one place the store,
103
+ * the selection, and the camera meet — kept as an explicit helper, not a store
104
+ * side effect, so games opt into the exact replacement/merge and focus policy
105
+ * they want. Returns the surviving ids that were applied.
106
+ *
107
+ * @capability selection-bookmark-recall fold a saved set into the active selection with stale-ref pruning and a caller focus hook
108
+ */
109
+ export function recallSelectionBookmark(bookmarks, key, selection, options = {}) {
110
+ const { mode = "replace", isValid, onFocus } = options;
111
+ if (isValid !== undefined)
112
+ bookmarks.prune(isValid);
113
+ const ids = bookmarks.recall(key);
114
+ if (mode === "replace")
115
+ selection.replace(ids);
116
+ else
117
+ for (const id of ids)
118
+ selection.add(id);
119
+ if (ids.length > 0)
120
+ onFocus?.(ids);
121
+ return ids;
122
+ }
@@ -0,0 +1,68 @@
1
+ import { MountController, type MountSeat, type RideableConfig } from "./mount.js";
2
+ /** World-space `[x, y, z]` for a vehicle's current position. */
3
+ export type VehiclePosition = readonly [number, number, number];
4
+ /** A vehicle's world-space position and heading, used for {@link VehicleSeats.exit}'s dismount placement math. */
5
+ export interface VehiclePose {
6
+ position: VehiclePosition;
7
+ rotationY: number;
8
+ }
9
+ /** Options for {@link VehicleSeats.enter}. */
10
+ export interface EnterVehicleOptions {
11
+ /** Specific seat to board; omit to take the first free control seat, else the first free seat. */
12
+ seatId?: string;
13
+ }
14
+ /** Movement-lock patch for `entities.update(riderId, { movement: { ...current, ...patch } })` (#286.gameplay `movement.frozen`). */
15
+ export interface RiderMovementPatch {
16
+ frozen: boolean;
17
+ }
18
+ /** Result of {@link VehicleSeats.enter} — the resolved seat plus the camera/drive/movement patches to apply. */
19
+ export type EnterVehicleResult = {
20
+ ok: true;
21
+ seat: MountSeat;
22
+ /** Feed straight into `ctx.camera.follow(...)` — the vehicle while a control seat is taken, else the rider's own id. */
23
+ cameraTarget: string;
24
+ /** Entity this rider's axis input should now drive (`scene/mount`'s `driveTarget`); `null` for a passenger seat. */
25
+ driveTarget: string | null;
26
+ riderMovementPatch: RiderMovementPatch;
27
+ } | {
28
+ ok: false;
29
+ reason: string;
30
+ };
31
+ /** Result of {@link VehicleSeats.exit} — the side-door placement plus the camera/movement patches to apply. */
32
+ export type ExitVehicleResult = {
33
+ ok: true;
34
+ vehicleId: string;
35
+ /** Where to `setPose` the rider — alongside the vehicle's side door, facing its heading. */
36
+ placement: VehiclePose;
37
+ cameraTarget: string;
38
+ riderMovementPatch: RiderMovementPatch;
39
+ } | {
40
+ ok: false;
41
+ reason: "not_seated";
42
+ };
43
+ /** Where {@link VehicleSeats.exit} steps the rider out, relative to the vehicle's heading. */
44
+ export interface DismountOffset {
45
+ /** Lateral distance from the vehicle's centerline; default 2.2. */
46
+ distance?: number;
47
+ /** Which side of the vehicle to step out on, relative to its heading; default `"right"`. */
48
+ side?: "left" | "right";
49
+ }
50
+ /**
51
+ * Composes `scene/mount`'s control-transfer bookkeeping with the seat/camera/movement-mode transition
52
+ * every enter/exit-vehicle flow needs (#533.2): boarding resolves a free seat and reports the camera
53
+ * target, drive target, and rider movement-lock patch in one call; leaving computes a side-door
54
+ * placement next to the vehicle and reports the same triad in reverse. Pure — no entity/camera side
55
+ * effects — the caller applies `riderMovementPatch`/`placement`/`cameraTarget` via its own `ctx`.
56
+ */
57
+ export declare class VehicleSeats {
58
+ private readonly controller;
59
+ constructor(controller?: MountController);
60
+ register(config: RideableConfig): void;
61
+ enter(riderId: string, vehicleId: string, options?: EnterVehicleOptions): EnterVehicleResult;
62
+ exit(riderId: string, vehiclePose: VehiclePose, offset?: DismountOffset): ExitVehicleResult;
63
+ isSeated(riderId: string): boolean;
64
+ driverOf(vehicleId: string): string | null;
65
+ get mounts(): MountController;
66
+ }
67
+ /** Builds a {@link VehicleSeats}, optionally over an existing `MountController` to share its occupancy. */
68
+ export declare function createVehicleSeats(controller?: MountController): VehicleSeats;