@the-inclusionist/engine 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/README.md +32 -1
  2. package/app/css/style.css +216 -42
  3. package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
  4. package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
  5. package/app/public/vendor/fonts.css +11 -1175
  6. package/dist-pkg/boot/create-game.d.ts +84 -33
  7. package/dist-pkg/boot/create-game.js +708 -307
  8. package/dist-pkg/core/a11y-sr.d.ts +1 -1
  9. package/dist-pkg/core/a11y-sr.js +3 -5
  10. package/dist-pkg/core/accommodations.d.ts +26 -8
  11. package/dist-pkg/core/accommodations.js +27 -10
  12. package/dist-pkg/core/actions.d.ts +39 -10
  13. package/dist-pkg/core/actions.js +28 -6
  14. package/dist-pkg/core/contract.d.ts +0 -2
  15. package/dist-pkg/core/contract.js +0 -2
  16. package/dist-pkg/core/i18n.d.ts +36 -71
  17. package/dist-pkg/core/i18n.js +131 -198
  18. package/dist-pkg/core/session-clock.d.ts +23 -0
  19. package/dist-pkg/core/session-clock.js +37 -0
  20. package/dist-pkg/i18n/en.js +44 -49
  21. package/dist-pkg/i18n/es.js +44 -49
  22. package/dist-pkg/i18n/pt.js +49 -54
  23. package/dist-pkg/input/gamepad.d.ts +42 -11
  24. package/dist-pkg/input/gamepad.js +50 -15
  25. package/dist-pkg/input/key-default.d.ts +30 -0
  26. package/dist-pkg/input/key-default.js +60 -0
  27. package/dist-pkg/input/keyboard-runtime.d.ts +0 -4
  28. package/dist-pkg/input/keyboard.d.ts +0 -1
  29. package/dist-pkg/input/keydown.d.ts +5 -11
  30. package/dist-pkg/input/keydown.js +3 -3
  31. package/dist-pkg/input/latch-edge.d.ts +10 -2
  32. package/dist-pkg/input/latch-edge.js +4 -3
  33. package/dist-pkg/input/latch-scope.d.ts +27 -22
  34. package/dist-pkg/input/latch-scope.js +25 -37
  35. package/dist-pkg/input/latch-store.d.ts +9 -12
  36. package/dist-pkg/input/latch-store.js +13 -18
  37. package/dist-pkg/input/latch-sync.d.ts +5 -4
  38. package/dist-pkg/input/latch-sync.js +5 -5
  39. package/dist-pkg/input/pad-reading.js +7 -2
  40. package/dist-pkg/input/pad-wizard.d.ts +4 -1
  41. package/dist-pkg/input/pad-wizard.js +60 -9
  42. package/dist-pkg/input/switch-scan.d.ts +29 -12
  43. package/dist-pkg/input/switch-scan.js +15 -2
  44. package/dist-pkg/input/touch-bindings.d.ts +3 -6
  45. package/dist-pkg/input/touch.d.ts +17 -2
  46. package/dist-pkg/input/touch.js +55 -17
  47. package/dist-pkg/input/transport-in-use.d.ts +5 -5
  48. package/dist-pkg/input/transport-in-use.js +5 -5
  49. package/dist-pkg/input/transports.d.ts +0 -9
  50. package/dist-pkg/input/transports.js +1 -1
  51. package/dist-pkg/input/virtual-controller.d.ts +39 -3
  52. package/dist-pkg/input/virtual-controller.js +32 -4
  53. package/dist-pkg/input/voice-map.d.ts +27 -11
  54. package/dist-pkg/input/voice-map.js +41 -43
  55. package/dist-pkg/platform/audio-ambient.d.ts +0 -1
  56. package/dist-pkg/platform/audio-ambient.js +3 -1
  57. package/dist-pkg/platform/audio-mixer.js +4 -9
  58. package/dist-pkg/platform/audio-sonar.d.ts +8 -94
  59. package/dist-pkg/platform/audio-sonar.js +22 -207
  60. package/dist-pkg/platform/audio.d.ts +10 -1
  61. package/dist-pkg/platform/audio.js +35 -2
  62. package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
  63. package/dist-pkg/platform/choose-by-voice.js +157 -0
  64. package/dist-pkg/platform/font-library.d.ts +77 -0
  65. package/dist-pkg/platform/font-library.js +98 -0
  66. package/dist-pkg/platform/font-library.json +721 -0
  67. package/dist-pkg/platform/heavy-catalogue.d.ts +46 -0
  68. package/dist-pkg/platform/heavy-catalogue.js +47 -14
  69. package/dist-pkg/platform/heavy-mirror.d.ts +3 -9
  70. package/dist-pkg/platform/heavy-mirror.js +14 -17
  71. package/dist-pkg/platform/heavy.d.ts +40 -8
  72. package/dist-pkg/platform/heavy.js +177 -22
  73. package/dist-pkg/platform/interruptible-speech.d.ts +15 -8
  74. package/dist-pkg/platform/interruptible-speech.js +37 -13
  75. package/dist-pkg/platform/listener-scope.js +22 -13
  76. package/dist-pkg/platform/locale-host.d.ts +7 -3
  77. package/dist-pkg/platform/locale-host.js +13 -2
  78. package/dist-pkg/platform/reading-in-worker.d.ts +24 -0
  79. package/dist-pkg/platform/reading-in-worker.js +38 -0
  80. package/dist-pkg/platform/reading-model.d.ts +21 -0
  81. package/dist-pkg/platform/reading-model.js +25 -0
  82. package/dist-pkg/platform/reading-runtime.js +13 -8
  83. package/dist-pkg/platform/reading.d.ts +12 -1
  84. package/dist-pkg/platform/reading.js +9 -1
  85. package/dist-pkg/platform/speech-recognition.d.ts +10 -1
  86. package/dist-pkg/platform/speech-recognition.js +29 -9
  87. package/dist-pkg/platform/speech.d.ts +10 -1
  88. package/dist-pkg/platform/speech.js +24 -13
  89. package/dist-pkg/platform/tts.d.ts +37 -4
  90. package/dist-pkg/platform/tts.js +279 -57
  91. package/dist-pkg/platform/voice-listener.d.ts +6 -2
  92. package/dist-pkg/platform/voice-listener.js +1 -1
  93. package/dist-pkg/platform/voice-plan.d.ts +13 -0
  94. package/dist-pkg/platform/voice-plan.js +57 -2
  95. package/dist-pkg/platform/vosk-runtime.d.ts +25 -0
  96. package/dist-pkg/platform/vosk-runtime.js +59 -1
  97. package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
  98. package/dist-pkg/platform/vosk-vocabulary.js +178 -0
  99. package/dist-pkg/render/crt.d.ts +11 -9
  100. package/dist-pkg/render/crt.js +6 -10
  101. package/dist-pkg/render/cvd-matrices.d.ts +5 -1
  102. package/dist-pkg/render/cvd-matrices.js +5 -1
  103. package/dist-pkg/render/high-contrast.d.ts +1 -2
  104. package/dist-pkg/render/high-contrast.js +5 -1
  105. package/dist-pkg/render/viz-axes.d.ts +9 -0
  106. package/dist-pkg/render/viz-axes.js +15 -2
  107. package/dist-pkg/ui/aac-sets.d.ts +29 -24
  108. package/dist-pkg/ui/aac-sets.js +22 -30
  109. package/dist-pkg/ui/audio-choices.d.ts +10 -5
  110. package/dist-pkg/ui/audio-choices.js +14 -10
  111. package/dist-pkg/ui/camera-control.d.ts +47 -0
  112. package/dist-pkg/ui/camera-control.js +35 -1
  113. package/dist-pkg/ui/declared-words.d.ts +21 -0
  114. package/dist-pkg/ui/declared-words.js +66 -0
  115. package/dist-pkg/ui/drawing-problems.js +4 -3
  116. package/dist-pkg/ui/eye-control.js +17 -17
  117. package/dist-pkg/ui/face-control.js +15 -15
  118. package/dist-pkg/ui/fonts.d.ts +42 -8
  119. package/dist-pkg/ui/fonts.js +58 -24
  120. package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
  121. package/dist-pkg/ui/footer-scroll-driver.js +201 -0
  122. package/dist-pkg/ui/footer-scroll.d.ts +38 -0
  123. package/dist-pkg/ui/footer-scroll.js +55 -0
  124. package/dist-pkg/ui/game-options.d.ts +14 -9
  125. package/dist-pkg/ui/game-options.js +41 -21
  126. package/dist-pkg/ui/hand-control.js +15 -15
  127. package/dist-pkg/ui/help-panel.d.ts +19 -8
  128. package/dist-pkg/ui/help-panel.js +15 -5
  129. package/dist-pkg/ui/hud-bands.d.ts +29 -12
  130. package/dist-pkg/ui/hud-bands.js +63 -25
  131. package/dist-pkg/ui/hud-row.d.ts +34 -0
  132. package/dist-pkg/ui/hud-row.js +80 -0
  133. package/dist-pkg/ui/hud.d.ts +0 -3
  134. package/dist-pkg/ui/layout.js +5 -2
  135. package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
  136. package/dist-pkg/ui/libras-avatar-clip.js +86 -0
  137. package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
  138. package/dist-pkg/ui/libras-avatar-load.js +134 -0
  139. package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
  140. package/dist-pkg/ui/libras-avatar-plan.js +211 -0
  141. package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
  142. package/dist-pkg/ui/libras-avatar-player.js +226 -0
  143. package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
  144. package/dist-pkg/ui/libras-avatar-stage.js +208 -0
  145. package/dist-pkg/ui/libras-glosses.d.ts +28 -0
  146. package/dist-pkg/ui/libras-glosses.js +161 -0
  147. package/dist-pkg/ui/menu-intent.d.ts +29 -0
  148. package/dist-pkg/ui/menu-intent.js +35 -1
  149. package/dist-pkg/ui/menu-items.d.ts +10 -0
  150. package/dist-pkg/ui/menu-items.js +29 -0
  151. package/dist-pkg/ui/menu-nav.d.ts +40 -4
  152. package/dist-pkg/ui/menu-nav.js +132 -47
  153. package/dist-pkg/ui/panel-widgets.d.ts +34 -0
  154. package/dist-pkg/ui/panel-widgets.js +86 -0
  155. package/dist-pkg/ui/pause-icons.d.ts +30 -14
  156. package/dist-pkg/ui/pause-icons.js +106 -45
  157. package/dist-pkg/ui/scan-overlay.d.ts +3 -3
  158. package/dist-pkg/ui/scan-overlay.js +11 -3
  159. package/dist-pkg/ui/screen-text.d.ts +25 -0
  160. package/dist-pkg/ui/screen-text.js +152 -0
  161. package/dist-pkg/ui/session-clock.d.ts +32 -0
  162. package/dist-pkg/ui/session-clock.js +67 -0
  163. package/dist-pkg/ui/settings-aac.d.ts +3 -1
  164. package/dist-pkg/ui/settings-aac.js +32 -13
  165. package/dist-pkg/ui/settings-audio.d.ts +10 -5
  166. package/dist-pkg/ui/settings-audio.js +101 -35
  167. package/dist-pkg/ui/settings-controls.d.ts +0 -4
  168. package/dist-pkg/ui/settings-mobility.d.ts +3 -6
  169. package/dist-pkg/ui/settings-mobility.js +4 -46
  170. package/dist-pkg/ui/settings-motion.js +2 -2
  171. package/dist-pkg/ui/settings-panel.d.ts +10 -0
  172. package/dist-pkg/ui/settings-panel.js +25 -1
  173. package/dist-pkg/ui/settings-typo.d.ts +5 -6
  174. package/dist-pkg/ui/settings-typo.js +20 -11
  175. package/dist-pkg/ui/settings-visual.js +2 -2
  176. package/dist-pkg/ui/shell.d.ts +1 -3
  177. package/dist-pkg/ui/shell.js +8 -4
  178. package/dist-pkg/ui/title.d.ts +2 -11
  179. package/dist-pkg/ui/title.js +39 -6
  180. package/dist-pkg/ui/top-band.d.ts +5 -3
  181. package/dist-pkg/ui/top-band.js +21 -25
  182. package/dist-pkg/ui/typo-choices.d.ts +3 -3
  183. package/dist-pkg/ui/typo-choices.js +9 -8
  184. package/dist-pkg/ui/vlibras.d.ts +71 -27
  185. package/dist-pkg/ui/vlibras.js +116 -44
  186. package/dist-pkg/ui/voice-control.d.ts +23 -1
  187. package/dist-pkg/ui/voice-control.js +149 -16
  188. package/dist-pkg/ui/voice-settings.d.ts +2 -3
  189. package/dist-pkg/ui/voice-settings.js +53 -3
  190. package/dist-pkg/ui/where-the-child-is.js +2 -2
  191. package/docs/CREDITS.md +122 -10
  192. package/docs/LICENSES.md +36 -7
  193. package/package.json +34 -9
  194. package/scripts/check-cartridge.mjs +78 -0
  195. package/scripts/game-build.d.mts +25 -0
  196. package/scripts/game-build.mjs +144 -0
  197. package/scripts/heavy-into-the-delivery.mjs +284 -40
  198. package/scripts/libras-avatar.json +680 -0
  199. package/scripts/libras-avatar.mjs +246 -0
  200. package/scripts/libras-glosses/gloss.py +95 -0
  201. package/scripts/libras-glosses/pyproject.toml +32 -0
  202. package/scripts/libras-glosses/uv.lock +781 -0
  203. package/scripts/libras-glosses.mjs +351 -0
  204. package/scripts/licences/OFL-1.1.txt +86 -0
  205. package/scripts/licences/UFL-1.0.txt +96 -0
  206. package/scripts/licences/fonts.mjs +389 -0
  207. package/scripts/licences/third-party.mjs +35 -21
  208. package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
  209. package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
  210. package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
  211. package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
  212. package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
  213. package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
  214. package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
  215. package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
  216. package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
  217. package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
  218. package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
  219. package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
  220. package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
  221. package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
  222. package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
  223. package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
  224. package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
  225. package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
  226. package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
  227. package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
  228. package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
  229. package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
  230. package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
  231. package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
  232. package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
  233. package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
  234. package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
  235. package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
  236. package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
  237. package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
  238. package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
  239. package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
  240. package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
  241. package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
  242. package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
  243. package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
  244. package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
  245. package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
  246. package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
  247. package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
  248. package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
  249. package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
  250. package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
  251. package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
  252. package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
  253. package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
  254. package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
  255. package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
  256. package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
  257. package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
  258. package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
  259. package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
  260. package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
  261. package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
  262. package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
  263. package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
  264. package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
  265. package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
  266. package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
  267. package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
  268. package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
  269. package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
  270. package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
  271. package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
  272. package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
  273. package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
  274. package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
  275. package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
  276. package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
  277. package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
  278. package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
  279. package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
  280. package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
  281. package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
  282. package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
  283. package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
  284. package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
  285. package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
  286. package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
  287. package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
  288. package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
  289. package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
  290. package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
  291. package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
  292. package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
  293. package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
  294. package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
  295. package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
  296. package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
  297. package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
  298. package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
  299. package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
  300. package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
  301. package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
  302. package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
  303. package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
  304. package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
  305. package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
  306. package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
  307. package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
  308. package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
  309. package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
  310. package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
  311. package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
  312. package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
  313. package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
  314. package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
  315. package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
  316. package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
  317. package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
  318. package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
  319. package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
  320. package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
  321. package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
  322. package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
  323. package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
  324. package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
  325. package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
  326. package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
  327. package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
  328. package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
  329. package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
  330. package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
  331. package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
  332. package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
  333. package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
  334. package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
  335. package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
  336. package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
  337. package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
  338. package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
  339. package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
  340. package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
  341. package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
  342. package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
  343. package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
  344. package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
  345. package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
  346. package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
  347. package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
  348. package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
  349. package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
  350. package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
  351. package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
  352. package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
  353. package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
  354. package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
  355. package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
  356. package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
  357. package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
  358. package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
  359. package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
  360. package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
  361. package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
  362. package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
  363. package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
  364. package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
  365. package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
  366. package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
  367. package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
  368. package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
  369. package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
  370. package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
  371. package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
  372. package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
  373. package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
  374. package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
  375. package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
  376. package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
  377. package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
  378. package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
  379. package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
  380. package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
  381. package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
  382. package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
  383. package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
  384. package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
  385. package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
  386. package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
  387. package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
  388. package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
  389. package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
  390. package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
  391. package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
  392. package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
  393. package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
  394. package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
  395. package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
  396. package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
  397. package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
  398. package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
  399. package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
  400. package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
  401. package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
  402. package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
  403. package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
  404. package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
  405. package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
  406. package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
  407. package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
  408. package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
  409. package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
  410. package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
  411. package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
  412. package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
  413. package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
  414. package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
  415. package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
  416. package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
  417. package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
  418. package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
  419. package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
  420. package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
  421. package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
  422. package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
  423. package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
  424. package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
  425. package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
  426. package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
  427. package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
  428. package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
  429. package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
  430. package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
  431. package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
  432. package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
  433. package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
  434. package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
  435. package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
  436. package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
  437. package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
  438. package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
  439. package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
  440. package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
  441. package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
  442. package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
  443. package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
  444. package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
  445. package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
  446. package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
  447. package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
  448. package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
  449. package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
  450. package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
  451. package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
  452. package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
  453. package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
  454. package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
  455. package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
  456. package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
  457. package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
  458. package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
  459. package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
  460. package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
  461. package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
  462. package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
  463. package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
  464. package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
  465. package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
  466. package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
  467. package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
  468. package/app/public/vendor/fonts/domine-var.woff2 +0 -0
  469. package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
  470. package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
  471. package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
  472. package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
  473. package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
  474. package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
  475. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  476. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  477. package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
  478. package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
  479. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  480. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  481. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  482. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  483. package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
  484. package/app/public/vendor/fonts/lora-var.woff2 +0 -0
  485. package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
  486. package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
  487. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  488. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  489. package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
  490. package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
  491. package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
  492. package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
  493. package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
  494. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  495. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  496. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  497. package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
  498. package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
  499. package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
  500. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  501. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  502. package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
  503. package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
  504. package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
  505. package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
  506. package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
  507. package/app/public/vendor/fonts/sora-var.woff2 +0 -0
  508. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  509. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  510. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  511. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  512. package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
  513. package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
  514. package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
  515. package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
  516. package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
  517. package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
  518. package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
  519. package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
  520. package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
  521. package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
  522. package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
  523. package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
  524. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  525. package/dist-pkg/platform/guide-intensity.d.ts +0 -39
  526. package/dist-pkg/platform/guide-intensity.js +0 -71
  527. package/dist-pkg/ui/latch-refusal.d.ts +0 -33
  528. package/dist-pkg/ui/latch-refusal.js +0 -60
package/docs/CREDITS.md CHANGED
@@ -61,10 +61,7 @@ Credit follows what was used. Until that date neural narration relied on:
61
61
  **Fangjun Kuang** ([@csukuangfj](https://github.com/csukuangfj)), who packaged Piper voices in the sherpa format.
62
62
  - **[Piper](https://github.com/rhasspy/piper)** (Michael Hansen / rhasspy, **MIT**) and the `@mintplex-labs/piper-tts-web` runtime (MIT).
63
63
  - **[eSpeak NG](https://github.com/espeak-ng/espeak-ng)** (**GPL-3.0**) — the voices' phonemization (`piper_phonemize`).
64
- ⚠️ **Staged for the mirror on 2026-09-22 and ON HOLD** (issue #192): the WebAssembly build of `espeak-ng` 1.0.2 sits in
65
- `the-inclusionist-lfs/espeak-ng-1.0.2/`, but the **matching source** the GPL requires beside it (`espeak-ng-1.0.2/source/`)
66
- has not been staged, so the upload script skips the folder. A binary served without its source would breach the licence,
67
- and a mirror is distribution. What `source/` needs is written in that folder's `LICENSE.md`.
64
+ It still phonemizes the neural voice, now in the project's own build (under Kokoro, below).
68
65
  - **The voices and their dataset licences**, read on 2026-09-14: `pt_BR-faber-medium` (NabuCasa/voice-datasets, CC0),
69
66
  `es_MX-claude-high` (HirCoir/Piper-TTS-Spanish, Apache-2.0), `en_US-amy-medium` (MycroftAI/mimic3-voices, «See URL»),
70
67
  `en_US-ryan-medium` (roholazandie/ryanspeech, CC BY-NC-SA 4.0). The Dev's answer on Ryan — «nosso projeto não tem fins
@@ -76,16 +73,21 @@ The weights are **Apache-2.0** (`huggingface.co/hexgrad/Kokoro-82M`), trained on
76
73
  audio: **Koniwa** (CC BY 3.0) and **SIWIS** (CC BY 4.0), credited here. The ONNX export used is `onnx-community/Kokoro-82M-v1.0-ONNX`.
77
74
 
78
75
  What speaks it, fetched by the engine beside the model: **[eSpeak NG](https://github.com/espeak-ng/espeak-ng)**
79
- (`espeak-ng` 1.0.2, **GPL-3.0-or-later**) turns the sentence into phonemes, and
76
+ (by Jonathan Duddington, Reece H. Dunn and its contributors; **GPL-3.0-or-later**) turns the sentence into phonemes, and
80
77
  **[ONNX Runtime Web](https://github.com/microsoft/onnxruntime)** (`onnxruntime-web` 1.27.0, **MIT**, Microsoft) runs the graph.
81
78
 
82
79
  - **Kokoro-82M** (catalogue `voz:kokoro:*`: the fp32 model, the tokenizer and one style table per voice) — **Apache-2.0**.
83
80
  Licence statement and NOTICE: `the-inclusionist-lfs/kokoro-82m-v1.0-onnx/LICENSE.md` and `NOTICE.md`; the Apache-2.0 text
84
81
  itself is upstream (`huggingface.co/hexgrad/Kokoro-82M`), not held in that folder.
85
- - **eSpeak NG in WebAssembly** (catalogue `voz:runtime:fonemas*`: `espeak-ng.js` and `espeak-ng.wasm` from the npm package
86
- `espeak-ng` 1.0.2, built by the `ianmarmour/espeak-ng.js` repository) — **GPL-3.0-or-later**, as its `package.json`
87
- declares. The package carries the GPL-3.0 text (`LICENSE`) and no copyright line of its own; the eSpeak NG revision the
88
- build was made from is not stated in the package. The source obligation is the one written under Piper above.
82
+ - **eSpeak NG in WebAssembly** (catalogue `voz:runtime:fonemas*`: `espeak-ng.js` and `espeak-ng.wasm`) — **GPL-3.0-or-later**,
83
+ **built by the project** from eSpeak NG commit `530bf0ab` (issue #192) with `scripts/models/build-espeak-ng.ps1`, which pins
84
+ that commit, the Emscripten image and every flag; its data is cut to the pt, es and en voices (and the de and fr
85
+ dictionaries Portuguese hands words to). It replaces the npm package `espeak-ng` 1.0.2 (`ianmarmour/espeak-ng.js`), whose
86
+ eSpeak NG revision the package never stated: built from `530bf0ab`, the project's build carries that package's data byte for
87
+ byte and gives the same phonemes (`docs/6-DevOps-SRE/models.md`). **Corresponding Source** (GPL-3.0 §6): the commit and the
88
+ recipe, both staged beside the build in `the-inclusionist-lfs/espeak-ng-530bf0a/corresponding-source/` with `LICENSE`, `NOTICE` and a
89
+ `LICENSE.md` naming them; every delivery's folder carries a `SOURCE` note saying where they are
90
+ (`scripts/licences/third-party.mjs`). The copyright lines are those of the C files compiled into it, listed in its `NOTICE`.
89
91
  - **ONNX Runtime Web** (catalogue `voz:runtime:onnx*`: `ort.webgpu.bundle.min.mjs` and the `ort-wasm-simd-threaded.jsep` pair)
90
92
  — **MIT**. The bundle's own header: «Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT
91
93
  License.» Mirror notice: `the-inclusionist-lfs/onnxruntime-web-1.27.0/LICENSE.md`; the MIT text itself is upstream
@@ -93,7 +95,7 @@ What speaks it, fetched by the engine beside the model: **[eSpeak NG](https://gi
93
95
 
94
96
  > The voice's files are **downloaded once** — by the build into the delivery's `heavy/` folder, and from there into the
95
97
  > device's cache — and run **100% locally** afterwards: no child's audio leaves the device. See ADR-0216 (the engine loads
96
- > the voice), ADR-0198 and ADR-0207 in `the-inclusionist-docs · docs/2-Architecture/adr/`.
98
+ > the voice), ADR-0198 and ADR-0207 in `docs/2-Architecture/adr/`.
97
99
 
98
100
  ## The other runtimes and models the engine downloads
99
101
 
@@ -183,6 +185,116 @@ The command models (catalogue `commands:model:*`): `vosk-model-small-pt-0.3`, `v
183
185
  - **Copyright lines, as each archive's `README` states them:** en-us 0.15 «Copyright 2020 Alpha Cephei Inc»; es 0.42
184
186
  «Copyright 2022-2050 AC Technologies LLC»; pt 0.3 **none** (its `README` says only what the model is).
185
187
 
188
+ ## VLibras translator — LAViD-UFPB `vlibras-translator` 1.3.3 — LGPL-3.0 — BUILD TIME ONLY
189
+
190
+ What turns the Portuguese a child is shown into the Libras glosses the player signs (ADR-0234, plan item 5b):
191
+ `inclusionist-heavy --libras` runs it once, on the build machine, over the engine's Portuguese dictionary and the game's
192
+ (`scripts/libras-glosses.mjs`, `scripts/libras-glosses/gloss.py`), in its **rule-based mode only** — the neural mode fetches a
193
+ model that declares no licence, and is never asked for. Published on test.pypi.org only; pinned with its hashes in
194
+ `scripts/libras-glosses/uv.lock`.
195
+
196
+ - **Licence:** **LGPL-3.0**, the `LICENSE` in its 1.3.3 source distribution.
197
+ - **Distributed: none of it.** It runs in an environment outside the repository and nothing of it enters a delivery or the npm
198
+ package; what a delivery carries is its OUTPUT, `libras/avatar/glosses.json`.
199
+ - **Copyright line** as its sources state it: «Copyright (c) Laboratório de Aplicações de Vídeo Digital - LAViD».
200
+
201
+ ## VLibras sign sources — LAViD-UFPB `vlibras-dictionary-sources`, `.blend` files — GPL-3.0 — EXPORTED, DISTRIBUTED BY `--libras`
202
+
203
+ What the Libras player deaf mode signs with is built from (ADR-0234, route B, phase B1; the engine's interpreter since phase B3): each sign's Blender 2.79 source,
204
+ `FILES/BLENDS/BR/<NAME>.blend` of the same repository at the same commit `f8ddb378affd0d6da42f04c9fc888dafe1cc1299` — the whole
205
+ avatar (meshes, armature, shape keys, materials) plus one Action named after the sign. Only the signs the engine's glosses use
206
+ and the manual alphabet's letters the player fingerspells from: **655 files, 1,194,114,310 bytes** — the 632 of the glosses
207
+ (1,141,253,870 bytes, with A, D, M and O among them) and the alphabet's 23 other letters, B–Z but those four, and Ç
208
+ (52,860,440 bytes) — each pinned by sha256 and byte count in `scripts/libras-export/sources.json`. Downloaded with the Dev's
209
+ permission (route B's first step; the 23 letters on 2026-09-25) into a folder outside the repository; none is committed.
210
+
211
+ - **Licence:** the repository declares **GPL-3.0**. What `scripts/libras-export.mjs` makes of them — **one avatar**
212
+ (`avatar.glb`, glTF 2.0) and **one clip per sign** (three.js AnimationClip JSON) — are **derivatives under GPL-3.0**, and a
213
+ delivery that carries them carries the GPL-3.0 text and a NOTICE naming the pinned source.
214
+ - **Corresponding source of the exports:** the pinned `.blend` files plus `scripts/libras-export.mjs` and
215
+ `scripts/libras-export/export.py`, run with the Blender version the export's `manifest.json` names (5.2.2 LTS for the first
216
+ export).
217
+ - **Changed by this project**, all in the export, none in the sources: the avatar's Blender Internal materials rebuilt as one
218
+ colour each, with the head's and the body's image (`cabecaAvatarCartoon.png`, `TxCorpo.png`) taken from the sign file `0`,
219
+ one of the twelve that pack them — most files only point at them by a path on LAViD's machines; the hair's normal map, which
220
+ no file carries, and two secondary texture slots are left out; the sign's constraints baked into bone tracks and its face's
221
+ driver-moved shape keys sampled into morph tracks; keys reduced within a stated tolerance; node names as three.js's glTF
222
+ loader renames them.
223
+ - **Distributed: by a delivery built with `inclusionist-heavy --libras`** (phase B3): the avatar and 655 clips — the
224
+ 632 signs of the first export and the manual alphabet's 23 other letters — **34,283,274 bytes**, each pinned by sha256 in
225
+ `scripts/libras-avatar.json`, into `libras/avatar/` with the
226
+ GPL-3.0 text and a NOTICE naming LAViD, the pinned commit and where the Corresponding Source is (`scripts/libras-avatar.mjs`).
227
+ The npm package carries none of them. One clip is played from a later point than its file starts: FALA's `.blend` action
228
+ begins at a stray keyframe 1404 frames before the sign, and the pins name the sign's start (46.8 s) with why.
229
+ - **Copyright line: UNVERIFIED** — the `.blend` files carry none that was read, and the repository's own `LICENSE` and README
230
+ were not read.
231
+
232
+ ## three.js 0.186.1 — mrdoob and the three.js authors — MIT
233
+
234
+ What the free Libras player of route B draws with (ADR-0234 errata, route B, phase B2; the Dev decided it on 2026-09-25): the
235
+ `three` npm package, the one run-time `dependency` of the engine, pinned to exactly `0.186.1`. Only `app/js/ui/libras-avatar-stage.ts`
236
+ imports it — `three` and its glTF loader, `three/addons/loaders/GLTFLoader.js` — and only the player's dynamic `import()` reaches
237
+ that module, at the first sign in deaf mode; a bundler cuts it into a chunk of its own (627 KB, 158 KB gzip), which the service
238
+ worker does not precache.
239
+
240
+ - **Licence:** **MIT** («Copyright © 2010-2026 three.js authors», the package's `LICENSE`). The npm package names it as a
241
+ dependency, so a consumer's `node_modules/three` carries that `LICENSE`. The built chunk carries the notice too: the build
242
+ keeps legal comments (`comments: { legal: true }` in `vite.config.ts`), and 📏 the minified
243
+ `assets/libras-avatar-stage-<hash>.js` holds three.js's two `@license` headers (it held none before the setting; gate
244
+ `tests/three-arrives-late.node.test.js`). A game that bundles the engine with its own build keeps the notice only if its
245
+ bundler keeps legal comments too.
246
+ - **Types:** not `@types/three` (not authorised); `app/js/ui/three-subset.d.ts` declares the few classes the stage uses, written
247
+ here from three.js's documentation.
248
+ - **Changed by this project:** nothing.
249
+
250
+ ## spaCy and its Portuguese model `pt_core_news_md` 3.8.0 — MIT and CC BY-SA 4.0 — BUILD TIME ONLY
251
+
252
+ The Portuguese pipeline the translator's rules read (part of speech, morphology, dependencies, entities): spaCy 3.8 (Explosion,
253
+ **MIT**) and the model `pt_core_news_md` 3.8.0 (Explosion, **CC BY-SA 4.0**, from the GitHub release of `explosion/spacy-models`),
254
+ both pinned in `scripts/libras-glosses/uv.lock` with the other Python packages they pull.
255
+
256
+ - **Distributed: none of it** — build time only, outside the repository, like the translator.
257
+ - ⚠️ **Whether a gloss the model helped produce is a derivative of the model** (and so under CC BY-SA 4.0) is **not determined**;
258
+ this project believes it is not, and that is not a legal opinion. The glosses a delivery writes say what made them
259
+ (`"made"` in `glosses.json`).
260
+
261
+ ## Fonts — the engine's 19 families and the font library's 194 — SIL OFL 1.1, Apache-2.0 and the Ubuntu Font Licence 1.0
262
+
263
+ Two homes since ADR-0255:
264
+
265
+ - **The engine's own faces** — every family `app/public/vendor/fonts.css` declares, 19 families in 29 `.woff2` files in
266
+ `app/public/vendor/fonts/`: Atkinson Hyperlegible, Atkinson Hyperlegible Mono (Braille Institute), Andika (SIL), Lexend (the
267
+ Lexend Project) and the fifteen Playwrite hands the typography button can pick (TypeTogether), the latin and latin-ext subsets
268
+ `fonts.gstatic.com` serves. The service worker precaches them into every install and the npm package ships them, so each copy
269
+ of the engine redistributes them; `app/public/vendor/fonts-licences/NOTICE.txt` lists each family's copyright line as read
270
+ from the font, beside `OFL-1.1.txt`. All 19 are under the **SIL OFL 1.1**.
271
+ - **The font library** — every other family, 194 in 291 files, one folder per family in `the-inclusionist-lfs/fonts/`, each
272
+ folder with its licence text, a `NOTICE.txt` and a `SHA256SUMS`, catalogued with each face's sha256 in
273
+ `app/js/platform/font-library.json`. A delivery carries only the families its games declare (`inclusionist-heavy --fonts`),
274
+ each with the same licence text and notice.
275
+
276
+ - **Licences, as each font states its own** (name IDs 14, 13 and 0 of its `name` table, read on 2026-09-27): **SIL OFL 1.1**
277
+ for every family but three, all in the library: **Apache-2.0** for Luckiest Guy and Smokum (Brian J. Bonislawsky DBA
278
+ Astigmatic) and the **Ubuntu Font Licence 1.0** for Ubuntu (Canonical Ltd.). ⚠️ The typographic catalogue
279
+ (`research/catalogo_tipografico.json`) records «OFL 1.1» for those three as well; the fonts say otherwise, and the fonts are
280
+ what ships.
281
+ - **Three families stated no licence in their files** — iA Writer Quattro, Monoton and Yatra One — and LEFT the package on
282
+ 2026-09-27 until their licence is established (ADR-0251); none is declared by hand any more.
283
+ - **Licence texts:** the web subsets strip the licence text (only OpenDyslexic keeps it, in name ID 13), so the texts travel as
284
+ files, kept in `scripts/licences/` and copied beside every family — `OFL-1.1.txt` (copied from OpenDyslexic's licence field,
285
+ byte-identical to three upstream `OFL.txt` copies held locally), `Apache-2.0.txt` (the heavy files' text) and `UFL-1.0.txt`
286
+ (decoded from the Debian `fonts-ubuntu` package's copyright file, and verified byte for byte on 2026-09-27 against
287
+ `google/fonts` `ufl/ubuntu/UFL.txt`).
288
+ - **Reserved Font Names (ADR-0254):** the 21 library families whose name is a Reserved Font Name — Lato, Lora, OpenDyslexic,
289
+ Playfair Display, Press Start 2P, Quicksand, Source Sans 3, Source Serif 4, UnifrakturMaguntia, Abril Fatface, Alfa Slab One,
290
+ Bowlby One SC, Cookie, Lilita One, Lobster, Monofett, Petit Formal Script, Plaster, Ranchers, Sancreek, Titan One — and Ubuntu
291
+ are their AUTHORS' ORIGINALS: OpenDyslexic its author's `compiled/OpenDyslexic-Regular.woff2` (antijingoist/opendyslexic),
292
+ the others the files `google/fonts` distributes, converted to WOFF2 by compression alone (every table byte-identical to the
293
+ author's but the two `head` fields WOFF2 writes, and without the `DSIG` a WOFF2 cannot carry), each folder with the author's
294
+ `OFL.txt` or `UFL.txt` beside its own. **Merriweather** is no longer offered: its original is a 4.5 MB variable font. The
295
+ other library families are the Google Fonts web subsets, none of them presented under a Reserved Font Name (ADR-0254 measured
296
+ the 22 that were).
297
+
186
298
  ## Arrow icons — Lucide, derived from Feather (Cole Bemis) — MIT
187
299
 
188
300
  The eye control draws four arrows over the game (`app/js/ui/gaze-overlay.ts`): Lucide's `arrow-up`, `arrow-right`, `arrow-down` and
package/docs/LICENSES.md CHANGED
@@ -63,8 +63,9 @@ request `g` of the filing asks to be put on record: the itemized list of those e
63
63
  - **Third-party code** — eSpeak NG (GPL-3.0). Clarity (MIT) left this repository with the platformer, and its
64
64
  credit travels with `game-platformer`; Piper and sherpa-onnx left (ADR-0207). Detail and attribution in
65
65
  [`CREDITS.md`](CREDITS.md).
66
- The engine itself loads the neural voice's runtime (ADR-0216): `espeak-ng` 1.0.2 (eSpeak NG in WebAssembly,
67
- **GPL-3.0-or-later**, compatible with the AGPL-3.0-or-later) and `onnxruntime-web` 1.27.0 (**MIT**) are catalogued
66
+ The engine itself loads the neural voice's runtime (ADR-0216): eSpeak NG in WebAssembly (**GPL-3.0-or-later**,
67
+ compatible with the AGPL-3.0-or-later; built by the project from commit `530bf0ab` with `scripts/models/build-espeak-ng.ps1`,
68
+ which with that commit is its Corresponding Source, issue #192) and `onnxruntime-web` 1.27.0 (**MIT**) are catalogued
68
69
  heavy files (`app/js/platform/heavy-catalogue.ts`), fetched by the build into the delivery's `heavy/` folder and read
69
70
  from the page's own origin — only for a game that declares `uses: { neuralVoice: true }`. The published npm package
70
71
  carries neither. The other runtimes and models in the same catalogue, each credited in `CREDITS.md`:
@@ -73,20 +74,48 @@ request `g` of the filing asks to be put on record: the itemized list of those e
73
74
  here): **MIT**;
74
75
  - **commands** — the Vosk browser runtime built here from vosk-browser, vosk-api and Kaldi: **Apache-2.0**, with the
75
76
  BSD, Zlib and MIT parts its `NOTICE` lists; the Vosk small models (pt, en-us, es): **Apache-2.0**.
77
+ - **Libras** — the Libras player deaf mode signs with (ADR-0234, route B), only in a delivery built with
78
+ `inclusionist-heavy --libras`: one avatar and one clip per sign, which `scripts/libras-export.mjs` exports from LAViD's
79
+ `vlibras-dictionary-sources` `.blend` files (**GPL-3.0**, pinned in `scripts/libras-export/sources.json`) — **GPL-3.0
80
+ derivatives** whose Corresponding Source is those `.blend` files plus the two export scripts. The delivery carries them
81
+ (`libras/avatar/`, pinned in `scripts/libras-avatar.json`) with the GPL-3.0 text and a NOTICE naming that source; the npm
82
+ package carries none. **Nothing closed and nothing patched is served**: the VLibras Unity player of route A — Unity
83
+ Technologies' proprietary runtime, with its `eval` rewritten at delivery time — was a declared, temporary exception, and
84
+ it left the engine and the delivery in phase B3.
85
+ The Libras **glosses** that delivery carries (`libras/avatar/glosses.json`) are made at build time by LAViD's
86
+ `vlibras-translator` 1.3.3 (**LGPL-3.0**, rule-based mode only) over spaCy (**MIT**) and its Portuguese model
87
+ `pt_core_news_md` 3.8.0 (**CC BY-SA 4.0**) — tools the build machine runs, **none of which is distributed**
88
+ (`scripts/libras-glosses/`). Whether a gloss is a derivative of the model is **not determined**; the project believes it
89
+ is not, which is not a legal opinion. See `CREDITS.md`.
90
+ The player that draws the avatar runs on **three.js** 0.186.1 (**MIT**), the engine's one run-time npm `dependency`,
91
+ pinned exactly and reached only by a dynamic `import()` at the first sign in deaf mode (ADR-0234 errata); the built chunk
92
+ that carries it keeps three.js's `@license` headers (`CREDITS.md`).
76
93
 
77
94
  ⚠️ For most of these the project holds a statement of the licence, not its upstream text, and several copyright
78
95
  lines are marked **UNVERIFIED** in `CREDITS.md`, which says what each line rests on.
79
96
  - **Voices** — only **Kokoro-82M** (Apache-2.0 weights trained on permissive audio; `CREDITS.md`). A voice enters when its licence
80
97
  AND its starting point's (the model it was fine-tuned from, and that model's data) have been read — that chain took the Piper
81
98
  voices out (ADR-0207, [`notices/2026-09-14-piper-voices-withdrawn.md`](notices/2026-09-14-piper-voices-withdrawn.md)).
82
- - **Pictograms** — the layer is decided by the **LICENCE and nothing else** (**ADR-0028**): Mulberry,
83
- Blissymbolics and Tawasol under CC BY-SA are embeddable; ARASAAC is **downloaded, never redistributed**; Sclera,
84
- PCS, SymbolStix and Widgit appear in the menu as **unavailable, awaiting negotiation**.
85
- ⚠️ And the **SA** reaches what we alter: a pictogram readjusted to the high-contrast palette
86
- (ADR-0011) or to the pixel grid stays CC BY-SA.
99
+ - **Pictograms** — **none is used** (**ADR-0233**, replacing ADR-0028's roster): the only candidates are
100
+ **ARASAAC** and **PCS**, each only once a licence is obtained, and no licence exists today. Both appear in the menu
101
+ **locked, with the reason «no licence»**; a set with no recorded licence can never be selected
102
+ (`tests/aac-sets.node.test.js`).
87
103
  - **Typefaces** — roster and restrictions in **ADR-0012**. ⚠️ Ronde and the alternatives OPTIFrench-Script and
88
104
  Merveille are **free for personal use only and CANNOT be packaged**: a download is offered, and the
89
105
  option stays disabled when none of them is present.
106
+ The engine **packages** only the faces it draws with itself (ADR-0255) — every family `app/public/vendor/fonts.css`
107
+ declares, **19 families in 29 `.woff2` files**, all under the **SIL OFL 1.1** — which the service worker precaches into every
108
+ install and the npm package ships. Every other family is the **font library**, **194 families in 291 files** in
109
+ `the-inclusionist-lfs/fonts/`: **191 under the SIL OFL 1.1**, **2 under Apache-2.0** (Luckiest Guy, Smokum) and **1 under the
110
+ Ubuntu Font Licence 1.0** (Ubuntu), each as its own font states it, delivered only where a game declares it
111
+ (`inclusionist-heavy --fonts`). Every licence asks for the notice and the text to travel **with each copy**, so they sit
112
+ **beside the fonts**: in `app/public/vendor/fonts-licences/` for the engine's (beside `fonts/`, so the notice revalidates while
113
+ the fonts keep their year of cache: `NOTICE.txt`, every family with its files, its licence and its copyright line as read from
114
+ the font, and `OFL-1.1.txt`), and in each library folder and each delivered family's folder for the library's (its licence
115
+ text and its `NOTICE.txt`; the mirror's folders also carry a `SHA256SUMS`). Made by `scripts/licences/fonts.mjs`, which keeps
116
+ the three texts; a family without an entry, or under a licence whose text is not kept, is refused
117
+ (`tests/font-licences.node.test.js`). The library's reserved-name families are their authors' originals (ADR-0254).
118
+ Attribution in [`CREDITS.md`](CREDITS.md).
90
119
  - **Third-party art — THREE DOORS, and what decides is compatibility with the project** (**ADR-0133**), not the
91
120
  family a name belongs to. Four questions: may we **derive**? may it be used **commercially**?
92
121
  may we **convey** the file in what we publish? does anything **travel** from the source to our output?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@the-inclusionist/engine",
3
- "version": "10.0.0",
3
+ "version": "11.0.0",
4
4
  "type": "module",
5
5
  "description": "Accessibility-first (WCAG 2.2 + GAG) engine for educational 2D pixel-art games, built with PixiJS. Screen reader, sonar, high contrast by role, colour-vision filters, remappable input as intent, i18n and offline PWA — the parts every game inherits (ADR-0035, ADR-0036).",
6
6
  "comment:exports": [
@@ -35,7 +35,11 @@
35
35
  "seventeen families of which none loaded — the child picks one, the menu marks it active, and the browser",
36
36
  "draws the system font. No error anywhere. `app/quiz.html` links it now, and",
37
37
  "`tests/an-offered-font-loads.node.test.js` holds both halves: no offerable font without a `@font-face`, and",
38
- "the host actually loading the sheet."
38
+ "the host actually loading the sheet.",
39
+ "`./build` IS A BUILD SCRIPT, NOT ENGINE CODE (ADR-0253): the game's `vite.config` wraps its config in `defineGameBuild`,",
40
+ "so `vite build` builds its app and `vite build --mode cartridge` its cartridge; `inclusionist-check-cartridge` (bin) runs",
41
+ "the boot's own refusals on the built cartridge. Both live in `scripts/` and import no package: the types are emitted with",
42
+ "the game's own `typescript`. `tests/the-engine-builds-both-targets.node.test.js` holds them."
39
43
  ],
40
44
  "exports": {
41
45
  ".": {
@@ -70,6 +74,10 @@
70
74
  "types": "./dist-pkg/i18n/*.d.ts",
71
75
  "default": "./dist-pkg/i18n/*.js"
72
76
  },
77
+ "./build": {
78
+ "types": "./scripts/game-build.d.mts",
79
+ "default": "./scripts/game-build.mjs"
80
+ },
73
81
  "./style.css": "./app/css/style.css",
74
82
  "./assets/vendor/*": "./app/public/vendor/*",
75
83
  "./package.json": "./package.json"
@@ -109,21 +117,37 @@
109
117
  "docs/LICENSES.md",
110
118
  "docs/CREDITS.md",
111
119
  "scripts/heavy-into-the-delivery.mjs",
112
- "scripts/licences"
120
+ "scripts/game-build.mjs",
121
+ "scripts/game-build.d.mts",
122
+ "scripts/check-cartridge.mjs",
123
+ "scripts/licences",
124
+ "scripts/libras-glosses.mjs",
125
+ "scripts/libras-glosses/pyproject.toml",
126
+ "scripts/libras-glosses/uv.lock",
127
+ "scripts/libras-glosses/gloss.py",
128
+ "scripts/libras-avatar.mjs",
129
+ "scripts/libras-avatar.json"
113
130
  ],
114
131
  "bin": {
115
- "inclusionist-heavy": "scripts/heavy-into-the-delivery.mjs"
132
+ "inclusionist-heavy": "scripts/heavy-into-the-delivery.mjs",
133
+ "inclusionist-check-cartridge": "scripts/check-cartridge.mjs"
116
134
  },
117
- "comment:no-dependencies": [
118
- "⚠️ THIS PACKAGE HAS NO `dependencies`, AND THAT IS A MEASURED DECISION (ADR-0094), not an accident.",
135
+ "comment:dependencies": [
136
+ "⚠️ THIS PACKAGE HAS ONE `dependency`, AND EACH ONE IS A RECORDED DECISION (ADR-0094), never an accident.",
119
137
  "Embedded code that names a package the consumer's npm does not install publishes an engine that does not compile (ADR-0093);",
120
138
  "a neural provider in `dependencies` lands its runtime in every consumer, a game that never speaks neurally included.",
121
- "The engine now LOADS that voice itself (ADR-0216) and still declares nothing: espeak-ng and onnxruntime-web are catalogued heavy",
139
+ "The engine LOADS that voice itself (ADR-0216) and declares nothing for it: espeak-ng and onnxruntime-web are catalogued heavy",
122
140
  "files, fetched by the build into `heavy/` and read from the page's own origin — so they are in nobody's `node_modules`, here",
123
141
  "included. A game says `uses: { neuralVoice: true }`, and a game that does not say it downloads none of it.",
124
- "`tests/engine-package.node.test.js` holds both directions: no embedded module names an undeclared package, and nothing declared",
125
- "is left without a module naming it."
142
+ "THE ONE: three.js 0.186.1 (MIT), pinned exactly — the free Libras player draws with it (ADR-0234 errata, route B). It is",
143
+ "reached only by the dynamic `import()` of `ui/libras-avatar-stage` at the first sign in deaf mode, so a bundler cuts it into",
144
+ "a chunk of its own and a child who never turns deaf mode on never downloads it.",
145
+ "`tests/engine-package.node.test.js` holds both directions — no embedded module names an undeclared package, and nothing declared",
146
+ "is left without a module naming it — and that no dependency enters without a recorded reason, at an exact version."
126
147
  ],
148
+ "dependencies": {
149
+ "three": "0.186.1"
150
+ },
127
151
  "comment:peerDependencies": [
128
152
  "PixiJS is a PEER, not a dependency. Measured on the emitted package (2026-09-05): exactly TWO shipped",
129
153
  "modules import it — `render/canvas` and `render/minimap` — plus their two `.d.ts`. A consumer that",
@@ -144,6 +168,7 @@
144
168
  "prepare": "npm run build:pkg",
145
169
  "prepack": "npm run build:pkg",
146
170
  "heavy:delivery": "npm run build:pkg && node scripts/heavy-into-the-delivery.mjs dist --kokoro",
171
+ "libras:setup": "node scripts/heavy-into-the-delivery.mjs --libras-setup",
147
172
  "preview": "vite preview",
148
173
  "typecheck": "tsc --noEmit",
149
174
  "validate": "npm run typecheck && vitest run && npm run build:pkg && vite build",
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later
3
+ // THE CARTRIDGE CHECKER — `inclusionist-check-cartridge [built entry]` (ADR-0253). Default entry: `dist-lib/cartridge.js`, where
4
+ // the engine's build (`@the-inclusionist/engine/build`, `vite build --mode cartridge`) puts it.
5
+ //
6
+ // It IMPORTS the built cartridge and runs on what it exports the SAME list `createGame` and `mount()` refuse a cartridge with —
7
+ // `cartridgeRefusals`, from the engine this script ships in. A cartridge that compiles and breaks the contract is refused here,
8
+ // in the game's CI, instead of in the platform the day it is installed. One line per problem, in the `problems` shape: the subject
9
+ // by name, and the fix.
10
+ //
11
+ // ⚠️ WHAT IT READS IS ADR-0139 §2's `Cartridge`, as the entry's DEFAULT export: `{ slug, declaration, hooks, create }`. The
12
+ // declaration and the hooks are read at import, before `create(ctx)` runs, because that is when `createGame` reads them too.
13
+ // ⚠️ AND IT IMPORTS IN NODE, WITH NO PAGE. A cartridge runs nothing until `create(ctx)` (ADR-0139 §2): one whose import needs a
14
+ // `document` would already be touching the platform's page when it is merely installed, and the import's error is the line.
15
+ //
16
+ // Exit codes: 0 the contract holds · 1 the cartridge is refused (the lines say why) · 2 this engine was never built (`dist-pkg/`).
17
+ import { existsSync, realpathSync } from 'node:fs';
18
+ import { relative, resolve, sep } from 'node:path';
19
+ import { fileURLToPath, pathToFileURL } from 'node:url';
20
+
21
+ /** Where the engine's build writes the cartridge — `CARTRIDGE_DIR/CARTRIDGE_FILE` of `game-build.mjs`. */
22
+ export const DEFAULT_ENTRY = 'dist-lib/cartridge.js';
23
+
24
+ /** The compiled composition root of the package this script ships in, which owns the refusals. */
25
+ export const REFUSALS_MODULE = new URL('../dist-pkg/boot/create-game.js', import.meta.url);
26
+
27
+ /**
28
+ * The problems of a built cartridge, EMPTY when it holds. `refusals` is the engine's `cartridgeRefusals`.
29
+ * The four shape lines come first because without them there is nothing to hand the engine's list.
30
+ */
31
+ export async function checkCartridge(entryPath, refusals) {
32
+ const shown = shownPath(entryPath);
33
+ if (!existsSync(entryPath)) {
34
+ return [`${shown}: missing - this game does not build its cartridge with the engine's build: wrap vite.config in defineGameBuild from @the-inclusionist/engine/build and run \`vite build --mode cartridge\` (ADR-0253)`];
35
+ }
36
+ let mod;
37
+ try {
38
+ mod = await import(pathToFileURL(entryPath).href);
39
+ } catch (e) {
40
+ return [`importing the cartridge threw: ${messageOf(e)} - a cartridge runs nothing until create(ctx) (ADR-0139 §2), so importing it must need no page`];
41
+ }
42
+ const cartridge = mod.default;
43
+ if (!cartridge || typeof cartridge !== 'object') {
44
+ return ['default export: missing - the built entry exports the cartridge as its default, { slug, declaration, hooks, create } (ADR-0139 §2)'];
45
+ }
46
+ const shape = [];
47
+ if (typeof cartridge.slug !== 'string' || !cartridge.slug.trim()) shape.push('slug: missing - the repository and package name, one word (ADR-0082 §1)');
48
+ if (typeof cartridge.create !== 'function') shape.push('create: must be a function - the shell calls create(ctx) to start the game, and nothing runs before it (ADR-0139 §2)');
49
+ try {
50
+ return [...shape, ...refusals(cartridge.declaration, cartridge.hooks)];
51
+ } catch (e) {
52
+ return [...shape, `the declaration threw while the engine checked it: ${messageOf(e)} - createGame and mount read it at boot, before create(ctx) runs`];
53
+ }
54
+ }
55
+
56
+ /** A path as the reader typed it: relative to where the check runs, with forward slashes on every system. */
57
+ const shownPath = (p) => (relative(process.cwd(), p) || p).split(sep).join('/');
58
+
59
+ const messageOf = (e) => (e instanceof Error ? e.message : String(e));
60
+
61
+ // Run as a program (directly, or through the `inclusionist-check-cartridge` shim, which may be a symlink): compare real paths.
62
+ const run = (() => { try { return realpathSync(process.argv[1] ?? '') === realpathSync(fileURLToPath(import.meta.url)); } catch { return false; } })();
63
+ if (run) {
64
+ if (!existsSync(fileURLToPath(REFUSALS_MODULE))) {
65
+ console.error('dist-pkg/boot/create-game.js is missing beside this script: in the engine repository, run `npm run build:pkg` first');
66
+ process.exit(2);
67
+ }
68
+ const { cartridgeRefusals } = await import(REFUSALS_MODULE.href);
69
+ const entry = resolve(process.argv[2] ?? DEFAULT_ENTRY);
70
+ const problems = await checkCartridge(entry, cartridgeRefusals);
71
+ const shown = shownPath(entry);
72
+ if (problems.length) {
73
+ console.error(`✗ cartridge ${shown}: ${problems.length} problem(s) — createGame and mount would refuse it (ADR-0253):`);
74
+ for (const p of problems) console.error(` · ${p}`);
75
+ process.exit(1);
76
+ }
77
+ console.log(`✓ cartridge ${shown}: the engine's contract holds.`);
78
+ }
@@ -0,0 +1,25 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // The types of `@the-inclusionist/engine/build` (`scripts/game-build.mjs`, ADR-0253). Written by hand because the module is a
3
+ // build script the game's Vite loads in Node, not a module of the engine's browser code that `tsconfig.pkg.json` compiles.
4
+ // `vite` is named only as a TYPE: the game has it, since it is what the game builds with.
5
+ import type { ConfigEnv, UserConfig, UserConfigFnPromise } from 'vite';
6
+
7
+ /** The Vite mode that builds the cartridge; every other mode is the app, Vitest's `test` included. */
8
+ export declare const CARTRIDGE_MODE: 'cartridge';
9
+ /** Where the cartridge lands, relative to the game's root. */
10
+ export declare const CARTRIDGE_DIR: 'dist-lib';
11
+ /** The cartridge's module inside `CARTRIDGE_DIR`; `cartridge.d.ts` is its types. */
12
+ export declare const CARTRIDGE_FILE: 'cartridge.js';
13
+ /** The engine and the shared render libraries (ADR-0140 §4): external in the cartridge, as prefixes. */
14
+ export declare const CARTRIDGE_EXTERNAL: readonly RegExp[];
15
+
16
+ export interface GameBuild {
17
+ /** The cartridge's entry, relative to the game's root — e.g. `src/index.ts`. Its default export is the cartridge. */
18
+ readonly cartridge: string;
19
+ /** The game's Vite config for the APP (the standalone PWA), exactly as it would be written without this wrapper. */
20
+ readonly config?: UserConfig | ((env: ConfigEnv) => UserConfig | Promise<UserConfig>);
21
+ }
22
+
23
+ /** The one declaration a game writes: `vite build` builds its app, `vite build --mode cartridge` its cartridge. */
24
+ export declare function defineGameBuild(build: GameBuild): UserConfigFnPromise;
25
+
@@ -0,0 +1,144 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // THE BUILD OF BOTH TARGETS OF A GAME — published as `@the-inclusionist/engine/build` (ADR-0253, ADR-0140 §1).
3
+ //
4
+ // ========================= WHAT A GAME WRITES =========================
5
+ // Its `vite.config.ts` wraps the config it already has and names its cartridge's entry — one declaration:
6
+ //
7
+ // import { defineGameBuild } from '@the-inclusionist/engine/build';
8
+ // export default defineGameBuild({ cartridge: 'src/index.ts', config: { root: 'app', plugins: [VitePWA({ … })], … } });
9
+ //
10
+ // · `vite build` → the APP: the game's own config, untouched — the standalone PWA with the engine bundled.
11
+ // · `vite build --mode cartridge` → the CARTRIDGE: `dist-lib/cartridge.js` + `dist-lib/cartridge.d.ts`, the engine and the
12
+ // shared render libraries external. Everything else in the game's config (plugins,
13
+ // `define`, `resolve`, `css`) still applies, so a plugin both targets need is written once.
14
+ //
15
+ // ========================= WHY THE ENGINE OWNS THE CARTRIDGE AND NOT THE APP =========================
16
+ // Measured on 2026-09-27, before this existed: five of seven games declared a `build:lib`, each differently — a mode, a second
17
+ // config file, an npm lifecycle variable, an environment variable, a script — and one had none. What they were all writing is
18
+ // the same four decisions, and each is the engine's to make, because each is about what the PLATFORM receives:
19
+ // 1. the engine, PixiJS and Zdog stay EXTERNAL, matched as PREFIXES — an exact string externalises the bare name and silently
20
+ // inlines every subpath, which is how every game imports (the 15-puzzle measured 35 kB turning into 74.5 kB);
21
+ // 2. no `public/`: Vite copies it into every build, and a cartridge declares no delivery (ADR-0117) — chess once shipped 7 MB;
22
+ // 3. no service worker: the PWA plugin is dropped, since a second worker would claim the platform's origin (ADR-0140 §1);
23
+ // 4. types emitted, for the one entry: a platform that cannot type the cartridge has a contract that is a comment.
24
+ // The APP stays the game's: its manifest, colours and precache budget are statements about THAT game (ADR-0140 §3).
25
+ //
26
+ // ⚠️ THIS FILE IMPORTS NO PACKAGE, on purpose. A Vite config is data, so nothing here needs `vite`; the types are emitted with the
27
+ // GAME's own `typescript`, resolved from the game's root, because a game builds with its own tools and the engine declares no
28
+ // build-time dependency on anyone's behalf (ADR-0119).
29
+ import { createRequire } from 'node:module';
30
+ import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
31
+ import { join, relative, resolve, sep } from 'node:path';
32
+
33
+ /** The Vite mode that builds the cartridge. The app is every other mode, which is what keeps `vite build` and Vitest untouched. */
34
+ export const CARTRIDGE_MODE = 'cartridge';
35
+
36
+ /** Where the cartridge lands, relative to the game's root — one place, so the shared CI and the checker need no argument. */
37
+ export const CARTRIDGE_DIR = 'dist-lib';
38
+
39
+ /** The cartridge's module; its types are `cartridge.d.ts` beside it, and its stylesheet, when it has one, `cartridge.css`. */
40
+ export const CARTRIDGE_FILE = 'cartridge.js';
41
+
42
+ /**
43
+ * What a cartridge never carries: the engine and the shared render libraries of ADR-0140 §4. A platform installs ONE of each for
44
+ * every game, and one bundled into a cartridge is a second copy of its module state — two blind-mode flags, two dictionary
45
+ * tables, two random streams on one page.
46
+ */
47
+ export const CARTRIDGE_EXTERNAL = [/^@the-inclusionist\/engine(\/|$)/, /^pixi\.js(\/|$)/, /^zdog(\/|$)/];
48
+
49
+ /**
50
+ * THE ONE DECLARATION. `cartridge` is the entry, relative to the game's root (where `package.json` is and where npm and CI run);
51
+ * `config` is the game's Vite config for the app, an object or a function of Vite's `env`, exactly as it was written before.
52
+ */
53
+ export function defineGameBuild({ cartridge, config } = {}) {
54
+ if (typeof cartridge !== 'string' || !cartridge.trim()) {
55
+ throw new Error('defineGameBuild: `cartridge` must name the cartridge entry, e.g. "src/index.ts" - it is the one thing the engine cannot guess (ADR-0253)');
56
+ }
57
+ return async (env) => {
58
+ const app = (typeof config === 'function' ? await config(env) : config) ?? {};
59
+ return env.mode === CARTRIDGE_MODE ? cartridgeConfig(app, cartridge, process.cwd()) : app;
60
+ };
61
+ }
62
+
63
+ /** The app's config turned into the cartridge's: the game's settings, with the four decisions above laid over them. */
64
+ function cartridgeConfig(app, cartridge, root) {
65
+ const entry = resolve(root, cartridge);
66
+ return {
67
+ ...app,
68
+ publicDir: false,
69
+ plugins: [...withoutServiceWorker(app.plugins), cartridgeTypes(entry, root)],
70
+ build: {
71
+ outDir: join(root, CARTRIDGE_DIR),
72
+ emptyOutDir: true,
73
+ target: 'es2022',
74
+ lib: { entry, formats: ['es'], fileName: () => CARTRIDGE_FILE, cssFileName: 'cartridge' },
75
+ rolldownOptions: { external: CARTRIDGE_EXTERNAL },
76
+ },
77
+ };
78
+ }
79
+
80
+ /**
81
+ * The game's plugins minus `vite-plugin-pwa` (every plugin it registers is named `vite-plugin-pwa` or `vite-plugin-pwa:…`).
82
+ * Arrays are flattened, because `VitePWA()` returns one; a plugin that is still a promise is kept, since its name is unknown.
83
+ */
84
+ function withoutServiceWorker(plugins) {
85
+ return [plugins ?? []].flat(Infinity).filter((p) => !(p && typeof p === 'object' && /^vite-plugin-pwa(:|$)/.test(String(p.name ?? ''))));
86
+ }
87
+
88
+ /** The plugin that writes the cartridge's types once the bundle is on disk. */
89
+ function cartridgeTypes(entry, root) {
90
+ return { name: 'inclusionist:cartridge-types', apply: 'build', writeBundle: () => emitCartridgeTypes(entry, root) };
91
+ }
92
+
93
+ /**
94
+ * THE TYPES OF THE CARTRIDGE, from the game's own `tsconfig.json`, for the entry's import graph and nothing else — the tests and
95
+ * the standalone shell are not reached from the entry, so they are not published (a platform would be invited to call the shell).
96
+ *
97
+ * ⚠️ `.ts` SPECIFIERS ARE REWRITTEN TO `.js` IN THE EMITTED `.d.ts`. The games import `./board.ts` with the extension, and
98
+ * TypeScript 5.9 keeps a type-only re-export's specifier as written (measured in `game-2048`): a consumer resolving it finds no
99
+ * `.ts`, and the package installs cleanly with no types.
100
+ */
101
+ function emitCartridgeTypes(entry, root) {
102
+ const ts = createRequire(join(root, 'package.json'))('typescript');
103
+ const configPath = join(root, 'tsconfig.json');
104
+ if (!existsSync(configPath)) throw new Error(`cartridge types: there is no tsconfig.json in ${root} - the cartridge's types are emitted with the game's own settings`);
105
+ const host = { getCanonicalFileName: (f) => f, getCurrentDirectory: () => root, getNewLine: () => '\n' };
106
+ const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, {
107
+ ...ts.sys,
108
+ onUnRecoverableConfigFileDiagnostic: (d) => { throw new Error(`cartridge types: ${ts.formatDiagnostics([d], host)}`); },
109
+ });
110
+ const outDir = join(root, CARTRIDGE_DIR, 'types');
111
+ const options = {
112
+ ...parsed.options,
113
+ noEmit: false, declaration: true, emitDeclarationOnly: true, declarationMap: false, sourceMap: false,
114
+ inlineSourceMap: false, composite: false, incremental: false, tsBuildInfoFile: undefined, noEmitOnError: false,
115
+ outDir, rootDir: root,
116
+ };
117
+ const program = ts.createProgram({ rootNames: [entry], options });
118
+ const result = program.emit();
119
+ const failures = [...program.getOptionsDiagnostics(), ...result.diagnostics];
120
+ if (failures.length) throw new Error(`cartridge types: ${ts.formatDiagnostics(failures, host)}`);
121
+
122
+ for (const file of declarationsUnder(outDir)) {
123
+ const before = readFileSync(file, 'utf8');
124
+ const after = before.replace(/((?:from|import\()\s*['"])(\.{1,2}\/[^'"]*?)\.([cm]?)ts(['"])/g, '$1$2.$3js$4');
125
+ if (after !== before) writeFileSync(file, after);
126
+ }
127
+
128
+ const entryTypes = join(outDir, relative(root, entry)).replace(/\.[cm]?[jt]sx?$/, '.d.ts');
129
+ if (!existsSync(entryTypes)) throw new Error(`cartridge types: TypeScript emitted no declaration for ${relative(root, entry)}`);
130
+ const from = './' + relative(join(root, CARTRIDGE_DIR), entryTypes).split(sep).join('/').replace(/\.d\.ts$/, '.js');
131
+ const hasDefault = /\bexport\s+default\b|\bas\s+default\b/.test(readFileSync(entryTypes, 'utf8'));
132
+ writeFileSync(join(root, CARTRIDGE_DIR, 'cartridge.d.ts'),
133
+ `export * from '${from}';\n${hasDefault ? `export { default } from '${from}';\n` : ''}`);
134
+ }
135
+
136
+ /** Every `.d.ts` under a folder, at any depth. */
137
+ function declarationsUnder(dir) {
138
+ if (!existsSync(dir)) return [];
139
+ return readdirSync(dir).flatMap((name) => {
140
+ const path = join(dir, name);
141
+ if (statSync(path).isDirectory()) return declarationsUnder(path);
142
+ return path.endsWith('.d.ts') ? [path] : [];
143
+ });
144
+ }