@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
@@ -1,19 +1,135 @@
1
- import { cloneEditorDocument, findEditorMarker, findEditorVolume, importEditorDocumentJson, } from "./document.js";
1
+ import { applyDeltaToSnapshot, applySurfaceDeltaToSnapshot, applyWeightDeltaToSnapshot, revertDeltaFromSnapshot, revertSurfaceDeltaFromSnapshot, revertWeightDeltaFromSnapshot, } from "../world/terraform.js";
2
+ import { patchUiPanel, removeUiPanel, } from "../ui/hudDocument.js";
3
+ import { cloneEditorDocument, collectDescendants, createPrefabFragment, editorDocumentExtras, ensureUniqueEditorId, extractEditorFragment, findEditorCollection, findEditorMarker, findEditorPrefab, findEditorVolume, importEditorDocumentJson, isEditorObjectLocked, wouldCreateCycle, } from "./document.js";
4
+ import { fillGridRect, floodFillGrid, migrateGridLayer, paintGridCells, resizeGridLayer, } from "./grid.js";
2
5
  function snapshotState(state) {
3
6
  return {
4
7
  document: cloneEditorDocument(state.document),
5
8
  selection: [...state.selection],
6
9
  };
7
10
  }
8
- function removeById(doc, id) {
11
+ function removeByIds(doc, ids) {
9
12
  return {
10
13
  version: 1,
11
- markers: doc.markers.filter((marker) => marker.id !== id),
12
- volumes: doc.volumes.filter((volume) => volume.id !== id),
13
- paths: doc.paths.filter((path) => path.id !== id),
14
- annotations: doc.annotations.filter((note) => note.id !== id),
14
+ markers: doc.markers.filter((marker) => !ids.has(marker.id)),
15
+ volumes: doc.volumes.filter((volume) => !ids.has(volume.id)),
16
+ paths: doc.paths.filter((path) => !ids.has(path.id)),
17
+ annotations: doc.annotations.filter((note) => !ids.has(note.id)),
18
+ ...editorDocumentExtras(doc),
19
+ collections: doc.collections.map((collection) => ({
20
+ ...collection,
21
+ memberIds: collection.memberIds.filter((id) => !ids.has(id)),
22
+ })),
15
23
  };
16
24
  }
25
+ function shifted(point, delta) {
26
+ return { x: point.x + delta.x, y: point.y + delta.y, z: point.z + delta.z };
27
+ }
28
+ function translateByIds(doc, ids, delta) {
29
+ return {
30
+ version: 1,
31
+ markers: doc.markers.map((marker) => ids.has(marker.id) ? { ...marker, position: shifted(marker.position, delta) } : marker),
32
+ volumes: doc.volumes.map((volume) => ids.has(volume.id) ? { ...volume, center: shifted(volume.center, delta) } : volume),
33
+ paths: doc.paths.map((path) => ids.has(path.id) ? { ...path, points: path.points.map((point) => shifted(point, delta)) } : path),
34
+ annotations: doc.annotations.map((note) => ids.has(note.id) ? { ...note, position: shifted(note.position, delta) } : note),
35
+ ...editorDocumentExtras(doc),
36
+ };
37
+ }
38
+ function collectIds(doc) {
39
+ const all = new Set();
40
+ for (const marker of doc.markers)
41
+ all.add(marker.id);
42
+ for (const volume of doc.volumes)
43
+ all.add(volume.id);
44
+ for (const path of doc.paths)
45
+ all.add(path.id);
46
+ for (const note of doc.annotations)
47
+ all.add(note.id);
48
+ return all;
49
+ }
50
+ /**
51
+ * Adding to a collection replaces a same-id member in that same collection (the existing
52
+ * upsert behavior); anything else collides with the document-global id space shared by markers,
53
+ * volumes, paths, and annotations, so it gets re-idded instead of shadowing whatever already
54
+ * holds that id in a different collection.
55
+ */
56
+ function ownIdOrGloballyUnique(doc, item, ownCollection) {
57
+ if (ownCollection.some((entry) => entry.id === item.id))
58
+ return item;
59
+ const id = ensureUniqueEditorId(item.id, collectIds(doc));
60
+ return id === item.id ? item : { ...item, id };
61
+ }
62
+ function copyId(base, taken) {
63
+ let candidate = `${base}_copy`;
64
+ let n = 2;
65
+ while (taken.has(candidate)) {
66
+ candidate = `${base}_copy${n}`;
67
+ n += 1;
68
+ }
69
+ taken.add(candidate);
70
+ return candidate;
71
+ }
72
+ function insertFragment(state, fragment, offset, renameAll) {
73
+ const doc = state.document;
74
+ const taken = collectIds(doc);
75
+ const clones = cloneEditorDocument(fragment);
76
+ const newIds = [];
77
+ const withId = (item) => {
78
+ const id = renameAll || taken.has(item.id) ? copyId(item.id, taken) : item.id;
79
+ taken.add(id);
80
+ newIds.push(id);
81
+ return { ...item, id };
82
+ };
83
+ const markers = clones.markers.map((marker) => withId({ ...marker, position: shifted(marker.position, offset) }));
84
+ const volumes = clones.volumes.map((volume) => withId({ ...volume, center: shifted(volume.center, offset) }));
85
+ const paths = clones.paths.map((path) => withId({ ...path, points: path.points.map((point) => shifted(point, offset)) }));
86
+ const annotations = clones.annotations.map((note) => withId({ ...note, position: shifted(note.position, offset) }));
87
+ if (newIds.length === 0)
88
+ return state;
89
+ return {
90
+ document: {
91
+ version: 1,
92
+ markers: [...doc.markers, ...markers],
93
+ volumes: [...doc.volumes, ...volumes],
94
+ paths: [...doc.paths, ...paths],
95
+ annotations: [...doc.annotations, ...annotations],
96
+ ...editorDocumentExtras(doc),
97
+ },
98
+ selection: newIds,
99
+ };
100
+ }
101
+ function fragmentAsDocument(fragment) {
102
+ return {
103
+ version: 1,
104
+ markers: [...fragment.markers],
105
+ volumes: [...fragment.volumes],
106
+ paths: [...fragment.paths],
107
+ annotations: [...fragment.annotations],
108
+ prefabs: [],
109
+ collections: [],
110
+ catalogs: [],
111
+ };
112
+ }
113
+ function tagWithInstance(item, prefabId, instanceId) {
114
+ return { ...item, meta: { ...item.meta, prefabId, prefabInstanceId: instanceId } };
115
+ }
116
+ /**
117
+ * Replaces one grid layer in place via `transform`, returning `null` when the layer is missing and
118
+ * the same state when the transform is a no-op (so history skips it).
119
+ */
120
+ function updateGridLayer(state, id, transform) {
121
+ const grids = state.document.grids;
122
+ if (grids === undefined)
123
+ return null;
124
+ const index = grids.findIndex((layer) => layer.id === id);
125
+ if (index < 0)
126
+ return null;
127
+ const next = transform(grids[index]);
128
+ if (next === grids[index])
129
+ return state;
130
+ const updated = grids.map((layer, i) => (i === index ? next : layer));
131
+ return { ...state, document: { ...state.document, grids: updated } };
132
+ }
17
133
  function applyMutating(state, command) {
18
134
  switch (command.type) {
19
135
  case "select":
@@ -21,52 +137,145 @@ function applyMutating(state, command) {
21
137
  case "clearSelection":
22
138
  return { ...state, selection: [] };
23
139
  case "setTransform": {
24
- const markers = state.document.markers.map((marker) => {
25
- if (marker.id !== command.id)
26
- return marker;
27
- return {
28
- ...marker,
29
- position: command.position === undefined ? marker.position : { ...command.position },
30
- ...(command.rotationY === undefined ? {} : { rotationY: command.rotationY }),
140
+ if (isEditorObjectLocked(state.document, command.id))
141
+ return null;
142
+ const marker = findEditorMarker(state.document, command.id);
143
+ const volume = findEditorVolume(state.document, command.id);
144
+ const note = state.document.annotations.find((n) => n.id === command.id);
145
+ const previous = marker?.position ?? volume?.center ?? note?.position;
146
+ // Moving a parent to a new position carries its whole subtree by the same delta.
147
+ const childDelta = command.position === undefined || previous === undefined
148
+ ? null
149
+ : {
150
+ x: command.position.x - previous.x,
151
+ y: command.position.y - previous.y,
152
+ z: command.position.z - previous.z,
31
153
  };
154
+ const descendants = childDelta === null ? new Set() : collectDescendants(state.document, [command.id]);
155
+ const shift = (point) => childDelta === null ? point : shifted(point, childDelta);
156
+ const markers = state.document.markers.map((entry) => {
157
+ if (entry.id === command.id) {
158
+ return {
159
+ ...entry,
160
+ position: command.position === undefined ? entry.position : { ...command.position },
161
+ ...(command.rotationY === undefined ? {} : { rotationY: command.rotationY }),
162
+ };
163
+ }
164
+ return descendants.has(entry.id) ? { ...entry, position: shift(entry.position) } : entry;
32
165
  });
33
- const volumes = state.document.volumes.map((volume) => {
34
- if (volume.id !== command.id)
35
- return volume;
36
- if (command.position === undefined)
37
- return volume;
38
- return { ...volume, center: { ...command.position } };
166
+ const volumes = state.document.volumes.map((entry) => {
167
+ if (entry.id === command.id)
168
+ return command.position === undefined ? entry : { ...entry, center: { ...command.position } };
169
+ return descendants.has(entry.id) ? { ...entry, center: shift(entry.center) } : entry;
39
170
  });
40
- const annotations = state.document.annotations.map((note) => {
41
- if (note.id !== command.id)
42
- return note;
43
- if (command.position === undefined)
44
- return note;
45
- return { ...note, position: { ...command.position } };
171
+ const paths = state.document.paths.map((entry) => descendants.has(entry.id) ? { ...entry, points: entry.points.map(shift) } : entry);
172
+ const annotations = state.document.annotations.map((entry) => {
173
+ if (entry.id === command.id)
174
+ return command.position === undefined ? entry : { ...entry, position: { ...command.position } };
175
+ return descendants.has(entry.id) ? { ...entry, position: shift(entry.position) } : entry;
46
176
  });
47
177
  return {
48
178
  ...state,
49
- document: { ...state.document, markers, volumes, annotations },
179
+ document: { ...state.document, markers, volumes, paths, annotations },
180
+ };
181
+ }
182
+ case "translate": {
183
+ const movable = command.ids.filter((id) => !isEditorObjectLocked(state.document, id));
184
+ if (movable.length === 0)
185
+ return null;
186
+ const ids = new Set(movable);
187
+ for (const descendant of collectDescendants(state.document, movable))
188
+ ids.add(descendant);
189
+ return {
190
+ ...state,
191
+ document: translateByIds(state.document, ids, command.delta),
192
+ };
193
+ }
194
+ case "setParent": {
195
+ const targets = command.ids.filter((id) => !wouldCreateCycle(state.document, id, command.parentId));
196
+ if (targets.length === 0)
197
+ return state;
198
+ const wanted = new Set(targets);
199
+ const reparent = (entry) => {
200
+ if (!wanted.has(entry.id))
201
+ return entry;
202
+ if (command.parentId === null) {
203
+ if (entry.parentId === undefined)
204
+ return entry;
205
+ const next = { ...entry };
206
+ delete next.parentId;
207
+ return next;
208
+ }
209
+ return { ...entry, parentId: command.parentId };
210
+ };
211
+ return {
212
+ ...state,
213
+ document: {
214
+ ...state.document,
215
+ markers: state.document.markers.map(reparent),
216
+ volumes: state.document.volumes.map(reparent),
217
+ paths: state.document.paths.map(reparent),
218
+ annotations: state.document.annotations.map(reparent),
219
+ },
220
+ };
221
+ }
222
+ case "addMarker": {
223
+ const marker = ownIdOrGloballyUnique(state.document, command.marker, state.document.markers);
224
+ return {
225
+ ...state,
226
+ document: {
227
+ ...state.document,
228
+ markers: [...state.document.markers.filter((m) => m.id !== marker.id), marker],
229
+ },
230
+ selection: [marker.id],
231
+ };
232
+ }
233
+ case "addVolume": {
234
+ const volume = ownIdOrGloballyUnique(state.document, command.volume, state.document.volumes);
235
+ return {
236
+ ...state,
237
+ document: {
238
+ ...state.document,
239
+ volumes: [...state.document.volumes.filter((v) => v.id !== volume.id), volume],
240
+ },
241
+ selection: [volume.id],
50
242
  };
51
243
  }
52
- case "addMarker":
244
+ case "addPath": {
245
+ const path = ownIdOrGloballyUnique(state.document, command.path, state.document.paths);
53
246
  return {
54
247
  ...state,
55
248
  document: {
56
249
  ...state.document,
57
- markers: [...state.document.markers.filter((m) => m.id !== command.marker.id), command.marker],
250
+ paths: [...state.document.paths.filter((p) => p.id !== path.id), path],
58
251
  },
59
- selection: [command.marker.id],
252
+ selection: [path.id],
60
253
  };
61
- case "addVolume":
254
+ }
255
+ case "addNote": {
256
+ const note = ownIdOrGloballyUnique(state.document, command.note, state.document.annotations);
62
257
  return {
63
258
  ...state,
64
259
  document: {
65
260
  ...state.document,
66
- volumes: [...state.document.volumes.filter((v) => v.id !== command.volume.id), command.volume],
261
+ annotations: [...state.document.annotations.filter((n) => n.id !== note.id), note],
67
262
  },
68
- selection: [command.volume.id],
263
+ selection: [note.id],
69
264
  };
265
+ }
266
+ case "setMarker": {
267
+ const markers = state.document.markers.map((marker) => {
268
+ if (marker.id !== command.id)
269
+ return marker;
270
+ return {
271
+ ...marker,
272
+ ...command.patch,
273
+ position: command.patch.position === undefined ? marker.position : { ...command.patch.position },
274
+ meta: command.patch.meta === undefined ? marker.meta : { ...command.patch.meta },
275
+ };
276
+ });
277
+ return { ...state, document: { ...state.document, markers } };
278
+ }
70
279
  case "setVolume": {
71
280
  const volumes = state.document.volumes.map((volume) => {
72
281
  if (volume.id !== command.id)
@@ -83,11 +292,82 @@ function applyMutating(state, command) {
83
292
  });
84
293
  return { ...state, document: { ...state.document, volumes } };
85
294
  }
295
+ case "setPath": {
296
+ const paths = state.document.paths.map((path) => {
297
+ if (path.id !== command.id)
298
+ return path;
299
+ return {
300
+ ...path,
301
+ ...command.patch,
302
+ points: command.patch.points === undefined
303
+ ? path.points
304
+ : command.patch.points.map((point) => ({ ...point })),
305
+ meta: command.patch.meta === undefined ? path.meta : { ...command.patch.meta },
306
+ };
307
+ });
308
+ return { ...state, document: { ...state.document, paths } };
309
+ }
310
+ case "setNote": {
311
+ const annotations = state.document.annotations.map((note) => {
312
+ if (note.id !== command.id)
313
+ return note;
314
+ return {
315
+ ...note,
316
+ ...command.patch,
317
+ position: command.patch.position === undefined ? note.position : { ...command.patch.position },
318
+ meta: command.patch.meta === undefined ? note.meta : { ...command.patch.meta },
319
+ };
320
+ });
321
+ return { ...state, document: { ...state.document, annotations } };
322
+ }
323
+ case "setCatalogEntry": {
324
+ const catalog = state.document.catalogs.find((entry) => entry.id === command.catalogId);
325
+ if (catalog === undefined)
326
+ return null;
327
+ if (!catalog.entries.some((entry) => entry.id === command.entryId))
328
+ return null;
329
+ const catalogs = state.document.catalogs.map((row) => {
330
+ if (row.id !== command.catalogId)
331
+ return row;
332
+ return {
333
+ ...row,
334
+ entries: row.entries.map((entry) => {
335
+ if (entry.id !== command.entryId)
336
+ return entry;
337
+ const next = { id: entry.id };
338
+ const label = command.patch.label ?? entry.label;
339
+ if (label !== undefined)
340
+ next.label = label;
341
+ if (command.patch.meta !== undefined)
342
+ next.meta = { ...entry.meta, ...command.patch.meta };
343
+ else if (entry.meta !== undefined)
344
+ next.meta = { ...entry.meta };
345
+ return next;
346
+ }),
347
+ };
348
+ });
349
+ return { ...state, document: { ...state.document, catalogs } };
350
+ }
86
351
  case "remove":
352
+ if (isEditorObjectLocked(state.document, command.id))
353
+ return null;
87
354
  return {
88
- document: removeById(state.document, command.id),
355
+ document: removeByIds(state.document, new Set([command.id])),
89
356
  selection: state.selection.filter((id) => id !== command.id),
90
357
  };
358
+ case "removeMany": {
359
+ const gone = new Set(command.ids.filter((id) => !isEditorObjectLocked(state.document, id)));
360
+ if (gone.size === 0)
361
+ return null;
362
+ return {
363
+ document: removeByIds(state.document, gone),
364
+ selection: state.selection.filter((id) => !gone.has(id)),
365
+ };
366
+ }
367
+ case "duplicate":
368
+ return insertFragment(state, extractEditorFragment(state.document, command.ids), command.offset ?? { x: 2, y: 0, z: 2 }, true);
369
+ case "addFragment":
370
+ return insertFragment(state, command.fragment, command.offset ?? { x: 0, y: 0, z: 0 }, false);
91
371
  case "importDocument":
92
372
  case "replaceDocument":
93
373
  return {
@@ -99,22 +379,315 @@ function applyMutating(state, command) {
99
379
  document: importEditorDocumentJson(command.json),
100
380
  selection: [],
101
381
  };
382
+ case "setTerrain":
383
+ return { ...state, document: { ...state.document, terrain: command.terrain } };
384
+ case "clearTerrain": {
385
+ const nextDoc = {
386
+ version: 1,
387
+ markers: state.document.markers,
388
+ volumes: state.document.volumes,
389
+ paths: state.document.paths,
390
+ annotations: state.document.annotations,
391
+ prefabs: state.document.prefabs,
392
+ collections: state.document.collections,
393
+ catalogs: state.document.catalogs,
394
+ ...(state.document.grids === undefined ? {} : { grids: state.document.grids }),
395
+ ...(state.document.ui === undefined ? {} : { ui: state.document.ui }),
396
+ };
397
+ return { ...state, document: nextDoc };
398
+ }
399
+ case "setUiPanel": {
400
+ const ui = patchUiPanel(state.document.ui, command.id, command.patch);
401
+ return { ...state, document: { ...state.document, ui } };
402
+ }
403
+ case "removeUiPanel": {
404
+ const ui = removeUiPanel(state.document.ui, command.id);
405
+ if (ui === undefined) {
406
+ const { ui: _removed, ...rest } = state.document;
407
+ void _removed;
408
+ return { ...state, document: rest };
409
+ }
410
+ return { ...state, document: { ...state.document, ui } };
411
+ }
412
+ case "setUi": {
413
+ if (command.ui === undefined) {
414
+ const { ui: _removed, ...rest } = state.document;
415
+ void _removed;
416
+ return { ...state, document: rest };
417
+ }
418
+ return { ...state, document: { ...state.document, ui: command.ui } };
419
+ }
420
+ case "sculptTerrain": {
421
+ if (state.document.terrain === undefined)
422
+ return state;
423
+ return {
424
+ ...state,
425
+ document: { ...state.document, terrain: applyDeltaToSnapshot(state.document.terrain, command.delta) },
426
+ };
427
+ }
428
+ case "paintTerrain": {
429
+ if (state.document.terrain === undefined)
430
+ return state;
431
+ return {
432
+ ...state,
433
+ document: { ...state.document, terrain: applySurfaceDeltaToSnapshot(state.document.terrain, command.delta) },
434
+ };
435
+ }
436
+ case "blendTerrain": {
437
+ if (state.document.terrain === undefined)
438
+ return state;
439
+ return {
440
+ ...state,
441
+ document: { ...state.document, terrain: applyWeightDeltaToSnapshot(state.document.terrain, command.delta) },
442
+ };
443
+ }
444
+ case "setTerrainLayers": {
445
+ if (state.document.terrain === undefined)
446
+ return state;
447
+ const terrain = state.document.terrain;
448
+ const layers = command.layers.map((layer) => ({ ...layer }));
449
+ const before = terrain.layers ?? [];
450
+ // Keep hand-painted weights only when the layer id sequence is unchanged (a params-only edit).
451
+ const sameSequence = before.length === layers.length && before.every((layer, i) => layer.id === layers[i].id);
452
+ const next = sameSequence
453
+ ? { ...terrain, layers }
454
+ : (() => {
455
+ const copy = { ...terrain, layers };
456
+ delete copy.weights;
457
+ return copy;
458
+ })();
459
+ return { ...state, document: { ...state.document, terrain: next } };
460
+ }
461
+ case "convertScatterToObjects": {
462
+ const path = state.document.paths.find((entry) => entry.id === command.pathId);
463
+ if (path === undefined)
464
+ return state;
465
+ const taken = collectIds(state.document);
466
+ const markers = command.markers.map((marker) => {
467
+ let id = marker.id;
468
+ while (taken.has(id))
469
+ id = copyId(marker.id, taken);
470
+ taken.add(id);
471
+ return { ...marker, id };
472
+ });
473
+ return {
474
+ document: {
475
+ ...state.document,
476
+ markers: [...state.document.markers, ...markers],
477
+ paths: state.document.paths.filter((entry) => entry.id !== command.pathId),
478
+ },
479
+ selection: markers.map((marker) => marker.id),
480
+ };
481
+ }
482
+ case "createPrefab": {
483
+ if (command.ids.length === 0)
484
+ return state;
485
+ const fragment = createPrefabFragment(state.document, command.ids);
486
+ const prefab = { id: command.id, name: command.name, fragment };
487
+ return {
488
+ ...state,
489
+ document: {
490
+ ...state.document,
491
+ prefabs: [...state.document.prefabs.filter((entry) => entry.id !== command.id), prefab],
492
+ },
493
+ };
494
+ }
495
+ case "deletePrefab":
496
+ return {
497
+ ...state,
498
+ document: {
499
+ ...state.document,
500
+ prefabs: state.document.prefabs.filter((entry) => entry.id !== command.prefabId),
501
+ },
502
+ };
503
+ case "insertPrefab": {
504
+ const prefab = findEditorPrefab(state.document, command.prefabId);
505
+ if (prefab === undefined)
506
+ return state;
507
+ const instanceId = command.instanceId ??
508
+ `${prefab.id}_inst_${Date.now().toString(36)}_${Math.floor(Math.random() * 1_296_000).toString(36)}`;
509
+ const tagged = fragmentAsDocument({
510
+ markers: prefab.fragment.markers.map((marker) => tagWithInstance(marker, prefab.id, instanceId)),
511
+ volumes: prefab.fragment.volumes.map((volume) => tagWithInstance(volume, prefab.id, instanceId)),
512
+ paths: prefab.fragment.paths.map((path) => tagWithInstance(path, prefab.id, instanceId)),
513
+ annotations: prefab.fragment.annotations.map((note) => tagWithInstance(note, prefab.id, instanceId)),
514
+ });
515
+ return insertFragment(state, tagged, command.at, true);
516
+ }
517
+ case "detachPrefabInstance": {
518
+ const strip = (item) => {
519
+ if (item.meta?.prefabInstanceId !== command.instanceId)
520
+ return item;
521
+ const meta = { ...item.meta };
522
+ delete meta.prefabId;
523
+ delete meta.prefabInstanceId;
524
+ return { ...item, meta };
525
+ };
526
+ return {
527
+ ...state,
528
+ document: {
529
+ ...state.document,
530
+ markers: state.document.markers.map(strip),
531
+ volumes: state.document.volumes.map(strip),
532
+ paths: state.document.paths.map(strip),
533
+ annotations: state.document.annotations.map(strip),
534
+ },
535
+ };
536
+ }
537
+ case "createCollection": {
538
+ const collection = {
539
+ id: command.id,
540
+ name: command.name,
541
+ memberIds: [...(command.memberIds ?? [])],
542
+ };
543
+ return {
544
+ ...state,
545
+ document: {
546
+ ...state.document,
547
+ collections: [...state.document.collections.filter((entry) => entry.id !== command.id), collection],
548
+ },
549
+ };
550
+ }
551
+ case "renameCollection": {
552
+ const collections = state.document.collections.map((collection) => collection.id === command.id ? { ...collection, name: command.name } : collection);
553
+ return { ...state, document: { ...state.document, collections } };
554
+ }
555
+ case "deleteCollection":
556
+ return {
557
+ ...state,
558
+ document: {
559
+ ...state.document,
560
+ collections: state.document.collections.filter((entry) => entry.id !== command.id),
561
+ },
562
+ };
563
+ case "setCollectionMembers": {
564
+ const collections = state.document.collections.map((collection) => collection.id === command.id ? { ...collection, memberIds: [...command.memberIds] } : collection);
565
+ return { ...state, document: { ...state.document, collections } };
566
+ }
567
+ case "addToCollection": {
568
+ const adding = new Set(command.ids);
569
+ const collections = state.document.collections.map((collection) => {
570
+ if (collection.id !== command.id)
571
+ return collection;
572
+ const merged = new Set(collection.memberIds);
573
+ for (const id of adding)
574
+ merged.add(id);
575
+ return { ...collection, memberIds: [...merged] };
576
+ });
577
+ return { ...state, document: { ...state.document, collections } };
578
+ }
579
+ case "removeFromCollection": {
580
+ const removing = new Set(command.ids);
581
+ const collections = state.document.collections.map((collection) => collection.id === command.id
582
+ ? { ...collection, memberIds: collection.memberIds.filter((id) => !removing.has(id)) }
583
+ : collection);
584
+ return { ...state, document: { ...state.document, collections } };
585
+ }
586
+ case "setCollectionFlags": {
587
+ const collections = state.document.collections.map((collection) => collection.id === command.id ? { ...collection, ...command.patch } : collection);
588
+ return { ...state, document: { ...state.document, collections } };
589
+ }
590
+ case "selectCollection": {
591
+ const collection = findEditorCollection(state.document, command.id);
592
+ if (collection === undefined)
593
+ return null;
594
+ return { ...state, selection: [...collection.memberIds] };
595
+ }
596
+ case "batchSetProperties": {
597
+ const ids = new Set(command.ids);
598
+ const patch = command.patch;
599
+ const markers = state.document.markers.map((marker) => ids.has(marker.id)
600
+ ? {
601
+ ...marker,
602
+ ...(patch.color === undefined ? {} : { color: patch.color }),
603
+ ...(patch.label === undefined ? {} : { label: patch.label }),
604
+ ...(patch.meta === undefined ? {} : { meta: { ...marker.meta, ...patch.meta } }),
605
+ }
606
+ : marker);
607
+ const volumes = state.document.volumes.map((volume) => ids.has(volume.id)
608
+ ? {
609
+ ...volume,
610
+ ...(patch.color === undefined ? {} : { color: patch.color }),
611
+ ...(patch.label === undefined ? {} : { label: patch.label }),
612
+ ...(patch.meta === undefined ? {} : { meta: { ...volume.meta, ...patch.meta } }),
613
+ }
614
+ : volume);
615
+ const paths = state.document.paths.map((path) => ids.has(path.id)
616
+ ? {
617
+ ...path,
618
+ ...(patch.color === undefined ? {} : { color: patch.color }),
619
+ ...(patch.label === undefined ? {} : { label: patch.label }),
620
+ ...(patch.meta === undefined ? {} : { meta: { ...path.meta, ...patch.meta } }),
621
+ }
622
+ : path);
623
+ const annotations = state.document.annotations.map((note) => ids.has(note.id)
624
+ ? {
625
+ ...note,
626
+ ...(patch.color === undefined ? {} : { color: patch.color }),
627
+ ...(patch.meta === undefined ? {} : { meta: { ...note.meta, ...patch.meta } }),
628
+ }
629
+ : note);
630
+ return { ...state, document: { ...state.document, markers, volumes, paths, annotations } };
631
+ }
632
+ case "addGridLayer": {
633
+ const layer = migrateGridLayer(command.layer);
634
+ const grids = state.document.grids ?? [];
635
+ return {
636
+ ...state,
637
+ document: {
638
+ ...state.document,
639
+ grids: [...grids.filter((entry) => entry.id !== layer.id), layer],
640
+ },
641
+ };
642
+ }
643
+ case "removeGridLayer": {
644
+ const grids = state.document.grids;
645
+ if (grids === undefined)
646
+ return null;
647
+ const next = grids.filter((layer) => layer.id !== command.id);
648
+ if (next.length === grids.length)
649
+ return null;
650
+ return { ...state, document: { ...state.document, grids: next } };
651
+ }
652
+ case "setGridLayer":
653
+ return updateGridLayer(state, command.id, (layer) => migrateGridLayer({ ...layer, ...command.patch }));
654
+ case "paintGridCells":
655
+ return updateGridLayer(state, command.id, (layer) => paintGridCells(layer, command.cells));
656
+ case "fillGridRect":
657
+ return updateGridLayer(state, command.id, (layer) => fillGridRect(layer, command.col0, command.row0, command.col1, command.row1, command.value));
658
+ case "floodFillGrid":
659
+ return updateGridLayer(state, command.id, (layer) => floodFillGrid(layer, command.col, command.row, command.value));
660
+ case "resizeGridLayer":
661
+ return updateGridLayer(state, command.id, (layer) => resizeGridLayer(layer, command.cols, command.rows));
662
+ case "assignMaterial": {
663
+ const ids = new Set(command.ids);
664
+ const stamp = (meta) => ({ ...meta, materialId: command.materialId });
665
+ return {
666
+ ...state,
667
+ document: {
668
+ ...state.document,
669
+ markers: state.document.markers.map((marker) => (ids.has(marker.id) ? { ...marker, meta: stamp(marker.meta) } : marker)),
670
+ volumes: state.document.volumes.map((volume) => (ids.has(volume.id) ? { ...volume, meta: stamp(volume.meta) } : volume)),
671
+ paths: state.document.paths.map((path) => (ids.has(path.id) ? { ...path, meta: stamp(path.meta) } : path)),
672
+ annotations: state.document.annotations.map((note) => (ids.has(note.id) ? { ...note, meta: stamp(note.meta) } : note)),
673
+ },
674
+ };
675
+ }
102
676
  case "undo":
103
677
  case "redo":
104
678
  return null;
105
679
  }
106
680
  }
107
681
  function isStructural(command) {
108
- return (command.type === "setTransform" ||
109
- command.type === "addMarker" ||
110
- command.type === "addVolume" ||
111
- command.type === "setVolume" ||
112
- command.type === "remove" ||
113
- command.type === "importDocument" ||
114
- command.type === "importJson" ||
115
- command.type === "replaceDocument");
682
+ return (command.type !== "select" &&
683
+ command.type !== "clearSelection" &&
684
+ command.type !== "selectCollection" &&
685
+ command.type !== "undo" &&
686
+ command.type !== "redo");
116
687
  }
117
- /** Creates an editor session with undo/redo history seeded from an initial document. */
688
+ /** Creates an editor session with undo/redo history seeded from an initial document.
689
+ * @internal
690
+ */
118
691
  export function createEditorSession(initial, historyLimit = 100) {
119
692
  let state = {
120
693
  document: cloneEditorDocument(initial),
@@ -122,11 +695,37 @@ export function createEditorSession(initial, historyLimit = 100) {
122
695
  };
123
696
  const past = [];
124
697
  const future = [];
698
+ let lastCoalesce = null;
125
699
  const listeners = new Set();
126
700
  const emit = () => {
127
701
  for (const listener of listeners)
128
702
  listener(state);
129
703
  };
704
+ const sculptWith = (delta, direction, selection) => {
705
+ const terrain = state.document.terrain;
706
+ if (terrain === undefined)
707
+ return state;
708
+ const next = direction === "apply" ? applyDeltaToSnapshot(terrain, delta) : revertDeltaFromSnapshot(terrain, delta);
709
+ return { document: { ...state.document, terrain: next }, selection };
710
+ };
711
+ const paintWith = (delta, direction, selection) => {
712
+ const terrain = state.document.terrain;
713
+ if (terrain === undefined)
714
+ return state;
715
+ const next = direction === "apply"
716
+ ? applySurfaceDeltaToSnapshot(terrain, delta)
717
+ : revertSurfaceDeltaFromSnapshot(terrain, delta);
718
+ return { document: { ...state.document, terrain: next }, selection };
719
+ };
720
+ const blendWith = (delta, direction, selection) => {
721
+ const terrain = state.document.terrain;
722
+ if (terrain === undefined)
723
+ return state;
724
+ const next = direction === "apply"
725
+ ? applyWeightDeltaToSnapshot(terrain, delta)
726
+ : revertWeightDeltaFromSnapshot(terrain, delta);
727
+ return { document: { ...state.document, terrain: next }, selection };
728
+ };
130
729
  return {
131
730
  getState: () => state,
132
731
  subscribe(listener) {
@@ -137,22 +736,88 @@ export function createEditorSession(initial, historyLimit = 100) {
137
736
  },
138
737
  canUndo: () => past.length > 0,
139
738
  canRedo: () => future.length > 0,
140
- dispatch(command) {
739
+ dispatch(command, options) {
141
740
  if (command.type === "undo") {
142
- const previous = past.pop();
143
- if (previous === undefined)
741
+ const entry = past.pop();
742
+ if (entry === undefined)
144
743
  return state;
145
- future.push(snapshotState(state));
146
- state = previous;
744
+ if (entry.kind === "sculpt") {
745
+ future.push({ kind: "sculpt", delta: entry.delta, selection: state.selection });
746
+ state = sculptWith(entry.delta, "revert", entry.selection);
747
+ }
748
+ else if (entry.kind === "paint") {
749
+ future.push({ kind: "paint", delta: entry.delta, selection: state.selection });
750
+ state = paintWith(entry.delta, "revert", entry.selection);
751
+ }
752
+ else if (entry.kind === "blend") {
753
+ future.push({ kind: "blend", delta: entry.delta, selection: state.selection });
754
+ state = blendWith(entry.delta, "revert", entry.selection);
755
+ }
756
+ else {
757
+ future.push({ kind: "snapshot", state: snapshotState(state) });
758
+ state = entry.state;
759
+ }
760
+ lastCoalesce = null;
147
761
  emit();
148
762
  return state;
149
763
  }
150
764
  if (command.type === "redo") {
151
- const next = future.pop();
152
- if (next === undefined)
765
+ const entry = future.pop();
766
+ if (entry === undefined)
767
+ return state;
768
+ if (entry.kind === "sculpt") {
769
+ past.push({ kind: "sculpt", delta: entry.delta, selection: state.selection });
770
+ state = sculptWith(entry.delta, "apply", entry.selection);
771
+ }
772
+ else if (entry.kind === "paint") {
773
+ past.push({ kind: "paint", delta: entry.delta, selection: state.selection });
774
+ state = paintWith(entry.delta, "apply", entry.selection);
775
+ }
776
+ else if (entry.kind === "blend") {
777
+ past.push({ kind: "blend", delta: entry.delta, selection: state.selection });
778
+ state = blendWith(entry.delta, "apply", entry.selection);
779
+ }
780
+ else {
781
+ past.push({ kind: "snapshot", state: snapshotState(state) });
782
+ state = entry.state;
783
+ }
784
+ lastCoalesce = null;
785
+ emit();
786
+ return state;
787
+ }
788
+ if (command.type === "sculptTerrain") {
789
+ if (state.document.terrain === undefined || command.delta.indices.length === 0)
153
790
  return state;
154
- past.push(snapshotState(state));
155
- state = next;
791
+ past.push({ kind: "sculpt", delta: command.delta, selection: [...state.selection] });
792
+ if (past.length > historyLimit)
793
+ past.shift();
794
+ future.length = 0;
795
+ lastCoalesce = null;
796
+ state = sculptWith(command.delta, "apply", state.selection);
797
+ emit();
798
+ return state;
799
+ }
800
+ if (command.type === "paintTerrain") {
801
+ if (state.document.terrain === undefined || command.delta.indices.length === 0)
802
+ return state;
803
+ past.push({ kind: "paint", delta: command.delta, selection: [...state.selection] });
804
+ if (past.length > historyLimit)
805
+ past.shift();
806
+ future.length = 0;
807
+ lastCoalesce = null;
808
+ state = paintWith(command.delta, "apply", state.selection);
809
+ emit();
810
+ return state;
811
+ }
812
+ if (command.type === "blendTerrain") {
813
+ if (state.document.terrain === undefined || command.delta.indices.length === 0)
814
+ return state;
815
+ past.push({ kind: "blend", delta: command.delta, selection: [...state.selection] });
816
+ if (past.length > historyLimit)
817
+ past.shift();
818
+ future.length = 0;
819
+ lastCoalesce = null;
820
+ state = blendWith(command.delta, "apply", state.selection);
156
821
  emit();
157
822
  return state;
158
823
  }
@@ -160,10 +825,15 @@ export function createEditorSession(initial, historyLimit = 100) {
160
825
  if (next === null)
161
826
  return state;
162
827
  if (isStructural(command)) {
163
- past.push(snapshotState(state));
164
- if (past.length > historyLimit)
165
- past.shift();
828
+ const coalesce = options?.coalesce;
829
+ const merge = coalesce !== undefined && coalesce === lastCoalesce && past.length > 0;
830
+ if (!merge) {
831
+ past.push({ kind: "snapshot", state: snapshotState(state) });
832
+ if (past.length > historyLimit)
833
+ past.shift();
834
+ }
166
835
  future.length = 0;
836
+ lastCoalesce = coalesce ?? null;
167
837
  }
168
838
  state = next;
169
839
  emit();
@@ -174,7 +844,9 @@ export function createEditorSession(initial, historyLimit = 100) {
174
844
  },
175
845
  };
176
846
  }
177
- /** Compact snapshot of a session state — counts, selection, and the selected object. */
847
+ /** Compact snapshot of a session state — counts, selection, and the selected object.
848
+ * @internal
849
+ */
178
850
  export function summarizeEditorSession(state) {
179
851
  const selectedId = state.selection[0];
180
852
  return {