@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,342 @@
1
+ import type { PlaybackBackgroundSceneContext } from '../playback.background.types';
2
+
3
+ /**
4
+ * Narrow request required to render the playback ground grid.
5
+ *
6
+ * The ground grid only needs time and world-scroll context. That separation is
7
+ * deliberate: the lower-band renderer should respond to camera motion like a
8
+ * piece of scenic lighting, not reach into gameplay entities or playback HUD
9
+ * state.
10
+ */
11
+ export type PlaybackBackgroundGroundGridRequest = {
12
+ frameIndex: number;
13
+ scrollBasePx: number;
14
+ };
15
+
16
+ /**
17
+ * Lazy builder used when one horizontal geometry cache entry is missing.
18
+ *
19
+ * Horizontal depth bands depend only on stable scene dimensions, so callers can
20
+ * defer their construction until a cache miss proves the work is actually
21
+ * needed.
22
+ */
23
+ export type PlaybackGroundGridHorizontalGeometryFactory =
24
+ () => PlaybackGroundGridHorizontalGeometry;
25
+
26
+ /**
27
+ * Lazy builder used when one vertical geometry cache entry is missing.
28
+ *
29
+ * Vertical rays additionally depend on wrapped scroll state, so the cache keeps
30
+ * a compact builder hook rather than eagerly storing every possible cycle.
31
+ */
32
+ export type PlaybackGroundGridVerticalGeometryFactory =
33
+ () => PlaybackGroundGridVerticalGeometry;
34
+
35
+ /**
36
+ * Lazy builder used when one vertical scene-metrics cache entry is missing.
37
+ *
38
+ * Scene metrics such as projected anchor bounds are pure functions of the
39
+ * viewport, which makes them ideal cache inputs for the performance-sensitive
40
+ * lower-band renderer.
41
+ */
42
+ export type PlaybackGroundGridVerticalSceneMetricsFactory =
43
+ () => PlaybackGroundGridVerticalSceneMetrics;
44
+
45
+ /**
46
+ * Immutable scene context resolved for one lower-band ground-grid pass.
47
+ *
48
+ * This is the adapted subset of the shared background scene that the ground
49
+ * grid cares about: horizon position, lower-band bounds, and the centered
50
+ * vanishing point that gives the grid its forced-perspective look.
51
+ */
52
+ export type PlaybackBackgroundGroundGridSceneContext = {
53
+ viewportOffsetXPx: number;
54
+ visibleWorldWidthPx: number;
55
+ alignedHorizonYPx: number;
56
+ lowerBandTopYPx: number;
57
+ lowerBandHeightPx: number;
58
+ lowerBandBottomYPx: number;
59
+ vanishingPointXPx: number;
60
+ vanishingPointYPx: number;
61
+ };
62
+
63
+ /**
64
+ * Theme-owned style contract for the neon ground grid.
65
+ *
66
+ * The ground grid uses three coordinated colors: the structural line work, a
67
+ * fog wash that softens the lower band, and small pulse markers that briefly
68
+ * travel along eligible tracks.
69
+ */
70
+ export type PlaybackBackgroundGroundGridStyle = {
71
+ lineColor: string;
72
+ fogColor: string;
73
+ pulseFillColor: string;
74
+ };
75
+
76
+ /**
77
+ * Travel orientation used by lightweight pulse overlays.
78
+ *
79
+ * Horizontal pulses skim along depth bands, while vertical pulses ride the
80
+ * perspective rays toward or away from the horizon.
81
+ */
82
+ export type PlaybackGroundGridPulseOrientation = 'horizontal' | 'vertical';
83
+
84
+ /**
85
+ * Geometry and style package resolved before drawing the ground grid.
86
+ *
87
+ * Splitting scene resolution from drawing keeps canvas code simple: by the time
88
+ * the renderer runs, every geometric and palette decision has already been made
89
+ * and packed into one immutable object graph.
90
+ */
91
+ export type PlaybackBackgroundGroundGridResolvedScene = {
92
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
93
+ style: PlaybackBackgroundGroundGridStyle;
94
+ };
95
+
96
+ /**
97
+ * Declarative line segment model used by the ground-grid renderer.
98
+ *
99
+ * The grid is built as plain data first so batch builders can group segments by
100
+ * shared style before any canvas path or glow work happens.
101
+ */
102
+ export type PlaybackGroundGridLineSegment = {
103
+ startXPx: number;
104
+ startYPx: number;
105
+ endXPx: number;
106
+ endYPx: number;
107
+ alpha: number;
108
+ blurPx: number;
109
+ thicknessPx: number;
110
+ };
111
+
112
+ /**
113
+ * Ordered batch of line segments that share one render style.
114
+ *
115
+ * Grouping segments by alpha, blur, and thickness reduces canvas state churn
116
+ * and gives the renderer a natural place to cache `Path2D` instances when the
117
+ * environment supports them.
118
+ */
119
+ export type PlaybackGroundGridSegmentBatch = {
120
+ alpha: number;
121
+ blurPx: number;
122
+ path: Path2D | null;
123
+ thicknessPx: number;
124
+ segments: readonly PlaybackGroundGridLineSegment[];
125
+ };
126
+
127
+ /**
128
+ * Internal helper contract used while generating vertical-ray sub-segments.
129
+ *
130
+ * Each vertical ray is split into depth-aware pieces so stroke thickness and
131
+ * glow can evolve as the ray approaches the viewer instead of staying uniform.
132
+ */
133
+ export type PlaybackGroundGridVerticalRayInput = PlaybackGroundGridPulsePath & {
134
+ lineDepthRatio: number;
135
+ maximumDistanceToHorizonPx: number;
136
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
137
+ verticalSegmentCount: number;
138
+ };
139
+
140
+ /**
141
+ * Simplified path used by one visible pulse event.
142
+ *
143
+ * Pulses do not need the full batch geometry; they only need a single lane to
144
+ * travel along, represented here as a start-end segment plus local thickness.
145
+ */
146
+ export type PlaybackGroundGridPulsePath = {
147
+ orientation: PlaybackGroundGridPulseOrientation;
148
+ startXPx: number;
149
+ startYPx: number;
150
+ endXPx: number;
151
+ endYPx: number;
152
+ thicknessPx: number;
153
+ };
154
+
155
+ /**
156
+ * One visible pulse square rendered above the grid lines.
157
+ *
158
+ * These pulses are tiny accent lights, not gameplay markers. Their job is to
159
+ * give the lower band a hint of moving circuitry without competing with birds,
160
+ * pipes, or the active network HUD.
161
+ */
162
+ export type PlaybackGroundGridPulse = {
163
+ centerXPx: number;
164
+ centerYPx: number;
165
+ sizePx: number;
166
+ alpha: number;
167
+ };
168
+
169
+ /**
170
+ * Pure geometry bundle generated before canvas drawing begins.
171
+ *
172
+ * Horizontal bands, vertical rays, and the optional pulse are resolved into one
173
+ * package so the draw layer can stay strictly about paint order.
174
+ */
175
+ export type PlaybackGroundGridGeometry = {
176
+ horizontalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
177
+ pulse: PlaybackGroundGridPulse | null;
178
+ verticalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
179
+ };
180
+
181
+ /**
182
+ * Cached horizontal geometry bundle reused across matching scene sizes.
183
+ *
184
+ * Horizontal depth lines are stable for a given viewport, which makes them the
185
+ * cheapest part of the grid to cache aggressively.
186
+ */
187
+ export type PlaybackGroundGridHorizontalGeometry = {
188
+ horizontalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
189
+ horizontalLines: readonly PlaybackGroundGridLineSegment[];
190
+ preferredHorizontalPulsePaths: readonly PlaybackGroundGridPulsePath[];
191
+ };
192
+
193
+ /**
194
+ * Cached vertical geometry bundle reused across one wrapped scroll cycle.
195
+ *
196
+ * Vertical rays move with scroll, but only within a repeating wrapped cycle.
197
+ * Caching at that granularity captures most of the reuse without pretending the
198
+ * rays are globally static.
199
+ */
200
+ export type PlaybackGroundGridVerticalGeometry = {
201
+ verticalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
202
+ verticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
203
+ visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
204
+ };
205
+
206
+ /**
207
+ * Cached scene metrics reused across matching vertical-grid frames.
208
+ *
209
+ * These metrics answer the expensive geometric questions once per viewport,
210
+ * such as how wide the visible anchor span is and how many perspective lanes
211
+ * can fit while preserving the intended spacing.
212
+ */
213
+ export type PlaybackGroundGridVerticalSceneMetrics = {
214
+ visibleAnchorBounds: PlaybackGroundGridAnchorBounds;
215
+ totalVisibleLaneCount: number;
216
+ safeLaneSpacingPx: number;
217
+ };
218
+
219
+ /**
220
+ * Visible horizon bounds projected onto the bottom anchor line.
221
+ *
222
+ * Perspective rays begin conceptually at the horizon and terminate on the floor
223
+ * anchor line, so this structure captures the visible lane span after the
224
+ * horizon segment has been projected downward.
225
+ */
226
+ export type PlaybackGroundGridAnchorBounds = {
227
+ leftAnchorXPx: number;
228
+ rightAnchorXPx: number;
229
+ anchorSpanPx: number;
230
+ };
231
+
232
+ /**
233
+ * Input used when projecting a visible horizon span onto anchor space.
234
+ */
235
+ export type PlaybackGroundGridAnchorBoundsInput = {
236
+ horizonLeftXPx: number;
237
+ horizonRightXPx: number;
238
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
239
+ };
240
+
241
+ /**
242
+ * Input used when projecting one horizon x-position onto the floor anchor line.
243
+ */
244
+ export type PlaybackGroundGridAnchorProjectionInput = {
245
+ horizonXPx: number;
246
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
247
+ };
248
+
249
+ /**
250
+ * Wrapped vertical-cycle state derived from scroll for one frame.
251
+ *
252
+ * The perspective rays repeat on a fixed cycle. Wrapping the scroll state lets
253
+ * the renderer reuse cached geometry while still appearing to drift sideways.
254
+ */
255
+ export type PlaybackGroundGridVerticalCycleContext = {
256
+ wrappedOffsetPx: number;
257
+ safeLaneSpacingPx: number;
258
+ };
259
+
260
+ /**
261
+ * Input contract used while resolving one deterministic pulse event.
262
+ *
263
+ * Pulses are deterministic decoration: given the same frame and scene, the same
264
+ * lane should light up. This input bundle gathers the candidate paths needed to
265
+ * make that choice without consulting external state.
266
+ */
267
+ export type PlaybackGroundGridPulseInput = {
268
+ frameIndex: number;
269
+ horizontalPulsePaths: readonly PlaybackGroundGridPulsePath[];
270
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
271
+ visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
272
+ verticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
273
+ };
274
+
275
+ /**
276
+ * Timing state resolved for one deterministic ground-grid pulse slot.
277
+ *
278
+ * The slot model keeps pulse timing legible: each pulse has a start bucket, an
279
+ * elapsed time inside that bucket, and a normalized progress value used by the
280
+ * position and fade helpers.
281
+ */
282
+ export type PlaybackGroundGridPulseTimingState = {
283
+ pulseSlotIndex: number;
284
+ pulseElapsedMs: number;
285
+ lifetimeProgressRatio: number;
286
+ };
287
+
288
+ /**
289
+ * Direction and timing state used when resolving pulse travel progress.
290
+ *
291
+ * Some pulse lanes feel better moving away from the viewer and others toward
292
+ * it, so travel resolution keeps orientation and forward/reverse intent paired
293
+ * with the current lifetime progress.
294
+ */
295
+ export type PlaybackGroundGridPulseTravelRatioInput = {
296
+ directionIsForward: boolean;
297
+ lifetimeProgressRatio: number;
298
+ orientation: PlaybackGroundGridPulseOrientation;
299
+ };
300
+
301
+ /**
302
+ * Input used when adapting a pulse position into a local track thickness.
303
+ *
304
+ * Because the grid uses perspective-weighted stroke widths, the pulse size must
305
+ * be adjusted to the local lane thickness rather than using one fixed square.
306
+ */
307
+ export type PlaybackGroundGridPulseTrackThicknessInput = {
308
+ pulseCenterYPx: number;
309
+ pulsePath: PlaybackGroundGridPulsePath;
310
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
311
+ };
312
+
313
+ /**
314
+ * Cached continuation state used to keep one vertical pulse on the same ray.
315
+ *
316
+ * Without this continuity state a vertical pulse could jitter between adjacent
317
+ * rays across frames, which looks like noise instead of a deliberate light.
318
+ */
319
+ export type PlaybackGroundGridVerticalPulseContinuationState = {
320
+ centerXPx: number;
321
+ centerYPx: number;
322
+ frameIndex: number;
323
+ };
324
+
325
+ /**
326
+ * Helper alias used when adapting the shared background scene context.
327
+ *
328
+ * The parent background module owns the full sky-plus-ground scene contract;
329
+ * the grid renderer narrows that shape to only the fields needed for the lower
330
+ * band so the dependency direction stays clear.
331
+ */
332
+ export type PlaybackBackgroundGroundGridSourceScene = Pick<
333
+ PlaybackBackgroundSceneContext,
334
+ | 'viewportLeftXPx'
335
+ | 'visibleWorldWidthPx'
336
+ | 'alignedHorizonYPx'
337
+ | 'lowerBandTopYPx'
338
+ | 'lowerBandHeightPx'
339
+ | 'lowerBandBottomYPx'
340
+ | 'vanishingPointXPx'
341
+ | 'vanishingPointYPx'
342
+ >;
@@ -0,0 +1,10 @@
1
+ export {
2
+ interpolatePlaybackGroundGridPoint,
3
+ resolvePlaybackGroundGridDepthCurve,
4
+ resolvePlaybackGroundGridDepthFromHorizonDistance,
5
+ resolvePlaybackGroundGridLineAlpha,
6
+ resolvePlaybackGroundGridLineBlur,
7
+ resolvePlaybackGroundGridLineThickness,
8
+ } from './playback.background.ground-grid.math.utils';
9
+ export { resolvePlaybackGroundGridGeometry } from './playback.background.ground-grid.geometry.services';
10
+ export { resolvePlaybackGroundGridSceneContext } from './playback.background.ground-grid.scene.services';
@@ -0,0 +1,96 @@
1
+ import type {
2
+ PlaybackBackgroundLayout,
3
+ PlaybackBackgroundLayoutFactory,
4
+ } from './playback.background.types';
5
+
6
+ let cachedViewportSizeKey: string | null = null;
7
+
8
+ const cachedLayoutsByHeightPx = new Map<number, PlaybackBackgroundLayout>();
9
+ const cachedTileCoverageCountsByTileWidthPx = new Map<number, number>();
10
+
11
+ /**
12
+ * Ensures background caches only retain entries for the current viewport size.
13
+ *
14
+ * When the page size changes, cached geometry and coverage counts become
15
+ * obsolete because the background bands and tile coverage both depend on the
16
+ * current viewport dimensions.
17
+ *
18
+ * @param visibleWorldWidthPx - Current visible world width in pixels.
19
+ * @param visibleWorldHeightPx - Current visible world height in pixels.
20
+ * @returns Stable viewport-size cache key for the current frame.
21
+ */
22
+ export function ensurePlaybackBackgroundViewportCacheValidity(
23
+ visibleWorldWidthPx: number,
24
+ visibleWorldHeightPx: number,
25
+ ): string {
26
+ const viewportSizeKey = resolvePlaybackBackgroundViewportCacheKey(
27
+ visibleWorldWidthPx,
28
+ visibleWorldHeightPx,
29
+ );
30
+
31
+ if (cachedViewportSizeKey === viewportSizeKey) {
32
+ return viewportSizeKey;
33
+ }
34
+
35
+ cachedViewportSizeKey = viewportSizeKey;
36
+ cachedLayoutsByHeightPx.clear();
37
+ cachedTileCoverageCountsByTileWidthPx.clear();
38
+ return viewportSizeKey;
39
+ }
40
+
41
+ /**
42
+ * Resolves the stable viewport-size cache key used by background caches.
43
+ *
44
+ * @param visibleWorldWidthPx - Current visible world width in pixels.
45
+ * @param visibleWorldHeightPx - Current visible world height in pixels.
46
+ * @returns Cache key that changes whenever the page size changes.
47
+ */
48
+ export function resolvePlaybackBackgroundViewportCacheKey(
49
+ visibleWorldWidthPx: number,
50
+ visibleWorldHeightPx: number,
51
+ ): string {
52
+ return `${visibleWorldWidthPx}x${visibleWorldHeightPx}`;
53
+ }
54
+
55
+ /**
56
+ * Resolves cached background layout for the current viewport height.
57
+ *
58
+ * @param visibleWorldHeightPx - Current visible world height in pixels.
59
+ * @param factory - Lazy layout builder used when the cache misses.
60
+ * @returns Cached background layout for the current viewport size.
61
+ */
62
+ export function resolveCachedPlaybackBackgroundLayout(
63
+ visibleWorldHeightPx: number,
64
+ factory: PlaybackBackgroundLayoutFactory,
65
+ ): PlaybackBackgroundLayout {
66
+ const cachedLayout = cachedLayoutsByHeightPx.get(visibleWorldHeightPx);
67
+ if (cachedLayout) {
68
+ return cachedLayout;
69
+ }
70
+
71
+ const resolvedLayout = factory();
72
+ cachedLayoutsByHeightPx.set(visibleWorldHeightPx, resolvedLayout);
73
+ return resolvedLayout;
74
+ }
75
+
76
+ /**
77
+ * Resolves cached tile coverage count for one tile width.
78
+ *
79
+ * @param tileWidthPx - Width of one repeated starfield tile in pixels.
80
+ * @param factory - Lazy coverage builder used when the cache misses.
81
+ * @returns Cached tile coverage count for the active viewport width.
82
+ */
83
+ export function resolveCachedPlaybackTileCoverageCount(
84
+ tileWidthPx: number,
85
+ factory: () => number,
86
+ ): number {
87
+ const cachedCoverageCount =
88
+ cachedTileCoverageCountsByTileWidthPx.get(tileWidthPx);
89
+ if (cachedCoverageCount !== undefined) {
90
+ return cachedCoverageCount;
91
+ }
92
+
93
+ const resolvedCoverageCount = factory();
94
+ cachedTileCoverageCountsByTileWidthPx.set(tileWidthPx, resolvedCoverageCount);
95
+ return resolvedCoverageCount;
96
+ }
@@ -0,0 +1,127 @@
1
+ import { FLAPPY_NEON_PALETTE } from '../../../constants/constants';
2
+ import type { PlaybackHorizonStyle } from './playback.background.types';
3
+
4
+ /**
5
+ * Background layout ratio reserved for the starfield sky band.
6
+ *
7
+ * The top band intentionally occupies most of the scene so the future ground
8
+ * layer can take over the lower strip without competing with the stars.
9
+ */
10
+ export const FLAPPY_BACKGROUND_SKY_HEIGHT_RATIO = 2 / 3;
11
+
12
+ /**
13
+ * Minimum safe viewport dimension used by background render math (pixels).
14
+ *
15
+ * Canvas helpers in this module assume positive dimensions. Clamping tiny or
16
+ * temporarily zero-sized layouts to this floor prevents resize races from
17
+ * producing invalid cache keys or negative geometry.
18
+ */
19
+ export const FLAPPY_BACKGROUND_MIN_VIEWPORT_DIMENSION_PX = 1;
20
+
21
+ /**
22
+ * Index offset used to draw one extra tile before the visible left edge.
23
+ *
24
+ * Starting one tile early hides wrap seams when the parallax offset lands near
25
+ * a tile boundary and the camera reveals a sliver of content just off-screen.
26
+ */
27
+ export const FLAPPY_BACKGROUND_TILE_ROW_START_INDEX = -1;
28
+
29
+ /**
30
+ * Extra tile count rendered past the visible right edge for seamless wrap.
31
+ *
32
+ * The starfield is drawn as repeated cached strips. One buffered strip beyond
33
+ * the viewport prevents empty columns from appearing while the parallax offset
34
+ * advances between frames.
35
+ */
36
+ export const FLAPPY_BACKGROUND_TILE_ROW_BUFFER_COUNT = 1;
37
+
38
+ /**
39
+ * Half-thickness multiplier used to center the horizon line on the split.
40
+ *
41
+ * The layout computes the horizon around the sky/lower-band seam, so this
42
+ * multiplier converts stroke thickness into the offset needed to center the
43
+ * divider on that seam rather than placing it fully below it.
44
+ */
45
+ export const FLAPPY_BACKGROUND_HORIZON_HALF_THICKNESS_MULTIPLIER = 0.5;
46
+
47
+ /**
48
+ * Divisor used to detect odd stroke widths for pixel snapping.
49
+ *
50
+ * Canvas 2D strokes look soft when odd-width lines are left on whole pixels.
51
+ * This constant supports the classic half-pixel alignment check used to keep
52
+ * the horizon divider visually crisp.
53
+ */
54
+ export const FLAPPY_BACKGROUND_ODD_STROKE_DIVISOR = 2;
55
+
56
+ /**
57
+ * Pixel offset used to align odd-width strokes to the device pixel grid.
58
+ *
59
+ * Offsetting odd-width lines by half a pixel is a standard raster technique
60
+ * for reducing blur in canvas line rendering.
61
+ */
62
+ export const FLAPPY_BACKGROUND_ODD_STROKE_ALIGNMENT_OFFSET_PX = 0.5;
63
+
64
+ /**
65
+ * Composite mode used for standard opaque drawing passes.
66
+ *
67
+ * Most background passes should replace pixels normally so the scene remains
68
+ * predictable before selective glow passes are added on top.
69
+ */
70
+ export const FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER = 'source-over';
71
+
72
+ /**
73
+ * Composite mode used when stacking glow-heavy starfield layers.
74
+ *
75
+ * The background currently resets to ordinary compositing for main passes, but
76
+ * this constant documents the additive blend mode used when glow layers need to
77
+ * visually accumulate rather than overwrite one another.
78
+ */
79
+ export const FLAPPY_BACKGROUND_COMPOSITE_LIGHTER = 'lighter';
80
+
81
+ /**
82
+ * Transparent shadow color used to reset canvas glow state.
83
+ *
84
+ * Canvas shadow state is sticky, so explicit transparent resets prevent one
85
+ * glow-heavy pass from leaking blur into later solid fills or line work.
86
+ */
87
+ export const FLAPPY_BACKGROUND_TRANSPARENT_SHADOW_COLOR = 'transparent';
88
+
89
+ /**
90
+ * Thickness of the neon horizon divider line (pixels).
91
+ *
92
+ * A slightly heavier stroke helps the divider remain legible against both the
93
+ * starfield and the bright grid below it.
94
+ */
95
+ export const FLAPPY_BACKGROUND_HORIZON_LINE_THICKNESS_PX = 4;
96
+
97
+ /**
98
+ * Soft glow opacity applied during the horizon glow pass.
99
+ *
100
+ * The glow is intentionally strong enough to read as neon, but still shy of a
101
+ * full opaque bloom so the crisp core line remains visible.
102
+ */
103
+ export const FLAPPY_BACKGROUND_HORIZON_GLOW_ALPHA = 0.92;
104
+
105
+ /**
106
+ * Blur radius used to bloom the horizon divider glow (pixels).
107
+ *
108
+ * This is the main control for how far the horizon's light appears to bleed
109
+ * into the neighboring sky and ground bands.
110
+ */
111
+ export const FLAPPY_BACKGROUND_HORIZON_GLOW_BLUR_PX = 14;
112
+
113
+ /**
114
+ * Frozen neon paint bundle reused by the playback horizon renderer.
115
+ *
116
+ * Keeping this style object in the constants module prevents repeated
117
+ * allocation during every background frame while still keeping the palette
118
+ * centrally theme-owned.
119
+ */
120
+ export const FLAPPY_BACKGROUND_HORIZON_STYLE: PlaybackHorizonStyle =
121
+ Object.freeze({
122
+ lineColor: FLAPPY_NEON_PALETTE.horizonLine,
123
+ glowColor: FLAPPY_NEON_PALETTE.horizonGlow,
124
+ glowAlpha: FLAPPY_BACKGROUND_HORIZON_GLOW_ALPHA,
125
+ glowBlurPx: FLAPPY_BACKGROUND_HORIZON_GLOW_BLUR_PX,
126
+ lineThicknessPx: FLAPPY_BACKGROUND_HORIZON_LINE_THICKNESS_PX,
127
+ });