@jgengine/core 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (727) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Authored behavior triggers on editor volumes and markers — a small `on`/`action` meta vocabulary
3
+ * so "when player enters this volume, spawn wave 2" is scene data, not game code. Games declare
4
+ * actions (typed via ParamSchema); the editor inspector renders their fields; a pure runtime
5
+ * watches membership and dispatches to handlers.
6
+ */
7
+ import type { SceneDocumentLike, SceneMarkerLike, SceneVolumeLike } from "../world/sceneShapes.js";
8
+ import { type ParamSchema, type ParsedParams } from "./sceneKinds.js";
9
+ /** Event edge that can fire an authored trigger. */
10
+ export type TriggerEvent = "enter" | "exit" | "interact";
11
+ /** Document collection a trigger source lives on. */
12
+ export type TriggerSourceKind = "marker" | "volume";
13
+ /** Reserved meta keys for the trigger vocabulary — action params use every other schema field. @internal */
14
+ export declare const TRIGGER_ON_KEY = "on";
15
+ /** @internal */
16
+ export declare const TRIGGER_ACTION_KEY = "action";
17
+ /** @internal */
18
+ export declare const TRIGGER_RADIUS_KEY = "triggerRadius";
19
+ /** @internal */
20
+ export declare const TRIGGER_LIST_KEY = "triggers";
21
+ /** Default proximity radius (m) for marker enter/exit/interact when neither triggerRadius nor radius is set. @internal */
22
+ export declare const DEFAULT_TRIGGER_RADIUS = 2.5;
23
+ /**
24
+ * A game-declared action the editor can assign to a volume/marker trigger. Schema drives the
25
+ * inspector params; `targets`/`events` optionally narrow where it appears.
26
+ */
27
+ export interface TriggerActionDefinition {
28
+ id: string;
29
+ /** Human label for the inspector action dropdown. */
30
+ label: string;
31
+ /** Param surface for this action — fields land flat on the object's `meta` (alongside `on`/`action`). */
32
+ schema: ParamSchema;
33
+ /** Which document collections accept this action. Default both. */
34
+ targets?: readonly TriggerSourceKind[];
35
+ /** Which events this action accepts. Default all (`enter`/`exit`/`interact`). */
36
+ events?: readonly TriggerEvent[];
37
+ }
38
+ /** One resolved trigger binding from a document object. */
39
+ export interface AuthoredTrigger {
40
+ sourceId: string;
41
+ sourceKind: TriggerSourceKind;
42
+ objectKind: string;
43
+ on: TriggerEvent;
44
+ action: string;
45
+ params: ParsedParams;
46
+ /** Proximity radius for marker sources; unused for volumes (shape owns containment). */
47
+ radius: number;
48
+ }
49
+ /** Fired when a watched actor trips an authored trigger edge. */
50
+ export interface TriggerDispatchEvent {
51
+ on: TriggerEvent;
52
+ action: string;
53
+ sourceId: string;
54
+ sourceKind: TriggerSourceKind;
55
+ objectKind: string;
56
+ actorId: string;
57
+ params: ParsedParams;
58
+ }
59
+ /** Handler map keyed by action id — unknown actions are skipped unless `onDispatch` is set. */
60
+ export type TriggerHandlers = Readonly<Record<string, (event: TriggerDispatchEvent) => void>>;
61
+ /**
62
+ * Declare a game action the editor can assign to volume/marker triggers. Idempotent per `id`
63
+ * (last registration wins). Call at module load next to catalogs.
64
+ *
65
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
66
+ */
67
+ export declare function registerTriggerAction(definition: TriggerActionDefinition): void;
68
+ /** Registered definition for an action id, or undefined when the game never declared it. */
69
+ export declare function getTriggerAction(id: string): TriggerActionDefinition | undefined;
70
+ /** Every registered action, optionally filtered by target collection. */
71
+ export declare function listTriggerActions(target?: TriggerSourceKind): TriggerActionDefinition[];
72
+ /** Clears the action registry — tests only. @internal */
73
+ export declare function clearTriggerActions(): void;
74
+ /**
75
+ * The engine's built-in trigger actions — the shared `announce` / `win` / `advance` vocabulary every
76
+ * game gets for free, so "enter this zone → win" is authored entirely in the editor with no bespoke
77
+ * action code. Their params land flat on the object's `meta` like any registered action; drive them
78
+ * at runtime with the handlers from {@link createTriggerOutcome}.
79
+ *
80
+ * @capability authored-triggers built-in announce/win/advance actions authorable on any marker or volume
81
+ */
82
+ export declare const BUILTIN_TRIGGER_ACTIONS: readonly TriggerActionDefinition[];
83
+ /**
84
+ * Register the engine's built-in {@link BUILTIN_TRIGGER_ACTIONS} so they appear in the editor's
85
+ * trigger inspector. Idempotent; call at module load (a game may still register its own actions or
86
+ * re-register a built-in id to override it).
87
+ *
88
+ * @capability authored-triggers register the shared announce/win/advance actions
89
+ */
90
+ export declare function registerBuiltinTriggerActions(): void;
91
+ /** Resolve the proximity radius for a marker trigger from meta. @internal */
92
+ export declare function triggerRadiusOf(meta: Record<string, unknown> | undefined, fallback?: number): number;
93
+ /**
94
+ * Read every valid `on`/`action` binding off a raw meta bag. Unknown events/actions are dropped;
95
+ * params are schema-parsed when the action is registered, else empty.
96
+ * @internal
97
+ */
98
+ export declare function readTriggerSpecs(meta: Record<string, unknown> | undefined): readonly {
99
+ on: TriggerEvent;
100
+ action: string;
101
+ params: ParsedParams;
102
+ }[];
103
+ /**
104
+ * Collect every authored trigger on a document's markers and volumes. Pure — no runtime state.
105
+ * Action params use the live {@link registerTriggerAction} registry when present.
106
+ *
107
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
108
+ */
109
+ export declare function collectAuthoredTriggers(document: SceneDocumentLike): AuthoredTrigger[];
110
+ /**
111
+ * True when `point` is inside an editor volume (sphere / cylinder / box). Cylinder height defaults
112
+ * to diameter when omitted; sphere ignores y for the common ground-plane case only when the volume
113
+ * radius covers the full vertical span — here y is tested for sphere and box too.
114
+ */
115
+ export declare function pointInVolume(volume: SceneVolumeLike, point: {
116
+ x: number;
117
+ y: number;
118
+ z: number;
119
+ }): boolean;
120
+ /** True when `point` is within `radius` of a marker's position (sphere for enter/exit/interact). @internal */
121
+ export declare function pointNearMarker(marker: SceneMarkerLike, point: {
122
+ x: number;
123
+ y: number;
124
+ z: number;
125
+ }, radius: number): boolean;
126
+ /** @internal */
127
+ export interface TriggerActor {
128
+ id: string;
129
+ position: readonly [number, number, number] | {
130
+ x: number;
131
+ y: number;
132
+ z: number;
133
+ };
134
+ }
135
+ /** @internal */
136
+ export interface AuthoredTriggerStepInput {
137
+ actors: readonly TriggerActor[];
138
+ /** Actor ids that pressed interact this frame — fires `on: "interact"` sources in range. */
139
+ interact?: readonly string[];
140
+ }
141
+ /** Runtime handle that watches authored triggers against moving actors each tick. */
142
+ export interface AuthoredTriggerRuntime {
143
+ /** Advance membership one tick; returns every edge fired and invokes handlers. */
144
+ step(input: {
145
+ actors: readonly {
146
+ id: string;
147
+ position: readonly [number, number, number] | {
148
+ x: number;
149
+ y: number;
150
+ z: number;
151
+ };
152
+ }[];
153
+ /** Actor ids that pressed interact this frame — fires `on: "interact"` sources in range. */
154
+ interact?: readonly string[];
155
+ }): readonly TriggerDispatchEvent[];
156
+ /** Drop membership so the next step re-fires enters for still-inside actors. */
157
+ reset(): void;
158
+ /** Snapshot of the triggers this runtime was built from. */
159
+ triggers(): readonly AuthoredTrigger[];
160
+ }
161
+ /**
162
+ * Build a runtime that watches a document's authored triggers against moving actors and dispatches
163
+ * to per-action handlers (and optional catch-all). Pure membership math; the game supplies actors
164
+ * each tick from its own player/entity poses.
165
+ *
166
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
167
+ */
168
+ export declare function createAuthoredTriggerRuntime(options: {
169
+ document: SceneDocumentLike;
170
+ handlers?: TriggerHandlers;
171
+ /** Invoked for every dispatch after the matching handler (if any). */
172
+ onDispatch?: (event: TriggerDispatchEvent) => void;
173
+ /** Override the collected trigger list (tests / hot-reload). Default: {@link collectAuthoredTriggers}. */
174
+ triggers?: readonly AuthoredTrigger[];
175
+ }): AuthoredTriggerRuntime;
176
+ /** Serializable read-model the built-in trigger actions write — the HUD/game reads it each frame. */
177
+ export interface TriggerOutcome {
178
+ /** True once a `win` action fired. */
179
+ won: boolean;
180
+ /** Latest announce/win/advance message to surface, or null before any fires. */
181
+ message: string | null;
182
+ /** Tone for the latest message: `"info" | "warn" | "good"`. */
183
+ tone: string;
184
+ /** Current objective id from the latest `advance`, or null. */
185
+ objective: string | null;
186
+ /** Bumped on every change — a cheap key for `useSyncExternalStore`. */
187
+ revision: number;
188
+ }
189
+ /** Outcome store: the built-in action handlers plus a subscribable snapshot of what they produced. */
190
+ export interface TriggerOutcomeStore {
191
+ /** Current outcome snapshot (stable reference until the next change). */
192
+ get(): TriggerOutcome;
193
+ /** Subscribe to outcome changes; returns an unsubscribe fn. */
194
+ subscribe(listener: () => void): () => void;
195
+ /** Handlers for `createAuthoredTriggerRuntime({ handlers })` — wires announce/win/advance. */
196
+ handlers: TriggerHandlers;
197
+ /** Reset to the initial (un-won) outcome — new run / retry. */
198
+ reset(): void;
199
+ }
200
+ /**
201
+ * Default runtime for the built-in {@link BUILTIN_TRIGGER_ACTIONS}: a small serializable outcome the
202
+ * HUD renders, with no engine-side UI. Pass {@link TriggerOutcomeStore.handlers} to
203
+ * {@link createAuthoredTriggerRuntime} and read {@link TriggerOutcomeStore.get} from the HUD via
204
+ * `useSyncExternalStore` — that is the whole zero-code "reach the zone to win" wiring.
205
+ *
206
+ * @capability authored-triggers headless win/announce/objective outcome for the built-in actions
207
+ */
208
+ export declare function createTriggerOutcome(): TriggerOutcomeStore;
209
+ /**
210
+ * Build a meta patch that sets a single flat trigger (`on` + `action` + optional param fields) and
211
+ * clears a multi-trigger list if present. Used by the editor inspector.
212
+ * @internal
213
+ */
214
+ export declare function triggerMetaPatch(on: TriggerEvent | "", action: string, params?: Record<string, unknown>): Record<string, unknown>;
215
+ /** Read the single flat trigger (`on`/`action`) from meta for the inspector, ignoring non-empty multi-lists. @internal */
216
+ export declare function readFlatTrigger(meta: Record<string, unknown> | undefined): {
217
+ on: TriggerEvent | "";
218
+ action: string;
219
+ };
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Authored behavior triggers on editor volumes and markers — a small `on`/`action` meta vocabulary
3
+ * so "when player enters this volume, spawn wave 2" is scene data, not game code. Games declare
4
+ * actions (typed via ParamSchema); the editor inspector renders their fields; a pure runtime
5
+ * watches membership and dispatches to handlers.
6
+ */
7
+ import { parseParams } from "./sceneKinds.js";
8
+ /** Reserved meta keys for the trigger vocabulary — action params use every other schema field. @internal */
9
+ export const TRIGGER_ON_KEY = "on";
10
+ /** @internal */
11
+ export const TRIGGER_ACTION_KEY = "action";
12
+ /** @internal */
13
+ export const TRIGGER_RADIUS_KEY = "triggerRadius";
14
+ /** @internal */
15
+ export const TRIGGER_LIST_KEY = "triggers";
16
+ const TRIGGER_EVENTS = ["enter", "exit", "interact"];
17
+ /** Default proximity radius (m) for marker enter/exit/interact when neither triggerRadius nor radius is set. @internal */
18
+ export const DEFAULT_TRIGGER_RADIUS = 2.5;
19
+ const actionRegistry = new Map();
20
+ /**
21
+ * Declare a game action the editor can assign to volume/marker triggers. Idempotent per `id`
22
+ * (last registration wins). Call at module load next to catalogs.
23
+ *
24
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
25
+ */
26
+ export function registerTriggerAction(definition) {
27
+ actionRegistry.set(definition.id, definition);
28
+ }
29
+ /** Registered definition for an action id, or undefined when the game never declared it. */
30
+ export function getTriggerAction(id) {
31
+ return actionRegistry.get(id);
32
+ }
33
+ /** Every registered action, optionally filtered by target collection. */
34
+ export function listTriggerActions(target) {
35
+ const all = [...actionRegistry.values()];
36
+ if (target === undefined)
37
+ return all;
38
+ return all.filter((definition) => definition.targets === undefined || definition.targets.includes(target));
39
+ }
40
+ /** Clears the action registry — tests only. @internal */
41
+ export function clearTriggerActions() {
42
+ actionRegistry.clear();
43
+ }
44
+ /**
45
+ * The engine's built-in trigger actions — the shared `announce` / `win` / `advance` vocabulary every
46
+ * game gets for free, so "enter this zone → win" is authored entirely in the editor with no bespoke
47
+ * action code. Their params land flat on the object's `meta` like any registered action; drive them
48
+ * at runtime with the handlers from {@link createTriggerOutcome}.
49
+ *
50
+ * @capability authored-triggers built-in announce/win/advance actions authorable on any marker or volume
51
+ */
52
+ export const BUILTIN_TRIGGER_ACTIONS = [
53
+ {
54
+ id: "announce",
55
+ label: "Announce",
56
+ schema: {
57
+ fields: [
58
+ { type: "text", key: "message", label: "Message", default: "Entered zone" },
59
+ {
60
+ type: "select",
61
+ key: "tone",
62
+ label: "Tone",
63
+ options: [
64
+ { value: "info", label: "Info" },
65
+ { value: "warn", label: "Warn" },
66
+ { value: "good", label: "Good" },
67
+ ],
68
+ default: "info",
69
+ },
70
+ ],
71
+ },
72
+ },
73
+ {
74
+ id: "win",
75
+ label: "Win the game",
76
+ schema: {
77
+ fields: [{ type: "text", key: "message", label: "Message", default: "You win!" }],
78
+ },
79
+ },
80
+ {
81
+ id: "advance",
82
+ label: "Advance objective",
83
+ schema: {
84
+ fields: [
85
+ { type: "text", key: "objective", label: "Next objective", default: "" },
86
+ { type: "text", key: "message", label: "Message", default: "" },
87
+ ],
88
+ },
89
+ },
90
+ ];
91
+ /**
92
+ * Register the engine's built-in {@link BUILTIN_TRIGGER_ACTIONS} so they appear in the editor's
93
+ * trigger inspector. Idempotent; call at module load (a game may still register its own actions or
94
+ * re-register a built-in id to override it).
95
+ *
96
+ * @capability authored-triggers register the shared announce/win/advance actions
97
+ */
98
+ export function registerBuiltinTriggerActions() {
99
+ for (const definition of BUILTIN_TRIGGER_ACTIONS)
100
+ registerTriggerAction(definition);
101
+ }
102
+ function isTriggerEvent(value) {
103
+ return typeof value === "string" && TRIGGER_EVENTS.includes(value);
104
+ }
105
+ function metaNumber(meta, key) {
106
+ const value = meta?.[key];
107
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
108
+ }
109
+ /** Resolve the proximity radius for a marker trigger from meta. @internal */
110
+ export function triggerRadiusOf(meta, fallback = DEFAULT_TRIGGER_RADIUS) {
111
+ const explicit = metaNumber(meta, TRIGGER_RADIUS_KEY) ?? metaNumber(meta, "radius");
112
+ if (explicit === undefined)
113
+ return fallback;
114
+ return Math.max(0, explicit);
115
+ }
116
+ function specsFromMeta(meta) {
117
+ if (meta === undefined)
118
+ return [];
119
+ const list = meta[TRIGGER_LIST_KEY];
120
+ if (Array.isArray(list)) {
121
+ if (list.length === 0) {
122
+ // Empty multi-list is the inspector's "cleared" sentinel — fall through to flat on/action.
123
+ }
124
+ else {
125
+ const out = [];
126
+ for (const entry of list) {
127
+ if (typeof entry !== "object" || entry === null)
128
+ continue;
129
+ const row = entry;
130
+ if (!isTriggerEvent(row[TRIGGER_ON_KEY]))
131
+ continue;
132
+ const action = row[TRIGGER_ACTION_KEY];
133
+ if (typeof action !== "string" || action.length === 0)
134
+ continue;
135
+ out.push({ on: row[TRIGGER_ON_KEY], action, paramsMeta: row });
136
+ }
137
+ return out;
138
+ }
139
+ }
140
+ if (!isTriggerEvent(meta[TRIGGER_ON_KEY]))
141
+ return [];
142
+ const action = meta[TRIGGER_ACTION_KEY];
143
+ if (typeof action !== "string" || action.length === 0)
144
+ return [];
145
+ return [{ on: meta[TRIGGER_ON_KEY], action, paramsMeta: meta }];
146
+ }
147
+ function resolveParams(actionId, paramsMeta) {
148
+ const definition = actionRegistry.get(actionId);
149
+ if (definition === undefined)
150
+ return {};
151
+ return parseParams(definition.schema, paramsMeta);
152
+ }
153
+ /**
154
+ * Read every valid `on`/`action` binding off a raw meta bag. Unknown events/actions are dropped;
155
+ * params are schema-parsed when the action is registered, else empty.
156
+ * @internal
157
+ */
158
+ export function readTriggerSpecs(meta) {
159
+ return specsFromMeta(meta).map((spec) => ({
160
+ on: spec.on,
161
+ action: spec.action,
162
+ params: resolveParams(spec.action, spec.paramsMeta),
163
+ }));
164
+ }
165
+ /**
166
+ * Collect every authored trigger on a document's markers and volumes. Pure — no runtime state.
167
+ * Action params use the live {@link registerTriggerAction} registry when present.
168
+ *
169
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
170
+ */
171
+ export function collectAuthoredTriggers(document) {
172
+ const out = [];
173
+ for (const marker of document.markers) {
174
+ const radius = triggerRadiusOf(marker.meta);
175
+ for (const spec of readTriggerSpecs(marker.meta)) {
176
+ out.push({
177
+ sourceId: marker.id,
178
+ sourceKind: "marker",
179
+ objectKind: marker.kind,
180
+ on: spec.on,
181
+ action: spec.action,
182
+ params: spec.params,
183
+ radius,
184
+ });
185
+ }
186
+ }
187
+ for (const volume of document.volumes) {
188
+ for (const spec of readTriggerSpecs(volume.meta)) {
189
+ out.push({
190
+ sourceId: volume.id,
191
+ sourceKind: "volume",
192
+ objectKind: volume.kind,
193
+ on: spec.on,
194
+ action: spec.action,
195
+ params: spec.params,
196
+ radius: 0,
197
+ });
198
+ }
199
+ }
200
+ return out;
201
+ }
202
+ /**
203
+ * True when `point` is inside an editor volume (sphere / cylinder / box). Cylinder height defaults
204
+ * to diameter when omitted; sphere ignores y for the common ground-plane case only when the volume
205
+ * radius covers the full vertical span — here y is tested for sphere and box too.
206
+ */
207
+ export function pointInVolume(volume, point) {
208
+ const dx = point.x - volume.center.x;
209
+ const dy = point.y - volume.center.y;
210
+ const dz = point.z - volume.center.z;
211
+ if (volume.shape === "box") {
212
+ const hx = volume.halfExtents?.x ?? 5;
213
+ const hy = volume.halfExtents?.y ?? 5;
214
+ const hz = volume.halfExtents?.z ?? 5;
215
+ return Math.abs(dx) <= hx && Math.abs(dy) <= hy && Math.abs(dz) <= hz;
216
+ }
217
+ const radius = volume.radius ?? 5;
218
+ if (volume.shape === "cylinder") {
219
+ const height = volume.height ?? radius * 2;
220
+ if (Math.hypot(dx, dz) > radius)
221
+ return false;
222
+ return Math.abs(dy) <= height / 2;
223
+ }
224
+ return Math.hypot(dx, dy, dz) <= radius;
225
+ }
226
+ /** True when `point` is within `radius` of a marker's position (sphere for enter/exit/interact). @internal */
227
+ export function pointNearMarker(marker, point, radius) {
228
+ const dx = point.x - marker.position.x;
229
+ const dy = point.y - marker.position.y;
230
+ const dz = point.z - marker.position.z;
231
+ return Math.hypot(dx, dy, dz) <= radius;
232
+ }
233
+ function membershipKey(sourceId, actorId) {
234
+ return `${sourceId}\0${actorId}`;
235
+ }
236
+ function actorPoint(actor) {
237
+ const p = actor.position;
238
+ if (Array.isArray(p))
239
+ return { x: p[0], y: p[1], z: p[2] };
240
+ return p;
241
+ }
242
+ function insideSource(document, trigger, point) {
243
+ if (trigger.sourceKind === "volume") {
244
+ const volume = document.volumes.find((entry) => entry.id === trigger.sourceId);
245
+ return volume !== undefined && pointInVolume(volume, point);
246
+ }
247
+ const marker = document.markers.find((entry) => entry.id === trigger.sourceId);
248
+ return marker !== undefined && pointNearMarker(marker, point, trigger.radius);
249
+ }
250
+ /**
251
+ * Build a runtime that watches a document's authored triggers against moving actors and dispatches
252
+ * to per-action handlers (and optional catch-all). Pure membership math; the game supplies actors
253
+ * each tick from its own player/entity poses.
254
+ *
255
+ * @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
256
+ */
257
+ export function createAuthoredTriggerRuntime(options) {
258
+ const document = options.document;
259
+ const triggers = options.triggers ?? collectAuthoredTriggers(document);
260
+ let members = new Set();
261
+ const sourceIds = new Map();
262
+ for (const trigger of triggers) {
263
+ const list = sourceIds.get(trigger.sourceId) ?? [];
264
+ list.push(trigger);
265
+ sourceIds.set(trigger.sourceId, list);
266
+ }
267
+ function emit(events) {
268
+ for (const event of events) {
269
+ options.handlers?.[event.action]?.(event);
270
+ options.onDispatch?.(event);
271
+ }
272
+ }
273
+ return {
274
+ triggers: () => triggers,
275
+ reset() {
276
+ members = new Set();
277
+ },
278
+ step(input) {
279
+ const next = new Set();
280
+ const insideNow = new Map();
281
+ for (const actor of input.actors) {
282
+ const point = actorPoint(actor);
283
+ for (const [sourceId, sourceTriggers] of sourceIds) {
284
+ const probe = sourceTriggers[0];
285
+ if (!insideSource(document, probe, point))
286
+ continue;
287
+ const key = membershipKey(sourceId, actor.id);
288
+ next.add(key);
289
+ let set = insideNow.get(sourceId);
290
+ if (set === undefined) {
291
+ set = new Set();
292
+ insideNow.set(sourceId, set);
293
+ }
294
+ set.add(actor.id);
295
+ }
296
+ }
297
+ const events = [];
298
+ for (const [sourceId, actorsInside] of insideNow) {
299
+ const sourceTriggers = sourceIds.get(sourceId) ?? [];
300
+ for (const actorId of actorsInside) {
301
+ const key = membershipKey(sourceId, actorId);
302
+ const wasInside = members.has(key);
303
+ if (!wasInside) {
304
+ for (const trigger of sourceTriggers) {
305
+ if (trigger.on !== "enter")
306
+ continue;
307
+ events.push({
308
+ on: "enter",
309
+ action: trigger.action,
310
+ sourceId: trigger.sourceId,
311
+ sourceKind: trigger.sourceKind,
312
+ objectKind: trigger.objectKind,
313
+ actorId,
314
+ params: trigger.params,
315
+ });
316
+ }
317
+ }
318
+ }
319
+ }
320
+ for (const key of members) {
321
+ if (next.has(key))
322
+ continue;
323
+ const sep = key.indexOf("\0");
324
+ const sourceId = key.slice(0, sep);
325
+ const actorId = key.slice(sep + 1);
326
+ for (const trigger of sourceIds.get(sourceId) ?? []) {
327
+ if (trigger.on !== "exit")
328
+ continue;
329
+ events.push({
330
+ on: "exit",
331
+ action: trigger.action,
332
+ sourceId: trigger.sourceId,
333
+ sourceKind: trigger.sourceKind,
334
+ objectKind: trigger.objectKind,
335
+ actorId,
336
+ params: trigger.params,
337
+ });
338
+ }
339
+ }
340
+ const interactActors = new Set(input.interact ?? []);
341
+ if (interactActors.size > 0) {
342
+ for (const actor of input.actors) {
343
+ if (!interactActors.has(actor.id))
344
+ continue;
345
+ const point = actorPoint(actor);
346
+ for (const sourceTriggers of sourceIds.values()) {
347
+ const probe = sourceTriggers[0];
348
+ if (!insideSource(document, probe, point))
349
+ continue;
350
+ for (const trigger of sourceTriggers) {
351
+ if (trigger.on !== "interact")
352
+ continue;
353
+ events.push({
354
+ on: "interact",
355
+ action: trigger.action,
356
+ sourceId: trigger.sourceId,
357
+ sourceKind: trigger.sourceKind,
358
+ objectKind: trigger.objectKind,
359
+ actorId: actor.id,
360
+ params: trigger.params,
361
+ });
362
+ }
363
+ }
364
+ }
365
+ }
366
+ members = next;
367
+ emit(events);
368
+ return events;
369
+ },
370
+ };
371
+ }
372
+ const INITIAL_OUTCOME = { won: false, message: null, tone: "info", objective: null, revision: 0 };
373
+ /**
374
+ * Default runtime for the built-in {@link BUILTIN_TRIGGER_ACTIONS}: a small serializable outcome the
375
+ * HUD renders, with no engine-side UI. Pass {@link TriggerOutcomeStore.handlers} to
376
+ * {@link createAuthoredTriggerRuntime} and read {@link TriggerOutcomeStore.get} from the HUD via
377
+ * `useSyncExternalStore` — that is the whole zero-code "reach the zone to win" wiring.
378
+ *
379
+ * @capability authored-triggers headless win/announce/objective outcome for the built-in actions
380
+ */
381
+ export function createTriggerOutcome() {
382
+ let outcome = INITIAL_OUTCOME;
383
+ const listeners = new Set();
384
+ const commit = (next) => {
385
+ outcome = { ...next, revision: outcome.revision + 1 };
386
+ for (const listener of listeners)
387
+ listener();
388
+ };
389
+ const messageOf = (event, fallback) => {
390
+ const value = event.params.message;
391
+ return typeof value === "string" && value.length > 0 ? value : fallback;
392
+ };
393
+ const stringParam = (event, key) => {
394
+ const value = event.params[key];
395
+ return typeof value === "string" && value.length > 0 ? value : undefined;
396
+ };
397
+ return {
398
+ get: () => outcome,
399
+ subscribe(listener) {
400
+ listeners.add(listener);
401
+ return () => {
402
+ listeners.delete(listener);
403
+ };
404
+ },
405
+ handlers: {
406
+ announce: (event) => {
407
+ commit({ won: outcome.won, message: messageOf(event, "Entered zone"), tone: stringParam(event, "tone") ?? "info", objective: outcome.objective });
408
+ },
409
+ win: (event) => {
410
+ commit({ won: true, message: messageOf(event, "You win!"), tone: "good", objective: outcome.objective });
411
+ },
412
+ advance: (event) => {
413
+ commit({
414
+ won: outcome.won,
415
+ message: stringParam(event, "message") ?? outcome.message,
416
+ tone: outcome.tone,
417
+ objective: stringParam(event, "objective") ?? outcome.objective,
418
+ });
419
+ },
420
+ },
421
+ reset() {
422
+ outcome = INITIAL_OUTCOME;
423
+ for (const listener of listeners)
424
+ listener();
425
+ },
426
+ };
427
+ }
428
+ /**
429
+ * Build a meta patch that sets a single flat trigger (`on` + `action` + optional param fields) and
430
+ * clears a multi-trigger list if present. Used by the editor inspector.
431
+ * @internal
432
+ */
433
+ export function triggerMetaPatch(on, action, params = {}) {
434
+ if (on === "" || action.length === 0) {
435
+ return { [TRIGGER_ON_KEY]: undefined, [TRIGGER_ACTION_KEY]: undefined, [TRIGGER_LIST_KEY]: undefined };
436
+ }
437
+ return {
438
+ [TRIGGER_ON_KEY]: on,
439
+ [TRIGGER_ACTION_KEY]: action,
440
+ [TRIGGER_LIST_KEY]: undefined,
441
+ ...params,
442
+ };
443
+ }
444
+ /** Read the single flat trigger (`on`/`action`) from meta for the inspector, ignoring non-empty multi-lists. @internal */
445
+ export function readFlatTrigger(meta) {
446
+ if (meta === undefined)
447
+ return { on: "", action: "" };
448
+ const list = meta[TRIGGER_LIST_KEY];
449
+ if (Array.isArray(list) && list.length > 0)
450
+ return { on: "", action: "" };
451
+ const on = isTriggerEvent(meta[TRIGGER_ON_KEY]) ? meta[TRIGGER_ON_KEY] : "";
452
+ const action = typeof meta[TRIGGER_ACTION_KEY] === "string" ? meta[TRIGGER_ACTION_KEY] : "";
453
+ return { on, action };
454
+ }