@reicek/neataptic-ts 0.1.21 → 0.1.23

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 (361) hide show
  1. package/.github/agents/boundary-mapper.agent.md +31 -0
  2. package/.github/agents/docs-scout.agent.md +29 -0
  3. package/.github/agents/plan-scout.agent.md +31 -0
  4. package/.github/agents/solid-split.agent.md +143 -0
  5. package/.github/copilot-instructions.md +119 -0
  6. package/.github/skills/solid-split-playbook/SKILL.md +220 -0
  7. package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
  8. package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
  9. package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
  10. package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
  11. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
  12. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
  13. package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
  14. package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
  15. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
  16. package/package.json +7 -3
  17. package/plans/ES2023 migration +13 -8
  18. package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
  19. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
  20. package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
  21. package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
  22. package/plans/Memory_Optimization.md +3 -3
  23. package/plans/README.md +63 -0
  24. package/plans/Roadmap.md +15 -3
  25. package/plans/asciiMaze_SOLID_split.done.md +130 -0
  26. package/plans/flappy_bird_SOLID_split.done.md +67 -0
  27. package/scripts/analyze-trace.ts +590 -0
  28. package/scripts/assets/theme.css +221 -34
  29. package/scripts/copy-examples.mjs +9 -5
  30. package/scripts/export-onnx.mjs +3 -3
  31. package/scripts/generate-bench-tables.mjs +10 -10
  32. package/scripts/generate-bench-tables.ts +10 -10
  33. package/scripts/generate-docs.ts +1415 -449
  34. package/scripts/render-docs-html.ts +15 -8
  35. package/src/README.md +127 -222
  36. package/src/architecture/README.md +117 -184
  37. package/src/architecture/architect.ts +6 -0
  38. package/src/architecture/layer/README.md +38 -38
  39. package/src/architecture/network/README.md +49 -31
  40. package/src/architecture/network/activate/README.md +77 -77
  41. package/src/architecture/network/connect/README.md +15 -13
  42. package/src/architecture/network/deterministic/README.md +7 -7
  43. package/src/architecture/network/evolve/README.md +44 -44
  44. package/src/architecture/network/gating/README.md +20 -20
  45. package/src/architecture/network/genetic/README.md +51 -51
  46. package/src/architecture/network/mutate/README.md +97 -97
  47. package/src/architecture/network/network.types.ts +39 -0
  48. package/src/architecture/network/onnx/README.md +264 -264
  49. package/src/architecture/network/prune/README.md +39 -39
  50. package/src/architecture/network/remove/README.md +26 -26
  51. package/src/architecture/network/serialize/README.md +56 -56
  52. package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
  53. package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
  54. package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
  55. package/src/architecture/network/slab/README.md +61 -61
  56. package/src/architecture/network/standalone/README.md +24 -24
  57. package/src/architecture/network/stats/README.md +9 -9
  58. package/src/architecture/network/topology/README.md +46 -46
  59. package/src/architecture/network/training/README.md +21 -21
  60. package/src/architecture/network.ts +114 -10
  61. package/src/methods/README.md +9 -87
  62. package/src/multithreading/README.md +8 -77
  63. package/src/multithreading/workers/README.md +2 -2
  64. package/src/multithreading/workers/browser/README.md +0 -6
  65. package/src/multithreading/workers/node/README.md +0 -3
  66. package/src/neat/README.md +623 -568
  67. package/src/neat/neat.evolve.population.utils.ts +29 -5
  68. package/src/neat/neat.helpers.ts +16 -0
  69. package/src/neat/neat.topology-intent.utils.ts +160 -0
  70. package/src/utils/README.md +18 -18
  71. package/test/examples/asciiMaze/README.md +59 -59
  72. package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
  73. package/test/examples/asciiMaze/browser-entry/README.md +196 -0
  74. package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
  75. package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
  76. package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
  77. package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
  78. package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
  79. package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
  80. package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
  81. package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
  82. package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
  83. package/test/examples/asciiMaze/browser-entry.ts +10 -576
  84. package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
  85. package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
  86. package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
  87. package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
  88. package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
  89. package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
  90. package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
  91. package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
  92. package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
  93. package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
  94. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
  95. package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
  96. package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
  97. package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
  98. package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
  99. package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
  100. package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
  101. package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
  102. package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
  103. package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
  104. package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
  105. package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
  106. package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
  107. package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
  108. package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
  109. package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
  110. package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
  111. package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
  112. package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
  113. package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
  114. package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
  115. package/test/examples/asciiMaze/fitness.ts +2 -2
  116. package/test/examples/asciiMaze/fitness.types.ts +65 -0
  117. package/test/examples/asciiMaze/interfaces.ts +64 -1352
  118. package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
  119. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
  120. package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
  121. package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
  122. package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
  123. package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
  124. package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
  125. package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
  126. package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
  127. package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
  128. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
  129. package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
  130. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
  131. package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
  132. package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
  133. package/test/examples/flappy_bird/README.md +193 -88
  134. package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
  135. package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
  136. package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
  137. package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
  138. package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
  139. package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
  140. package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
  141. package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
  142. package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
  143. package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
  144. package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
  145. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
  146. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
  147. package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
  148. package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
  149. package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
  150. package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
  151. package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
  152. package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
  153. package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
  154. package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
  155. package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
  156. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
  157. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
  158. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
  159. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
  160. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
  161. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
  162. package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
  163. package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
  164. package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
  165. package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
  166. package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
  167. package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
  168. package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
  169. package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
  170. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
  171. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
  172. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
  173. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
  174. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
  175. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
  176. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
  177. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
  178. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
  179. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
  180. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
  181. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
  182. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
  183. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
  184. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
  185. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
  186. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
  187. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
  188. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
  189. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
  190. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
  191. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
  192. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
  193. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
  194. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
  195. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
  196. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
  197. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
  198. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
  199. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
  200. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
  201. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
  202. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
  203. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
  204. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
  205. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
  206. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
  207. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
  208. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
  209. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
  210. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
  211. package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
  212. package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
  213. package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
  214. package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
  215. package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
  216. package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
  217. package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
  218. package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
  219. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
  220. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
  221. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
  222. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
  223. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
  224. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
  225. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
  226. package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
  227. package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
  228. package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
  229. package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
  230. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
  231. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
  232. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
  233. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
  234. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
  235. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
  236. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
  237. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
  238. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
  239. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
  240. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
  241. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
  242. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
  243. package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
  244. package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
  245. package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
  246. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
  247. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
  248. package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
  249. package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
  250. package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
  251. package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
  252. package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
  253. package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
  254. package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
  255. package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
  256. package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
  257. package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
  258. package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
  259. package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
  260. package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
  261. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
  262. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
  263. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
  264. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
  265. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
  266. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
  267. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
  268. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
  269. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
  270. package/test/examples/flappy_bird/constants/README.md +1163 -0
  271. package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
  272. package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
  273. package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
  274. package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
  275. package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
  276. package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
  277. package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
  278. package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
  279. package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
  280. package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
  281. package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
  282. package/test/examples/flappy_bird/constants/constants.ts +6 -0
  283. package/test/examples/flappy_bird/environment/README.md +182 -0
  284. package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
  285. package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
  286. package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
  287. package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
  288. package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
  289. package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
  290. package/test/examples/flappy_bird/evaluation/README.md +155 -0
  291. package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
  292. package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
  293. package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
  294. package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
  295. package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
  296. package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
  297. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
  298. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
  299. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
  300. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
  301. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
  302. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
  303. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
  304. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
  305. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
  306. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
  307. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
  308. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
  309. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
  310. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
  311. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
  312. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
  313. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
  314. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
  315. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
  316. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
  317. package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
  318. package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
  319. package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
  320. package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
  321. package/test/examples/flappy_bird/index.ts +8 -2
  322. package/test/examples/flappy_bird/rng.ts +10 -0
  323. package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
  324. package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
  325. package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
  326. package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
  327. package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
  328. package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
  329. package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
  330. package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
  331. package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
  332. package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
  333. package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
  334. package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
  335. package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
  336. package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
  337. package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
  338. package/test/examples/flappy_bird/trainer/README.md +676 -0
  339. package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
  340. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
  341. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
  342. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
  343. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
  344. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
  345. package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
  346. package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
  347. package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
  348. package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
  349. package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
  350. package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
  351. package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
  352. package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
  353. package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
  354. package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
  355. package/test/neat/neat.topology-intent.test.ts +129 -0
  356. package/test/network/network.topology-intent.test.ts +44 -0
  357. package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
  358. package/test/examples/flappy_bird/environment/environment.ts +0 -7
  359. package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
  360. package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
  361. package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
@@ -1,580 +1,14 @@
1
- import { BrowserTerminalUtility } from './browserTerminalUtility';
2
- import { createBrowserLogger } from './browserLogger';
3
- import { DashboardManager } from './dashboardManager';
4
- import { EvolutionEngine } from './evolutionEngine';
5
- import { INetwork } from './interfaces';
6
- import { MazeGenerator } from './mazes';
7
- import { NetworkRefinement } from './networkRefinement';
8
- import type Network from '../../../src/architecture/network';
9
-
10
- /**
11
- * Runtime type for DashboardManager with dynamic methods and hooks.
12
- * Dashboard gains runtime methods like redraw and telemetry hooks.
13
- */
14
- interface RuntimeDashboard {
15
- _telemetryHook?: (telemetry: Record<string, unknown>) => void;
16
- redraw?: (data: unknown[], state: unknown) => void;
17
- getLastTelemetry?: () => Record<string, unknown>;
18
- [key: string]: unknown;
19
- }
20
-
21
- /**
22
- * Runtime type for AbortSignal with dynamic properties.
23
- * Some environments extend AbortSignal with additional runtime flags.
24
- */
25
- interface RuntimeAbortSignal {
26
- aborted?: boolean;
27
- onabort?: (() => void) | null;
28
- addEventListener: AbortSignal['addEventListener'];
29
- removeEventListener: AbortSignal['removeEventListener'];
30
- dispatchEvent: AbortSignal['dispatchEvent'];
31
- reason?: unknown;
32
- throwIfAborted?: () => void;
33
- }
34
-
35
- /**
36
- * Runtime type for AbortSignal constructor with dynamic any method.
37
- * Modern environments support AbortSignal.any for signal composition.
38
- */
39
- interface RuntimeAbortSignalConstructor {
40
- prototype: AbortSignal;
41
- new (): AbortSignal;
42
- any?: (signals: AbortSignal[]) => AbortSignal;
43
- }
44
-
45
- /**
46
- * Runtime type for evolution result with dynamic properties.
47
- * Evolution loop returns results with bestResult, bestNetwork, etc.
48
- */
49
- interface RuntimeEvolutionResult {
50
- bestResult?: {
51
- progress?: number;
52
- [key: string]: unknown;
53
- };
54
- bestNetwork?: INetwork;
55
- [key: string]: unknown;
56
- }
57
-
58
- /**
59
- * Runtime type for global window with dynamic asciiMaze namespace.
60
- * Browser environments extend window with custom global namespaces.
61
- */
62
- interface RuntimeWindow extends Window {
63
- asciiMaze?: {
64
- start?: typeof start;
65
- _autoStarted?: boolean;
66
- [key: string]: unknown;
67
- };
68
- asciiMazeStart?: (containerElement?: unknown) => unknown;
69
- [key: string]: unknown;
70
- }
71
-
72
- /** Default host container id used when a string is supplied to `start`. */
73
- const DEFAULT_CONTAINER_ID = 'ascii-maze-output';
74
- /** Width delta (px) that triggers a dashboard redraw to avoid noisy renders. */
75
- const RESIZE_WIDTH_THRESHOLD = 8;
76
- /** Debounce for fallback window.resize handler (ms). */
77
- const RESIZE_DEBOUNCE_MS = 120;
78
- /** Delay before auto-starting the demo when loaded as a script (ms). */
79
- const AUTO_START_DELAY_MS = 20;
80
- /** Minimum progress percentage required to consider a maze solved (mirrors e2e test). */
81
- const MIN_PROGRESS_TO_PASS = 90;
82
- /** Default stagnation generation threshold used across most curriculum phases. */
83
- const DEFAULT_MAX_STAGNANT_GENERATIONS = 50;
84
- /** Default max generations (hard cap) for most curriculum phases. */
85
- const DEFAULT_MAX_GENERATIONS = 100;
86
- /** Per-generation log/telemetry frequency for interactive demo (always 1). */
87
- const PER_GENERATION_LOG_FREQUENCY = 1;
88
- /** Initial side length (cells) of the generated procedural maze. */
89
- const INITIAL_MAZE_DIMENSION = 8;
90
- /** Maximum side length (cells) to grow the maze to. */
91
- const MAX_MAZE_DIMENSION = 40;
92
- /** Dimension increment (cells per axis) applied after each solved maze. */
93
- const MAZE_DIMENSION_INCREMENT = 4;
94
- /** Maximum agent steps before termination (scaled mazes). */
95
- const AGENT_MAX_STEPS = 600;
96
- /** Population size for evolution across maze scalings. */
97
- const POPULATION_SIZE = 20;
98
-
99
- /**
100
- * Create immutable evolution settings for a given maze dimension.
101
- *
102
- * @param dimension - Maze side length in cells (square maze).
103
- * @returns Readonly configuration object consumed by a single evolution run.
104
- */
105
- const createEvolutionSettings = (dimension: number) => {
106
- return {
107
- agentMaxSteps: AGENT_MAX_STEPS,
108
- popSize: POPULATION_SIZE,
109
- maxStagnantGenerations: DEFAULT_MAX_STAGNANT_GENERATIONS,
110
- maxGenerations: DEFAULT_MAX_GENERATIONS,
111
- lamarckianIterations: 4,
112
- lamarckianSampleSize: 12,
113
- mazeFactory: () => new MazeGenerator(dimension, dimension).generate(),
114
- } as const;
115
- };
116
-
117
- /**
118
- * Lightweight telemetry hub using a Set + snapshot iteration (micro-optimized for small listener counts).
119
- * EventTarget would work here, but Set keeps call overhead extremely low and avoids string event names.
120
- */
121
- class TelemetryHub<TTelemetry extends Record<string, unknown>> {
122
- /** Registered listener callbacks (unique). */
123
- #listeners = new Set<(payload: TTelemetry) => void>();
124
-
125
- /** Add a listener and return an unsubscribe function. */
126
- add(listener: (payload: TTelemetry) => void): () => void {
127
- this.#listeners.add(listener);
128
- return () => this.#listeners.delete(listener);
129
- }
130
-
131
- /** Dispatch to a snapshot of listeners so mutations during iteration are safe. */
132
- dispatch(payload: TTelemetry): void {
133
- // Step: Snapshot listeners (defensive against unsubscribe inside callback)
134
- const snapshot = Array.from(this.#listeners);
135
- for (const listener of snapshot) {
136
- try {
137
- listener(payload);
138
- } catch {
139
- // Listener exceptions are isolated so evolution cannot be disrupted.
140
- }
141
- }
142
- }
143
- }
144
-
145
- /**
146
- * Handle returned by {@link start} providing lifecycle & telemetry access.
147
- *
148
- * Consumers embedding the ASCII Maze demo can use this object to:
149
- * - Stop the evolutionary curriculum early (`stop()`)
150
- * - Check whether evolution is still active (`isRunning()`)
151
- * - Await natural completion (`done` Promise resolves when curriculum ends or stop() called)
152
- * - Subscribe to lightweight per-generation telemetry (`onTelemetry(cb)` returning an unsubscribe)
153
- * - Pull the latest snapshot on demand (`getTelemetry()`)
154
- */
155
- export interface AsciiMazeRunHandle {
156
- /** Stop the running curriculum. This will also abort the internal signal. */
157
- stop: () => void;
158
- /** Whether the curriculum is currently active (not finished or stopped). */
159
- isRunning: () => boolean;
160
- /** Promise that resolves when the curriculum naturally finishes or is stopped. */
161
- done: Promise<void>;
162
- /** Subscribe to per-generation telemetry events. Returns an unsubscribe function. */
163
- onTelemetry: (
164
- listener: (telemetry: Record<string, unknown>) => void,
165
- ) => () => void;
166
- /** Return the last telemetry snapshot produced by the dashboard, if any. */
167
- getTelemetry: () => unknown;
168
- }
169
-
170
1
  /**
171
- * Start the ASCII Maze evolutionary demo (progressively larger procedural mazes).
172
- *
173
- * Steps:
174
- * 1. Generate an initial procedural maze (20x20) and evolve a NEAT population.
175
- * 2. Emit telemetry each generation (logEvery=1) and pace via requestAnimationFrame for UI responsiveness.
176
- * 3. When solved (progress >= MIN_PROGRESS_TO_PASS) grow maze size by +2 on each axis (up to 40x40) and repeat.
177
- * 4. Continue until maximum dimension reached or `stop()` / external abort invoked.
2
+ * Compatibility entrypoint for the dedicated browser-entry module.
178
3
  *
179
- * This progressive curriculum demonstrates transfer of learned structure to larger mazes via fresh evolution runs.
180
- *
181
- * @param container - Element id or HTMLElement to host the demo (defaults to 'ascii-maze-output').
182
- * @param opts - Optional configuration. `opts.signal` (AbortSignal) can be supplied by the caller to
183
- * cooperatively cancel the curriculum. Calling `stop()` will also trigger an abort.
184
- * @returns A {@link AsciiMazeRunHandle} exposing lifecycle controls and telemetry hooks.
4
+ * The real implementation now lives under `browser-entry/browser-entry.ts`.
5
+ * This file remains so existing imports such as `./browser-entry` continue to
6
+ * resolve without changes.
185
7
  */
186
- export const start = async (
187
- container: string | HTMLElement = DEFAULT_CONTAINER_ID,
188
- opts: { signal?: AbortSignal } = {},
189
- ): Promise<AsciiMazeRunHandle> => {
190
- // Step 0: Resolve host elements & loggers
191
- const hostElement =
192
- typeof container === 'string'
193
- ? document.getElementById(container)
194
- : container;
195
-
196
- const archiveElement = hostElement
197
- ? (hostElement.querySelector('#ascii-maze-archive') as HTMLElement)
198
- : null;
199
- const liveElement = hostElement
200
- ? (hostElement.querySelector('#ascii-maze-live') as HTMLElement)
201
- : null;
202
-
203
- // clearer will clear only the live area; archive remains
204
- const clearer = BrowserTerminalUtility.createTerminalClearer(
205
- liveElement ?? undefined,
206
- );
207
- const liveLogger = createBrowserLogger(liveElement ?? undefined);
208
- const archiveLogger = createBrowserLogger(archiveElement ?? undefined);
209
-
210
- // DashboardManager will use live logger for ongoing redraws and archive logger to append solved blocks
211
- const dashboard = new DashboardManager(
212
- clearer,
213
- liveLogger as unknown as (...args: unknown[]) => void,
214
- archiveLogger as unknown as (...args: unknown[]) => void,
215
- );
216
-
217
- // Telemetry hub mediating dashboard -> external listeners
218
- const telemetryHub = new TelemetryHub<Record<string, unknown>>();
219
- const runtimeDashboard = dashboard as unknown as RuntimeDashboard;
220
- runtimeDashboard._telemetryHook = (telemetry: Record<string, unknown>) =>
221
- telemetryHub.dispatch(telemetry);
222
-
223
- // Responsive resize: re-render dashboard when host width changes significantly.
224
- try {
225
- const observeTarget =
226
- hostElement ?? document.getElementById('ascii-maze-output');
227
- if (observeTarget && typeof ResizeObserver !== 'undefined') {
228
- let lastObservedWidth = observeTarget.clientWidth;
229
- const resizeObserver = new ResizeObserver((entries) => {
230
- for (const entry of entries) {
231
- const width = entry.contentRect.width;
232
- if (Math.abs(width - lastObservedWidth) > RESIZE_WIDTH_THRESHOLD) {
233
- // threshold to avoid noisy redraws
234
- lastObservedWidth = width;
235
- try {
236
- runtimeDashboard.redraw?.([], undefined);
237
- } catch {
238
- // ignore redraw errors
239
- }
240
- }
241
- }
242
- });
243
- resizeObserver.observe(observeTarget);
244
- } else if (observeTarget) {
245
- // Fallback: window resize listener (debounced)
246
- let debounceTimer: number | undefined = undefined;
247
- const handler = () => {
248
- if (typeof debounceTimer === 'number') clearTimeout(debounceTimer);
249
- debounceTimer = window.setTimeout(() => {
250
- try {
251
- runtimeDashboard.redraw?.([], undefined);
252
- } catch {
253
- // ignore
254
- }
255
- }, RESIZE_DEBOUNCE_MS);
256
- };
257
- window.addEventListener('resize', handler);
258
- }
259
- } catch {
260
- // ignore resize wiring errors
261
- }
262
-
263
- // Inner runner (previously assigned to window.asciiMazeStart). Kept internal for ESM API.
264
- let cancelled = false;
265
- const internalController = new AbortController();
266
- const externalSignal = opts.signal;
267
-
268
- /**
269
- * Compose an AbortSignal that will abort when either the internal controller
270
- * or an optional external signal aborts. This helper prefers modern
271
- * composition via `AbortSignal.any` when available, and falls back to
272
- * best-effort wiring for older or test environments (jsdom, polyfills).
273
- *
274
- * @example
275
- * // Create a composed signal that aborts when either source aborts
276
- * const composed = composeAbortSignal(externalSignal);
277
- * composed.addEventListener('abort', () => console.log('aborted'));
278
- *
279
- * @param externalSignalParam - Optional external AbortSignal provided by the caller.
280
- * When omitted, the returned signal is the internal controller's signal.
281
- * @returns A signal that will abort when either the internal controller or the external signal aborts.
282
- */
283
- const composeAbortSignal = (
284
- externalSignalParam?: AbortSignal,
285
- ): AbortSignal => {
286
- // Step 0: fast-path when no external signal supplied
287
- if (!externalSignalParam) return internalController.signal;
288
-
289
- // Convert to descriptive locals for clarity
290
- const externalSignal = externalSignalParam as RuntimeAbortSignal;
291
- const internalSignal = internalController.signal;
292
-
293
- // Use a switch-style flow to replace chained else-if logic and keep branches explicit.
294
- // We switch on `true` so each case is a predicate; this keeps intent clear and
295
- // satisfies the requirement to use switch/case rather than else-if chains.
296
- switch (true) {
297
- // Case: external already aborted -> return it immediately (race fast-path)
298
- case !!externalSignal.aborted: {
299
- return externalSignal as unknown as AbortSignal;
300
- }
301
-
302
- // Case: environment supports AbortSignal.any (modern browsers / Node 20+)
303
- case typeof (AbortSignal as unknown as RuntimeAbortSignalConstructor)
304
- .any === 'function': {
305
- try {
306
- // Prefer native composition when available for clarity & performance.
307
- const composedSignal = (
308
- AbortSignal as unknown as RuntimeAbortSignalConstructor
309
- ).any!([externalSignal as unknown as AbortSignal, internalSignal]);
310
- return composedSignal;
311
- } catch {
312
- // If native composition throws, intentionally fall through to manual
313
- // wiring below so listeners are still attached.
314
- }
315
- // fallthrough
316
- }
317
-
318
- // Default: manual best-effort wiring for older environments and test runners.
319
- default: {
320
- // Step: try to attach an event listener to propagate abort.
321
- try {
322
- externalSignal.addEventListener(
323
- 'abort',
324
- () => {
325
- // Isolate listener exceptions to avoid destabilizing callers.
326
- try {
327
- internalController.abort();
328
- } catch {
329
- /* ignore */
330
- }
331
- },
332
- { once: true },
333
- );
334
- } catch {
335
- // ignore event wiring errors (some polyfills / minimal DOMs may throw)
336
- }
337
-
338
- // Step: defensive fallback - attempt to set `onabort` if supported.
339
- try {
340
- // Runtime assignment for environments lacking addEventListener
341
- externalSignal.onabort = () => {
342
- try {
343
- internalController.abort();
344
- } catch {
345
- /* ignore */
346
- }
347
- };
348
- } catch {
349
- // ignore
350
- }
351
-
352
- // Step: microtask check to catch races where the external signal aborted
353
- // before wiring handlers. queueMicrotask is preferred but may not exist
354
- // in some minimal runtimes, so guard defensively.
355
- try {
356
- queueMicrotask(() => {
357
- if (externalSignal.aborted) {
358
- try {
359
- internalController.abort();
360
- } catch {
361
- /* ignore */
362
- }
363
- }
364
- });
365
- } catch {
366
- // queueMicrotask may not be available in some environments; ignore.
367
- }
368
- }
369
- }
370
-
371
- // Return the internal controller's signal as the composed signal when native
372
- // composition isn't available. Manual wiring will propagate external aborts.
373
- return internalSignal;
374
- };
375
-
376
- // Create done promise early so immediate-abort handling (below) can resolve it.
377
- let resolveDone: (() => void) | undefined;
378
- const donePromise = new Promise<void>((resolve) => (resolveDone = resolve));
379
-
380
- const combinedSignal = composeAbortSignal(externalSignal);
381
- let running = true;
382
-
383
- // Immediate abort reaction: if the combined signal is already aborted (race),
384
- // reflect the cancelled state immediately so callers polling `isRunning()` see
385
- // the updated state without waiting for event listeners to be attached.
386
- if (combinedSignal.aborted) {
387
- cancelled = true;
388
- running = false;
389
- try {
390
- resolveDone?.();
391
- } catch {
392
- /* ignore */
393
- }
394
- }
395
-
396
- // Ensure we capture future abort events when they occur.
397
- try {
398
- combinedSignal.addEventListener(
399
- 'abort',
400
- () => {
401
- // Step: mark cancelled state so cooperative checks exit early.
402
- cancelled = true;
403
- // Step: reflect non-running state immediately for consumers polling isRunning().
404
- running = false;
405
- // Step: resolve done Promise eagerly; underlying evolution will short‑circuit soon.
406
- try {
407
- resolveDone?.();
408
- } catch {
409
- /* ignore */
410
- }
411
- },
412
- { once: true },
413
- );
414
- } catch {
415
- /* ignore listener wiring errors */
416
- }
417
-
418
- // Progressive scaling state
419
- let currentDimension = INITIAL_MAZE_DIMENSION;
420
-
421
- // --- Cross-maze curriculum transfer state ---
422
- // Holds the best network from the most recently completed evolution run.
423
- // Updated after each run finishes and passed as `initialBestNetwork` into the next
424
- // run to encourage structural transfer to larger mazes. Starts undefined so the
425
- // first maze evolves from a fresh random population.
426
- let previousBestNetwork: INetwork | undefined;
427
-
428
- /** Schedule a callback on the next animation frame with a setTimeout(0) fallback. */
429
- const scheduleNextMaze = (cb: () => void) => {
430
- try {
431
- if (typeof requestAnimationFrame === 'function')
432
- requestAnimationFrame(cb);
433
- else setTimeout(cb, 0);
434
- } catch {
435
- setTimeout(cb, 0);
436
- }
437
- };
438
-
439
- const runEvolution = async () => {
440
- if (cancelled) {
441
- running = false;
442
- resolveDone?.();
443
- return;
444
- }
445
- // Best network carried forward across curriculum phases (progressively larger mazes).
446
- // This lets the next maze seed its population with the prior best to encourage transfer.
447
- const settings = createEvolutionSettings(currentDimension);
448
- const mazeLayout = settings.mazeFactory();
449
- let solved = false;
450
- try {
451
- const result = await EvolutionEngine.runMazeEvolution({
452
- mazeConfig: { maze: mazeLayout },
453
- agentSimConfig: { maxSteps: settings.agentMaxSteps },
454
- evolutionAlgorithmConfig: {
455
- allowRecurrent: true,
456
- popSize: settings.popSize,
457
- maxStagnantGenerations: settings.maxStagnantGenerations,
458
- minProgressToPass: MIN_PROGRESS_TO_PASS,
459
- maxGenerations: settings.maxGenerations,
460
- autoPauseOnSolve: false,
461
- stopOnlyOnSolve: false,
462
- lamarckianIterations: settings.lamarckianIterations,
463
- lamarckianSampleSize: settings.lamarckianSampleSize,
464
- initialBestNetwork: previousBestNetwork,
465
- },
466
- reportingConfig: {
467
- dashboardManager: dashboard,
468
- logEvery: PER_GENERATION_LOG_FREQUENCY,
469
- label: `browser-procedural-${currentDimension}x${currentDimension}`,
470
- paceEveryGeneration: true, // custom flag (consumed if supported) to yield between generations
471
- },
472
- cancellation: { isCancelled: () => cancelled },
473
- signal: combinedSignal,
474
- });
475
- const runtimeResult = result as unknown as RuntimeEvolutionResult;
476
- const progress = runtimeResult.bestResult?.progress;
477
- // Capture & refine best network for seeding next curriculum phase (if any).
478
- try {
479
- const bestNet = runtimeResult.bestNetwork;
480
- if (bestNet) {
481
- const refined = NetworkRefinement.refineWinnerWithBackprop(
482
- bestNet as unknown as Network,
483
- );
484
- previousBestNetwork = (refined as unknown as INetwork) || bestNet;
485
- }
486
- } catch {
487
- /* ignore refinement */
488
- }
489
- solved = typeof progress === 'number' && progress >= MIN_PROGRESS_TO_PASS;
490
- try {
491
- console.log(
492
- '[asciiMaze] maze complete',
493
- currentDimension,
494
- 'solved?',
495
- solved,
496
- 'progress',
497
- progress,
498
- );
499
- } catch {
500
- /* ignore */
501
- }
502
- } catch (error: unknown) {
503
- console.error(
504
- 'Error while running procedural maze',
505
- currentDimension,
506
- error,
507
- );
508
- }
509
-
510
- if (!cancelled && solved && currentDimension < MAX_MAZE_DIMENSION) {
511
- currentDimension = Math.min(
512
- currentDimension + MAZE_DIMENSION_INCREMENT,
513
- MAX_MAZE_DIMENSION,
514
- );
515
- scheduleNextMaze(() => runEvolution());
516
- } else {
517
- running = false;
518
- resolveDone?.();
519
- }
520
- };
521
-
522
- // Kick off first maze immediately
523
- runEvolution();
524
-
525
- const handle: AsciiMazeRunHandle = {
526
- stop: () => {
527
- cancelled = true;
528
- try {
529
- internalController.abort();
530
- } catch {
531
- // ignore
532
- }
533
- // Reflect stopped state immediately.
534
- running = false;
535
- },
536
- // Include AbortSignal aborted state so external aborts flip isRunning() without relying solely on listener side-effects.
537
- isRunning: () => running && !cancelled && !combinedSignal.aborted,
538
- done: Promise.resolve(donePromise).catch(() => {}) as Promise<void>,
539
- onTelemetry: (telemetryCallback) =>
540
- telemetryHub.add(
541
- telemetryCallback as unknown as (
542
- payload: Record<string, unknown>,
543
- ) => void,
544
- ),
545
- getTelemetry: () => runtimeDashboard.getLastTelemetry?.(),
546
- };
547
-
548
- // (Pause UI removed; external host can manage pause via a future API if needed.)
549
- return handle;
550
- };
551
8
 
552
- // UMD-style compatibility + deprecated global.
553
- // If loaded directly (no module loader), expose window.asciiMaze.start() and legacy asciiMazeStart().
554
- if (
555
- typeof window !== 'undefined' &&
556
- (window as unknown as RuntimeWindow).document
557
- ) {
558
- const globalWindow = window as unknown as RuntimeWindow;
559
- globalWindow.asciiMaze = globalWindow.asciiMaze || {};
560
- globalWindow.asciiMaze.start = start;
561
- if (!globalWindow.asciiMazeStart) {
562
- globalWindow.asciiMazeStart = (containerElement?: unknown) => {
563
- console.warn(
564
- '[asciiMaze] window.asciiMazeStart is deprecated; use import { start } ... or window.asciiMaze.start',
565
- );
566
- return start(containerElement as string | HTMLElement | undefined);
567
- };
568
- }
569
- // Guard against duplicate auto-start
570
- if (!globalWindow.asciiMaze._autoStarted) {
571
- globalWindow.asciiMaze._autoStarted = true;
572
- setTimeout(() => {
573
- try {
574
- if (document.getElementById(DEFAULT_CONTAINER_ID)) start();
575
- } catch {
576
- /* ignore */
577
- }
578
- }, AUTO_START_DELAY_MS);
579
- }
580
- }
9
+ export { start } from './browser-entry/browser-entry';
10
+ export type {
11
+ AsciiMazeRunHandle,
12
+ BrowserEntryStartFunction,
13
+ BrowserEntryStartOptions,
14
+ } from './browser-entry/browser-entry.types';