@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,181 @@
1
+ /**
2
+ * Public DashboardManager facade for the dedicated dashboardManager module boundary.
3
+ *
4
+ * The folder now owns local contracts, constants, pure formatting helpers, and
5
+ * stateful rendering and telemetry services. This facade keeps the established
6
+ * class-based API stable while delegating the heavy work to focused helpers.
7
+ */
8
+
9
+ import type Neat from '../../../../src/neat';
10
+ import { colors } from '../colors';
11
+ import type {
12
+ IDashboardManager,
13
+ IMazeRunResult,
14
+ INetwork,
15
+ } from '../interfaces';
16
+ import { NetworkVisualization } from '../networkVisualization';
17
+ import { DASHBOARD_MANAGER_CONSTANTS as C } from './dashboardManager.constants';
18
+ import {
19
+ applyDashboardUpdate,
20
+ getDashboardLastTelemetry,
21
+ redrawDashboard,
22
+ resetDashboardState,
23
+ } from './dashboardManager.services';
24
+ import type {
25
+ AsciiMazeTelemetrySnapshot,
26
+ DashboardArchiveFunction,
27
+ DashboardClearFunction,
28
+ DashboardLogFunction,
29
+ DashboardManagerContext,
30
+ DashboardManagerState,
31
+ DashboardTelemetryHook,
32
+ RuntimeDashboardManager,
33
+ } from './dashboardManager.types';
34
+ import { formatDashboardStat } from './dashboardManager.utils';
35
+
36
+ /**
37
+ * Rich ASCII maze dashboard used by browser and terminal example hosts.
38
+ *
39
+ * @remarks
40
+ * Create one instance per evolution run. The dashboard stores bounded history
41
+ * buffers and solved-archive output so a fresh instance gives the cleanest
42
+ * example lifecycle.
43
+ */
44
+ export class DashboardManager
45
+ implements IDashboardManager, RuntimeDashboardManager
46
+ {
47
+ /** Allow runtime host hooks such as `_telemetryHook`. */
48
+ [key: string]: unknown;
49
+
50
+ #state: DashboardManagerState = {
51
+ solvedMazes: [],
52
+ solvedMazeKeys: new Set(),
53
+ currentBest: null,
54
+ lastTelemetry: null,
55
+ lastBestFitness: null,
56
+ histories: {
57
+ bestFitness: [],
58
+ complexityNodes: [],
59
+ complexityConns: [],
60
+ hypervolume: [],
61
+ progress: [],
62
+ speciesCount: [],
63
+ },
64
+ lastDetailedStats: null,
65
+ runStartTs: null,
66
+ perfStart: null,
67
+ lastGeneration: null,
68
+ lastUpdateTs: null,
69
+ scratch: {
70
+ scores: [],
71
+ speciesSizes: [],
72
+ operatorStats: [],
73
+ mutationEntries: [],
74
+ },
75
+ };
76
+
77
+ #clearFn: DashboardClearFunction;
78
+ #logFn: DashboardLogFunction;
79
+ #archiveFn?: DashboardArchiveFunction;
80
+
81
+ /**
82
+ * Create a dashboard instance bound to the host's clear, live-log, and archive outputs.
83
+ *
84
+ * @param clearFn - Function that clears the live dashboard region.
85
+ * @param logFn - Function used for live framed dashboard lines.
86
+ * @param archiveFn - Optional function used for solved-maze archive output.
87
+ */
88
+ constructor(
89
+ clearFn: () => void,
90
+ logFn: (...args: unknown[]) => void,
91
+ archiveFn?: (...args: unknown[]) => void,
92
+ ) {
93
+ const noop = () => {};
94
+ this.#clearFn = typeof clearFn === 'function' ? clearFn : noop;
95
+ this.#logFn = typeof logFn === 'function' ? logFn : noop;
96
+ this.#archiveFn = typeof archiveFn === 'function' ? archiveFn : undefined;
97
+ }
98
+
99
+ /** Optional log function exposed for engine-side safe-writer fallbacks. */
100
+ get logFunction(): ((msg: string) => void) | undefined {
101
+ return this.#logFn as (msg: string) => void;
102
+ }
103
+
104
+ /**
105
+ * Clear and repaint the live dashboard using the current best candidate and histories.
106
+ *
107
+ * @param currentMaze - Maze currently shown in the live panel.
108
+ * @param neat - Optional NEAT instance used to enrich stats.
109
+ */
110
+ redraw(currentMaze: string[], neat?: unknown): void {
111
+ redrawDashboard(this.#createContext(), currentMaze, neat);
112
+ }
113
+
114
+ /**
115
+ * Ingest one evolution update, refresh the live dashboard, and emit telemetry.
116
+ *
117
+ * @param maze - Current maze layout.
118
+ * @param result - Latest run result for the tracked candidate.
119
+ * @param network - Candidate network used for the run.
120
+ * @param generation - Current generation number.
121
+ * @param neatInstance - Optional NEAT runtime used for advanced telemetry.
122
+ */
123
+ update(
124
+ maze: string[],
125
+ result: IMazeRunResult | undefined,
126
+ network: INetwork | null,
127
+ generation: number,
128
+ neatInstance?: Neat,
129
+ ): void {
130
+ applyDashboardUpdate(this.#createContext(), {
131
+ maze,
132
+ result,
133
+ network,
134
+ generation,
135
+ neatInstance,
136
+ telemetryHook: this._telemetryHook as DashboardTelemetryHook | undefined,
137
+ });
138
+ }
139
+
140
+ /**
141
+ * Return the latest public telemetry snapshot, including rich detail history when available.
142
+ *
143
+ * @returns Latest dashboard telemetry snapshot.
144
+ */
145
+ getLastTelemetry(): AsciiMazeTelemetrySnapshot {
146
+ return getDashboardLastTelemetry(this.#state);
147
+ }
148
+
149
+ /** Clear archive, current best, and telemetry state so the instance can be reused. */
150
+ reset(): void {
151
+ resetDashboardState(this.#state);
152
+ }
153
+
154
+ #createContext(): DashboardManagerContext {
155
+ return {
156
+ state: this.#state,
157
+ clearFn: this.#clearFn,
158
+ logFn: this.#logFn,
159
+ archiveFn: this.#archiveFn,
160
+ logBlank: () => this.#logBlank(),
161
+ formatStat: (
162
+ label: string,
163
+ value: string | number,
164
+ colorLabel?: string,
165
+ colorValue?: string,
166
+ labelWidth?: number,
167
+ ) =>
168
+ formatDashboardStat(label, value, colorLabel, colorValue, labelWidth),
169
+ };
170
+ }
171
+
172
+ #logBlank(): void {
173
+ this.#logFn(
174
+ `${colors.blueCore}║${NetworkVisualization.pad(
175
+ ' ',
176
+ C.FRAME_INNER_WIDTH,
177
+ ' ',
178
+ )}${colors.blueCore}║${colors.reset}`,
179
+ );
180
+ }
181
+ }
@@ -0,0 +1,267 @@
1
+ import type Neat from '../../../../src/neat';
2
+ import type {
3
+ IDashboardManager,
4
+ IMazeRunResult,
5
+ INetwork,
6
+ } from '../interfaces';
7
+
8
+ /** NEAT genome/network with runtime properties used by dashboard telemetry. */
9
+ export interface NeatGenome {
10
+ score?: number;
11
+ nodes?: Array<{ type?: string; [key: string]: unknown }>;
12
+ connections?: Array<{ enabled?: boolean; [key: string]: unknown }>;
13
+ [key: string]: unknown;
14
+ }
15
+
16
+ /** NEAT species collection entry surface used by dashboard telemetry. */
17
+ export interface NeatSpecies {
18
+ members?: unknown[];
19
+ length?: number;
20
+ [key: string]: unknown;
21
+ }
22
+
23
+ /** NEAT instance shape needed by dashboard helpers. */
24
+ export interface NeatInstance {
25
+ population?: NeatGenome[];
26
+ species?: NeatSpecies[];
27
+ getTelemetry?: () => unknown[];
28
+ getOperatorStats?: () => unknown[];
29
+ getMutationStats?: () => Record<string, number>;
30
+ getNoveltyArchive?: () => unknown[];
31
+ [key: string]: unknown;
32
+ }
33
+
34
+ /** Operator stats entry from NEAT. */
35
+ export interface OperatorStatsEntry {
36
+ name: string;
37
+ success: number;
38
+ attempts: number;
39
+ accepted?: number;
40
+ total?: number;
41
+ [key: string]: unknown;
42
+ }
43
+
44
+ export type NumericTelemetryMap = Record<string, number | null | undefined>;
45
+
46
+ export interface AsciiMazeComplexityStats extends NumericTelemetryMap {
47
+ meanNodes?: number | null;
48
+ meanConns?: number | null;
49
+ growthNodes?: number | null;
50
+ growthConns?: number | null;
51
+ }
52
+
53
+ export type MutationStatsMap = Record<string, unknown>;
54
+
55
+ /** Raw telemetry shape received from NEAT dashboard integrations. */
56
+ export interface DashboardTelemetry {
57
+ complexity?: AsciiMazeComplexityStats | null;
58
+ perf?: NumericTelemetryMap | null;
59
+ lineage?: NumericTelemetryMap | null;
60
+ diversity?: NumericTelemetryMap | null;
61
+ fronts?: ReadonlyArray<ReadonlyArray<unknown>> | null;
62
+ objectives?: NumericTelemetryMap | null;
63
+ hyper?: number | null;
64
+ mutationStats?: MutationStatsMap | null;
65
+ mutation?: { stats?: MutationStatsMap | null } | null;
66
+ species?: number | null;
67
+ saturationFraction?: number | null;
68
+ actionEntropy?: number | null;
69
+ populationMean?: number | null;
70
+ populationMedian?: number | null;
71
+ enabledConnRatio?: number | null;
72
+ bestFitness?: number | null;
73
+ bestFitnessDelta?: number | null;
74
+ topSpeciesSizes?: number[] | null;
75
+ noveltyArchiveSize?: number | null;
76
+ operatorAcceptance?: Array<{ name: string; acceptancePct: number }> | null;
77
+ topMutations?: Array<{ name: string; count: number }> | null;
78
+ trends?: {
79
+ fitness?: string | null;
80
+ nodes?: string | null;
81
+ conns?: string | null;
82
+ hyper?: string | null;
83
+ progress?: string | null;
84
+ species?: string | null;
85
+ } | null;
86
+ histories?: {
87
+ bestFitness?: number[];
88
+ nodes?: number[];
89
+ conns?: number[];
90
+ hyper?: number[];
91
+ progress?: number[];
92
+ species?: number[];
93
+ } | null;
94
+ timestamp?: number;
95
+ generation?: number;
96
+ }
97
+
98
+ /** Expanded telemetry details retained by the dashboard between redraws. */
99
+ export interface AsciiMazeDetailedStats {
100
+ generation: number;
101
+ bestFitness: number | null;
102
+ bestFitnessDelta: number | null;
103
+ saturationFraction: number | null;
104
+ actionEntropy: number | null;
105
+ populationMean: number | null;
106
+ populationMedian: number | null;
107
+ enabledConnRatio: number | null;
108
+ complexity: AsciiMazeComplexityStats | null;
109
+ simplifyPhaseActive: boolean;
110
+ perf: NumericTelemetryMap | null;
111
+ lineage: NumericTelemetryMap | null;
112
+ diversity: NumericTelemetryMap | null;
113
+ speciesCount: number | null;
114
+ topSpeciesSizes: number[] | null;
115
+ objectives: NumericTelemetryMap | null;
116
+ paretoFrontSizes: number[] | null;
117
+ firstFrontSize: number;
118
+ hypervolume: number | null;
119
+ noveltyArchiveSize: number | null;
120
+ operatorAcceptance: Array<{ name: string; acceptancePct: number }> | null;
121
+ topMutations: Array<{ name: string; count: number }> | null;
122
+ mutationStats: MutationStatsMap | null;
123
+ trends: {
124
+ fitness: string | null;
125
+ nodes: string | null;
126
+ conns: string | null;
127
+ hyper: string | null;
128
+ progress: string | null;
129
+ species: string | null;
130
+ };
131
+ histories: {
132
+ bestFitness: number[];
133
+ nodes: number[];
134
+ conns: number[];
135
+ hyper: number[];
136
+ progress: number[];
137
+ species: number[];
138
+ };
139
+ timestamp: number;
140
+ }
141
+
142
+ /** Public telemetry snapshot surfaced to browser consumers. */
143
+ export interface AsciiMazeTelemetrySnapshot {
144
+ generation: number;
145
+ bestFitness: number | null;
146
+ progress: number | null;
147
+ speciesCount: number | null;
148
+ gensPerSec: number;
149
+ timestamp: number;
150
+ details: AsciiMazeDetailedStats | null;
151
+ }
152
+
153
+ /** Telemetry payload emitted through events, postMessage, and runtime hooks. */
154
+ export interface DashboardTelemetryPayload {
155
+ type: 'asciiMaze:telemetry';
156
+ generation: number;
157
+ bestFitness: number | null;
158
+ progress: number | null;
159
+ speciesCount: number | null;
160
+ gensPerSec: number;
161
+ timestamp: number;
162
+ details: AsciiMazeDetailedStats | null;
163
+ }
164
+
165
+ /** Stored solved-maze archive entry. */
166
+ export interface SolvedMazeRecord {
167
+ maze: string[];
168
+ result: IMazeRunResult;
169
+ network: INetwork;
170
+ generation: number;
171
+ }
172
+
173
+ /** Latest best candidate used by live rendering and telemetry. */
174
+ export interface CurrentBestRecord {
175
+ result: IMazeRunResult;
176
+ network: INetwork | null;
177
+ generation: number;
178
+ }
179
+
180
+ /** Bounded numeric histories used for trends and exports. */
181
+ export interface DashboardHistoryState {
182
+ bestFitness: number[];
183
+ complexityNodes: number[];
184
+ complexityConns: number[];
185
+ hypervolume: number[];
186
+ progress: number[];
187
+ speciesCount: number[];
188
+ }
189
+
190
+ /** Reused scratch arrays to keep redraw allocations predictable. */
191
+ export interface DashboardScratchState {
192
+ scores: number[];
193
+ speciesSizes: number[];
194
+ operatorStats: OperatorStatsEntry[];
195
+ mutationEntries: [string, number][];
196
+ }
197
+
198
+ /** Mutable runtime state owned by one dashboard instance. */
199
+ export interface DashboardManagerState {
200
+ solvedMazes: SolvedMazeRecord[];
201
+ solvedMazeKeys: Set<string>;
202
+ currentBest: CurrentBestRecord | null;
203
+ lastTelemetry: DashboardTelemetry | null;
204
+ lastBestFitness: number | null;
205
+ histories: DashboardHistoryState;
206
+ lastDetailedStats: AsciiMazeDetailedStats | null;
207
+ runStartTs: number | null;
208
+ perfStart: number | null;
209
+ lastGeneration: number | null;
210
+ lastUpdateTs: number | null;
211
+ scratch: DashboardScratchState;
212
+ }
213
+
214
+ export type DashboardClearFunction = () => void;
215
+ export type DashboardLogFunction = (...args: unknown[]) => void;
216
+ export type DashboardArchiveFunction = (...args: unknown[]) => void;
217
+ export type DashboardTelemetryHook = (
218
+ payload: DashboardTelemetryPayload,
219
+ ) => void;
220
+
221
+ /** Shared runtime context passed into dashboard services. */
222
+ export interface DashboardManagerContext {
223
+ state: DashboardManagerState;
224
+ clearFn: DashboardClearFunction;
225
+ logFn: DashboardLogFunction;
226
+ archiveFn?: DashboardArchiveFunction;
227
+ logBlank: () => void;
228
+ formatStat: (
229
+ label: string,
230
+ value: string | number,
231
+ colorLabel?: string,
232
+ colorValue?: string,
233
+ labelWidth?: number,
234
+ ) => string;
235
+ }
236
+
237
+ /** Input accepted by the update orchestration service. */
238
+ export interface DashboardManagerUpdateArgs {
239
+ maze: string[];
240
+ result: IMazeRunResult | undefined;
241
+ network: INetwork | null;
242
+ generation: number;
243
+ neatInstance?: Neat;
244
+ telemetryHook?: DashboardTelemetryHook;
245
+ }
246
+
247
+ /**
248
+ * Shared presentation adapter used by browser and non-browser hosts.
249
+ *
250
+ * @remarks
251
+ * Host wiring should prefer this interface when it needs redraw and telemetry
252
+ * access without depending on the concrete `DashboardManager` implementation.
253
+ */
254
+ export interface DashboardPresentationAdapter extends IDashboardManager {
255
+ _telemetryHook?: DashboardTelemetryHook;
256
+ redraw?: (currentMaze: string[], neat?: unknown) => void;
257
+ getLastTelemetry?: () => AsciiMazeTelemetrySnapshot;
258
+ }
259
+
260
+ /**
261
+ * Compatibility alias for older runtime-facing imports.
262
+ *
263
+ * @remarks
264
+ * Step 7 promotes `DashboardPresentationAdapter` as the primary owner of this
265
+ * presentation seam while preserving the existing export name.
266
+ */
267
+ export interface RuntimeDashboardManager extends DashboardPresentationAdapter {}
@@ -0,0 +1,254 @@
1
+ import { colors } from '../colors';
2
+ import type { IMazeRunResult, INetwork } from '../interfaces';
3
+ import { MazeUtils } from '../mazeUtils';
4
+ import { NetworkVisualization } from '../networkVisualization';
5
+ import { DASHBOARD_MANAGER_CONSTANTS as C } from './dashboardManager.constants';
6
+
7
+ /**
8
+ * Format a single framed dashboard stat line with aligned label and value columns.
9
+ *
10
+ * @param label - Descriptive stat label.
11
+ * @param value - String or number value displayed after the label.
12
+ * @param colorLabel - Color token applied to the label segment.
13
+ * @param colorValue - Color token applied to the value segment.
14
+ * @param labelWidth - Fixed width used for the label column.
15
+ * @returns Ready-to-log framed stat line.
16
+ */
17
+ export function formatDashboardStat(
18
+ label: string,
19
+ value: string | number,
20
+ colorLabel = colors.neonSilver,
21
+ colorValue = colors.cyanNeon,
22
+ labelWidth: number = C.STAT_LABEL_WIDTH,
23
+ ): string {
24
+ const canonicalLabel = label.endsWith(':') ? label : `${label}:`;
25
+ const paddedLabel = canonicalLabel.padEnd(labelWidth, ' ');
26
+ const valueString = typeof value === 'number' ? `${value}` : String(value);
27
+ const coloredContent = `${colorLabel}${paddedLabel}${colorValue} ${valueString}${colors.reset}`;
28
+ return `${colors.blueCore}║${' '.repeat(C.LEFT_PADDING)}${NetworkVisualization.pad(
29
+ coloredContent,
30
+ C.CONTENT_WIDTH,
31
+ ' ',
32
+ 'left',
33
+ )}${' '.repeat(C.RIGHT_PADDING)}${colors.blueCore}║${colors.reset}`;
34
+ }
35
+
36
+ /**
37
+ * Convert the recent tail of a numeric series into a compact sparkline.
38
+ *
39
+ * @param series - Numeric history in chronological order.
40
+ * @param width - Maximum sample count included in the sparkline.
41
+ * @returns Unicode sparkline string.
42
+ */
43
+ export function buildDashboardSparkline(series: number[], width = 32): string {
44
+ if (!Array.isArray(series) || !series.length || width <= 0) return '';
45
+
46
+ const tailSlice = MazeUtils.tail<number>(series, width);
47
+ if (!tailSlice.length) return '';
48
+
49
+ const numericSamples = tailSlice.filter((sampleValue) =>
50
+ Number.isFinite(sampleValue),
51
+ );
52
+ if (!numericSamples.length) return '';
53
+
54
+ const minValue = Math.min(...numericSamples);
55
+ const maxValue = Math.max(...numericSamples);
56
+ const safeRange =
57
+ Math.abs(maxValue - minValue) < C.DELTA_EPSILON
58
+ ? C.DELTA_EPSILON
59
+ : maxValue - minValue;
60
+ const rampTopIndex = C.SPARK_BLOCKS.length - 1;
61
+
62
+ return numericSamples
63
+ .map((sampleValue) => {
64
+ const normalized = (sampleValue - minValue) / safeRange;
65
+ const blockIndex = Math.min(
66
+ rampTopIndex,
67
+ Math.max(0, Math.floor(normalized * rampTopIndex)),
68
+ );
69
+ return C.SPARK_BLOCKS[blockIndex];
70
+ })
71
+ .join('');
72
+ }
73
+
74
+ /**
75
+ * Build a lightweight dedupe key for a maze layout.
76
+ *
77
+ * @param maze - Maze rows in display order.
78
+ * @returns Joined maze key used by the solved archive.
79
+ */
80
+ export function getDashboardMazeKey(maze: string[]): string {
81
+ return maze.join('');
82
+ }
83
+
84
+ /**
85
+ * Compute solved-path efficiency and visitation metrics for archive output.
86
+ *
87
+ * @param maze - Maze layout containing start and exit markers.
88
+ * @param result - Run result with path, steps, and fitness.
89
+ * @returns Derived path metrics used by solved archive formatting.
90
+ */
91
+ export function computeDashboardPathMetrics(
92
+ maze: string[],
93
+ result: Pick<IMazeRunResult, 'path' | 'steps' | 'fitness'>,
94
+ ): {
95
+ optimalLength: number;
96
+ pathLength: number;
97
+ efficiencyPct: string;
98
+ overheadPct: string;
99
+ uniqueCellsVisited: number;
100
+ revisitedCells: number;
101
+ totalSteps: number;
102
+ fitnessValue: number;
103
+ } {
104
+ const startPosition = MazeUtils.findPosition(maze, 'S');
105
+ const exitPosition = MazeUtils.findPosition(maze, 'E');
106
+ const bfsLength = MazeUtils.bfsDistance(
107
+ MazeUtils.encodeMaze(maze),
108
+ startPosition,
109
+ exitPosition,
110
+ );
111
+ const optimalLength = typeof bfsLength === 'number' ? bfsLength : 0;
112
+ const pathLength = Math.max(0, result.path.length - 1);
113
+
114
+ let efficiencyPct = '0.0';
115
+ let overheadPct = '0.0';
116
+ if (pathLength > 0 && optimalLength > 0) {
117
+ const efficiency = Math.min(1, optimalLength / pathLength) * 100;
118
+ efficiencyPct = efficiency.toFixed(1);
119
+ overheadPct = ((pathLength / optimalLength) * 100 - 100).toFixed(1);
120
+ }
121
+
122
+ const uniqueCells = new Set<string>();
123
+ let revisitedCells = 0;
124
+ for (const [cellX, cellY] of result.path) {
125
+ const cellKey = `${cellX},${cellY}`;
126
+ if (uniqueCells.has(cellKey)) {
127
+ revisitedCells++;
128
+ continue;
129
+ }
130
+ uniqueCells.add(cellKey);
131
+ }
132
+
133
+ return {
134
+ optimalLength,
135
+ pathLength,
136
+ efficiencyPct,
137
+ overheadPct,
138
+ uniqueCellsVisited: uniqueCells.size,
139
+ revisitedCells,
140
+ totalSteps: result.steps,
141
+ fitnessValue: result.fitness,
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Infer a compact architecture string from a network-like runtime object.
147
+ *
148
+ * @param networkInstance - Network instance from the maze example runtime.
149
+ * @returns Architecture string such as `6 - 8 - 4`, or `n/a` when unavailable.
150
+ */
151
+ export function deriveDashboardArchitecture(
152
+ networkInstance?: INetwork | null,
153
+ ): string {
154
+ if (!networkInstance) return 'n/a';
155
+
156
+ const networkRecord = networkInstance as unknown as Record<string, unknown>;
157
+ const layerArray = networkRecord.layers;
158
+ if (Array.isArray(layerArray) && layerArray.length >= 2) {
159
+ const layerSizes = layerArray.map((layerValue) => {
160
+ const layerRecord = layerValue as Record<string, unknown>;
161
+ if (Array.isArray(layerRecord.nodes)) return layerRecord.nodes.length;
162
+ if (Array.isArray(layerValue)) return layerValue.length;
163
+ return 0;
164
+ });
165
+ return layerSizes.join(' - ');
166
+ }
167
+
168
+ const flatNodes = networkRecord.nodes;
169
+ if (Array.isArray(flatNodes)) {
170
+ type NodeWithType = {
171
+ type?: string;
172
+ connections?: { in?: Array<{ from?: unknown }> };
173
+ [key: string]: unknown;
174
+ };
175
+
176
+ const inputNodes = flatNodes.filter(
177
+ (nodeValue) => (nodeValue as NodeWithType).type === 'input',
178
+ );
179
+ const outputNodes = flatNodes.filter(
180
+ (nodeValue) => (nodeValue as NodeWithType).type === 'output',
181
+ );
182
+ const hiddenNodes = flatNodes.filter(
183
+ (nodeValue) => (nodeValue as NodeWithType).type === 'hidden',
184
+ );
185
+
186
+ if (!hiddenNodes.length) {
187
+ if (
188
+ typeof networkInstance.input === 'number' &&
189
+ typeof networkInstance.output === 'number'
190
+ ) {
191
+ return `${networkInstance.input} - ${networkInstance.output}`;
192
+ }
193
+ return `${inputNodes.length} - ${outputNodes.length}`;
194
+ }
195
+
196
+ const assignedNodes = new Set<unknown>(inputNodes);
197
+ let remainingHidden = hiddenNodes.slice();
198
+ const inferredHiddenSizes: number[] = [];
199
+ const safetyLimit = hiddenNodes.length * C.LAYER_INFER_LOOP_MULTIPLIER;
200
+ let iterationCount = 0;
201
+
202
+ while (remainingHidden.length && iterationCount < safetyLimit) {
203
+ iterationCount++;
204
+ const currentLayer = remainingHidden.filter((hiddenNode) => {
205
+ const hiddenNodeRecord = hiddenNode as NodeWithType;
206
+ return hiddenNodeRecord.connections?.in?.every((connectionValue) =>
207
+ assignedNodes.has(connectionValue.from),
208
+ );
209
+ });
210
+
211
+ if (!currentLayer.length) {
212
+ inferredHiddenSizes.push(remainingHidden.length);
213
+ break;
214
+ }
215
+
216
+ inferredHiddenSizes.push(currentLayer.length);
217
+ for (const currentNode of currentLayer) {
218
+ assignedNodes.add(currentNode);
219
+ }
220
+ remainingHidden = remainingHidden.filter(
221
+ (hiddenNode) => !assignedNodes.has(hiddenNode),
222
+ );
223
+ }
224
+
225
+ return [
226
+ `${inputNodes.length}`,
227
+ ...inferredHiddenSizes.map((hiddenSize) => `${hiddenSize}`),
228
+ `${outputNodes.length}`,
229
+ ].join(' - ');
230
+ }
231
+
232
+ if (
233
+ typeof networkInstance.input === 'number' &&
234
+ typeof networkInstance.output === 'number'
235
+ ) {
236
+ return `${networkInstance.input} - ${networkInstance.output}`;
237
+ }
238
+
239
+ return 'n/a';
240
+ }
241
+
242
+ /**
243
+ * Return the recent export window of a bounded numeric history buffer.
244
+ *
245
+ * @param history - History buffer in chronological order.
246
+ * @returns Independent tail slice suitable for telemetry export.
247
+ */
248
+ export function sliceDashboardHistoryForExport(
249
+ history: number[] | undefined | null,
250
+ ): number[] {
251
+ if (!Array.isArray(history) || !history.length) return [];
252
+ const startIndex = Math.max(0, history.length - C.HISTORY_EXPORT_WINDOW);
253
+ return history.slice(startIndex);
254
+ }