@jgengine/core 0.10.0 → 0.11.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 (607) hide show
  1. package/CHANGELOG.md +13 -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/spawnDirector.d.ts +7 -2
  21. package/dist/ai/spawnDirector.js +18 -15
  22. package/dist/ai/spawnPoint.d.ts +3 -1
  23. package/dist/ai/spawnPoint.js +3 -1
  24. package/dist/ai/targetAcquisition.d.ts +84 -0
  25. package/dist/ai/targetAcquisition.js +92 -0
  26. package/dist/anim/easing.d.ts +19 -0
  27. package/dist/anim/easing.js +19 -0
  28. package/dist/anim/oscillator.d.ts +12 -0
  29. package/dist/anim/oscillator.js +25 -0
  30. package/dist/area/areaEffectField.d.ts +127 -0
  31. package/dist/area/areaEffectField.js +175 -0
  32. package/dist/area/stackPolicy.d.ts +47 -0
  33. package/dist/area/stackPolicy.js +99 -0
  34. package/dist/authoring.d.ts +1 -0
  35. package/dist/authoring.js +1 -0
  36. package/dist/board/laneBoard.d.ts +13 -0
  37. package/dist/board/laneBoard.js +13 -0
  38. package/dist/board/timelineBoard.d.ts +10 -0
  39. package/dist/board/timelineBoard.js +10 -0
  40. package/dist/combat/abilityKit.d.ts +18 -0
  41. package/dist/combat/abilityKit.js +24 -9
  42. package/dist/combat/animationState.d.ts +5 -0
  43. package/dist/combat/animationState.js +5 -0
  44. package/dist/combat/breakMeters.d.ts +10 -0
  45. package/dist/combat/breakMeters.js +10 -0
  46. package/dist/combat/castRunner.d.ts +5 -0
  47. package/dist/combat/castRunner.js +5 -0
  48. package/dist/combat/comboPoints.d.ts +5 -0
  49. package/dist/combat/comboPoints.js +5 -0
  50. package/dist/combat/comboString.d.ts +5 -0
  51. package/dist/combat/comboString.js +5 -0
  52. package/dist/combat/damageInterceptors.d.ts +192 -0
  53. package/dist/combat/damageInterceptors.js +251 -0
  54. package/dist/combat/damageMatchup.d.ts +68 -0
  55. package/dist/combat/damageMatchup.js +42 -0
  56. package/dist/combat/damageResolution.d.ts +63 -0
  57. package/dist/combat/damageResolution.js +50 -0
  58. package/dist/combat/death.d.ts +7 -1
  59. package/dist/combat/death.js +5 -0
  60. package/dist/combat/deathReason.d.ts +14 -0
  61. package/dist/combat/deathReason.js +1 -0
  62. package/dist/combat/defensiveWindow.d.ts +5 -0
  63. package/dist/combat/defensiveWindow.js +5 -0
  64. package/dist/combat/dotField.d.ts +5 -1
  65. package/dist/combat/dotField.js +5 -1
  66. package/dist/combat/downed.d.ts +5 -0
  67. package/dist/combat/downed.js +5 -0
  68. package/dist/combat/effects.d.ts +5 -0
  69. package/dist/combat/effects.js +5 -0
  70. package/dist/combat/encounterSequence.d.ts +258 -0
  71. package/dist/combat/encounterSequence.js +426 -0
  72. package/dist/combat/hitReaction.d.ts +57 -1
  73. package/dist/combat/hitReaction.js +45 -5
  74. package/dist/combat/magazine.d.ts +54 -0
  75. package/dist/combat/magazine.js +96 -0
  76. package/dist/combat/projectiles.d.ts +5 -0
  77. package/dist/combat/projectiles.js +32 -14
  78. package/dist/combat/receivedDamage.d.ts +117 -0
  79. package/dist/combat/receivedDamage.js +92 -0
  80. package/dist/combat/regenShield.d.ts +5 -1
  81. package/dist/combat/regenShield.js +5 -1
  82. package/dist/combat/renderCues.d.ts +51 -0
  83. package/dist/combat/renderCues.js +44 -0
  84. package/dist/combat/resourcePool.d.ts +5 -0
  85. package/dist/combat/resourcePool.js +5 -0
  86. package/dist/combat/rewardAllocation.d.ts +121 -0
  87. package/dist/combat/rewardAllocation.js +251 -0
  88. package/dist/combat/shotOrigin.d.ts +18 -1
  89. package/dist/combat/shotOrigin.js +39 -0
  90. package/dist/combat/statusApplication.d.ts +96 -0
  91. package/dist/combat/statusApplication.js +81 -0
  92. package/dist/combat/telegraph.d.ts +11 -2
  93. package/dist/combat/telegraph.js +11 -2
  94. package/dist/combat/thresholdCrossings.d.ts +85 -0
  95. package/dist/combat/thresholdCrossings.js +116 -0
  96. package/dist/combat.d.ts +34 -0
  97. package/dist/combat.js +34 -0
  98. package/dist/commands/commandRegistry.d.ts +11 -0
  99. package/dist/commands/commandRegistry.js +9 -2
  100. package/dist/crafting/crop.d.ts +18 -0
  101. package/dist/crafting/crop.js +18 -0
  102. package/dist/crafting/production.d.ts +5 -0
  103. package/dist/crafting/production.js +5 -0
  104. package/dist/devtools/rewriteTunables.d.ts +17 -0
  105. package/dist/devtools/rewriteTunables.js +276 -0
  106. package/dist/devtools/saveEndpoint.d.ts +46 -0
  107. package/dist/devtools/saveEndpoint.js +48 -0
  108. package/dist/devtools/transformTunables.d.ts +3 -0
  109. package/dist/devtools/transformTunables.js +3 -0
  110. package/dist/devtools/tunableSchema.d.ts +31 -0
  111. package/dist/devtools/tunableSchema.js +31 -0
  112. package/dist/economy/currency.d.ts +12 -1
  113. package/dist/economy/currency.js +12 -1
  114. package/dist/economy/listingBook.d.ts +91 -0
  115. package/dist/economy/listingBook.js +144 -0
  116. package/dist/economy/resourceLedger.d.ts +222 -0
  117. package/dist/economy/resourceLedger.js +353 -0
  118. package/dist/economy/sharedWallet.d.ts +14 -0
  119. package/dist/economy/sharedWallet.js +14 -0
  120. package/dist/economy/techTree.d.ts +12 -0
  121. package/dist/economy/techTree.js +12 -0
  122. package/dist/economy/wallet.d.ts +26 -2
  123. package/dist/economy/wallet.js +35 -6
  124. package/dist/editor/commands.d.ts +190 -7
  125. package/dist/editor/commands.js +727 -55
  126. package/dist/editor/document.d.ts +159 -13
  127. package/dist/editor/document.js +750 -19
  128. package/dist/editor/grid.d.ts +229 -0
  129. package/dist/editor/grid.js +366 -0
  130. package/dist/editor/gridAdapters.d.ts +80 -0
  131. package/dist/editor/gridAdapters.js +134 -0
  132. package/dist/editor/index.d.ts +73 -6
  133. package/dist/editor/index.js +6 -2
  134. package/dist/editor/liveSync.d.ts +127 -0
  135. package/dist/editor/liveSync.js +249 -0
  136. package/dist/editor/runtimeInspector.d.ts +88 -0
  137. package/dist/editor/runtimeInspector.js +239 -0
  138. package/dist/editor/types.d.ts +107 -1
  139. package/dist/faction/reputation.d.ts +5 -0
  140. package/dist/faction/reputation.js +5 -0
  141. package/dist/format/distance.d.ts +17 -0
  142. package/dist/format/distance.js +18 -0
  143. package/dist/format/duration.d.ts +27 -0
  144. package/dist/format/duration.js +45 -0
  145. package/dist/format/speed.d.ts +17 -0
  146. package/dist/format/speed.js +25 -0
  147. package/dist/game/connectedPlayers.d.ts +6 -4
  148. package/dist/game/connectedPlayers.js +2 -2
  149. package/dist/game/cosmetics.d.ts +9 -0
  150. package/dist/game/cosmetics.js +16 -0
  151. package/dist/game/defineGame.d.ts +100 -2
  152. package/dist/game/defineGame.js +39 -2
  153. package/dist/game/defineSystem.d.ts +88 -0
  154. package/dist/game/defineSystem.js +45 -0
  155. package/dist/game/dialogue.d.ts +33 -0
  156. package/dist/game/dialogue.js +21 -0
  157. package/dist/game/events.d.ts +35 -13
  158. package/dist/game/events.js +5 -0
  159. package/dist/game/feed.d.ts +33 -0
  160. package/dist/game/feed.js +35 -2
  161. package/dist/game/gamePhase.d.ts +11 -0
  162. package/dist/game/gamePhase.js +16 -0
  163. package/dist/game/leaderboard.d.ts +5 -0
  164. package/dist/game/leaderboard.js +5 -0
  165. package/dist/game/loadout.d.ts +5 -0
  166. package/dist/game/loadout.js +5 -0
  167. package/dist/game/lootFilter.d.ts +2 -0
  168. package/dist/game/lootFilter.js +2 -0
  169. package/dist/game/lootPipeline.d.ts +164 -0
  170. package/dist/game/lootPipeline.js +216 -0
  171. package/dist/game/lootTable.d.ts +19 -2
  172. package/dist/game/lootTable.js +15 -5
  173. package/dist/game/objectives.d.ts +43 -0
  174. package/dist/game/objectives.js +36 -0
  175. package/dist/game/paramLayers.d.ts +148 -0
  176. package/dist/game/paramLayers.js +185 -0
  177. package/dist/game/ping.d.ts +5 -0
  178. package/dist/game/ping.js +5 -0
  179. package/dist/game/playableGame.d.ts +92 -7
  180. package/dist/game/quest.d.ts +8 -0
  181. package/dist/game/quest.js +29 -0
  182. package/dist/game/race.d.ts +141 -0
  183. package/dist/game/race.js +169 -0
  184. package/dist/game/recordBook.d.ts +3 -1
  185. package/dist/game/recordBook.js +4 -1
  186. package/dist/game/ruleSelection.d.ts +75 -0
  187. package/dist/game/ruleSelection.js +127 -0
  188. package/dist/game/runDraft.d.ts +5 -0
  189. package/dist/game/runDraft.js +5 -0
  190. package/dist/game/saveStore.d.ts +111 -0
  191. package/dist/game/saveStore.js +312 -0
  192. package/dist/game/snapshotHistory.d.ts +67 -0
  193. package/dist/game/snapshotHistory.js +95 -0
  194. package/dist/game/social.d.ts +38 -1
  195. package/dist/game/social.js +71 -0
  196. package/dist/game/spawnPoints.d.ts +5 -0
  197. package/dist/game/spawnPoints.js +5 -0
  198. package/dist/game/systemRuntime.d.ts +50 -0
  199. package/dist/game/systemRuntime.js +157 -0
  200. package/dist/game/systemSchedule.d.ts +72 -0
  201. package/dist/game/systemSchedule.js +242 -0
  202. package/dist/game/toasts.d.ts +43 -0
  203. package/dist/game/toasts.js +44 -0
  204. package/dist/game/trade.d.ts +10 -0
  205. package/dist/game/trade.js +10 -0
  206. package/dist/game/unlocks.d.ts +8 -0
  207. package/dist/game/unlocks.js +16 -0
  208. package/dist/game/vfxInstance.d.ts +138 -0
  209. package/dist/game/vfxInstance.js +96 -0
  210. package/dist/game/worldItem.d.ts +17 -4
  211. package/dist/game/worldItem.js +17 -4
  212. package/dist/gameplay.d.ts +91 -0
  213. package/dist/gameplay.js +91 -0
  214. package/dist/index.d.ts +5 -14
  215. package/dist/index.js +5 -14
  216. package/dist/input/actionBindings.d.ts +23 -6
  217. package/dist/input/actionBindings.js +23 -6
  218. package/dist/input/axisInput.d.ts +7 -2
  219. package/dist/input/axisInput.js +7 -2
  220. package/dist/input/controlGroups.d.ts +67 -0
  221. package/dist/input/controlGroups.js +41 -0
  222. package/dist/input/touchScheme.d.ts +82 -6
  223. package/dist/input/touchScheme.js +123 -10
  224. package/dist/interaction/lockpick.d.ts +61 -0
  225. package/dist/interaction/lockpick.js +168 -0
  226. package/dist/interaction/proximityPrompt.d.ts +2 -0
  227. package/dist/interaction/proximityPrompt.js +2 -0
  228. package/dist/interaction/qte.d.ts +5 -0
  229. package/dist/interaction/qte.js +5 -0
  230. package/dist/interaction/skillCheck.d.ts +5 -0
  231. package/dist/interaction/skillCheck.js +5 -0
  232. package/dist/inventory/inventoryModel.d.ts +12 -0
  233. package/dist/inventory/inventoryModel.js +12 -0
  234. package/dist/inventory/shapedGrid.d.ts +16 -0
  235. package/dist/inventory/shapedGrid.js +16 -0
  236. package/dist/inventory/slotModel.d.ts +10 -0
  237. package/dist/inventory/slotModel.js +10 -0
  238. package/dist/item/durability.d.ts +5 -0
  239. package/dist/item/durability.js +5 -0
  240. package/dist/item/itemIdentity.d.ts +171 -0
  241. package/dist/item/itemIdentity.js +138 -0
  242. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  243. package/dist/item/itemInstanceRegistry.js +34 -0
  244. package/dist/item/itemgen.d.ts +163 -0
  245. package/dist/item/itemgen.js +151 -0
  246. package/dist/item/modularItem.d.ts +5 -0
  247. package/dist/item/modularItem.js +5 -0
  248. package/dist/item/use.d.ts +5 -0
  249. package/dist/item/use.js +5 -0
  250. package/dist/item/useBehavior.d.ts +142 -0
  251. package/dist/item/useBehavior.js +105 -0
  252. package/dist/item/weapon.d.ts +5 -0
  253. package/dist/item/weapon.js +5 -0
  254. package/dist/math/scalar.d.ts +25 -0
  255. package/dist/math/scalar.js +47 -0
  256. package/dist/meta/changelog.d.ts +4 -1
  257. package/dist/meta/changelog.js +16 -2
  258. package/dist/movement/avoidance.d.ts +45 -0
  259. package/dist/movement/avoidance.js +123 -0
  260. package/dist/movement/cameraRig.d.ts +8 -0
  261. package/dist/movement/cameraRig.js +8 -0
  262. package/dist/movement/dash.d.ts +11 -0
  263. package/dist/movement/dash.js +11 -0
  264. package/dist/movement/formation.d.ts +135 -0
  265. package/dist/movement/formation.js +194 -0
  266. package/dist/movement/glideModel.d.ts +5 -0
  267. package/dist/movement/glideModel.js +5 -0
  268. package/dist/movement/grappleSwing.d.ts +5 -0
  269. package/dist/movement/grappleSwing.js +5 -0
  270. package/dist/movement/leaderTrail.d.ts +5 -0
  271. package/dist/movement/leaderTrail.js +5 -0
  272. package/dist/movement/movementModel.d.ts +35 -8
  273. package/dist/movement/movementModel.js +42 -14
  274. package/dist/movement/playerMovement.js +65 -10
  275. package/dist/movement/poseState.d.ts +13 -0
  276. package/dist/movement/poseState.js +16 -0
  277. package/dist/movement/steering.d.ts +8 -0
  278. package/dist/movement/steering.js +18 -0
  279. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  280. package/dist/multiplayer/combatSnapshot.js +3 -0
  281. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  282. package/dist/multiplayer/lagCompensation.js +5 -0
  283. package/dist/multiplayer/presenceModel.d.ts +9 -1
  284. package/dist/multiplayer/presenceModel.js +9 -1
  285. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  286. package/dist/multiplayer/simultaneousCommit.js +3 -0
  287. package/dist/multiplayer.d.ts +11 -0
  288. package/dist/multiplayer.js +11 -0
  289. package/dist/nav/pathFollow.d.ts +57 -0
  290. package/dist/nav/pathFollow.js +109 -0
  291. package/dist/orders/orderKinds.d.ts +156 -0
  292. package/dist/orders/orderKinds.js +197 -0
  293. package/dist/orders/orderQueue.d.ts +208 -0
  294. package/dist/orders/orderQueue.js +211 -0
  295. package/dist/physics/drivableVehicle.d.ts +29 -0
  296. package/dist/physics/drivableVehicle.js +16 -0
  297. package/dist/physics/kinematicVehicle.d.ts +21 -1
  298. package/dist/physics/kinematicVehicle.js +23 -8
  299. package/dist/physics/physicsWorld.d.ts +24 -12
  300. package/dist/physics/physicsWorld.js +11 -5
  301. package/dist/physics/radialImpulse.d.ts +25 -0
  302. package/dist/physics/radialImpulse.js +27 -0
  303. package/dist/procedural.d.ts +3 -0
  304. package/dist/procedural.js +3 -0
  305. package/dist/progression/statGraph.d.ts +116 -0
  306. package/dist/progression/statGraph.js +318 -0
  307. package/dist/puzzle/cellGrid.d.ts +9 -0
  308. package/dist/puzzle/cellGrid.js +9 -0
  309. package/dist/puzzle/fallingPiece.d.ts +9 -0
  310. package/dist/puzzle/fallingPiece.js +9 -0
  311. package/dist/puzzle/nonogram.d.ts +39 -0
  312. package/dist/puzzle/nonogram.js +136 -0
  313. package/dist/random/nameGen.d.ts +5 -0
  314. package/dist/random/nameGen.js +5 -0
  315. package/dist/random/pick.d.ts +8 -0
  316. package/dist/random/pick.js +31 -0
  317. package/dist/random/rng.d.ts +22 -0
  318. package/dist/random/rng.js +28 -8
  319. package/dist/random/seedLink.d.ts +4 -0
  320. package/dist/random/seedLink.js +4 -0
  321. package/dist/relation/keyedValues.d.ts +54 -0
  322. package/dist/relation/keyedValues.js +115 -0
  323. package/dist/relation/thresholds.d.ts +62 -0
  324. package/dist/relation/thresholds.js +62 -0
  325. package/dist/render/color.d.ts +12 -0
  326. package/dist/render/color.js +26 -0
  327. package/dist/render/lookPreset.d.ts +41 -0
  328. package/dist/render/lookPreset.js +29 -0
  329. package/dist/render/postProcessing.d.ts +20 -0
  330. package/dist/render/postProcessing.js +21 -1
  331. package/dist/rules/predicate.d.ts +53 -0
  332. package/dist/rules/predicate.js +64 -0
  333. package/dist/rules/ruleEffects.d.ts +38 -0
  334. package/dist/rules/ruleEffects.js +37 -0
  335. package/dist/rules/triggeredRules.d.ts +160 -0
  336. package/dist/rules/triggeredRules.js +241 -0
  337. package/dist/runtime/adapter.d.ts +42 -3
  338. package/dist/runtime/adapter.js +44 -1
  339. package/dist/runtime/cameraDirector.d.ts +1 -0
  340. package/dist/runtime/cameraDirector.js +1 -0
  341. package/dist/runtime/commandRunner.d.ts +1 -0
  342. package/dist/runtime/commandRunner.js +1 -0
  343. package/dist/runtime/context/combatFx.d.ts +23 -0
  344. package/dist/runtime/context/combatFx.js +161 -0
  345. package/dist/runtime/context/registries.d.ts +13 -0
  346. package/dist/runtime/context/registries.js +84 -0
  347. package/dist/runtime/context/worldItems.d.ts +21 -0
  348. package/dist/runtime/context/worldItems.js +37 -0
  349. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  350. package/dist/runtime/descriptors/baseline.js +134 -0
  351. package/dist/runtime/descriptors/features.d.ts +74 -0
  352. package/dist/runtime/descriptors/features.js +281 -0
  353. package/dist/runtime/gameContext.d.ts +114 -13
  354. package/dist/runtime/gameContext.js +303 -395
  355. package/dist/runtime/gameRuntime.d.ts +1 -0
  356. package/dist/runtime/gameRuntime.js +1 -0
  357. package/dist/runtime/headlessRunner.d.ts +60 -0
  358. package/dist/runtime/headlessRunner.js +44 -0
  359. package/dist/runtime/hostPersistence.d.ts +12 -0
  360. package/dist/runtime/hostPersistence.js +12 -0
  361. package/dist/runtime/hostedGameRunner.d.ts +8 -3
  362. package/dist/runtime/hostedGameRunner.js +26 -3
  363. package/dist/runtime/hostedWorldSession.d.ts +12 -4
  364. package/dist/runtime/hostedWorldSession.js +11 -4
  365. package/dist/runtime/inputSnapshot.d.ts +8 -3
  366. package/dist/runtime/inputSnapshot.js +6 -2
  367. package/dist/runtime/motionIntents.d.ts +11 -2
  368. package/dist/runtime/motionIntents.js +16 -2
  369. package/dist/runtime/perContext.d.ts +15 -0
  370. package/dist/runtime/perContext.js +21 -0
  371. package/dist/runtime/runtimeSave.d.ts +79 -0
  372. package/dist/runtime/runtimeSave.js +105 -0
  373. package/dist/runtime/save.d.ts +4 -0
  374. package/dist/runtime/save.js +4 -0
  375. package/dist/runtime/snapshot.d.ts +7 -0
  376. package/dist/runtime/snapshot.js +7 -0
  377. package/dist/runtime/visibility.d.ts +2 -1
  378. package/dist/runtime/visibility.js +2 -1
  379. package/dist/runtime/worldChannel.d.ts +7 -3
  380. package/dist/runtime/worldChannel.js +51 -6
  381. package/dist/runtime/worldMirror.d.ts +14 -2
  382. package/dist/runtime/worldMirror.js +15 -2
  383. package/dist/runtime/worldProjection.d.ts +47 -0
  384. package/dist/runtime/worldProjection.js +52 -0
  385. package/dist/runtime/worldReplication.d.ts +30 -7
  386. package/dist/runtime/worldReplication.js +41 -9
  387. package/dist/runtime/worldSnapshot.d.ts +30 -3
  388. package/dist/runtime/worldSnapshot.js +20 -5
  389. package/dist/scene/assetCatalog.d.ts +21 -0
  390. package/dist/scene/assetCatalog.js +4 -0
  391. package/dist/scene/assetDiagnostics.d.ts +69 -0
  392. package/dist/scene/assetDiagnostics.js +110 -0
  393. package/dist/scene/assetGenerator.d.ts +65 -0
  394. package/dist/scene/assetGenerator.js +64 -0
  395. package/dist/scene/assetSpace.d.ts +137 -0
  396. package/dist/scene/assetSpace.js +259 -0
  397. package/dist/scene/authoredTriggers.d.ts +169 -0
  398. package/dist/scene/authoredTriggers.js +340 -0
  399. package/dist/scene/behaviorRuntime.d.ts +75 -0
  400. package/dist/scene/behaviorRuntime.js +217 -0
  401. package/dist/scene/behaviors.d.ts +14 -2
  402. package/dist/scene/behaviors.js +7 -2
  403. package/dist/scene/bodyBind.d.ts +60 -0
  404. package/dist/scene/bodyBind.js +51 -0
  405. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  406. package/dist/scene/builtinSceneKinds.js +62 -0
  407. package/dist/scene/colliders.d.ts +13 -1
  408. package/dist/scene/colliders.js +37 -1
  409. package/dist/scene/entityStats.d.ts +11 -2
  410. package/dist/scene/entityStats.js +11 -2
  411. package/dist/scene/entityStore.d.ts +12 -1
  412. package/dist/scene/entityStore.js +15 -0
  413. package/dist/scene/facing.d.ts +18 -0
  414. package/dist/scene/facing.js +26 -0
  415. package/dist/scene/modelSockets.d.ts +33 -0
  416. package/dist/scene/modelSockets.js +29 -0
  417. package/dist/scene/objectQuery.d.ts +2 -0
  418. package/dist/scene/objectQuery.js +2 -0
  419. package/dist/scene/objectStore.d.ts +4 -0
  420. package/dist/scene/objectStore.js +6 -0
  421. package/dist/scene/possession.d.ts +8 -0
  422. package/dist/scene/possession.js +14 -0
  423. package/dist/scene/roster.d.ts +3 -0
  424. package/dist/scene/roster.js +12 -0
  425. package/dist/scene/sceneKinds.d.ts +240 -0
  426. package/dist/scene/sceneKinds.js +214 -0
  427. package/dist/scene/sceneOwnership.d.ts +169 -0
  428. package/dist/scene/sceneOwnership.js +179 -0
  429. package/dist/scene/selectionBookmarks.d.ts +93 -0
  430. package/dist/scene/selectionBookmarks.js +122 -0
  431. package/dist/scene/vehicleSeat.d.ts +68 -0
  432. package/dist/scene/vehicleSeat.js +59 -0
  433. package/dist/sensor/concealment.d.ts +3 -0
  434. package/dist/sensor/concealment.js +3 -0
  435. package/dist/sensor/freezeMonitor.d.ts +1 -0
  436. package/dist/sensor/freezeMonitor.js +1 -0
  437. package/dist/sensor/frustumSensor.d.ts +7 -3
  438. package/dist/sensor/frustumSensor.js +7 -3
  439. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  440. package/dist/sensor/hiddenStateProbe.js +5 -2
  441. package/dist/sensor/recordingBuffer.d.ts +2 -1
  442. package/dist/sensor/recordingBuffer.js +2 -1
  443. package/dist/sensor/replayLoop.d.ts +6 -2
  444. package/dist/sensor/replayLoop.js +6 -2
  445. package/dist/sensor/revealQuery.d.ts +2 -1
  446. package/dist/sensor/revealQuery.js +2 -1
  447. package/dist/sensor/visionCone.d.ts +10 -3
  448. package/dist/sensor/visionCone.js +10 -3
  449. package/dist/session/contestedChannel.d.ts +1 -0
  450. package/dist/session/contestedChannel.js +1 -0
  451. package/dist/session/extraction.d.ts +1 -0
  452. package/dist/session/extraction.js +1 -0
  453. package/dist/session/roles.d.ts +6 -0
  454. package/dist/session/roles.js +6 -0
  455. package/dist/session/roundState.d.ts +8 -0
  456. package/dist/session/roundState.js +2 -0
  457. package/dist/settings/settingsModel.d.ts +1 -0
  458. package/dist/settings/settingsModel.js +1 -0
  459. package/dist/stats/accumulatorMeter.d.ts +6 -0
  460. package/dist/stats/accumulatorMeter.js +6 -0
  461. package/dist/stats/eventMeter.d.ts +5 -0
  462. package/dist/stats/eventMeter.js +5 -0
  463. package/dist/stats/rollCheck.d.ts +5 -0
  464. package/dist/stats/rollCheck.js +5 -0
  465. package/dist/stats/statModifiers.d.ts +5 -0
  466. package/dist/stats/statModifiers.js +5 -0
  467. package/dist/store/defineKeyedStore.d.ts +38 -0
  468. package/dist/store/defineKeyedStore.js +42 -0
  469. package/dist/store/defineStore.d.ts +33 -0
  470. package/dist/store/defineStore.js +35 -0
  471. package/dist/store/observableKeyedStore.d.ts +5 -0
  472. package/dist/store/observableKeyedStore.js +34 -2
  473. package/dist/survival/decayMeter.d.ts +55 -0
  474. package/dist/survival/decayMeter.js +130 -55
  475. package/dist/survival/moodle.d.ts +2 -0
  476. package/dist/survival/regionHealth.d.ts +6 -0
  477. package/dist/survival/regionHealth.js +5 -0
  478. package/dist/tactics/fallingGrid.d.ts +4 -2
  479. package/dist/tactics/fallingGrid.js +4 -2
  480. package/dist/tactics/predictiveQuery.d.ts +3 -0
  481. package/dist/tactics/predictiveQuery.js +3 -0
  482. package/dist/tactics/snapshot.d.ts +2 -0
  483. package/dist/tactics/snapshot.js +2 -0
  484. package/dist/tactics/surface.d.ts +1 -0
  485. package/dist/tactics/surface.js +1 -0
  486. package/dist/tactics/tacticalGrid.d.ts +1 -0
  487. package/dist/tactics/tacticalGrid.js +1 -0
  488. package/dist/time/beatClock.d.ts +14 -4
  489. package/dist/time/beatClock.js +14 -4
  490. package/dist/time/calendarClock.d.ts +3 -0
  491. package/dist/time/calendarClock.js +3 -0
  492. package/dist/time/idleProgress.d.ts +4 -0
  493. package/dist/time/idleProgress.js +4 -0
  494. package/dist/time/simClock.d.ts +2 -0
  495. package/dist/time/simClock.js +20 -5
  496. package/dist/ui/actionModel.d.ts +110 -0
  497. package/dist/ui/actionModel.js +159 -0
  498. package/dist/ui/gameLayout.d.ts +30 -11
  499. package/dist/ui/gameLayout.js +30 -11
  500. package/dist/ui/hudDocument.d.ts +114 -0
  501. package/dist/ui/hudDocument.js +220 -0
  502. package/dist/ui/hudLayout.d.ts +33 -1
  503. package/dist/ui/hudLayout.js +204 -17
  504. package/dist/ui/selectionModel.d.ts +92 -0
  505. package/dist/ui/selectionModel.js +88 -0
  506. package/dist/ui/tooltipModel.d.ts +63 -0
  507. package/dist/ui/tooltipModel.js +82 -0
  508. package/dist/ui.d.ts +15 -0
  509. package/dist/ui.js +15 -0
  510. package/dist/visibility/bounds.d.ts +8 -1
  511. package/dist/visibility/bounds.js +8 -1
  512. package/dist/visibility/frustum.d.ts +12 -3
  513. package/dist/visibility/frustum.js +12 -3
  514. package/dist/work/jobQueue.d.ts +201 -0
  515. package/dist/work/jobQueue.js +253 -0
  516. package/dist/work/unitTraining.d.ts +58 -0
  517. package/dist/work/unitTraining.js +52 -0
  518. package/dist/world/authoredObjects.d.ts +58 -0
  519. package/dist/world/authoredObjects.js +69 -0
  520. package/dist/world/buildingGenerator.d.ts +18 -0
  521. package/dist/world/buildingGenerator.js +62 -0
  522. package/dist/world/buildings.d.ts +5 -0
  523. package/dist/world/buildings.js +5 -0
  524. package/dist/world/catenary.d.ts +22 -0
  525. package/dist/world/catenary.js +69 -0
  526. package/dist/world/features.d.ts +115 -7
  527. package/dist/world/features.js +56 -5
  528. package/dist/world/footprintGrid.d.ts +59 -0
  529. package/dist/world/footprintGrid.js +141 -0
  530. package/dist/world/geometry.d.ts +64 -0
  531. package/dist/world/geometry.js +94 -0
  532. package/dist/world/grassKind.d.ts +51 -0
  533. package/dist/world/grassKind.js +101 -0
  534. package/dist/world/pathInstances.d.ts +27 -0
  535. package/dist/world/pathInstances.js +27 -0
  536. package/dist/world/pathTerrain.d.ts +80 -0
  537. package/dist/world/pathTerrain.js +142 -0
  538. package/dist/world/placeAsset.d.ts +81 -0
  539. package/dist/world/placeAsset.js +77 -0
  540. package/dist/world/placement.d.ts +4 -0
  541. package/dist/world/placement.js +4 -0
  542. package/dist/world/placementController.d.ts +6 -0
  543. package/dist/world/placementController.js +6 -0
  544. package/dist/world/polyline.d.ts +34 -0
  545. package/dist/world/polyline.js +81 -0
  546. package/dist/world/roads.d.ts +8 -0
  547. package/dist/world/roads.js +38 -0
  548. package/dist/world/scatterRegion.d.ts +164 -0
  549. package/dist/world/scatterRegion.js +409 -0
  550. package/dist/world/sceneShapes.d.ts +43 -0
  551. package/dist/world/sceneShapes.js +1 -0
  552. package/dist/world/segment.d.ts +27 -0
  553. package/dist/world/segment.js +43 -0
  554. package/dist/world/soilKind.d.ts +48 -0
  555. package/dist/world/soilKind.js +92 -0
  556. package/dist/world/spatialSample.d.ts +241 -0
  557. package/dist/world/spatialSample.js +465 -0
  558. package/dist/world/terraform.d.ts +213 -1
  559. package/dist/world/terraform.js +655 -20
  560. package/dist/world/terrain.d.ts +119 -20
  561. package/dist/world/terrain.js +247 -41
  562. package/dist/world/terrainGuides.d.ts +182 -0
  563. package/dist/world/terrainGuides.js +343 -0
  564. package/dist/world/vec2.d.ts +81 -0
  565. package/dist/world/vec2.js +128 -0
  566. package/dist/world/vec3.d.ts +49 -0
  567. package/dist/world/vec3.js +76 -0
  568. package/dist/world/vegetation.d.ts +71 -0
  569. package/dist/world/vegetation.js +151 -0
  570. package/dist/world/visibilityField.d.ts +154 -0
  571. package/dist/world/visibilityField.js +271 -0
  572. package/dist/world/volumetricClouds.d.ts +52 -0
  573. package/dist/world/volumetricClouds.js +43 -0
  574. package/dist/world/walls.d.ts +9 -0
  575. package/dist/world/walls.js +9 -0
  576. package/dist/world/waterKind.d.ts +55 -0
  577. package/dist/world/waterKind.js +99 -0
  578. package/dist/world.d.ts +132 -0
  579. package/dist/world.js +132 -0
  580. package/package.json +32 -8
  581. package/skills/jgengine/SKILL.md +51 -0
  582. package/skills/jgengine/api.md +434 -0
  583. package/skills/jgengine/capabilities.md +29 -0
  584. package/skills/jgengine/reference-cartridge.md +72 -0
  585. package/skills/jgengine-combat/SKILL.md +34 -0
  586. package/skills/jgengine-combat/api.md +549 -0
  587. package/skills/jgengine-combat/capabilities.md +169 -0
  588. package/skills/jgengine-combat/reference.md +98 -0
  589. package/skills/jgengine-gameplay/SKILL.md +39 -0
  590. package/skills/jgengine-gameplay/api.md +1794 -0
  591. package/skills/jgengine-gameplay/capabilities.md +378 -0
  592. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  593. package/skills/jgengine-world/SKILL.md +38 -0
  594. package/skills/jgengine-world/api.md +2652 -0
  595. package/skills/jgengine-world/capabilities.md +370 -0
  596. package/skills/jgengine-world/reference.md +222 -0
  597. package/dist/cartridge/runtime.d.ts +0 -15
  598. package/dist/cartridge/runtime.js +0 -556
  599. package/dist/cartridge/spec.d.ts +0 -188
  600. package/dist/cartridge/spec.js +0 -19
  601. package/dist/cartridge/validate.d.ts +0 -2
  602. package/dist/cartridge/validate.js +0 -78
  603. package/dist/store/engineStore.d.ts +0 -22
  604. package/dist/store/engineStore.js +0 -50
  605. package/dist/store/features.d.ts +0 -10
  606. package/dist/store/features.js +0 -23
  607. package/llms.txt +0 -5389
@@ -0,0 +1,220 @@
1
+ import { isHudAnchor } from "./hudLayout.js";
2
+ const panelTypes = new Map();
3
+ /** Register a HUD panel type so the editor can list/add/configure it and canvas resize knows axes. */
4
+ export function registerHudPanelType(def) {
5
+ panelTypes.set(def.id, def);
6
+ }
7
+ /** @internal Look up a registered panel type by id. */
8
+ export function getHudPanelType(id) {
9
+ return panelTypes.get(id);
10
+ }
11
+ /** Every registered panel type, sorted by id — editor palette / agent listing. */
12
+ export function listHudPanelTypes() {
13
+ return [...panelTypes.values()].sort((a, b) => a.id.localeCompare(b.id));
14
+ }
15
+ /** @internal Test seam — clear the registry between tests. */
16
+ export function clearHudPanelTypes() {
17
+ panelTypes.clear();
18
+ }
19
+ /** @internal Convert a document panel layout into a runtime placement. */
20
+ export function placementFromUiPanel(panel) {
21
+ return { anchor: panel.anchor, dx: panel.dx, dy: panel.dy };
22
+ }
23
+ /** @internal Build a document panel layout from a runtime placement plus optional size/visibility. */
24
+ export function uiPanelFromPlacement(placement, options) {
25
+ const panel = {
26
+ anchor: placement.anchor,
27
+ dx: placement.dx,
28
+ dy: placement.dy,
29
+ };
30
+ if (options?.width !== undefined)
31
+ panel.width = options.width;
32
+ if (options?.height !== undefined)
33
+ panel.height = options.height;
34
+ if (options?.visible !== undefined)
35
+ panel.visible = options.visible;
36
+ if (options?.type !== undefined)
37
+ panel.type = options.type;
38
+ return panel;
39
+ }
40
+ function fallbackPlacement(fallback) {
41
+ const inset = fallback.inset ?? { x: 16, y: 16 };
42
+ const { anchor } = fallback;
43
+ const edgeX = anchor.endsWith("right") || anchor === "right";
44
+ const edgeY = anchor.startsWith("bottom") || anchor === "bottom";
45
+ return {
46
+ anchor,
47
+ dx: edgeX ? -inset.x : inset.x,
48
+ dy: edgeY ? -inset.y : inset.y,
49
+ };
50
+ }
51
+ /**
52
+ * Resolve a panel's layout: document entry wins field-by-field over TSX fallback.
53
+ * TSX props are fallback-only — the scene document is the source of truth once authored.
54
+ */
55
+ export function resolveHudPanelLayout(docPanel, fallback) {
56
+ if (docPanel === undefined) {
57
+ return {
58
+ placement: fallbackPlacement(fallback),
59
+ width: fallback.width,
60
+ height: fallback.height,
61
+ visible: fallback.visible !== false,
62
+ type: fallback.type,
63
+ fromDocument: false,
64
+ };
65
+ }
66
+ return {
67
+ placement: placementFromUiPanel(docPanel),
68
+ width: docPanel.width ?? fallback.width,
69
+ height: docPanel.height ?? fallback.height,
70
+ visible: docPanel.visible ?? fallback.visible !== false,
71
+ type: docPanel.type ?? fallback.type,
72
+ fromDocument: true,
73
+ };
74
+ }
75
+ /** @internal Read a panel layout from a document ui section, or undefined when absent. */
76
+ export function findUiPanel(ui, id) {
77
+ return ui?.panels[id];
78
+ }
79
+ /** @internal Immutable patch of one panel into a ui section (creates the section when missing). */
80
+ export function patchUiPanel(ui, id, patch) {
81
+ const existing = ui?.panels[id];
82
+ const base = existing !== undefined
83
+ ? { ...existing }
84
+ : {
85
+ anchor: isHudAnchor(patch.anchor) ? patch.anchor : "top-left",
86
+ dx: typeof patch.dx === "number" ? patch.dx : 0,
87
+ dy: typeof patch.dy === "number" ? patch.dy : 0,
88
+ };
89
+ const next = { ...base };
90
+ if (patch.anchor !== undefined && isHudAnchor(patch.anchor))
91
+ next.anchor = patch.anchor;
92
+ if (typeof patch.dx === "number" && Number.isFinite(patch.dx))
93
+ next.dx = patch.dx;
94
+ if (typeof patch.dy === "number" && Number.isFinite(patch.dy))
95
+ next.dy = patch.dy;
96
+ if (typeof patch.width === "number" && Number.isFinite(patch.width))
97
+ next.width = patch.width;
98
+ if (typeof patch.height === "number" && Number.isFinite(patch.height))
99
+ next.height = patch.height;
100
+ if (typeof patch.visible === "boolean")
101
+ next.visible = patch.visible;
102
+ if (typeof patch.type === "string")
103
+ next.type = patch.type;
104
+ return {
105
+ panels: {
106
+ ...(ui?.panels ?? {}),
107
+ [id]: next,
108
+ },
109
+ };
110
+ }
111
+ /** @internal Remove a panel entry from the ui section; returns undefined when the section empties. */
112
+ export function removeUiPanel(ui, id) {
113
+ if (ui === undefined || ui.panels[id] === undefined)
114
+ return ui;
115
+ const panels = { ...ui.panels };
116
+ delete panels[id];
117
+ return Object.keys(panels).length === 0 ? undefined : { panels };
118
+ }
119
+ /**
120
+ * Semantic resize: apply pixel deltas only on growable axes, clamped to min/max.
121
+ * Never scales content — callers reflow layout size (track length, list rows).
122
+ */
123
+ export function resizePanelSize(current, delta, axes, limits) {
124
+ if (axes === "none")
125
+ return { ...current };
126
+ let width = current.width;
127
+ let height = current.height;
128
+ if (axes === "x" || axes === "both")
129
+ width = current.width + delta.dw;
130
+ if (axes === "y" || axes === "both")
131
+ height = current.height + delta.dh;
132
+ const minW = limits?.minWidth ?? 1;
133
+ const minH = limits?.minHeight ?? 1;
134
+ const maxW = limits?.maxWidth ?? Number.POSITIVE_INFINITY;
135
+ const maxH = limits?.maxHeight ?? Number.POSITIVE_INFINITY;
136
+ return {
137
+ width: Math.max(minW, Math.min(maxW, Math.round(width))),
138
+ height: Math.max(minH, Math.min(maxH, Math.round(height))),
139
+ };
140
+ }
141
+ /** @internal Resolve resize axes + limits for a panel type id (defaults to none when unregistered). */
142
+ export function resolvePanelResize(typeId) {
143
+ if (typeId === undefined)
144
+ return { axes: "none" };
145
+ const def = panelTypes.get(typeId);
146
+ if (def === undefined)
147
+ return { axes: "none" };
148
+ return {
149
+ axes: def.resize,
150
+ minWidth: def.minWidth,
151
+ maxWidth: def.maxWidth,
152
+ minHeight: def.minHeight,
153
+ maxHeight: def.maxHeight,
154
+ };
155
+ }
156
+ function isFiniteNumber(value) {
157
+ return typeof value === "number" && Number.isFinite(value);
158
+ }
159
+ /** @internal Decode a single panel layout from untrusted JSON; null when invalid. */
160
+ export function decodeUiPanelLayout(raw) {
161
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
162
+ return null;
163
+ const value = raw;
164
+ if (!isHudAnchor(value.anchor))
165
+ return null;
166
+ if (!isFiniteNumber(value.dx) || !isFiniteNumber(value.dy))
167
+ return null;
168
+ const panel = {
169
+ anchor: value.anchor,
170
+ dx: value.dx,
171
+ dy: value.dy,
172
+ };
173
+ if (isFiniteNumber(value.width))
174
+ panel.width = value.width;
175
+ if (isFiniteNumber(value.height))
176
+ panel.height = value.height;
177
+ if (typeof value.visible === "boolean")
178
+ panel.visible = value.visible;
179
+ if (typeof value.type === "string" && value.type.length > 0)
180
+ panel.type = value.type;
181
+ return panel;
182
+ }
183
+ /** @internal Decode a ui section from untrusted JSON; undefined when absent, empty object when empty panels. */
184
+ export function decodeEditorUiDocument(raw) {
185
+ if (raw === undefined || raw === null)
186
+ return undefined;
187
+ if (typeof raw !== "object" || Array.isArray(raw))
188
+ return undefined;
189
+ const panelsRaw = raw.panels;
190
+ if (typeof panelsRaw !== "object" || panelsRaw === null || Array.isArray(panelsRaw)) {
191
+ return { panels: {} };
192
+ }
193
+ const panels = {};
194
+ for (const [id, entry] of Object.entries(panelsRaw)) {
195
+ if (id.length === 0)
196
+ continue;
197
+ const decoded = decodeUiPanelLayout(entry);
198
+ if (decoded !== null)
199
+ panels[id] = decoded;
200
+ }
201
+ return { panels };
202
+ }
203
+ /** @internal Deep-clone a ui section for document history snapshots. */
204
+ export function cloneEditorUiDocument(ui) {
205
+ if (ui === undefined)
206
+ return undefined;
207
+ const panels = {};
208
+ for (const [id, panel] of Object.entries(ui.panels)) {
209
+ panels[id] = { ...panel };
210
+ }
211
+ return { panels };
212
+ }
213
+ /** @internal Convert a layout store-style placement map into a document ui section. */
214
+ export function uiDocumentFromPlacements(panels) {
215
+ const out = {};
216
+ for (const [id, panel] of Object.entries(panels)) {
217
+ out[id] = { ...panel };
218
+ }
219
+ return { panels: out };
220
+ }
@@ -19,6 +19,10 @@ export interface HudPanelState {
19
19
  placement: HudPlacement;
20
20
  z: number;
21
21
  moved: boolean;
22
+ width?: number;
23
+ height?: number;
24
+ visible: boolean;
25
+ type?: string;
22
26
  }
23
27
  export interface HudLayoutState {
24
28
  panels: Record<string, HudPanelState>;
@@ -28,31 +32,59 @@ export interface HudLayoutState {
28
32
  export interface HudLayoutOptions {
29
33
  snap?: number;
30
34
  locked?: boolean;
35
+ /**
36
+ * Called after a panel placement/size is authored (move, resize, hydrate from document).
37
+ * Canvas mode + agent RPCs use this to write undoable scene-document patches.
38
+ */
39
+ onDocumentPatch?: (id: string, panel: import("./hudDocument.js").EditorUiPanelLayout) => void;
31
40
  }
41
+ /** @internal */
32
42
  export declare function isPanelDraggable(state: HudLayoutState, id: string): boolean;
33
43
  export interface HudLayoutStore {
34
44
  getState(): HudLayoutState;
35
45
  subscribe(listener: (state: HudLayoutState) => void): () => void;
36
- register(id: string, placement: HudPlacement): void;
46
+ register(id: string, placement: HudPlacement, options?: {
47
+ width?: number;
48
+ height?: number;
49
+ visible?: boolean;
50
+ type?: string;
51
+ }): void;
37
52
  move(id: string, rect: HudRect, viewport: HudSize): void;
53
+ resize(id: string, size: HudSize): void;
54
+ setVisible(id: string, visible: boolean): void;
38
55
  bringToFront(id: string): void;
39
56
  setLocked(locked: boolean): void;
40
57
  setEditing(editing: boolean): void;
41
58
  reset(id?: string): void;
42
59
  serialize(): string;
43
60
  hydrate(raw: string | null | undefined): void;
61
+ /** Apply scene-document `ui` section as the source of truth for registered/pending panels. */
62
+ applyDocumentUi(ui: import("./hudDocument.js").EditorUiDocument | undefined): void;
63
+ /** Snapshot moved/resized panels as a document ui section. */
64
+ toDocumentUi(): import("./hudDocument.js").EditorUiDocument;
44
65
  }
45
66
  export declare const HUD_ANCHOR_FRACTIONS: Record<HudAnchor, {
46
67
  fx: number;
47
68
  fy: number;
48
69
  }>;
70
+ /** @internal */
49
71
  export declare function isHudAnchor(value: unknown): value is HudAnchor;
72
+ /** @internal */
50
73
  export declare function anchoredPlacement(anchor: HudAnchor, inset: {
51
74
  x: number;
52
75
  y: number;
53
76
  }): HudPlacement;
77
+ /** @internal */
54
78
  export declare function nearestAnchor(rect: HudRect, viewport: HudSize): HudAnchor;
79
+ /** @internal */
55
80
  export declare function clampRect(rect: HudRect, viewport: HudSize): HudRect;
81
+ /** @internal */
56
82
  export declare function placementFromRect(rect: HudRect, viewport: HudSize, snap?: number): HudPlacement;
83
+ /** @internal */
57
84
  export declare function rectFromPlacement(placement: HudPlacement, size: HudSize, viewport: HudSize): HudRect;
85
+ /** @internal Agent bridge seam — HudCanvas registers its store while mounted so headless drivers can reach canvas mode. */
86
+ export declare function registerActiveHudLayout(store: HudLayoutStore): () => void;
87
+ /** @internal */
88
+ export declare function listActiveHudLayouts(): HudLayoutStore[];
89
+ /** @internal */
58
90
  export declare function createHudLayout(options?: HudLayoutOptions): HudLayoutStore;
@@ -1,3 +1,4 @@
1
+ /** @internal */
1
2
  export function isPanelDraggable(state, id) {
2
3
  return state.panels[id] !== undefined && (state.editing || !state.locked);
3
4
  }
@@ -13,9 +14,11 @@ export const HUD_ANCHOR_FRACTIONS = {
13
14
  "bottom-right": { fx: 1, fy: 1 },
14
15
  };
15
16
  const HUD_ANCHORS = Object.keys(HUD_ANCHOR_FRACTIONS);
17
+ /** @internal */
16
18
  export function isHudAnchor(value) {
17
19
  return typeof value === "string" && value in HUD_ANCHOR_FRACTIONS;
18
20
  }
21
+ /** @internal */
19
22
  export function anchoredPlacement(anchor, inset) {
20
23
  const { fx, fy } = HUD_ANCHOR_FRACTIONS[anchor];
21
24
  return {
@@ -24,6 +27,7 @@ export function anchoredPlacement(anchor, inset) {
24
27
  dy: fy === 1 ? -inset.y : inset.y,
25
28
  };
26
29
  }
30
+ /** @internal */
27
31
  export function nearestAnchor(rect, viewport) {
28
32
  const cx = viewport.width > 0 ? (rect.x + rect.width / 2) / viewport.width : 0.5;
29
33
  const cy = viewport.height > 0 ? (rect.y + rect.height / 2) / viewport.height : 0.5;
@@ -39,6 +43,7 @@ export function nearestAnchor(rect, viewport) {
39
43
  }
40
44
  return best;
41
45
  }
46
+ /** @internal */
42
47
  export function clampRect(rect, viewport) {
43
48
  return {
44
49
  x: Math.max(0, Math.min(rect.x, viewport.width - rect.width)),
@@ -47,6 +52,7 @@ export function clampRect(rect, viewport) {
47
52
  height: rect.height,
48
53
  };
49
54
  }
55
+ /** @internal */
50
56
  export function placementFromRect(rect, viewport, snap = 1) {
51
57
  const clamped = clampRect(rect, viewport);
52
58
  const anchor = nearestAnchor(clamped, viewport);
@@ -60,6 +66,7 @@ export function placementFromRect(rect, viewport, snap = 1) {
60
66
  dy: Math.round(dy / step) * step,
61
67
  };
62
68
  }
69
+ /** @internal */
63
70
  export function rectFromPlacement(placement, size, viewport) {
64
71
  const { fx, fy } = HUD_ANCHOR_FRACTIONS[placement.anchor];
65
72
  return {
@@ -86,19 +93,77 @@ function parseSerialized(raw) {
86
93
  for (const [id, value] of Object.entries(panels)) {
87
94
  if (typeof value !== "object" || value === null)
88
95
  continue;
89
- const { anchor, dx, dy } = value;
96
+ const record = value;
97
+ const placementSource = record.placement ?? record;
98
+ const { anchor, dx, dy } = placementSource;
90
99
  if (!isHudAnchor(anchor))
91
100
  continue;
92
101
  if (typeof dx !== "number" || !Number.isFinite(dx))
93
102
  continue;
94
103
  if (typeof dy !== "number" || !Number.isFinite(dy))
95
104
  continue;
96
- out.set(id, { anchor, dx, dy });
105
+ const override = { placement: { anchor, dx, dy } };
106
+ if (typeof record.width === "number" && Number.isFinite(record.width))
107
+ override.width = record.width;
108
+ if (typeof record.height === "number" && Number.isFinite(record.height))
109
+ override.height = record.height;
110
+ if (typeof record.visible === "boolean")
111
+ override.visible = record.visible;
112
+ if (typeof record.type === "string")
113
+ override.type = record.type;
114
+ out.set(id, override);
97
115
  }
98
116
  return out;
99
117
  }
118
+ const activeHudLayouts = new Set();
119
+ /** @internal Agent bridge seam — HudCanvas registers its store while mounted so headless drivers can reach canvas mode. */
120
+ export function registerActiveHudLayout(store) {
121
+ activeHudLayouts.add(store);
122
+ return () => {
123
+ activeHudLayouts.delete(store);
124
+ };
125
+ }
126
+ /** @internal */
127
+ export function listActiveHudLayouts() {
128
+ return [...activeHudLayouts];
129
+ }
130
+ function panelToUi(panel) {
131
+ const layout = {
132
+ anchor: panel.placement.anchor,
133
+ dx: panel.placement.dx,
134
+ dy: panel.placement.dy,
135
+ };
136
+ if (panel.width !== undefined)
137
+ layout.width = panel.width;
138
+ if (panel.height !== undefined)
139
+ layout.height = panel.height;
140
+ if (panel.visible === false)
141
+ layout.visible = false;
142
+ if (panel.type !== undefined)
143
+ layout.type = panel.type;
144
+ return layout;
145
+ }
146
+ function overrideToUi(id, override) {
147
+ const layout = {
148
+ anchor: override.placement.anchor,
149
+ dx: override.placement.dx,
150
+ dy: override.placement.dy,
151
+ };
152
+ if (override.width !== undefined)
153
+ layout.width = override.width;
154
+ if (override.height !== undefined)
155
+ layout.height = override.height;
156
+ if (override.visible !== undefined)
157
+ layout.visible = override.visible;
158
+ if (override.type !== undefined)
159
+ layout.type = override.type;
160
+ void id;
161
+ return layout;
162
+ }
163
+ /** @internal */
100
164
  export function createHudLayout(options) {
101
165
  const snap = options?.snap ?? 1;
166
+ const onDocumentPatch = options?.onDocumentPatch;
102
167
  const defaults = new Map();
103
168
  const pending = new Map();
104
169
  let topZ = 0;
@@ -111,22 +176,37 @@ export function createHudLayout(options) {
111
176
  const setPanel = (panel) => {
112
177
  state = { ...state, panels: { ...state.panels, [panel.id]: panel } };
113
178
  };
179
+ const notifyDocument = (panel) => {
180
+ onDocumentPatch?.(panel.id, panelToUi(panel));
181
+ };
114
182
  return {
115
183
  getState: () => state,
116
184
  subscribe(listener) {
117
185
  listeners.add(listener);
118
186
  return () => listeners.delete(listener);
119
187
  },
120
- register(id, placement) {
121
- defaults.set(id, placement);
188
+ register(id, placement, registerOptions) {
189
+ const fallback = {
190
+ placement,
191
+ width: registerOptions?.width,
192
+ height: registerOptions?.height,
193
+ visible: registerOptions?.visible,
194
+ type: registerOptions?.type,
195
+ };
196
+ defaults.set(id, fallback);
122
197
  if (state.panels[id] !== undefined)
123
198
  return;
124
199
  const override = pending.get(id);
200
+ const source = override ?? fallback;
125
201
  setPanel({
126
202
  id,
127
- placement: override ?? placement,
203
+ placement: source.placement,
128
204
  z: ++topZ,
129
205
  moved: override !== undefined,
206
+ width: source.width ?? fallback.width,
207
+ height: source.height ?? fallback.height,
208
+ visible: source.visible ?? fallback.visible !== false,
209
+ type: source.type ?? fallback.type,
130
210
  });
131
211
  },
132
212
  move(id, rect, viewport) {
@@ -134,8 +214,32 @@ export function createHudLayout(options) {
134
214
  if (panel === undefined)
135
215
  return;
136
216
  const placement = placementFromRect(rect, viewport, snap);
137
- setPanel({ ...panel, placement, moved: true });
217
+ const next = { ...panel, placement, moved: true };
218
+ setPanel(next);
138
219
  emit();
220
+ notifyDocument(next);
221
+ },
222
+ resize(id, size) {
223
+ const panel = state.panels[id];
224
+ if (panel === undefined)
225
+ return;
226
+ const width = Math.max(1, Math.round(size.width));
227
+ const height = Math.max(1, Math.round(size.height));
228
+ if (panel.width === width && panel.height === height)
229
+ return;
230
+ const next = { ...panel, width, height, moved: true };
231
+ setPanel(next);
232
+ emit();
233
+ notifyDocument(next);
234
+ },
235
+ setVisible(id, visible) {
236
+ const panel = state.panels[id];
237
+ if (panel === undefined || panel.visible === visible)
238
+ return;
239
+ const next = { ...panel, visible, moved: true };
240
+ setPanel(next);
241
+ emit();
242
+ notifyDocument(next);
139
243
  },
140
244
  bringToFront(id) {
141
245
  const panel = state.panels[id];
@@ -163,9 +267,23 @@ export function createHudLayout(options) {
163
267
  pending.delete(panelId);
164
268
  const panel = state.panels[panelId];
165
269
  const fallback = defaults.get(panelId);
166
- if (panel === undefined || fallback === undefined || !panel.moved)
270
+ if (panel === undefined || fallback === undefined)
271
+ continue;
272
+ const hasAuthored = panel.moved ||
273
+ panel.width !== fallback.width ||
274
+ panel.height !== fallback.height ||
275
+ panel.visible !== (fallback.visible !== false);
276
+ if (!hasAuthored)
167
277
  continue;
168
- setPanel({ ...panel, placement: fallback, moved: false });
278
+ setPanel({
279
+ ...panel,
280
+ placement: fallback.placement,
281
+ width: fallback.width,
282
+ height: fallback.height,
283
+ visible: fallback.visible !== false,
284
+ type: fallback.type,
285
+ moved: false,
286
+ });
169
287
  changed = true;
170
288
  }
171
289
  if (changed)
@@ -174,14 +292,32 @@ export function createHudLayout(options) {
174
292
  serialize() {
175
293
  const panels = {};
176
294
  for (const panel of Object.values(state.panels)) {
177
- if (panel.moved)
178
- panels[panel.id] = panel.placement;
295
+ if (!panel.moved)
296
+ continue;
297
+ panels[panel.id] = {
298
+ anchor: panel.placement.anchor,
299
+ dx: panel.placement.dx,
300
+ dy: panel.placement.dy,
301
+ ...(panel.width === undefined ? {} : { width: panel.width }),
302
+ ...(panel.height === undefined ? {} : { height: panel.height }),
303
+ ...(panel.visible === false ? { visible: false } : {}),
304
+ ...(panel.type === undefined ? {} : { type: panel.type }),
305
+ };
179
306
  }
180
- for (const [id, placement] of pending) {
181
- if (state.panels[id] === undefined)
182
- panels[id] = placement;
307
+ for (const [id, override] of pending) {
308
+ if (state.panels[id] !== undefined)
309
+ continue;
310
+ panels[id] = {
311
+ anchor: override.placement.anchor,
312
+ dx: override.placement.dx,
313
+ dy: override.placement.dy,
314
+ ...(override.width === undefined ? {} : { width: override.width }),
315
+ ...(override.height === undefined ? {} : { height: override.height }),
316
+ ...(override.visible === undefined ? {} : { visible: override.visible }),
317
+ ...(override.type === undefined ? {} : { type: override.type }),
318
+ };
183
319
  }
184
- const data = { v: 1, panels };
320
+ const data = { v: 2, panels };
185
321
  return JSON.stringify(data);
186
322
  },
187
323
  hydrate(raw) {
@@ -191,17 +327,68 @@ export function createHudLayout(options) {
191
327
  if (parsed.size === 0)
192
328
  return;
193
329
  let changed = false;
194
- for (const [id, placement] of parsed) {
330
+ for (const [id, override] of parsed) {
331
+ const panel = state.panels[id];
332
+ if (panel === undefined) {
333
+ pending.set(id, override);
334
+ continue;
335
+ }
336
+ setPanel({
337
+ ...panel,
338
+ placement: override.placement,
339
+ width: override.width ?? panel.width,
340
+ height: override.height ?? panel.height,
341
+ visible: override.visible ?? panel.visible,
342
+ type: override.type ?? panel.type,
343
+ moved: true,
344
+ });
345
+ changed = true;
346
+ }
347
+ if (changed)
348
+ emit();
349
+ },
350
+ applyDocumentUi(ui) {
351
+ if (ui === undefined)
352
+ return;
353
+ let changed = false;
354
+ for (const [id, layout] of Object.entries(ui.panels)) {
355
+ const override = {
356
+ placement: { anchor: layout.anchor, dx: layout.dx, dy: layout.dy },
357
+ width: layout.width,
358
+ height: layout.height,
359
+ visible: layout.visible,
360
+ type: layout.type,
361
+ };
195
362
  const panel = state.panels[id];
196
363
  if (panel === undefined) {
197
- pending.set(id, placement);
364
+ pending.set(id, override);
198
365
  continue;
199
366
  }
200
- setPanel({ ...panel, placement, moved: true });
367
+ setPanel({
368
+ ...panel,
369
+ placement: override.placement,
370
+ width: override.width ?? panel.width,
371
+ height: override.height ?? panel.height,
372
+ visible: override.visible ?? panel.visible,
373
+ type: override.type ?? panel.type,
374
+ moved: true,
375
+ });
201
376
  changed = true;
202
377
  }
203
378
  if (changed)
204
379
  emit();
205
380
  },
381
+ toDocumentUi() {
382
+ const panels = {};
383
+ for (const panel of Object.values(state.panels)) {
384
+ if (panel.moved)
385
+ panels[panel.id] = panelToUi(panel);
386
+ }
387
+ for (const [id, override] of pending) {
388
+ if (state.panels[id] === undefined)
389
+ panels[id] = overrideToUi(id, override);
390
+ }
391
+ return { panels };
392
+ },
206
393
  };
207
394
  }