@alife-sdk/core 0.1.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 (367) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/ai/DangerManager.d.ts +71 -0
  4. package/dist/ai/DangerManager.d.ts.map +1 -0
  5. package/dist/ai/DangerManager.js +176 -0
  6. package/dist/ai/DangerManager.js.map +1 -0
  7. package/dist/ai/GOAPAction.d.ts +45 -0
  8. package/dist/ai/GOAPAction.d.ts.map +1 -0
  9. package/dist/ai/GOAPAction.js +32 -0
  10. package/dist/ai/GOAPAction.js.map +1 -0
  11. package/dist/ai/GOAPPlanner.d.ts +80 -0
  12. package/dist/ai/GOAPPlanner.d.ts.map +1 -0
  13. package/dist/ai/GOAPPlanner.js +259 -0
  14. package/dist/ai/GOAPPlanner.js.map +1 -0
  15. package/dist/ai/IStateHandler.d.ts +8 -0
  16. package/dist/ai/IStateHandler.d.ts.map +1 -0
  17. package/dist/ai/IStateHandler.js +8 -0
  18. package/dist/ai/IStateHandler.js.map +1 -0
  19. package/dist/ai/MemorySystem.d.ts +94 -0
  20. package/dist/ai/MemorySystem.d.ts.map +1 -0
  21. package/dist/ai/MemorySystem.js +207 -0
  22. package/dist/ai/MemorySystem.js.map +1 -0
  23. package/dist/ai/StateMachine.d.ts +49 -0
  24. package/dist/ai/StateMachine.d.ts.map +1 -0
  25. package/dist/ai/StateMachine.js +83 -0
  26. package/dist/ai/StateMachine.js.map +1 -0
  27. package/dist/ai/WorldState.d.ts +48 -0
  28. package/dist/ai/WorldState.d.ts.map +1 -0
  29. package/dist/ai/WorldState.js +93 -0
  30. package/dist/ai/WorldState.js.map +1 -0
  31. package/dist/ai/index.d.ts +10 -0
  32. package/dist/ai/index.d.ts.map +1 -0
  33. package/dist/ai/index.js +8 -0
  34. package/dist/ai/index.js.map +1 -0
  35. package/dist/combat/DamageInstance.d.ts +26 -0
  36. package/dist/combat/DamageInstance.d.ts.map +1 -0
  37. package/dist/combat/DamageInstance.js +25 -0
  38. package/dist/combat/DamageInstance.js.map +1 -0
  39. package/dist/combat/MoraleStateMachine.d.ts +53 -0
  40. package/dist/combat/MoraleStateMachine.d.ts.map +1 -0
  41. package/dist/combat/MoraleStateMachine.js +84 -0
  42. package/dist/combat/MoraleStateMachine.js.map +1 -0
  43. package/dist/combat/index.d.ts +5 -0
  44. package/dist/combat/index.d.ts.map +1 -0
  45. package/dist/combat/index.js +3 -0
  46. package/dist/combat/index.js.map +1 -0
  47. package/dist/config/ALifeConfig.d.ts +131 -0
  48. package/dist/config/ALifeConfig.d.ts.map +1 -0
  49. package/dist/config/ALifeConfig.js +82 -0
  50. package/dist/config/ALifeConfig.js.map +1 -0
  51. package/dist/config/index.d.ts +3 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +2 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/core/ALifeKernel.d.ts +163 -0
  56. package/dist/core/ALifeKernel.d.ts.map +1 -0
  57. package/dist/core/ALifeKernel.js +542 -0
  58. package/dist/core/ALifeKernel.js.map +1 -0
  59. package/dist/core/Clock.d.ts +123 -0
  60. package/dist/core/Clock.d.ts.map +1 -0
  61. package/dist/core/Clock.js +228 -0
  62. package/dist/core/Clock.js.map +1 -0
  63. package/dist/core/DevToolsInspector.d.ts +53 -0
  64. package/dist/core/DevToolsInspector.d.ts.map +1 -0
  65. package/dist/core/DevToolsInspector.js +8 -0
  66. package/dist/core/DevToolsInspector.js.map +1 -0
  67. package/dist/core/Diagnostics.d.ts +64 -0
  68. package/dist/core/Diagnostics.d.ts.map +1 -0
  69. package/dist/core/Diagnostics.js +107 -0
  70. package/dist/core/Diagnostics.js.map +1 -0
  71. package/dist/core/ISerializable.d.ts +12 -0
  72. package/dist/core/ISerializable.d.ts.map +1 -0
  73. package/dist/core/ISerializable.js +2 -0
  74. package/dist/core/ISerializable.js.map +1 -0
  75. package/dist/core/PortRegistry.d.ts +57 -0
  76. package/dist/core/PortRegistry.d.ts.map +1 -0
  77. package/dist/core/PortRegistry.js +72 -0
  78. package/dist/core/PortRegistry.js.map +1 -0
  79. package/dist/core/PortTokens.d.ts +39 -0
  80. package/dist/core/PortTokens.d.ts.map +1 -0
  81. package/dist/core/PortTokens.js +39 -0
  82. package/dist/core/PortTokens.js.map +1 -0
  83. package/dist/core/SpatialGrid.d.ts +114 -0
  84. package/dist/core/SpatialGrid.d.ts.map +1 -0
  85. package/dist/core/SpatialGrid.js +258 -0
  86. package/dist/core/SpatialGrid.js.map +1 -0
  87. package/dist/core/Vec2.d.ts +34 -0
  88. package/dist/core/Vec2.d.ts.map +1 -0
  89. package/dist/core/Vec2.js +52 -0
  90. package/dist/core/Vec2.js.map +1 -0
  91. package/dist/core/math/CatmullRom.d.ts +20 -0
  92. package/dist/core/math/CatmullRom.d.ts.map +1 -0
  93. package/dist/core/math/CatmullRom.js +37 -0
  94. package/dist/core/math/CatmullRom.js.map +1 -0
  95. package/dist/core/math/index.d.ts +6 -0
  96. package/dist/core/math/index.d.ts.map +1 -0
  97. package/dist/core/math/index.js +5 -0
  98. package/dist/core/math/index.js.map +1 -0
  99. package/dist/core/math/intersects.d.ts +32 -0
  100. package/dist/core/math/intersects.d.ts.map +1 -0
  101. package/dist/core/math/intersects.js +92 -0
  102. package/dist/core/math/intersects.js.map +1 -0
  103. package/dist/core/math/utils.d.ts +5 -0
  104. package/dist/core/math/utils.d.ts.map +1 -0
  105. package/dist/core/math/utils.js +13 -0
  106. package/dist/core/math/utils.js.map +1 -0
  107. package/dist/entity/IComponent.d.ts +17 -0
  108. package/dist/entity/IComponent.d.ts.map +1 -0
  109. package/dist/entity/IComponent.js +2 -0
  110. package/dist/entity/IComponent.js.map +1 -0
  111. package/dist/entity/IEntity.d.ts +33 -0
  112. package/dist/entity/IEntity.d.ts.map +1 -0
  113. package/dist/entity/IEntity.js +2 -0
  114. package/dist/entity/IEntity.js.map +1 -0
  115. package/dist/entity/index.d.ts +3 -0
  116. package/dist/entity/index.d.ts.map +1 -0
  117. package/dist/entity/index.js +2 -0
  118. package/dist/entity/index.js.map +1 -0
  119. package/dist/events/ALifeEvents.d.ts +241 -0
  120. package/dist/events/ALifeEvents.d.ts.map +1 -0
  121. package/dist/events/ALifeEvents.js +53 -0
  122. package/dist/events/ALifeEvents.js.map +1 -0
  123. package/dist/events/EventBus.d.ts +52 -0
  124. package/dist/events/EventBus.d.ts.map +1 -0
  125. package/dist/events/EventBus.js +129 -0
  126. package/dist/events/EventBus.js.map +1 -0
  127. package/dist/events/index.d.ts +4 -0
  128. package/dist/events/index.d.ts.map +1 -0
  129. package/dist/events/index.js +4 -0
  130. package/dist/events/index.js.map +1 -0
  131. package/dist/faction/Faction.d.ts +53 -0
  132. package/dist/faction/Faction.d.ts.map +1 -0
  133. package/dist/faction/Faction.js +101 -0
  134. package/dist/faction/Faction.js.map +1 -0
  135. package/dist/faction/FactionBuilder.d.ts +32 -0
  136. package/dist/faction/FactionBuilder.d.ts.map +1 -0
  137. package/dist/faction/FactionBuilder.js +80 -0
  138. package/dist/faction/FactionBuilder.js.map +1 -0
  139. package/dist/faction/ImmunityProfile.d.ts +24 -0
  140. package/dist/faction/ImmunityProfile.d.ts.map +1 -0
  141. package/dist/faction/ImmunityProfile.js +43 -0
  142. package/dist/faction/ImmunityProfile.js.map +1 -0
  143. package/dist/faction/index.d.ts +6 -0
  144. package/dist/faction/index.d.ts.map +1 -0
  145. package/dist/faction/index.js +5 -0
  146. package/dist/faction/index.js.map +1 -0
  147. package/dist/index.d.ts +32 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +34 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logger/ILogEntry.d.ts +16 -0
  152. package/dist/logger/ILogEntry.d.ts.map +1 -0
  153. package/dist/logger/ILogEntry.js +2 -0
  154. package/dist/logger/ILogEntry.js.map +1 -0
  155. package/dist/logger/LogChannel.d.ts +27 -0
  156. package/dist/logger/LogChannel.d.ts.map +1 -0
  157. package/dist/logger/LogChannel.js +26 -0
  158. package/dist/logger/LogChannel.js.map +1 -0
  159. package/dist/logger/LogLevel.d.ts +10 -0
  160. package/dist/logger/LogLevel.d.ts.map +1 -0
  161. package/dist/logger/LogLevel.js +9 -0
  162. package/dist/logger/LogLevel.js.map +1 -0
  163. package/dist/logger/Logger.d.ts +56 -0
  164. package/dist/logger/Logger.d.ts.map +1 -0
  165. package/dist/logger/Logger.js +106 -0
  166. package/dist/logger/Logger.js.map +1 -0
  167. package/dist/logger/index.d.ts +8 -0
  168. package/dist/logger/index.d.ts.map +1 -0
  169. package/dist/logger/index.js +5 -0
  170. package/dist/logger/index.js.map +1 -0
  171. package/dist/movement/MonsterHome.d.ts +49 -0
  172. package/dist/movement/MonsterHome.d.ts.map +1 -0
  173. package/dist/movement/MonsterHome.js +75 -0
  174. package/dist/movement/MonsterHome.js.map +1 -0
  175. package/dist/movement/PatrolRoute.d.ts +99 -0
  176. package/dist/movement/PatrolRoute.d.ts.map +1 -0
  177. package/dist/movement/PatrolRoute.js +141 -0
  178. package/dist/movement/PatrolRoute.js.map +1 -0
  179. package/dist/movement/index.d.ts +5 -0
  180. package/dist/movement/index.d.ts.map +1 -0
  181. package/dist/movement/index.js +4 -0
  182. package/dist/movement/index.js.map +1 -0
  183. package/dist/navigation/LevelGraph.d.ts +78 -0
  184. package/dist/navigation/LevelGraph.d.ts.map +1 -0
  185. package/dist/navigation/LevelGraph.js +268 -0
  186. package/dist/navigation/LevelGraph.js.map +1 -0
  187. package/dist/navigation/NPCGraphMover.d.ts +87 -0
  188. package/dist/navigation/NPCGraphMover.d.ts.map +1 -0
  189. package/dist/navigation/NPCGraphMover.js +193 -0
  190. package/dist/navigation/NPCGraphMover.js.map +1 -0
  191. package/dist/navigation/index.d.ts +5 -0
  192. package/dist/navigation/index.d.ts.map +1 -0
  193. package/dist/navigation/index.js +4 -0
  194. package/dist/navigation/index.js.map +1 -0
  195. package/dist/plugins/AnomaliesPlugin.d.ts +26 -0
  196. package/dist/plugins/AnomaliesPlugin.d.ts.map +1 -0
  197. package/dist/plugins/AnomaliesPlugin.js +30 -0
  198. package/dist/plugins/AnomaliesPlugin.js.map +1 -0
  199. package/dist/plugins/CombatSchemaPlugin.d.ts +35 -0
  200. package/dist/plugins/CombatSchemaPlugin.d.ts.map +1 -0
  201. package/dist/plugins/CombatSchemaPlugin.js +44 -0
  202. package/dist/plugins/CombatSchemaPlugin.js.map +1 -0
  203. package/dist/plugins/FactionsPlugin.d.ts +26 -0
  204. package/dist/plugins/FactionsPlugin.d.ts.map +1 -0
  205. package/dist/plugins/FactionsPlugin.js +30 -0
  206. package/dist/plugins/FactionsPlugin.js.map +1 -0
  207. package/dist/plugins/IALifePlugin.d.ts +91 -0
  208. package/dist/plugins/IALifePlugin.d.ts.map +1 -0
  209. package/dist/plugins/IALifePlugin.js +2 -0
  210. package/dist/plugins/IALifePlugin.js.map +1 -0
  211. package/dist/plugins/MonstersPlugin.d.ts +26 -0
  212. package/dist/plugins/MonstersPlugin.d.ts.map +1 -0
  213. package/dist/plugins/MonstersPlugin.js +30 -0
  214. package/dist/plugins/MonstersPlugin.js.map +1 -0
  215. package/dist/plugins/NPCTypesPlugin.d.ts +26 -0
  216. package/dist/plugins/NPCTypesPlugin.d.ts.map +1 -0
  217. package/dist/plugins/NPCTypesPlugin.js +30 -0
  218. package/dist/plugins/NPCTypesPlugin.js.map +1 -0
  219. package/dist/plugins/PluginToken.d.ts +26 -0
  220. package/dist/plugins/PluginToken.d.ts.map +1 -0
  221. package/dist/plugins/PluginToken.js +22 -0
  222. package/dist/plugins/PluginToken.js.map +1 -0
  223. package/dist/plugins/SocialPlugin.d.ts +14 -0
  224. package/dist/plugins/SocialPlugin.d.ts.map +1 -0
  225. package/dist/plugins/SocialPlugin.js +16 -0
  226. package/dist/plugins/SocialPlugin.js.map +1 -0
  227. package/dist/plugins/SpawnPlugin.d.ts +15 -0
  228. package/dist/plugins/SpawnPlugin.d.ts.map +1 -0
  229. package/dist/plugins/SpawnPlugin.js +26 -0
  230. package/dist/plugins/SpawnPlugin.js.map +1 -0
  231. package/dist/plugins/SquadPlugin.d.ts +14 -0
  232. package/dist/plugins/SquadPlugin.d.ts.map +1 -0
  233. package/dist/plugins/SquadPlugin.js +16 -0
  234. package/dist/plugins/SquadPlugin.js.map +1 -0
  235. package/dist/plugins/SurgePlugin.d.ts +20 -0
  236. package/dist/plugins/SurgePlugin.d.ts.map +1 -0
  237. package/dist/plugins/SurgePlugin.js +22 -0
  238. package/dist/plugins/SurgePlugin.js.map +1 -0
  239. package/dist/plugins/TradePlugin.d.ts +16 -0
  240. package/dist/plugins/TradePlugin.d.ts.map +1 -0
  241. package/dist/plugins/TradePlugin.js +18 -0
  242. package/dist/plugins/TradePlugin.js.map +1 -0
  243. package/dist/plugins/index.d.ts +11 -0
  244. package/dist/plugins/index.d.ts.map +1 -0
  245. package/dist/plugins/index.js +10 -0
  246. package/dist/plugins/index.js.map +1 -0
  247. package/dist/plugins/pluginNames.d.ts +37 -0
  248. package/dist/plugins/pluginNames.d.ts.map +1 -0
  249. package/dist/plugins/pluginNames.js +28 -0
  250. package/dist/plugins/pluginNames.js.map +1 -0
  251. package/dist/plugins/presets.d.ts +31 -0
  252. package/dist/plugins/presets.d.ts.map +1 -0
  253. package/dist/plugins/presets.js +50 -0
  254. package/dist/plugins/presets.js.map +1 -0
  255. package/dist/ports/IDataLoader.d.ts +38 -0
  256. package/dist/ports/IDataLoader.d.ts.map +1 -0
  257. package/dist/ports/IDataLoader.js +12 -0
  258. package/dist/ports/IDataLoader.js.map +1 -0
  259. package/dist/ports/IEntityAdapter.d.ts +73 -0
  260. package/dist/ports/IEntityAdapter.d.ts.map +1 -0
  261. package/dist/ports/IEntityAdapter.js +36 -0
  262. package/dist/ports/IEntityAdapter.js.map +1 -0
  263. package/dist/ports/IEntityFactory.d.ts +66 -0
  264. package/dist/ports/IEntityFactory.d.ts.map +1 -0
  265. package/dist/ports/IEntityFactory.js +21 -0
  266. package/dist/ports/IEntityFactory.js.map +1 -0
  267. package/dist/ports/ILogger.d.ts +29 -0
  268. package/dist/ports/ILogger.d.ts.map +1 -0
  269. package/dist/ports/ILogger.js +2 -0
  270. package/dist/ports/ILogger.js.map +1 -0
  271. package/dist/ports/IPlayerPositionProvider.d.ts +20 -0
  272. package/dist/ports/IPlayerPositionProvider.d.ts.map +1 -0
  273. package/dist/ports/IPlayerPositionProvider.js +11 -0
  274. package/dist/ports/IPlayerPositionProvider.js.map +1 -0
  275. package/dist/ports/IRandom.d.ts +25 -0
  276. package/dist/ports/IRandom.d.ts.map +1 -0
  277. package/dist/ports/IRandom.js +39 -0
  278. package/dist/ports/IRandom.js.map +1 -0
  279. package/dist/ports/IRuntimeClock.d.ts +18 -0
  280. package/dist/ports/IRuntimeClock.d.ts.map +1 -0
  281. package/dist/ports/IRuntimeClock.js +2 -0
  282. package/dist/ports/IRuntimeClock.js.map +1 -0
  283. package/dist/ports/index.d.ts +12 -0
  284. package/dist/ports/index.d.ts.map +1 -0
  285. package/dist/ports/index.js +5 -0
  286. package/dist/ports/index.js.map +1 -0
  287. package/dist/registry/AIStateRegistry.d.ts +42 -0
  288. package/dist/registry/AIStateRegistry.d.ts.map +1 -0
  289. package/dist/registry/AIStateRegistry.js +27 -0
  290. package/dist/registry/AIStateRegistry.js.map +1 -0
  291. package/dist/registry/AnomalyTypeRegistry.d.ts +21 -0
  292. package/dist/registry/AnomalyTypeRegistry.d.ts.map +1 -0
  293. package/dist/registry/AnomalyTypeRegistry.js +20 -0
  294. package/dist/registry/AnomalyTypeRegistry.js.map +1 -0
  295. package/dist/registry/BehaviorSchemeRegistry.d.ts +21 -0
  296. package/dist/registry/BehaviorSchemeRegistry.d.ts.map +1 -0
  297. package/dist/registry/BehaviorSchemeRegistry.js +24 -0
  298. package/dist/registry/BehaviorSchemeRegistry.js.map +1 -0
  299. package/dist/registry/DamageTypeRegistry.d.ts +17 -0
  300. package/dist/registry/DamageTypeRegistry.d.ts.map +1 -0
  301. package/dist/registry/DamageTypeRegistry.js +24 -0
  302. package/dist/registry/DamageTypeRegistry.js.map +1 -0
  303. package/dist/registry/FactionRegistry.d.ts +41 -0
  304. package/dist/registry/FactionRegistry.d.ts.map +1 -0
  305. package/dist/registry/FactionRegistry.js +29 -0
  306. package/dist/registry/FactionRegistry.js.map +1 -0
  307. package/dist/registry/MonsterRegistry.d.ts +44 -0
  308. package/dist/registry/MonsterRegistry.d.ts.map +1 -0
  309. package/dist/registry/MonsterRegistry.js +43 -0
  310. package/dist/registry/MonsterRegistry.js.map +1 -0
  311. package/dist/registry/NPCTypeRegistry.d.ts +34 -0
  312. package/dist/registry/NPCTypeRegistry.d.ts.map +1 -0
  313. package/dist/registry/NPCTypeRegistry.js +20 -0
  314. package/dist/registry/NPCTypeRegistry.js.map +1 -0
  315. package/dist/registry/Registry.d.ts +44 -0
  316. package/dist/registry/Registry.d.ts.map +1 -0
  317. package/dist/registry/Registry.js +80 -0
  318. package/dist/registry/Registry.js.map +1 -0
  319. package/dist/registry/TaskTypeRegistry.d.ts +17 -0
  320. package/dist/registry/TaskTypeRegistry.d.ts.map +1 -0
  321. package/dist/registry/TaskTypeRegistry.js +16 -0
  322. package/dist/registry/TaskTypeRegistry.js.map +1 -0
  323. package/dist/registry/index.d.ts +19 -0
  324. package/dist/registry/index.d.ts.map +1 -0
  325. package/dist/registry/index.js +11 -0
  326. package/dist/registry/index.js.map +1 -0
  327. package/dist/schema/index.d.ts +3 -0
  328. package/dist/schema/index.d.ts.map +1 -0
  329. package/dist/schema/index.js +3 -0
  330. package/dist/schema/index.js.map +1 -0
  331. package/dist/schema/validators.d.ts +32 -0
  332. package/dist/schema/validators.d.ts.map +1 -0
  333. package/dist/schema/validators.js +249 -0
  334. package/dist/schema/validators.js.map +1 -0
  335. package/dist/spawn/SpawnRegistry.d.ts +48 -0
  336. package/dist/spawn/SpawnRegistry.d.ts.map +1 -0
  337. package/dist/spawn/SpawnRegistry.js +141 -0
  338. package/dist/spawn/SpawnRegistry.js.map +1 -0
  339. package/dist/spawn/index.d.ts +3 -0
  340. package/dist/spawn/index.d.ts.map +1 -0
  341. package/dist/spawn/index.js +3 -0
  342. package/dist/spawn/index.js.map +1 -0
  343. package/dist/terrain/SmartTerrain.d.ts +119 -0
  344. package/dist/terrain/SmartTerrain.d.ts.map +1 -0
  345. package/dist/terrain/SmartTerrain.js +124 -0
  346. package/dist/terrain/SmartTerrain.js.map +1 -0
  347. package/dist/terrain/TerrainBuilder.d.ts +44 -0
  348. package/dist/terrain/TerrainBuilder.d.ts.map +1 -0
  349. package/dist/terrain/TerrainBuilder.js +112 -0
  350. package/dist/terrain/TerrainBuilder.js.map +1 -0
  351. package/dist/terrain/Zone.d.ts +25 -0
  352. package/dist/terrain/Zone.d.ts.map +1 -0
  353. package/dist/terrain/Zone.js +29 -0
  354. package/dist/terrain/Zone.js.map +1 -0
  355. package/dist/terrain/index.d.ts +6 -0
  356. package/dist/terrain/index.d.ts.map +1 -0
  357. package/dist/terrain/index.js +5 -0
  358. package/dist/terrain/index.js.map +1 -0
  359. package/dist/time/TimeManager.d.ts +21 -0
  360. package/dist/time/TimeManager.d.ts.map +1 -0
  361. package/dist/time/TimeManager.js +41 -0
  362. package/dist/time/TimeManager.js.map +1 -0
  363. package/dist/time/index.d.ts +3 -0
  364. package/dist/time/index.d.ts.map +1 -0
  365. package/dist/time/index.js +2 -0
  366. package/dist/time/index.js.map +1 -0
  367. package/package.json +119 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * A*-based GOAP (Goal-Oriented Action Planning) solver.
3
+ *
4
+ * The planner treats the problem as a graph search:
5
+ * - Each NODE is a world state reachable by applying a sequence of actions.
6
+ * - Each EDGE is a GOAPAction whose preconditions are satisfied by the
7
+ * node's world state and whose effects advance toward the goal.
8
+ * - The cost of a path is the sum of action cost values along it.
9
+ * - The heuristic is state.distanceTo(goal) -- the count of unsatisfied
10
+ * goal properties (admissible, since each action satisfies at most one).
11
+ *
12
+ * Complexity:
13
+ * Time: O(b^d) where b = |availableActions|, d = plan depth (<= maxDepth)
14
+ * Space: O(b^d) for the open/closed sets, bounded by maxDepth
15
+ */
16
+ import type { GOAPAction } from './GOAPAction';
17
+ import type { WorldState } from './WorldState';
18
+ export declare class GOAPPlanner {
19
+ private readonly actions;
20
+ private readonly defaultMaxDepth;
21
+ private _sortedKeys;
22
+ private readonly _closed;
23
+ private readonly _actionKeys;
24
+ private readonly _open;
25
+ constructor(defaultMaxDepth?: number);
26
+ /** Register an action that the planner can use when building plans. */
27
+ registerAction(action: GOAPAction): void;
28
+ /**
29
+ * Find the optimal action sequence from the current state to the goal.
30
+ *
31
+ * @param currentState - Live world state snapshot for the agent.
32
+ * @param goal - Desired world state the agent wants to achieve.
33
+ * @param maxDepth - Maximum plan depth (default 10).
34
+ * @returns Ordered action list (index 0 = first), or null if no plan found.
35
+ */
36
+ plan(currentState: WorldState, goal: WorldState, maxDepth?: number): GOAPAction[] | null;
37
+ /** Walk from goal node to root, collecting actions in execution order. */
38
+ private reconstructPlan;
39
+ /** Push a node onto the min-heap. */
40
+ private _heapPush;
41
+ /** Pop the node with the smallest f value from the min-heap. */
42
+ private _heapPop;
43
+ /** Restore heap property upward from index i. */
44
+ private _heapSiftUp;
45
+ /** Restore heap property downward from index i. */
46
+ private _heapSiftDown;
47
+ /**
48
+ * Create a compact numeric fingerprint of ALL world-state values.
49
+ *
50
+ * For boolean-only states (the common case with DEFAULT_WORLD_PROPERTY_BUILDERS),
51
+ * encodes as a 31-bit bitmask — zero allocations. Result is always non-negative
52
+ * (0 to 2^31-1). Falls back to djb2 hash when:
53
+ * - key universe exceeds 31 keys (C2: avoids sign-bit corruption at i=31)
54
+ * - an explicit `false` value is present (C1: distinguishes false from absent)
55
+ * - a non-boolean value is present
56
+ * djb2 results are tagged with 0x80000000, making them always negative and
57
+ * thus disjoint from the bitmask domain (C3: no cross-domain collisions).
58
+ */
59
+ private fingerprint;
60
+ /**
61
+ * Build the sorted key universe from current state, goal, and cached
62
+ * action keys. Ensures the bitmask fingerprint covers every key that
63
+ * can appear during planning.
64
+ *
65
+ * P21: Action keys are accumulated incrementally in registerAction(),
66
+ * so this method only needs to union them with state/goal keys.
67
+ */
68
+ private _buildKeyUniverse;
69
+ /**
70
+ * djb2 hash fallback for WorldStates containing non-boolean values,
71
+ * explicit `false` keys, or key universes larger than 31.
72
+ *
73
+ * C3: Result is always tagged with 0x80000000, making it a negative
74
+ * int32. This keeps the djb2 domain (negative) disjoint from the
75
+ * bitmask domain (non-negative, 0 to 2^30), preventing cross-domain
76
+ * fingerprint collisions.
77
+ */
78
+ private fingerprintHash;
79
+ }
80
+ //# sourceMappingURL=GOAPPlanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GOAPPlanner.d.ts","sourceRoot":"","sources":["../../src/ai/GOAPPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAiC/C,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAG7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAGjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAE5B,eAAe,GAAE,MAA0B;IAIvD,uEAAuE;IACvE,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAQxC;;;;;;;OAOG;IACH,IAAI,CACF,YAAY,EAAE,UAAU,EACxB,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,MAA6B,GACtC,UAAU,EAAE,GAAG,IAAI;IA+EtB,0EAA0E;IAC1E,OAAO,CAAC,eAAe;IAiBvB,qCAAqC;IACrC,OAAO,CAAC,SAAS;IAKjB,gEAAgE;IAChE,OAAO,CAAC,QAAQ;IAchB,iDAAiD;IACjD,OAAO,CAAC,WAAW;IAYnB,mDAAmD;IACnD,OAAO,CAAC,aAAa;IAiBrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,WAAW;IA2BnB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;CAYxB"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * A*-based GOAP (Goal-Oriented Action Planning) solver.
3
+ *
4
+ * The planner treats the problem as a graph search:
5
+ * - Each NODE is a world state reachable by applying a sequence of actions.
6
+ * - Each EDGE is a GOAPAction whose preconditions are satisfied by the
7
+ * node's world state and whose effects advance toward the goal.
8
+ * - The cost of a path is the sum of action cost values along it.
9
+ * - The heuristic is state.distanceTo(goal) -- the count of unsatisfied
10
+ * goal properties (admissible, since each action satisfies at most one).
11
+ *
12
+ * Complexity:
13
+ * Time: O(b^d) where b = |availableActions|, d = plan depth (<= maxDepth)
14
+ * Space: O(b^d) for the open/closed sets, bounded by maxDepth
15
+ */
16
+ // ---------------------------------------------------------------------------
17
+ // Constants
18
+ // ---------------------------------------------------------------------------
19
+ const DEFAULT_MAX_DEPTH = 10;
20
+ // ---------------------------------------------------------------------------
21
+ // GOAPPlanner
22
+ // ---------------------------------------------------------------------------
23
+ export class GOAPPlanner {
24
+ constructor(defaultMaxDepth = DEFAULT_MAX_DEPTH) {
25
+ this.actions = [];
26
+ // Scratch fields — reused across plan() calls
27
+ this._sortedKeys = null;
28
+ this._closed = new Set();
29
+ // P21: Incrementally accumulated keys from all registered actions.
30
+ this._actionKeys = new Set();
31
+ // P19: Binary min-heap storage for the open set (reused across plan() calls).
32
+ this._open = [];
33
+ this.defaultMaxDepth = defaultMaxDepth;
34
+ }
35
+ /** Register an action that the planner can use when building plans. */
36
+ registerAction(action) {
37
+ this.actions.push(action);
38
+ // P21: Cache action keys incrementally.
39
+ for (const k of action.getPreconditions().keys())
40
+ this._actionKeys.add(k);
41
+ for (const k of action.getEffects().keys())
42
+ this._actionKeys.add(k);
43
+ }
44
+ /**
45
+ * Find the optimal action sequence from the current state to the goal.
46
+ *
47
+ * @param currentState - Live world state snapshot for the agent.
48
+ * @param goal - Desired world state the agent wants to achieve.
49
+ * @param maxDepth - Maximum plan depth (default 10).
50
+ * @returns Ordered action list (index 0 = first), or null if no plan found.
51
+ */
52
+ plan(currentState, goal, maxDepth = this.defaultMaxDepth) {
53
+ const root = {
54
+ state: currentState.clone(),
55
+ action: null,
56
+ parent: null,
57
+ g: 0,
58
+ h: currentState.distanceTo(goal),
59
+ f: currentState.distanceTo(goal),
60
+ depth: 0,
61
+ };
62
+ // P19: Reuse heap storage, clear from previous plan() call.
63
+ const open = this._open;
64
+ open.length = 0;
65
+ this._heapPush(root);
66
+ // Build sorted key universe from current state + goal + cached action keys.
67
+ // This ensures the bitmask covers ALL keys that can appear during planning.
68
+ this._buildKeyUniverse(currentState, goal);
69
+ // Closed set: bitmask fingerprints to prevent re-expansion.
70
+ this._closed.clear();
71
+ while (open.length > 0) {
72
+ const current = this._heapPop();
73
+ // Goal check.
74
+ if (current.state.satisfies(goal)) {
75
+ return this.reconstructPlan(current);
76
+ }
77
+ // P20: Depth limit using stored depth.
78
+ if (current.depth >= maxDepth) {
79
+ continue;
80
+ }
81
+ // Mark visited.
82
+ const stateKey = this.fingerprint(current.state);
83
+ if (this._closed.has(stateKey)) {
84
+ continue;
85
+ }
86
+ this._closed.add(stateKey);
87
+ // Expand: try each action whose preconditions are met.
88
+ for (const action of this.actions) {
89
+ if (!current.state.satisfies(action.getPreconditions())) {
90
+ continue;
91
+ }
92
+ // Apply action effects using WorldState's public API.
93
+ const nextState = current.state.applyEffects(action.getEffects());
94
+ const g = current.g + action.cost;
95
+ const h = nextState.distanceTo(goal);
96
+ const successor = {
97
+ state: nextState,
98
+ action,
99
+ parent: current,
100
+ g,
101
+ h,
102
+ f: g + h,
103
+ depth: current.depth + 1,
104
+ };
105
+ const successorKey = this.fingerprint(nextState);
106
+ if (!this._closed.has(successorKey)) {
107
+ this._heapPush(successor);
108
+ }
109
+ }
110
+ }
111
+ // No plan found.
112
+ return null;
113
+ }
114
+ // -----------------------------------------------------------------------
115
+ // Private helpers
116
+ // -----------------------------------------------------------------------
117
+ /** Walk from goal node to root, collecting actions in execution order. */
118
+ reconstructPlan(goalNode) {
119
+ const plan = [];
120
+ let node = goalNode;
121
+ while (node !== null && node.action !== null) {
122
+ plan.push(node.action);
123
+ node = node.parent;
124
+ }
125
+ plan.reverse();
126
+ return plan;
127
+ }
128
+ // -----------------------------------------------------------------------
129
+ // P19: Binary min-heap (keyed on f)
130
+ // -----------------------------------------------------------------------
131
+ /** Push a node onto the min-heap. */
132
+ _heapPush(node) {
133
+ this._open.push(node);
134
+ this._heapSiftUp(this._open.length - 1);
135
+ }
136
+ /** Pop the node with the smallest f value from the min-heap. */
137
+ _heapPop() {
138
+ const heap = this._open;
139
+ if (heap.length === 0) {
140
+ throw new Error('GOAPPlanner._heapPop: heap is empty');
141
+ }
142
+ const top = heap[0];
143
+ const last = heap.pop();
144
+ if (heap.length > 0) {
145
+ heap[0] = last;
146
+ this._heapSiftDown(0);
147
+ }
148
+ return top;
149
+ }
150
+ /** Restore heap property upward from index i. */
151
+ _heapSiftUp(i) {
152
+ const heap = this._open;
153
+ const node = heap[i];
154
+ while (i > 0) {
155
+ const parentIdx = (i - 1) >>> 1;
156
+ if (heap[parentIdx].f <= node.f)
157
+ break;
158
+ heap[i] = heap[parentIdx];
159
+ i = parentIdx;
160
+ }
161
+ heap[i] = node;
162
+ }
163
+ /** Restore heap property downward from index i. */
164
+ _heapSiftDown(i) {
165
+ const heap = this._open;
166
+ const len = heap.length;
167
+ const node = heap[i];
168
+ while (true) {
169
+ let smallest = i;
170
+ const left = 2 * i + 1;
171
+ const right = 2 * i + 2;
172
+ if (left < len && heap[left].f < heap[smallest].f)
173
+ smallest = left;
174
+ if (right < len && heap[right].f < heap[smallest].f)
175
+ smallest = right;
176
+ if (smallest === i)
177
+ break;
178
+ heap[i] = heap[smallest];
179
+ i = smallest;
180
+ }
181
+ heap[i] = node;
182
+ }
183
+ /**
184
+ * Create a compact numeric fingerprint of ALL world-state values.
185
+ *
186
+ * For boolean-only states (the common case with DEFAULT_WORLD_PROPERTY_BUILDERS),
187
+ * encodes as a 31-bit bitmask — zero allocations. Result is always non-negative
188
+ * (0 to 2^31-1). Falls back to djb2 hash when:
189
+ * - key universe exceeds 31 keys (C2: avoids sign-bit corruption at i=31)
190
+ * - an explicit `false` value is present (C1: distinguishes false from absent)
191
+ * - a non-boolean value is present
192
+ * djb2 results are tagged with 0x80000000, making them always negative and
193
+ * thus disjoint from the bitmask domain (C3: no cross-domain collisions).
194
+ */
195
+ fingerprint(state) {
196
+ const keys = this._sortedKeys;
197
+ // C2: fall through to hash when key universe exceeds safe bitmask capacity.
198
+ // Using 31 bits avoids sign-bit issues with `1 << 31` in 32-bit signed int.
199
+ if (keys.length >= 31) {
200
+ return this.fingerprintHash(state);
201
+ }
202
+ let mask = 0;
203
+ for (let i = 0; i < keys.length; i++) {
204
+ const val = state.get(keys[i]);
205
+ if (val === true) {
206
+ mask |= (1 << i);
207
+ }
208
+ else if (val === false) {
209
+ // C1: explicit false vs absent key (undefined) are semantically different
210
+ // in WorldState.satisfies() — must use hash to distinguish them.
211
+ return this.fingerprintHash(state);
212
+ }
213
+ else if (val !== undefined) {
214
+ // Non-boolean value — use hash.
215
+ return this.fingerprintHash(state);
216
+ }
217
+ // undefined (absent key): bit stays 0.
218
+ }
219
+ return mask; // Non-negative: 0 to 2^30
220
+ }
221
+ /**
222
+ * Build the sorted key universe from current state, goal, and cached
223
+ * action keys. Ensures the bitmask fingerprint covers every key that
224
+ * can appear during planning.
225
+ *
226
+ * P21: Action keys are accumulated incrementally in registerAction(),
227
+ * so this method only needs to union them with state/goal keys.
228
+ */
229
+ _buildKeyUniverse(currentState, goal) {
230
+ const keySet = new Set(this._actionKeys);
231
+ for (const k of currentState.keys())
232
+ keySet.add(k);
233
+ for (const k of goal.keys())
234
+ keySet.add(k);
235
+ this._sortedKeys = [...keySet].sort();
236
+ }
237
+ /**
238
+ * djb2 hash fallback for WorldStates containing non-boolean values,
239
+ * explicit `false` keys, or key universes larger than 31.
240
+ *
241
+ * C3: Result is always tagged with 0x80000000, making it a negative
242
+ * int32. This keeps the djb2 domain (negative) disjoint from the
243
+ * bitmask domain (non-negative, 0 to 2^30), preventing cross-domain
244
+ * fingerprint collisions.
245
+ */
246
+ fingerprintHash(state) {
247
+ let h = 5381;
248
+ for (const key of this._sortedKeys) {
249
+ const val = state.get(key);
250
+ const str = `${key}:${val}`;
251
+ for (let i = 0; i < str.length; i++) {
252
+ h = ((h << 5) + h) + str.charCodeAt(i);
253
+ }
254
+ }
255
+ // Tag with high bit: result is always negative (int32), disjoint from bitmask.
256
+ return h | 0x80000000;
257
+ }
258
+ }
259
+ //# sourceMappingURL=GOAPPlanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GOAPPlanner.js","sourceRoot":"","sources":["../../src/ai/GOAPPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0BH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,OAAO,WAAW;IActB,YAAY,kBAA0B,iBAAiB;QAbtC,YAAO,GAAiB,EAAE,CAAC;QAG5C,8CAA8C;QACtC,gBAAW,GAAoB,IAAI,CAAC;QAC3B,YAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAE7C,mEAAmE;QAClD,gBAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QAEjD,8EAA8E;QAC7D,UAAK,GAAe,EAAE,CAAC;QAGtC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,uEAAuE;IACvE,cAAc,CAAC,MAAkB;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,wCAAwC;QACxC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CACF,YAAwB,EACxB,IAAgB,EAChB,WAAmB,IAAI,CAAC,eAAe;QAEvC,MAAM,IAAI,GAAa;YACrB,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE;YAC3B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;YAChC,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;YAChC,KAAK,EAAE,CAAC;SACT,CAAC;QAEF,4DAA4D;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAErB,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAE3C,4DAA4D;QAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAErB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhC,cAAc;YACd,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,uCAAuC;YACvC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,gBAAgB;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE3B,uDAAuD;YACvD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;oBACxD,SAAS;gBACX,CAAC;gBAED,sDAAsD;gBACtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;gBAClE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;gBAClC,MAAM,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAErC,MAAM,SAAS,GAAa;oBAC1B,KAAK,EAAE,SAAS;oBAChB,MAAM;oBACN,MAAM,EAAE,OAAO;oBACf,CAAC;oBACD,CAAC;oBACD,CAAC,EAAE,CAAC,GAAG,CAAC;oBACR,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC;iBACzB,CAAC;gBAEF,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAC1E,kBAAkB;IAClB,0EAA0E;IAE1E,0EAA0E;IAClE,eAAe,CAAC,QAAkB;QACxC,MAAM,IAAI,GAAiB,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAoB,QAAQ,CAAC;QAErC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAC1E,oCAAoC;IACpC,0EAA0E;IAE1E,qCAAqC;IAC7B,SAAS,CAAC,IAAc;QAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,gEAAgE;IACxD,QAAQ;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAG,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iDAAiD;IACzC,WAAW,CAAC,CAAS;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBAAE,MAAM;YACvC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,GAAG,SAAS,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,mDAAmD;IAC3C,aAAa,CAAC,CAAS;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,QAAQ,GAAG,IAAI,CAAC;YACnE,IAAI,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACtE,IAAI,QAAQ,KAAK,CAAC;gBAAE,MAAM;YAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC,GAAG,QAAQ,CAAC;QACf,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;OAWG;IACK,WAAW,CAAC,KAAiB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAY,CAAC;QAE/B,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBACzB,0EAA0E;gBAC1E,iEAAiE;gBACjE,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,gCAAgC;gBAChC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,uCAAuC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,0BAA0B;IACzC,CAAC;IAED;;;;;;;OAOG;IACK,iBAAiB,CAAC,YAAwB,EAAE,IAAgB;QAClE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACK,eAAe,CAAC,KAAiB;QACvC,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAY,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,+EAA+E;QAC/E,OAAO,CAAC,GAAG,UAAU,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Convenience re-exports from AIStateRegistry for clean import paths.
3
+ *
4
+ * Consumers can import directly from this module:
5
+ * import type { IStateHandler } from '../ai/IStateHandler';
6
+ */
7
+ export type { IStateHandler, ITransitionCondition, IAIStateDefinition, } from '../registry/AIStateRegistry';
8
+ //# sourceMappingURL=IStateHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IStateHandler.d.ts","sourceRoot":"","sources":["../../src/ai/IStateHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Convenience re-exports from AIStateRegistry for clean import paths.
3
+ *
4
+ * Consumers can import directly from this module:
5
+ * import type { IStateHandler } from '../ai/IStateHandler';
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=IStateHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IStateHandler.js","sourceRoot":"","sources":["../../src/ai/IStateHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Multi-channel memory bank with confidence decay.
3
+ *
4
+ * MemoryBank provides per-NPC episodic memory storage. Memories are
5
+ * categorised by channel (visual, sound, hit, danger) and decay over time.
6
+ * Records below the minimum confidence threshold are pruned automatically
7
+ * during update().
8
+ *
9
+ * Storage layout: Map keyed by sourceId for O(1) read/write per entry.
10
+ * A single entity may have at most one record per sourceId; newer
11
+ * observations overwrite older ones.
12
+ */
13
+ import type { Vec2 } from '../core/Vec2';
14
+ export declare const MemoryChannel: {
15
+ readonly VISUAL: "visual";
16
+ readonly SOUND: "sound";
17
+ readonly HIT: "hit";
18
+ readonly DANGER: "danger";
19
+ };
20
+ export type MemoryChannel = (typeof MemoryChannel)[keyof typeof MemoryChannel] | (string & {});
21
+ export interface MemoryRecord {
22
+ readonly sourceId: string;
23
+ readonly channel: MemoryChannel;
24
+ readonly position: Vec2;
25
+ /** Confidence level in [0, 1]. Decays over time. */
26
+ readonly confidence: number;
27
+ /** Timestamp (accumulated delta or game time) when record was last updated. */
28
+ readonly timestamp: number;
29
+ }
30
+ /** Configuration for MemoryBank construction. */
31
+ export interface IMemoryBankConfig {
32
+ /** Time provider for timestamps. Required for deterministic behavior. */
33
+ readonly timeFn: () => number;
34
+ /** Maximum memory entries kept per NPC. Default: 32. */
35
+ readonly maxRecords?: number;
36
+ /** Confidence decay rate per second. Default: 0.1. */
37
+ readonly decayRate?: number;
38
+ /** Confidence below which a record is pruned. Default: 0.05. */
39
+ readonly minConfidence?: number;
40
+ /** Per-channel decay rate overrides. Keys are MemoryChannel values. Falls back to global decayRate when a channel is not present. */
41
+ readonly channelDecayRates?: Readonly<Record<string, number>>;
42
+ }
43
+ export interface IMemoryInput {
44
+ readonly sourceId: string;
45
+ readonly channel: MemoryChannel;
46
+ readonly position: Vec2;
47
+ readonly confidence?: number;
48
+ }
49
+ export declare class MemoryBank {
50
+ private readonly records;
51
+ private readonly byChannel;
52
+ private readonly maxRecords;
53
+ private readonly decayRate;
54
+ private readonly minConfidence;
55
+ private readonly timeFn;
56
+ private readonly channelDecayRates?;
57
+ private readonly _toDelete;
58
+ constructor(config: IMemoryBankConfig);
59
+ /**
60
+ * Add or update a memory record.
61
+ *
62
+ * If a record for this sourceId already exists, its position and timestamp
63
+ * are updated and confidence is reset to the provided value (default 1.0).
64
+ * If the bank is at capacity, the lowest-confidence record is evicted.
65
+ */
66
+ remember(input: IMemoryInput): void;
67
+ /** Get memory of a specific source. */
68
+ recall(sourceId: string): MemoryRecord | undefined;
69
+ /** Get all records on a specific channel. */
70
+ getByChannel(channel: MemoryChannel): MemoryRecord[];
71
+ /** Get the highest-confidence record, or undefined if the bank is empty. */
72
+ getMostConfident(): MemoryRecord | undefined;
73
+ /**
74
+ * Decay all records and remove those below the minimum confidence threshold.
75
+ *
76
+ * @param deltaSec - Seconds elapsed since the last update.
77
+ * @param minConfidence - Records below this threshold are pruned.
78
+ */
79
+ update(deltaSec: number): void;
80
+ /** Forget a specific source. */
81
+ forget(sourceId: string): void;
82
+ /** Clear all memories. */
83
+ clear(): void;
84
+ get size(): number;
85
+ serialize(): MemoryRecord[];
86
+ restore(records: MemoryRecord[]): void;
87
+ /** Evict the record with the lowest confidence to make room. */
88
+ private evictLowestConfidence;
89
+ /** Add a record to the byChannel secondary index. */
90
+ private addToChannelIndex;
91
+ /** Remove a record from the byChannel secondary index. */
92
+ private removeFromChannelIndex;
93
+ }
94
+ //# sourceMappingURL=MemorySystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorySystem.d.ts","sourceRoot":"","sources":["../../src/ai/MemorySystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAMzC,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAM/F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAcD,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qIAAqI;IACrI,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/D;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAmC;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAE9B,MAAM,EAAE,iBAAiB;IAYrC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAoCnC,uCAAuC;IACvC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIlD,6CAA6C;IAC7C,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,EAAE;IAMpD,4EAA4E;IAC5E,gBAAgB,IAAI,YAAY,GAAG,SAAS;IAgB5C;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsB9B,gCAAgC;IAChC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ9B,0BAA0B;IAC1B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAMD,SAAS,IAAI,YAAY,EAAE;IAU3B,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IActC,gEAAgE;IAChE,OAAO,CAAC,qBAAqB;IAoB7B,qDAAqD;IACrD,OAAO,CAAC,iBAAiB;IASzB,0DAA0D;IAC1D,OAAO,CAAC,sBAAsB;CAM/B"}