@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
@@ -0,0 +1,276 @@
1
+ # dashboardManager
2
+
3
+ ## dashboardManager/dashboardManager.types.ts
4
+
5
+ ### AsciiMazeComplexityStats
6
+
7
+ ### AsciiMazeDetailedStats
8
+
9
+ Expanded telemetry details retained by the dashboard between redraws.
10
+
11
+ ### AsciiMazeTelemetrySnapshot
12
+
13
+ Public telemetry snapshot surfaced to browser consumers.
14
+
15
+ ### CurrentBestRecord
16
+
17
+ Latest best candidate used by live rendering and telemetry.
18
+
19
+ ### DashboardArchiveFunction
20
+
21
+ `(args: unknown[]) => void`
22
+
23
+ ### DashboardClearFunction
24
+
25
+ `() => void`
26
+
27
+ ### DashboardHistoryState
28
+
29
+ Bounded numeric histories used for trends and exports.
30
+
31
+ ### DashboardLogFunction
32
+
33
+ `(args: unknown[]) => void`
34
+
35
+ ### DashboardManagerContext
36
+
37
+ Shared runtime context passed into dashboard services.
38
+
39
+ ### DashboardManagerState
40
+
41
+ Mutable runtime state owned by one dashboard instance.
42
+
43
+ ### DashboardManagerUpdateArgs
44
+
45
+ Input accepted by the update orchestration service.
46
+
47
+ ### DashboardPresentationAdapter
48
+
49
+ Shared presentation adapter used by browser and non-browser hosts.
50
+
51
+ ### DashboardScratchState
52
+
53
+ Reused scratch arrays to keep redraw allocations predictable.
54
+
55
+ ### DashboardTelemetry
56
+
57
+ Raw telemetry shape received from NEAT dashboard integrations.
58
+
59
+ ### DashboardTelemetryHook
60
+
61
+ `(payload: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardTelemetryPayload) => void`
62
+
63
+ ### DashboardTelemetryPayload
64
+
65
+ Telemetry payload emitted through events, postMessage, and runtime hooks.
66
+
67
+ ### MutationStatsMap
68
+
69
+ ### NeatGenome
70
+
71
+ NEAT genome/network with runtime properties used by dashboard telemetry.
72
+
73
+ ### NeatInstance
74
+
75
+ NEAT instance shape needed by dashboard helpers.
76
+
77
+ ### NeatSpecies
78
+
79
+ NEAT species collection entry surface used by dashboard telemetry.
80
+
81
+ ### NumericTelemetryMap
82
+
83
+ ### OperatorStatsEntry
84
+
85
+ Operator stats entry from NEAT.
86
+
87
+ ### RuntimeDashboardManager
88
+
89
+ Compatibility alias for older runtime-facing imports.
90
+
91
+ ### SolvedMazeRecord
92
+
93
+ Stored solved-maze archive entry.
94
+
95
+ ## dashboardManager/dashboardManager.ts
96
+
97
+ ### dashboardManager
98
+
99
+ Public DashboardManager facade for the dedicated dashboardManager module boundary.
100
+
101
+ The folder now owns local contracts, constants, pure formatting helpers, and
102
+ stateful rendering and telemetry services. This facade keeps the established
103
+ class-based API stable while delegating the heavy work to focused helpers.
104
+
105
+ ### DashboardManager
106
+
107
+ Rich ASCII maze dashboard used by browser and terminal example hosts.
108
+
109
+ #### getLastTelemetry
110
+
111
+ `() => import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").AsciiMazeTelemetrySnapshot`
112
+
113
+ Return the latest public telemetry snapshot, including rich detail history when available.
114
+
115
+ Returns: Latest dashboard telemetry snapshot.
116
+
117
+ #### logFunction
118
+
119
+ Optional log function exposed for engine-side safe-writer fallbacks.
120
+
121
+ #### redraw
122
+
123
+ `(currentMaze: string[], neat: unknown) => void`
124
+
125
+ Clear and repaint the live dashboard using the current best candidate and histories.
126
+
127
+ Parameters:
128
+ - `currentMaze` - - Maze currently shown in the live panel.
129
+ - `neat` - - Optional NEAT instance used to enrich stats.
130
+
131
+ #### reset
132
+
133
+ `() => void`
134
+
135
+ Clear archive, current best, and telemetry state so the instance can be reused.
136
+
137
+ #### update
138
+
139
+ `(maze: string[], result: import("test/examples/asciiMaze/interfaces").IMazeRunResult | undefined, network: import("test/examples/asciiMaze/interfaces").INetwork | null, generation: number, neatInstance: import("src/neat").default | undefined) => void`
140
+
141
+ Ingest one evolution update, refresh the live dashboard, and emit telemetry.
142
+
143
+ Parameters:
144
+ - `maze` - - Current maze layout.
145
+ - `result` - - Latest run result for the tracked candidate.
146
+ - `network` - - Candidate network used for the run.
147
+ - `generation` - - Current generation number.
148
+ - `neatInstance` - - Optional NEAT runtime used for advanced telemetry.
149
+
150
+ ## dashboardManager/dashboardManager.services.ts
151
+
152
+ ### applyDashboardUpdate
153
+
154
+ `(context: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardManagerContext, args: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardManagerUpdateArgs) => void`
155
+
156
+ Ingest one engine update, refresh the live view, and emit external telemetry.
157
+
158
+ Parameters:
159
+ - `context` - - Dashboard runtime context for state and output callbacks.
160
+ - `args` - - Latest update payload from the evolution engine.
161
+
162
+ ### getDashboardLastTelemetry
163
+
164
+ `(state: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardManagerState) => import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").AsciiMazeTelemetrySnapshot`
165
+
166
+ Produce the latest public telemetry snapshot from current dashboard state.
167
+
168
+ Parameters:
169
+ - `state` - - Mutable dashboard state.
170
+
171
+ Returns: Public telemetry snapshot used by browser hosts.
172
+
173
+ ### redrawDashboard
174
+
175
+ `(context: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardManagerContext, currentMaze: string[], neat: unknown) => void`
176
+
177
+ Repaint the live dashboard from current state and refresh the detailed snapshot.
178
+
179
+ Parameters:
180
+ - `context` - - Dashboard runtime context for state and output callbacks.
181
+ - `currentMaze` - - Maze currently being evolved.
182
+ - `neat` - - Optional NEAT runtime instance used for detailed stats.
183
+
184
+ ### resetDashboardState
185
+
186
+ `(state: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardManagerState) => void`
187
+
188
+ Clear retained archive, best-candidate, and history state for a fresh run.
189
+
190
+ Parameters:
191
+ - `state` - - Mutable dashboard state to clear.
192
+
193
+ ## dashboardManager/dashboardManager.constants.ts
194
+
195
+ ### dashboardManager.constants
196
+
197
+ Shared sizing, formatting, and top-N limits for the ASCII maze dashboard.
198
+
199
+ These values are kept in one place so rendering, archive output, and
200
+ telemetry helpers stay visually and semantically aligned.
201
+
202
+ ### DASHBOARD_MANAGER_CONSTANTS
203
+
204
+ ## dashboardManager/dashboardManager.utils.ts
205
+
206
+ ### buildDashboardSparkline
207
+
208
+ `(series: number[], width: number) => string`
209
+
210
+ Convert the recent tail of a numeric series into a compact sparkline.
211
+
212
+ Parameters:
213
+ - `series` - - Numeric history in chronological order.
214
+ - `width` - - Maximum sample count included in the sparkline.
215
+
216
+ Returns: Unicode sparkline string.
217
+
218
+ ### computeDashboardPathMetrics
219
+
220
+ `(maze: string[], result: Pick<import("test/examples/asciiMaze/interfaces").IMazeRunResult, "path" | "steps" | "fitness">) => { optimalLength: number; pathLength: number; efficiencyPct: string; overheadPct: string; uniqueCellsVisited: number; revisitedCells: number; totalSteps: number; fitnessValue: number; }`
221
+
222
+ Compute solved-path efficiency and visitation metrics for archive output.
223
+
224
+ Parameters:
225
+ - `maze` - - Maze layout containing start and exit markers.
226
+ - `result` - - Run result with path, steps, and fitness.
227
+
228
+ Returns: Derived path metrics used by solved archive formatting.
229
+
230
+ ### deriveDashboardArchitecture
231
+
232
+ `(networkInstance: import("test/examples/asciiMaze/interfaces").INetwork | null | undefined) => string`
233
+
234
+ Infer a compact architecture string from a network-like runtime object.
235
+
236
+ Parameters:
237
+ - `networkInstance` - - Network instance from the maze example runtime.
238
+
239
+ Returns: Architecture string such as `6 - 8 - 4`, or `n/a` when unavailable.
240
+
241
+ ### formatDashboardStat
242
+
243
+ `(label: string, value: string | number, colorLabel: string, colorValue: string, labelWidth: number) => string`
244
+
245
+ Format a single framed dashboard stat line with aligned label and value columns.
246
+
247
+ Parameters:
248
+ - `label` - - Descriptive stat label.
249
+ - `value` - - String or number value displayed after the label.
250
+ - `colorLabel` - - Color token applied to the label segment.
251
+ - `colorValue` - - Color token applied to the value segment.
252
+ - `labelWidth` - - Fixed width used for the label column.
253
+
254
+ Returns: Ready-to-log framed stat line.
255
+
256
+ ### getDashboardMazeKey
257
+
258
+ `(maze: string[]) => string`
259
+
260
+ Build a lightweight dedupe key for a maze layout.
261
+
262
+ Parameters:
263
+ - `maze` - - Maze rows in display order.
264
+
265
+ Returns: Joined maze key used by the solved archive.
266
+
267
+ ### sliceDashboardHistoryForExport
268
+
269
+ `(history: number[] | null | undefined) => number[]`
270
+
271
+ Return the recent export window of a bounded numeric history buffer.
272
+
273
+ Parameters:
274
+ - `history` - - History buffer in chronological order.
275
+
276
+ Returns: Independent tail slice suitable for telemetry export.
@@ -0,0 +1,16 @@
1
+ # dashboardManager/archive
2
+
3
+ ## dashboardManager/archive/dashboardManager.archive.services.ts
4
+
5
+ ### recordSolvedMaze
6
+
7
+ `(context: import("test/examples/asciiMaze/dashboardManager/dashboardManager.types").DashboardManagerContext, maze: string[], result: import("test/examples/asciiMaze/interfaces").IMazeRunResult, network: import("test/examples/asciiMaze/interfaces").INetwork, generation: number) => void`
8
+
9
+ Record and emit a newly solved maze archive block when the layout has not been seen before.
10
+
11
+ Parameters:
12
+ - `context` - - Dashboard runtime context containing archive state and callbacks.
13
+ - `maze` - - Solved maze layout.
14
+ - `result` - - Successful run result used for archive stats.
15
+ - `network` - - Network that solved the maze.
16
+ - `generation` - - Generation number at solve time.
@@ -0,0 +1,267 @@
1
+ import { colors } from '../../colors';
2
+ import type { IMazeRunResult, INetwork } from '../../interfaces';
3
+ import { MazeVisualization } from '../../mazeVisualization';
4
+ import { NetworkVisualization } from '../../networkVisualization';
5
+ import { DASHBOARD_MANAGER_CONSTANTS as C } from '../dashboardManager.constants';
6
+ import type {
7
+ DashboardManagerContext,
8
+ SolvedMazeRecord,
9
+ } from '../dashboardManager.types';
10
+ import {
11
+ buildDashboardSparkline,
12
+ computeDashboardPathMetrics,
13
+ deriveDashboardArchitecture,
14
+ getDashboardMazeKey,
15
+ } from '../dashboardManager.utils';
16
+
17
+ let cachedSolvedFooterBorder: string | null = null;
18
+
19
+ /**
20
+ * Record and emit a newly solved maze archive block when the layout has not been seen before.
21
+ *
22
+ * @param context - Dashboard runtime context containing archive state and callbacks.
23
+ * @param maze - Solved maze layout.
24
+ * @param result - Successful run result used for archive stats.
25
+ * @param network - Network that solved the maze.
26
+ * @param generation - Generation number at solve time.
27
+ */
28
+ export function recordSolvedMaze(
29
+ context: DashboardManagerContext,
30
+ maze: string[],
31
+ result: IMazeRunResult,
32
+ network: INetwork,
33
+ generation: number,
34
+ ): void {
35
+ const { state } = context;
36
+ const solvedMazeKey = getDashboardMazeKey(maze);
37
+ if (state.solvedMazeKeys.has(solvedMazeKey)) return;
38
+
39
+ const solvedRecord: SolvedMazeRecord = { maze, result, network, generation };
40
+ state.solvedMazes.push(solvedRecord);
41
+ state.solvedMazeKeys.add(solvedMazeKey);
42
+ appendSolvedToArchive(context, solvedRecord, state.solvedMazes.length);
43
+ }
44
+
45
+ function appendSolvedToArchive(
46
+ context: DashboardManagerContext,
47
+ solved: SolvedMazeRecord,
48
+ displayNumber: number,
49
+ ): void {
50
+ if (!context.archiveFn) return;
51
+
52
+ const blockLines: string[] = [];
53
+ appendSolvedHeader(blockLines, solved, displayNumber);
54
+ appendSolvedSparklines(context, blockLines, solved.network);
55
+ appendSolvedMaze(blockLines, solved);
56
+ appendSolvedPathStats(context, blockLines, solved);
57
+ appendSolvedFooterAndEmit(context.archiveFn, blockLines);
58
+ }
59
+
60
+ function appendSolvedHeader(
61
+ blockLines: string[],
62
+ solved: SolvedMazeRecord,
63
+ displayNumber: number,
64
+ ): void {
65
+ const rawFitness = solved.result?.fitness;
66
+ const formattedFitness =
67
+ typeof rawFitness === 'number' && Number.isFinite(rawFitness)
68
+ ? rawFitness.toFixed(2)
69
+ : 'n/a';
70
+ const title = ` SOLVED #${Math.max(1, displayNumber)} (GEN ${solved.generation}) FITNESS ${formattedFitness} `;
71
+ const leftPaddingSize = Math.max(
72
+ 0,
73
+ Math.floor((C.FRAME_INNER_WIDTH - title.length) / 2),
74
+ );
75
+ const rightPaddingSize = Math.max(
76
+ 0,
77
+ C.FRAME_INNER_WIDTH - title.length - leftPaddingSize,
78
+ );
79
+
80
+ blockLines.push(
81
+ `${colors.blueCore}╔${NetworkVisualization.pad(
82
+ '═'.repeat(C.FRAME_INNER_WIDTH),
83
+ C.FRAME_INNER_WIDTH,
84
+ '═',
85
+ )}╗${colors.reset}`,
86
+ );
87
+ blockLines.push(
88
+ `${colors.blueCore}║${' '.repeat(leftPaddingSize)}${colors.orangeNeon}${title}${colors.blueCore}${' '.repeat(rightPaddingSize)}║${colors.reset}`,
89
+ );
90
+ blockLines.push(
91
+ `${colors.blueCore}║${NetworkVisualization.pad(' ', C.FRAME_INNER_WIDTH, ' ')}║${colors.reset}`,
92
+ );
93
+ }
94
+
95
+ function appendSolvedSparklines(
96
+ context: DashboardManagerContext,
97
+ blockLines: string[],
98
+ network?: INetwork | null,
99
+ ): void {
100
+ const pushIfPresent = (label: string, value: string | null | undefined) => {
101
+ if (!value) return;
102
+ blockLines.push(
103
+ context.formatStat(
104
+ label,
105
+ value,
106
+ colors.neonSilver,
107
+ colors.cyanNeon,
108
+ C.SOLVED_LABEL_WIDTH,
109
+ ),
110
+ );
111
+ };
112
+
113
+ const architecture = deriveDashboardArchitecture(network);
114
+ if (architecture !== 'n/a') {
115
+ pushIfPresent(C.LABEL_ARCH, architecture.split(/\s*-\s*/).join(' <=> '));
116
+ }
117
+
118
+ const { histories } = context.state;
119
+ pushIfPresent(
120
+ 'Fitness trend',
121
+ buildDashboardSparkline(histories.bestFitness, C.ARCHIVE_SPARK_WIDTH),
122
+ );
123
+ pushIfPresent(
124
+ 'Nodes trend',
125
+ buildDashboardSparkline(histories.complexityNodes, C.ARCHIVE_SPARK_WIDTH),
126
+ );
127
+ pushIfPresent(
128
+ 'Conns trend',
129
+ buildDashboardSparkline(histories.complexityConns, C.ARCHIVE_SPARK_WIDTH),
130
+ );
131
+ pushIfPresent(
132
+ 'Hypervol trend',
133
+ buildDashboardSparkline(histories.hypervolume, C.ARCHIVE_SPARK_WIDTH),
134
+ );
135
+ pushIfPresent(
136
+ 'Progress trend',
137
+ buildDashboardSparkline(histories.progress, C.ARCHIVE_SPARK_WIDTH),
138
+ );
139
+ pushIfPresent(
140
+ 'Species trend',
141
+ buildDashboardSparkline(histories.speciesCount, C.ARCHIVE_SPARK_WIDTH),
142
+ );
143
+
144
+ blockLines.push(
145
+ `${colors.blueCore}║${NetworkVisualization.pad(' ', C.FRAME_INNER_WIDTH, ' ')}${colors.blueCore}║${colors.reset}`,
146
+ );
147
+ }
148
+
149
+ function appendSolvedMaze(
150
+ blockLines: string[],
151
+ solved: Pick<SolvedMazeRecord, 'maze' | 'result'>,
152
+ ): void {
153
+ const pathCoordinates = solved.result.path;
154
+ const endPosition = pathCoordinates?.at(-1) ?? [0, 0];
155
+ const visualization = MazeVisualization.visualizeMaze(
156
+ solved.maze,
157
+ endPosition as [number, number],
158
+ pathCoordinates,
159
+ );
160
+ const rawLines = Array.isArray(visualization)
161
+ ? visualization
162
+ : visualization.split('\n');
163
+
164
+ for (const rawLine of rawLines) {
165
+ const paddedRow = NetworkVisualization.pad(
166
+ rawLine,
167
+ C.FRAME_INNER_WIDTH,
168
+ ' ',
169
+ );
170
+ blockLines.push(
171
+ `${colors.blueCore}║${NetworkVisualization.pad(
172
+ paddedRow,
173
+ C.FRAME_INNER_WIDTH,
174
+ ' ',
175
+ )}${colors.blueCore}║${colors.reset}`,
176
+ );
177
+ }
178
+ }
179
+
180
+ function appendSolvedPathStats(
181
+ context: DashboardManagerContext,
182
+ blockLines: string[],
183
+ solved: Pick<SolvedMazeRecord, 'maze' | 'result'>,
184
+ ): void {
185
+ const metrics = computeDashboardPathMetrics(solved.maze, solved.result);
186
+ blockLines.push(
187
+ context.formatStat(
188
+ C.LABEL_PATH_EFF,
189
+ `${metrics.optimalLength}/${metrics.pathLength} (${metrics.efficiencyPct}%)`,
190
+ colors.neonSilver,
191
+ colors.cyanNeon,
192
+ C.SOLVED_LABEL_WIDTH,
193
+ ),
194
+ );
195
+ blockLines.push(
196
+ context.formatStat(
197
+ C.LABEL_PATH_OVER,
198
+ `${metrics.overheadPct}% longer than optimal`,
199
+ colors.neonSilver,
200
+ colors.cyanNeon,
201
+ C.SOLVED_LABEL_WIDTH,
202
+ ),
203
+ );
204
+ blockLines.push(
205
+ context.formatStat(
206
+ C.LABEL_UNIQUE,
207
+ `${metrics.uniqueCellsVisited}`,
208
+ colors.neonSilver,
209
+ colors.cyanNeon,
210
+ C.SOLVED_LABEL_WIDTH,
211
+ ),
212
+ );
213
+ blockLines.push(
214
+ context.formatStat(
215
+ C.LABEL_REVISITS,
216
+ `${metrics.revisitedCells} times`,
217
+ colors.neonSilver,
218
+ colors.cyanNeon,
219
+ C.SOLVED_LABEL_WIDTH,
220
+ ),
221
+ );
222
+ blockLines.push(
223
+ context.formatStat(
224
+ C.LABEL_STEPS,
225
+ `${metrics.totalSteps}`,
226
+ colors.neonSilver,
227
+ colors.cyanNeon,
228
+ C.SOLVED_LABEL_WIDTH,
229
+ ),
230
+ );
231
+ blockLines.push(
232
+ context.formatStat(
233
+ C.LABEL_FITNESS,
234
+ `${metrics.fitnessValue.toFixed(2)}`,
235
+ colors.neonSilver,
236
+ colors.cyanNeon,
237
+ C.SOLVED_LABEL_WIDTH,
238
+ ),
239
+ );
240
+ }
241
+
242
+ function appendSolvedFooterAndEmit(
243
+ archiveFn: (...args: unknown[]) => void,
244
+ blockLines: string[],
245
+ ): void {
246
+ if (cachedSolvedFooterBorder === null) {
247
+ cachedSolvedFooterBorder = `${colors.blueCore}╚${NetworkVisualization.pad(
248
+ '═'.repeat(C.FRAME_INNER_WIDTH),
249
+ C.FRAME_INNER_WIDTH,
250
+ '═',
251
+ )}╝${colors.reset}`;
252
+ }
253
+
254
+ blockLines.push(cachedSolvedFooterBorder);
255
+ try {
256
+ const archiveEmitter = archiveFn as (
257
+ payload: string,
258
+ options?: { prepend?: boolean },
259
+ ) => void;
260
+ archiveEmitter(blockLines.join('\n'), { prepend: true });
261
+ } catch {
262
+ for (const lineValue of blockLines) {
263
+ archiveFn(lineValue);
264
+ }
265
+ }
266
+ blockLines.length = 0;
267
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Shared sizing, formatting, and top-N limits for the ASCII maze dashboard.
3
+ *
4
+ * These values are kept in one place so rendering, archive output, and
5
+ * telemetry helpers stay visually and semantically aligned.
6
+ */
7
+ export const DASHBOARD_MANAGER_CONSTANTS = {
8
+ HISTORY_MAX: 500,
9
+ FRAME_INNER_WIDTH: 148,
10
+ LEFT_PADDING: 7,
11
+ RIGHT_PADDING: 1,
12
+ CONTENT_WIDTH: 148 - 7 - 1,
13
+ STAT_LABEL_WIDTH: 28,
14
+ ARCHIVE_SPARK_WIDTH: 64,
15
+ GENERAL_SPARK_WIDTH: 64,
16
+ SOLVED_LABEL_WIDTH: 22,
17
+ HISTORY_EXPORT_WINDOW: 200,
18
+ SPARK_BLOCKS: Object.freeze(['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']),
19
+ DELTA_EPSILON: 1e-9,
20
+ TOP_OPERATOR_LIMIT: 6,
21
+ TOP_MUTATION_LIMIT: 8,
22
+ TOP_SPECIES_LIMIT: 5,
23
+ LAYER_INFER_LOOP_MULTIPLIER: 4,
24
+ LABEL_PATH_EFF: 'Path efficiency',
25
+ LABEL_PATH_OVER: 'Path overhead',
26
+ LABEL_UNIQUE: 'Unique cells visited',
27
+ LABEL_REVISITS: 'Cells revisited',
28
+ LABEL_STEPS: 'Steps',
29
+ LABEL_FITNESS: 'Fitness',
30
+ LABEL_ARCH: 'Architecture',
31
+ FRAME_SINGLE_LINE_CHAR: '═',
32
+ FRAME_BRIDGE_TOP: '╦════════════╦',
33
+ FRAME_BRIDGE_BOTTOM: '╩════════════╩',
34
+ EVOLVING_SECTION_LINE: '══════════════════════',
35
+ } as const;
@@ -0,0 +1,103 @@
1
+ import type {
2
+ AsciiMazeTelemetrySnapshot,
3
+ DashboardManagerContext,
4
+ DashboardManagerState,
5
+ DashboardManagerUpdateArgs,
6
+ } from './dashboardManager.types';
7
+ import { recordSolvedMaze } from './archive/dashboardManager.archive.services';
8
+ import { redrawDashboard as redrawDashboardLive } from './live/dashboardManager.live.services';
9
+ import {
10
+ emitTelemetryPayload,
11
+ getDashboardLastTelemetry as getDashboardLastTelemetrySnapshot,
12
+ updateTelemetryHistory,
13
+ } from './telemetry/dashboardManager.telemetry.services';
14
+
15
+ /**
16
+ * Repaint the live dashboard from current state and refresh the detailed snapshot.
17
+ *
18
+ * @param context - Dashboard runtime context for state and output callbacks.
19
+ * @param currentMaze - Maze currently being evolved.
20
+ * @param neat - Optional NEAT runtime instance used for detailed stats.
21
+ */
22
+ export function redrawDashboard(
23
+ context: DashboardManagerContext,
24
+ currentMaze: string[],
25
+ neat?: unknown,
26
+ ): void {
27
+ redrawDashboardLive(context, currentMaze, neat);
28
+ }
29
+
30
+ /**
31
+ * Ingest one engine update, refresh the live view, and emit external telemetry.
32
+ *
33
+ * @param context - Dashboard runtime context for state and output callbacks.
34
+ * @param args - Latest update payload from the evolution engine.
35
+ */
36
+ export function applyDashboardUpdate(
37
+ context: DashboardManagerContext,
38
+ args: DashboardManagerUpdateArgs,
39
+ ): void {
40
+ const { state } = context;
41
+ const { generation, maze, result, network, neatInstance, telemetryHook } =
42
+ args;
43
+
44
+ if (state.runStartTs == null) {
45
+ state.runStartTs = Date.now();
46
+ state.perfStart = globalThis.performance?.now?.() ?? state.runStartTs;
47
+ }
48
+
49
+ state.lastUpdateTs = globalThis.performance?.now?.() ?? Date.now();
50
+ state.lastGeneration = generation;
51
+
52
+ if (result) {
53
+ state.currentBest = { result, network, generation };
54
+ }
55
+
56
+ if (result?.success && network) {
57
+ recordSolvedMaze(context, maze, result, network, generation);
58
+ }
59
+
60
+ updateTelemetryHistory(state, neatInstance);
61
+ redrawDashboardLive(context, maze, neatInstance);
62
+ emitTelemetryPayload(state, generation, telemetryHook);
63
+ }
64
+
65
+ /**
66
+ * Produce the latest public telemetry snapshot from current dashboard state.
67
+ *
68
+ * @param state - Mutable dashboard state.
69
+ * @returns Public telemetry snapshot used by browser hosts.
70
+ */
71
+ export function getDashboardLastTelemetry(
72
+ state: DashboardManagerState,
73
+ ): AsciiMazeTelemetrySnapshot {
74
+ return getDashboardLastTelemetrySnapshot(state);
75
+ }
76
+
77
+ /**
78
+ * Clear retained archive, best-candidate, and history state for a fresh run.
79
+ *
80
+ * @param state - Mutable dashboard state to clear.
81
+ */
82
+ export function resetDashboardState(state: DashboardManagerState): void {
83
+ state.solvedMazes = [];
84
+ state.solvedMazeKeys.clear();
85
+ state.currentBest = null;
86
+ state.lastTelemetry = null;
87
+ state.lastBestFitness = null;
88
+ state.lastDetailedStats = null;
89
+ state.runStartTs = null;
90
+ state.perfStart = null;
91
+ state.lastGeneration = null;
92
+ state.lastUpdateTs = null;
93
+ state.histories.bestFitness = [];
94
+ state.histories.complexityNodes = [];
95
+ state.histories.complexityConns = [];
96
+ state.histories.hypervolume = [];
97
+ state.histories.progress = [];
98
+ state.histories.speciesCount = [];
99
+ state.scratch.scores.length = 0;
100
+ state.scratch.speciesSizes.length = 0;
101
+ state.scratch.operatorStats.length = 0;
102
+ state.scratch.mutationEntries.length = 0;
103
+ }