@mavea/mavea 1.2.0 → 2.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 (389) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/PRIVACY.md +1 -0
  3. package/README.md +8 -4
  4. package/TERMS.md +1 -1
  5. package/THIRD-PARTY.txt +13 -5
  6. package/bin/mavea.mjs +143 -2
  7. package/dist/.vite/manifest.json +1473 -861
  8. package/dist/assets/AnnotationLayer-Cccb12ps.js +0 -0
  9. package/dist/assets/{AppCommandPalette-BHaYBZ5e.js → AppCommandPalette-DdOPNZ0e.js} +1 -1
  10. package/dist/assets/AtlasView-B7yObdf8.css +1 -0
  11. package/dist/assets/{AtlasView-B82UfrEX.js → AtlasView-DO_p0TdZ.js} +1 -1
  12. package/dist/assets/BriefingPlayer-DHV4vMga.css +1 -0
  13. package/dist/assets/{CadenceCard-P4teI7Se.js → CadenceCard-DxceyiPA.js} +1 -1
  14. package/dist/assets/{CanvasSkeleton-CRGWlafo.js → CanvasSkeleton-BmGjJHUQ.js} +1 -1
  15. package/dist/assets/CanvasSkeleton-DYASkTjW.css +1 -0
  16. package/dist/assets/CardEditor-CiAfT78z.css +1 -0
  17. package/dist/assets/{CardEditor-DABIhGdQ.js → CardEditor-D4slxmIM.js} +1 -1
  18. package/dist/assets/{CheckLogRail-DkHIHL0E.js → CheckLogRail-BibJTid0.js} +1 -1
  19. package/dist/assets/ConversationVideoStudio-CSO3jHXD.css +1 -0
  20. package/dist/assets/ConversationVideoStudio-DMIPUCcq.js +1 -0
  21. package/dist/assets/CourseLessonReader-D29Kix4f.js +2 -0
  22. package/dist/assets/{CourseRail-DXt3bzjU.js → CourseRail-BQmUsG6v.js} +1 -1
  23. package/dist/assets/CoursesApp-DcDsS_ZS.js +2 -0
  24. package/dist/assets/CrossExamPanel-BafTqkbf.css +1 -0
  25. package/dist/assets/{DashPresent-5SRScC2i.js → DashPresent-BDWgO9am.js} +1 -1
  26. package/dist/assets/DashboardDetail-BrnAdWfy.js +2 -0
  27. package/dist/assets/DashboardLoopGate-NxMcQ4rD.js +2 -0
  28. package/dist/assets/DashboardLoopRuntime-Dsy9u1wa.js +1 -0
  29. package/dist/assets/{DashboardSettings-CE0B2y2y.js → DashboardSettings-DJon1Q4o.js} +1 -1
  30. package/dist/assets/DashboardsApp-DxyMn3x_.js +2 -0
  31. package/dist/assets/DeepZoomApp-CVwmnRGN.css +1 -0
  32. package/dist/assets/{DeepZoomApp-BOLEl-kQ.js → DeepZoomApp-nNjqoyYE.js} +1 -1
  33. package/dist/assets/DelegatePanel-D17XvWYd.css +1 -0
  34. package/dist/assets/DelegatePanel-DN_ZL0j7.js +33 -0
  35. package/dist/assets/DemoGallery-DrSlMsnu.js +1 -0
  36. package/dist/assets/{DropSelect-DilESAgA.css → DropSelect-B4lqCEjw.css} +1 -1
  37. package/dist/assets/{DropSelect-DjbdVfIR.js → DropSelect-GwIXHA5o.js} +1 -1
  38. package/dist/assets/{ExportModal-CLobMv1F.js → ExportModal-DBUjC71U.js} +1 -1
  39. package/dist/assets/{ExtractionPreview-QZ2VHmsb.js → ExtractionPreview-D4M6eXqb.js} +1 -1
  40. package/dist/assets/{FeatureUseNotice-Dc8joBGM.js → FeatureUseNotice-Bda9jr3W.js} +1 -1
  41. package/dist/assets/{FlagshipCommandPalette-DnWuBjYI.js → FlagshipCommandPalette-DAO849RC.js} +1 -1
  42. package/dist/assets/FlagshipShowcase-g2x-1c70.js +1 -0
  43. package/dist/assets/{FlashcardsApp-BQGM-Tr1.js → FlashcardsApp-BUKzCr65.js} +1 -1
  44. package/dist/assets/ForecastPanel-Cq_yDhNQ.css +1 -0
  45. package/dist/assets/GalleryApp-ot_A7ZF-.js +1 -0
  46. package/dist/assets/{HonestByDesign-57LDf-gm.js → HonestByDesign-DgZFEpEx.js} +1 -1
  47. package/dist/assets/{HowItWorks-DMfPX3GK.js → HowItWorks-DPFpdeGE.js} +1 -1
  48. package/dist/assets/{LegalApp-CcO5Qq6R.js → LegalApp-C56kWdmK.js} +1 -1
  49. package/dist/assets/{LegalMarkdownDocument-Be_fQbZ_.js → LegalMarkdownDocument-BBTHuW_M.js} +1 -1
  50. package/dist/assets/{LegalPageShell-B-HY1WG7.js → LegalPageShell-hMA-7JLf.js} +1 -1
  51. package/dist/assets/LeverPanel-HOEwIr8k.css +1 -0
  52. package/dist/assets/{Library-DmdzY2se.js → Library-CVj7R6F4.js} +1 -1
  53. package/dist/assets/LibraryOverlay-BkPYm0Bs.css +1 -0
  54. package/dist/assets/{LibraryOverlay-BilW6q_z.js → LibraryOverlay-DSUWcUe4.js} +1 -1
  55. package/dist/assets/LiveApp-B62EMybC.js +79 -0
  56. package/dist/assets/LiveApp-CziqEsOb.css +1 -0
  57. package/dist/assets/LiveSettings-BITIaMoT.js +6 -0
  58. package/dist/assets/LiveSettings-Dho0OxlM.css +1 -0
  59. package/dist/assets/{MindMapViewerDrawer-DI_S7fRZ.js → MindMapViewerDrawer-CKdJtHno.js} +1 -1
  60. package/dist/assets/MindShape-B3lg_z4X.js +1 -0
  61. package/dist/assets/MindShape-CozR9W8M.css +1 -0
  62. package/dist/assets/{PinToDashboard-Cz5UJCmq.js → PinToDashboard-DpQjBLPa.js} +1 -1
  63. package/dist/assets/{PlanReview-CmUxzNqL.js → PlanReview-CrTbmMAd.js} +1 -1
  64. package/dist/assets/PresentationDeck-CfYadu9V.js +1 -0
  65. package/dist/assets/PrismApp-bRKK_3JA.js +2 -0
  66. package/dist/assets/PrismAskController-68gbUO5u.css +1 -0
  67. package/dist/assets/{PrismAskController-Bt0k9hAA.js → PrismAskController-C4MuB8om.js} +1 -1
  68. package/dist/assets/{PrismBriefingPlayer-DzdtnFj4.js → PrismBriefingPlayer-ChJj6hSS.js} +2 -2
  69. package/dist/assets/PrismOverlay-BwnF4BEn.css +1 -0
  70. package/dist/assets/{PrismOverlay-D1cDZamt.js → PrismOverlay-Pp6ZKmTc.js} +4 -4
  71. package/dist/assets/{PrismWorkbench-BEIp4MiL.js → PrismWorkbench-BCV7r4Oa.js} +1 -1
  72. package/dist/assets/{PrivacyApp-B4DT2RUz.js → PrivacyApp-A2Bu6LVd.js} +2 -1
  73. package/dist/assets/{Recap-T9DtFaEk.js → Recap-BOl3SUh0.js} +1 -1
  74. package/dist/assets/Recap-D3NlzM1p.css +1 -0
  75. package/dist/assets/{ReplayCard-Dx46HCBT.js → ReplayCard-B6NYiYzQ.js} +2 -2
  76. package/dist/assets/{ReplayOverlay-CnJAxf0u.js → ReplayOverlay-BJKtJ-vc.js} +1 -1
  77. package/dist/assets/{RewindOverlay-CousnxXo.js → RewindOverlay-BO7YgDsW.js} +1 -1
  78. package/dist/assets/RippleApp-BXt7tenS.js +2 -0
  79. package/dist/assets/{RippleAskController-9SxpZnHX.js → RippleAskController-BzdwYcYY.js} +1 -1
  80. package/dist/assets/RippleOverlay-B3hg2KMN.css +1 -0
  81. package/dist/assets/RippleOverlay-BSxubBwj.js +6 -0
  82. package/dist/assets/SeeDontRead-0He5hS2C.js +1 -0
  83. package/dist/assets/ShareModal-I_sxHKLv.css +1 -0
  84. package/dist/assets/ShareModal-xYdZWJxy.js +2 -0
  85. package/dist/assets/{ShipCourse-BavQppkt.js → ShipCourse-Dg6kCWyH.js} +1 -1
  86. package/dist/assets/{SignatureLoop-L8W2h62w.js → SignatureLoop-QPwB2oNN.js} +1 -1
  87. package/dist/assets/SrsReview-DmBcJCMa.css +1 -0
  88. package/dist/assets/{SrsReview-DhWNYYv7.js → SrsReview-Gr6Y0QTQ.js} +1 -1
  89. package/dist/assets/{SynthesisApp-C2O6pFeM.js → SynthesisApp-DrCq6NDa.js} +2 -2
  90. package/dist/assets/{SynthesisOverlay-DLvwiSMv.js → SynthesisOverlay-DCa-2Pz_.js} +1 -1
  91. package/dist/assets/{TermsApp-CxY1yorm.js → TermsApp-zcPDYfuh.js} +2 -2
  92. package/dist/assets/TopicCanvas-Bw4bMFpe.js +2 -0
  93. package/dist/assets/TopicCanvas-DWTm611H.css +1 -0
  94. package/dist/assets/{TourPrism-CI-iJZil.js → TourPrism-DbinDupp.js} +1 -1
  95. package/dist/assets/{TrackerTile-oz6IoG8m.js → TrackerTile-CrT9u1I4.js} +2 -2
  96. package/dist/assets/{TwoSurfaces-Rnf-_WgY.js → TwoSurfaces-L0CDuyOZ.js} +1 -1
  97. package/dist/assets/WhyMachineOverlay-Rav-cuMm.css +1 -0
  98. package/dist/assets/WorldOverlay-BcjqG1BR.js +2 -0
  99. package/dist/assets/{WowFeatures-C4efSbNV.js → WowFeatures-CwBk4ZMO.js} +1 -1
  100. package/dist/assets/ZoomDeck-DdLNsrHV.css +1 -0
  101. package/dist/assets/{ZoomDeck-CBrr0yfy.js → ZoomDeck-DlnesweX.js} +1 -1
  102. package/dist/assets/{annotationAuto-CDv6Es44.js → annotationAuto-B2UdfJNj.js} +1 -1
  103. package/dist/assets/{backup-ZrlVatXc.js → backup-685QrAjt.js} +1 -1
  104. package/dist/assets/canvas-C3O7MEA3.js +1 -0
  105. package/dist/assets/capture-DgJLQ_0-.js +2 -0
  106. package/dist/assets/{chapters-Dqm4iLDa.js → chapters-CIvdCeBC.js} +1 -1
  107. package/dist/assets/{confirmAdd-DzMO9jKV.js → confirmAdd-CZ829Mbx.js} +1 -1
  108. package/dist/assets/{dashboardEvents-DKl5rrTD.js → dashboardEvents-CiayRLrH.js} +1 -1
  109. package/dist/assets/dashboards-Cvs28p3Z.css +1 -0
  110. package/dist/assets/deepen-DAeHHFiI.js +11 -0
  111. package/dist/assets/deepenStore-BWLLzLCY.js +1 -0
  112. package/dist/assets/effort-jJe4iMIq.js +39 -0
  113. package/dist/assets/{explode-BgZIWY9m.js → explode-CPnvJiTg.js} +1 -1
  114. package/dist/assets/{fitText-DQ2omSN0.js → fitText-DHbmSS-q.js} +1 -1
  115. package/dist/assets/{generate-Dl2EJ_SR.js → generate-COfYQFmT.js} +4 -4
  116. package/dist/assets/{generateBeats-DZHkvFvh.js → generateBeats-COflu5Zi.js} +1 -1
  117. package/dist/assets/{generateCourse-C9qvaJRo.js → generateCourse-BldPpgdh.js} +1 -1
  118. package/dist/assets/generateLive-DGwnpIip.js +24 -0
  119. package/dist/assets/homeTarget-CwFsJYwb.js +1 -0
  120. package/dist/assets/index-BIUYTk1W.css +1 -0
  121. package/dist/assets/index-LiHcEJt_.js +22 -0
  122. package/dist/assets/kokoro-DXRj0KQX.js +1 -0
  123. package/dist/assets/ledger-BssK9Pv2.js +1 -0
  124. package/dist/assets/{lib-DMAxsZKm.css → lib-DP9Kuxqk.css} +1 -1
  125. package/dist/assets/{liveSchema-B4bQtO88.js → liveSchema-DyfND6P2.js} +2 -2
  126. package/dist/assets/{loader-DKJEcbPm.js → loader-DgMLGfAC.js} +2 -2
  127. package/dist/assets/localBudget-CxLP6bjE.js +1 -0
  128. package/dist/assets/{mastery-CUfDeuqO.js → mastery-DB5qpRAy.js} +1 -1
  129. package/dist/assets/{media-BvwzACIX.js → media-VLRh6CX2.js} +2 -2
  130. package/dist/assets/{model-BFRTN9Eh.js → model-CAewjw45.js} +1 -1
  131. package/dist/assets/{neighborhoods-D7QjURnE.js → neighborhoods-CqECCmo8.js} +1 -1
  132. package/dist/assets/{notes-B0-EE0FK.js → notes-DzIAEESd.js} +1 -1
  133. package/dist/assets/pen-DtEW1xf4.js +24 -0
  134. package/dist/assets/{perfProbe-B9zJpjo9.js → perfProbe-ezVn1mOu.js} +1 -1
  135. package/dist/assets/{pin-CZAIlpXt.js → pin-BPGVDgnq.js} +1 -1
  136. package/dist/assets/pin-BXyyKnci.css +1 -0
  137. package/dist/assets/{planTracker-KKAtTBWs.js → planTracker-BwoKEftp.js} +1 -1
  138. package/dist/assets/portal-B9DmFo6J.js +1 -0
  139. package/dist/assets/{prewarm-B4ELBOxf.js → prewarm-BgUqAJbF.js} +1 -1
  140. package/dist/assets/providers-0DthJW_I.js +1 -0
  141. package/dist/assets/quietHours-DyynzDyC.js +1 -0
  142. package/dist/assets/{ready-jtAUOb62.js → ready-yBSGJubb.js} +1 -1
  143. package/dist/assets/{registry-CqhpLHM7.js → registry-7tKTrzeZ.js} +1 -1
  144. package/dist/assets/{registry-BFrgx1tE.js → registry-B53EEn8S.js} +1 -1
  145. package/dist/assets/{registry-CPiwQhAm.js → registry-BDXwUn3i.js} +1 -1
  146. package/dist/assets/{registry-CD1s3eQ-.js → registry-BJEvFgoL.js} +1 -1
  147. package/dist/assets/{registry-B0GIHERt.js → registry-BQzvA61G.js} +1 -1
  148. package/dist/assets/{registry-6DGRAB1m.js → registry-BT6ydF33.js} +1 -1
  149. package/dist/assets/{registry-D8O0apUT.js → registry-BdHj_oIs.js} +1 -1
  150. package/dist/assets/{registry-Dru0JcTa.css → registry-BgWzEkxc.css} +1 -1
  151. package/dist/assets/{registry-Vp8VuMV0.js → registry-Bl2qfp5V.js} +1 -1
  152. package/dist/assets/registry-Bl7zAWKt.js +2 -0
  153. package/dist/assets/{registry-6MOD-I7p.js → registry-BlujNlQJ.js} +1 -1
  154. package/dist/assets/{registry-C28gYnVq.js → registry-CE1T0z9x.js} +1 -1
  155. package/dist/assets/{registry-4mMEt1Xy.css → registry-CEV5h2cu.css} +1 -1
  156. package/dist/assets/{registry-ZOWzhOHk.css → registry-CGB0jkFI.css} +1 -1
  157. package/dist/assets/{registry-BFbfXK-W.js → registry-Cgo4C0ux.js} +1 -1
  158. package/dist/assets/registry-CwRTUk0R.js +1 -0
  159. package/dist/assets/{registry-GeAC3ZD7.js → registry-D06LKiUk.js} +1 -1
  160. package/dist/assets/registry-Dbe9TQPw.css +1 -0
  161. package/dist/assets/registry-Diyud3DF.js +1 -0
  162. package/dist/assets/registry-DjvftnY2.css +1 -0
  163. package/dist/assets/{registry-w4R6c89s.js → registry-KRYoVMCh.js} +1 -1
  164. package/dist/assets/registry-QbArAJKB.js +1 -0
  165. package/dist/assets/registry-dmR14XnY.css +1 -0
  166. package/dist/assets/registry-g2sBcIrf.css +1 -0
  167. package/dist/assets/{registry-CcOO8UZr.js → registry-qRfnKTt4.js} +1 -1
  168. package/dist/assets/{relate-BYdM5eiV.js → relate-aQFFr11O.js} +1 -1
  169. package/dist/assets/{replay-TYXO0Brm.js → replay-CalqEgdW.js} +1 -1
  170. package/dist/assets/route-CMdTFx0P.js +1 -0
  171. package/dist/assets/{run-Df10YPyB.js → run-CuHaB8wF.js} +1 -1
  172. package/dist/assets/{run-gmqUaxcL.js → run-CwMSPOps.js} +1 -1
  173. package/dist/assets/{run-DlvA3l28.js → run-DCQrxgHA.js} +1 -1
  174. package/dist/assets/select-wEtBn9U6.js +3 -0
  175. package/dist/assets/shapes-BwoDrn09.js +1 -0
  176. package/dist/assets/shard000-Bx6Nmt0m.js +1 -0
  177. package/dist/assets/shard001-CL6O9SLr.js +1 -0
  178. package/dist/assets/shard002-vLQ0Ss-O.js +1 -0
  179. package/dist/assets/shard003-kKZdpzuh.js +1 -0
  180. package/dist/assets/shard004-CdVohAu1.js +1 -0
  181. package/dist/assets/shard005-CMzF_uJB.js +1 -0
  182. package/dist/assets/shard006-DQoDWuoN.js +1 -0
  183. package/dist/assets/shard007-Ck0N0IUk.js +1 -0
  184. package/dist/assets/shard008-Dt395x0Q.js +1 -0
  185. package/dist/assets/shard009-D_z8Lhqh.js +1 -0
  186. package/dist/assets/shard010-CQfR6lnk.js +1 -0
  187. package/dist/assets/shard011-l-w2t2Ie.js +1 -0
  188. package/dist/assets/shard012-BTw_UO1C.js +1 -0
  189. package/dist/assets/shard013-D8ZjKKYb.js +1 -0
  190. package/dist/assets/shard014-Cth_76It.js +1 -0
  191. package/dist/assets/shard015-DdYJVsHx.js +1 -0
  192. package/dist/assets/shard016-BdlBf9uZ.js +1 -0
  193. package/dist/assets/shard017-C3HTxh6t.js +1 -0
  194. package/dist/assets/shard018-Mf4wvqVk.js +1 -0
  195. package/dist/assets/shard019-Dpcy1Arx.js +1 -0
  196. package/dist/assets/shard020-BNvKfQld.js +1 -0
  197. package/dist/assets/shard021-D0kpI_PQ.js +1 -0
  198. package/dist/assets/shard022-Cjms7kAe.js +1 -0
  199. package/dist/assets/shard023-Bdwci7fy.js +1 -0
  200. package/dist/assets/shard024-BBoyPtpP.js +1 -0
  201. package/dist/assets/shard025-lMGpgN_0.js +3 -0
  202. package/dist/assets/shard026-Bp3UVI4_.js +1 -0
  203. package/dist/assets/shard027-C4HTpdeT.js +1 -0
  204. package/dist/assets/shard028-BsFTH3Sf.js +1 -0
  205. package/dist/assets/shard029-B3dEcXPy.js +1 -0
  206. package/dist/assets/shard030-DWwA-fNs.js +5 -0
  207. package/dist/assets/shard031-RhqA_0nH.js +1 -0
  208. package/dist/assets/shard032-BlZdG1Yi.js +1 -0
  209. package/dist/assets/shard033-Dmx2lOjI.js +1 -0
  210. package/dist/assets/shard034-BLOFKJT4.js +1 -0
  211. package/dist/assets/shard035-DMXdH733.js +1 -0
  212. package/dist/assets/shard036-DzOiEn23.js +1 -0
  213. package/dist/assets/shard037-BcHfVaYM.js +1 -0
  214. package/dist/assets/shard038-KozOx-Jh.js +1 -0
  215. package/dist/assets/shard039-apdILQwC.js +1 -0
  216. package/dist/assets/shard040-BrNXGaBi.js +1 -0
  217. package/dist/assets/shard041-D6eq9h1u.js +4 -0
  218. package/dist/assets/shard042-M-L34DbY.js +1 -0
  219. package/dist/assets/shard043-Ct6_C2pN.js +1 -0
  220. package/dist/assets/shard044-Bo0iaVHx.js +1 -0
  221. package/dist/assets/shard045-9ccZ4Y_N.js +1 -0
  222. package/dist/assets/shard046-eXoP478L.js +1 -0
  223. package/dist/assets/shard047-N56r6Lsz.js +1 -0
  224. package/dist/assets/shard048-BeKX7cI8.js +1 -0
  225. package/dist/assets/shard049-hPaNN2sL.js +1 -0
  226. package/dist/assets/shard050-B-YpP0B6.js +1 -0
  227. package/dist/assets/shard051-Bww5_KB2.js +1 -0
  228. package/dist/assets/shard052-DErwF8Df.js +1 -0
  229. package/dist/assets/shard053-C-qGH4jz.js +1 -0
  230. package/dist/assets/shard054-kcSxZrSj.js +1 -0
  231. package/dist/assets/shard055-CsETBTqa.js +1 -0
  232. package/dist/assets/shard056-CdBR4qTC.js +1 -0
  233. package/dist/assets/shard057-yRUG8B9e.js +1 -0
  234. package/dist/assets/shard058-DeDAnECG.js +1 -0
  235. package/dist/assets/shard059-Dh6jbDnW.js +1 -0
  236. package/dist/assets/shard060-B5kpWrhW.js +1 -0
  237. package/dist/assets/shard061-BTnj5LZA.js +1 -0
  238. package/dist/assets/shard062-DC7LTaNc.js +1 -0
  239. package/dist/assets/shard063-C8SIGCfd.js +1 -0
  240. package/dist/assets/shard064-DLyASocW.js +1 -0
  241. package/dist/assets/shard065-Cy_yV4ry.js +1 -0
  242. package/dist/assets/shard066-BmjVQqFX.js +1 -0
  243. package/dist/assets/shard067-uZUJsqtF.js +1 -0
  244. package/dist/assets/shard068-CXVjyJU4.js +1 -0
  245. package/dist/assets/shard069-CyfmjAm-.js +4 -0
  246. package/dist/assets/shard070-CxN3xiuY.js +12 -0
  247. package/dist/assets/shard071-CP1WrYC-.js +1 -0
  248. package/dist/assets/shard072-D6L5Yr05.js +1 -0
  249. package/dist/assets/shard073-DFEzkwg2.js +1 -0
  250. package/dist/assets/shard074-BSv3rvRL.js +1 -0
  251. package/dist/assets/shard075-Bt0OjGVd.js +1 -0
  252. package/dist/assets/shard076-DZHs0uzd.js +1 -0
  253. package/dist/assets/{share-kW3pZ027.js → share--tpc1nLE.js} +1 -1
  254. package/dist/assets/speed-BOytg6bC.js +1 -0
  255. package/dist/assets/store-B2Rpbqgg.js +1 -0
  256. package/dist/assets/store-Ba9vzL4H.js +1 -0
  257. package/dist/assets/store-BwyOArJl.js +1 -0
  258. package/dist/assets/store-ruEsXJjU.js +1 -0
  259. package/dist/assets/streamParse-BX0bAppQ.js +2 -0
  260. package/dist/assets/{templates-DHeyJ32F.css → templates-BIkAr4YH.css} +1 -1
  261. package/dist/assets/{theme-7IrMJ70_.js → theme-D5D55hZi.js} +1 -1
  262. package/dist/assets/{threads-Cu2t3070.js → threads-DNfxMTwx.js} +1 -1
  263. package/dist/assets/{useDashboardLoop-DDqCFJKY.js → useDashboardLoop-ifcuVRo-.js} +3 -3
  264. package/dist/assets/{useDashboards-SRk8LqHe.js → useDashboards-lgQnk2Al.js} +1 -1
  265. package/dist/assets/useFocusTrap-CJmpNZv2.js +1 -0
  266. package/dist/assets/useInView-DsTvv7L_.js +1 -0
  267. package/dist/assets/useInterval-DDgFrel2.js +1 -0
  268. package/dist/assets/{useLiveConfig-Cpy0_E_-.js → useLiveConfig-B4CmBiAK.js} +1 -1
  269. package/dist/assets/useStudy-CySgE3Cx.js +1 -0
  270. package/dist/assets/{walkSync-CPsd-xu7.js → walkSync-DBne70gg.js} +1 -1
  271. package/dist/demo-assets/CREDITS.md +94 -50
  272. package/dist/demo-assets/images/arnel-lighthouse.avif +0 -0
  273. package/dist/demo-assets/images/cliff-fields.avif +0 -0
  274. package/dist/demo-assets/images/crater-panorama.avif +0 -0
  275. package/dist/demo-assets/images/furnas-lake.avif +0 -0
  276. package/dist/demo-assets/images/green-coast-raw.avif +0 -0
  277. package/dist/demo-assets/images/green-coast.avif +0 -0
  278. package/dist/demo-assets/images/island-coast-poster.avif +0 -0
  279. package/dist/demo-assets/images/nordeste-town.avif +0 -0
  280. package/dist/demo-assets/images/sea-cliffs.avif +0 -0
  281. package/dist/demo-assets/images/sete-cidades.avif +0 -0
  282. package/dist/demo-assets/images/tea-terraces.avif +0 -0
  283. package/dist/demo-assets/pdf/cfd-primer.pdf +0 -0
  284. package/dist/demo-assets/video/island-coast.webm +0 -0
  285. package/dist/fonts/fonts.css +18 -0
  286. package/dist/index.html +38 -10
  287. package/dist/legal/PRIVACY.md +1 -0
  288. package/dist/legal/TERMS.md +1 -1
  289. package/dist/legal/THIRD-PARTY.txt +13 -5
  290. package/package.json +3 -2
  291. package/dist/assets/AnnotationLayer-qV6CIUZv.js +0 -0
  292. package/dist/assets/AtlasView-B5fkQhO6.css +0 -1
  293. package/dist/assets/BriefingPlayer-TpFZB77N.css +0 -1
  294. package/dist/assets/CanvasSkeleton-iy6DBvde.css +0 -1
  295. package/dist/assets/CardEditor-BY1bZiV6.css +0 -1
  296. package/dist/assets/ConversationVideoStudio-C1sd4k53.js +0 -1
  297. package/dist/assets/ConversationVideoStudio-CIAMxElj.css +0 -1
  298. package/dist/assets/CourseLessonReader-YCcNKEW7.js +0 -2
  299. package/dist/assets/CoursesApp-Dz6xjf4V.js +0 -2
  300. package/dist/assets/CrossExamPanel-CZ0ShGma.css +0 -1
  301. package/dist/assets/DashboardDetail-DOfm8UCQ.js +0 -2
  302. package/dist/assets/DashboardLoopGate-Cf0y_HQ7.js +0 -2
  303. package/dist/assets/DashboardLoopRuntime-CnN5VayH.js +0 -1
  304. package/dist/assets/DashboardsApp-_gbfdbX6.js +0 -2
  305. package/dist/assets/DeepZoomApp-fRXCJHHZ.css +0 -1
  306. package/dist/assets/DelegatePanel-CHEB-OZl.js +0 -33
  307. package/dist/assets/DelegatePanel-Cf85-0qE.css +0 -1
  308. package/dist/assets/DemoGallery-DBqnu8TR.js +0 -1
  309. package/dist/assets/FlagshipShowcase-3qQDOK6g.js +0 -1
  310. package/dist/assets/ForecastPanel-Da2ZBUrE.css +0 -1
  311. package/dist/assets/GalleryApp-BWQ-J450.js +0 -1
  312. package/dist/assets/LeverPanel-DhpJY76O.css +0 -1
  313. package/dist/assets/LibraryOverlay-CnKWDMG_.css +0 -1
  314. package/dist/assets/LiveApp-C-OPBybd.css +0 -1
  315. package/dist/assets/LiveApp-DH3OxJFV.js +0 -79
  316. package/dist/assets/LiveSettings-CmgrMqvK.css +0 -1
  317. package/dist/assets/LiveSettings-CuVMy7rZ.js +0 -6
  318. package/dist/assets/MindShape-C_Bo9hW9.js +0 -1
  319. package/dist/assets/MindShape-CaPeUo-a.css +0 -1
  320. package/dist/assets/PresentationDeck-B_EI33Pp.js +0 -1
  321. package/dist/assets/PrismApp-DtLsPiQF.js +0 -2
  322. package/dist/assets/PrismAskController-DBoxQSJR.css +0 -1
  323. package/dist/assets/PrismOverlay-BTfAicBt.css +0 -1
  324. package/dist/assets/Recap-DCiiWNiV.css +0 -1
  325. package/dist/assets/RippleApp-D5j2VCt2.js +0 -2
  326. package/dist/assets/RippleOverlay-_iiZsQVZ.css +0 -1
  327. package/dist/assets/RippleOverlay-zcXAHPuJ.js +0 -6
  328. package/dist/assets/SeeDontRead-Dqfzha0V.js +0 -1
  329. package/dist/assets/ShareModal-D1QuQEko.css +0 -1
  330. package/dist/assets/ShareModal-DWxlrJSz.js +0 -2
  331. package/dist/assets/SrsReview-B1B2VekR.css +0 -1
  332. package/dist/assets/TopicCanvas-LMI0zC7R.js +0 -2
  333. package/dist/assets/TopicCanvas-uRuHi99s.css +0 -1
  334. package/dist/assets/WhyMachineOverlay-BZk3PVTl.css +0 -1
  335. package/dist/assets/WorldOverlay-BaQNNClA.js +0 -2
  336. package/dist/assets/ZoomDeck-B2SjNwY7.css +0 -1
  337. package/dist/assets/canvas-Bsx3eSaS.js +0 -1
  338. package/dist/assets/capture-D8uPIcfj.js +0 -2
  339. package/dist/assets/dashboards-C1u2ks-d.css +0 -1
  340. package/dist/assets/generateLive-B6purd69.js +0 -51
  341. package/dist/assets/homeTarget-CsO8nY7z.js +0 -1
  342. package/dist/assets/index-Dk0QapqQ.js +0 -22
  343. package/dist/assets/index-DmKgC_TJ.css +0 -1
  344. package/dist/assets/kokoro-P_fkcX-A.js +0 -1
  345. package/dist/assets/layout-CEoNLr-w.js +0 -1
  346. package/dist/assets/pageVisibility-BxUVsw7Z.js +0 -1
  347. package/dist/assets/pen-DNMslo3e.js +0 -24
  348. package/dist/assets/pin-D-4Zjiik.css +0 -1
  349. package/dist/assets/portal-Dogggsub.js +0 -1
  350. package/dist/assets/providers-BovElgRL.js +0 -1
  351. package/dist/assets/quietHours-CeBje_uU.js +0 -1
  352. package/dist/assets/registry-BSX3aFUw.js +0 -1
  353. package/dist/assets/registry-Bv1f5UU4.js +0 -2
  354. package/dist/assets/registry-Cse2wF7x.css +0 -1
  355. package/dist/assets/registry-Dye5m3qt.css +0 -1
  356. package/dist/assets/registry-GeSy4i7R.css +0 -1
  357. package/dist/assets/registry-WHd1PwU3.js +0 -1
  358. package/dist/assets/registry-Xl8mAnKq.js +0 -1
  359. package/dist/assets/registry-tkd3UhWn.css +0 -1
  360. package/dist/assets/shapes-Cx5SCKgj.js +0 -39
  361. package/dist/assets/speed-K5_Ebj-8.js +0 -1
  362. package/dist/assets/store-BfHRbVKz.js +0 -1
  363. package/dist/assets/store-CsjDEADX.js +0 -1
  364. package/dist/assets/store-DpObYU1u.js +0 -1
  365. package/dist/assets/store-gohr8YVT.js +0 -1
  366. package/dist/assets/streamParse-B-Gjwa9T.js +0 -2
  367. package/dist/assets/useFocusTrap-DBtkeyRy.js +0 -1
  368. package/dist/assets/useInView-CXTOAEV3.js +0 -1
  369. package/dist/assets/useStudy-GwNcQWtv.js +0 -1
  370. package/dist/demo-assets/images/basalt-cliffs.jpg +0 -0
  371. package/dist/demo-assets/images/capelinhos.jpg +0 -0
  372. package/dist/demo-assets/images/cliff-fields.jpg +0 -0
  373. package/dist/demo-assets/images/crater-panorama.jpg +0 -0
  374. package/dist/demo-assets/images/furnas-lake.jpg +0 -0
  375. package/dist/demo-assets/images/green-coast.jpg +0 -0
  376. package/dist/demo-assets/images/overcast-coast.jpg +0 -0
  377. package/dist/demo-assets/images/patchwork-fields.jpg +0 -0
  378. package/dist/demo-assets/images/ponta-delgada.jpg +0 -0
  379. package/dist/demo-assets/images/sete-cidades.jpg +0 -0
  380. package/dist/demo-assets/images/village-street.jpg +0 -0
  381. package/dist/demo-assets/video/azores-film.webm +0 -0
  382. /package/dist/assets/{BriefingPlayer-C0D_2ILa.js → BriefingPlayer-74mRKyjl.js} +0 -0
  383. /package/dist/assets/{CrossExamPanel-CdIYUu-B.js → CrossExamPanel-BfeGr5iw.js} +0 -0
  384. /package/dist/assets/{ForecastPanel-zPUh2ClQ.js → ForecastPanel-OfW39WGS.js} +0 -0
  385. /package/dist/assets/{LeverPanel-D1SNRGdm.js → LeverPanel-vco5UK2U.js} +0 -0
  386. /package/dist/assets/{WhyMachineOverlay-ks9-rRiL.js → WhyMachineOverlay-D2K7y8SA.js} +0 -0
  387. /package/dist/assets/{lib-B7OE1ZQQ.js → lib-u95BsX_B.js} +0 -0
  388. /package/dist/assets/{registry-7poQfBaM.js → registry-C4Yh05pk.js} +0 -0
  389. /package/dist/assets/{registry-Daypk4uR.js → registry-S3j4OpCH.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,102 @@ All notable changes to Mavéa are documented here. The format is based on
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.0.0] - 2026-08-18
10
+
11
+ ### Added
12
+
13
+ - **What a session cost is now visible** (Settings → Model): tokens sent, how much of that was
14
+ billed at the cached rate, tokens written back, and which pass spent them. Mavéa is BYOK, so
15
+ every one of those calls was billed to your key — tokens only, never a guessed currency figure,
16
+ and nothing is stored or sent anywhere.
17
+ - The dock's explanation-level chip says what it is. It rendered a bare word ("Standard") beside
18
+ the voice and model chips, so the one control there that isn't self-evident read as a mystery.
19
+
20
+ ### Changed
21
+
22
+ - **The gap between speaking and being answered isn't blank any more.** When the mic closed, every
23
+ "I'm hearing you" indicator vanished at once while the words were still being transcribed —
24
+ which read as not having been heard. The face now holds a working state through it, the
25
+ listening card holds with its bars stilled instead of unmounting, and the mic button keeps a
26
+ slowed pulse rather than just dimming. It starts about 1.3 seconds earlier than it could have:
27
+ the mic reports that you have plainly stopped before its own hangover window closes the
28
+ utterance, and takes that back if you were only pausing mid-thought. A transcription that lands
29
+ inside 300ms changes nothing, so a fast machine never flashes.
30
+ - **A backgrounded tab stops animating.** Every ambient loop in the app — the landing's aurora, a
31
+ card's glow, a hundred-odd others — kept repainting for nobody while the tab sat behind another
32
+ window. They now pause while the tab is hidden, and a landing section pauses its own once it has
33
+ scrolled entirely out of view. Nothing you can see ever changes.
34
+ - The demo images ship as AVIF (2.2MB → 1.6MB), and the component reference examples load per
35
+ answer instead of arriving as one 390KB block held for the whole session (~19KB now stays
36
+ resident). Both make the first load smaller and the session lighter.
37
+ - Answers below the drawer are generated when you open it, not on every rich turn. Six blocks were
38
+ written into every answer whether or not anyone opened the drawer they live behind — the most
39
+ expensive tokens in a turn, spent on content nobody had asked to see. Opening it now generates
40
+ them once and caches them permanently.
41
+
42
+ - **A video export no longer takes exactly as long as the video.** Frames were stamped at real
43
+ elapsed time, so a machine that rasterised slowly stretched them into a slideshow and a fast one
44
+ gained nothing. The export now runs on its own clock — frame `n` belongs at `n/fps` whenever it
45
+ finishes — so a weak machine produces the same sharp file, just later, and a strong one finishes
46
+ ahead of real time. The face is drawn as its own small layer over a cached background, the
47
+ preview stops rendering a second full-size copy while a render is in flight, and a rasterizer
48
+ that fails now says so instead of quietly writing a blank video.
49
+ - **Audio is a choice in the export sheet**, on by default. Turning it off skips speech synthesis
50
+ entirely — captions still pace themselves from the same estimate that drives the duration meter
51
+ — which is also the cheapest path on a weak machine. Narration that does need synthesising is
52
+ now made two lines at a time instead of all at once, which is what used to peg the fan.
53
+ - The in-sheet Share button is gone. On desktop it was a share that silently downloaded, then said
54
+ it had shared; there is now one honest "Download video" action on both tabs.
55
+ - **What a turn costs the model has come down** without changing what it can do: only the leading
56
+ few components carry a worked example, the per-turn prompt now sits inside the cached prefix on
57
+ Anthropic instead of after it, a repair pass no longer resends the whole component menu, a
58
+ speculative glimpse is billed as a glimpse rather than at a reasoning model's floor, and a
59
+ prefetched suggestion is reused across turns instead of being thrown away and paid for twice.
60
+
61
+ ### Fixed
62
+
63
+ - **Local storage stops silently losing data.** Every store capped itself, but they share one
64
+ browser quota and the caps sum past it, so whichever store wrote last simply failed — and said
65
+ nothing. A refused write now sheds the oldest entry of the largest cache and retries, never
66
+ touching anything that isn't a cache, and says so once if it still cannot land.
67
+ - **The scrubber's waveform stops repainting itself sixty times a second** while a line plays: the
68
+ bars are drawn once per track and the playhead is a clip, so playback commits to React about
69
+ once a second instead of once a frame.
70
+ - Speech no longer wakes up ~470 times to ask whether it can queue the next window, and the audio
71
+ thread parks itself after 30 seconds of silence rather than idling for the whole session.
72
+ - **A streamed answer stops rebuilding itself as it arrives.** Each closed block used to land in
73
+ its own render, and a mid-stream flip (a new block family arriving, the first section-tagged
74
+ block landing) tore the whole grid down and replayed every card's entrance. Blocks now fold into
75
+ one paint per frame, the loading placeholders hand their grid cell to the real card instead of
76
+ being replaced wholesale, and the section decision is made once per answer.
77
+ - **A returning dark-mode reader no longer gets a light flash on load.** The boot splash had no
78
+ way to know the stored choice before the bundle ran; it now takes the system setting as its
79
+ guess and yields to the real choice the instant it's known.
80
+ - The hero no longer reflows when its display font lands: the fallback is now metric-matched to
81
+ Newsreader, so the text occupies the same box before and after.
82
+ - **The on-device semantic model (~7MB) is fetched when you reach for the composer**, not on the
83
+ first keystroke or click anywhere in Live. The behaviour its own comment described was never
84
+ what the code did — scrolling the page or dismissing a hint counted as "about to ask".
85
+ - Glass blur now goes away where it's supposed to. 29 stylesheets hardcoded their own blur radius
86
+ and so ignored the performance tier that exists to shed exactly that cost on weak machines.
87
+ - The face's mouth keeps moving on the main conversation surface when another surface is also
88
+ showing a face. Live was the one mount that never registered as a voice-energy target.
89
+
90
+ ## [1.2.1] - 2026-08-17
91
+
92
+ ### Fixed
93
+
94
+ - **The legal acknowledgement could not be scrolled, so on a short window there was no way past
95
+ it.** The gate is a document, but the app shell it appears over locks the viewport
96
+ (`html, body { overflow: hidden }`) and a hash route change never unloads that lock — so a card
97
+ taller than the window was clipped at the fold with the two consent checkboxes and Continue
98
+ underneath it, unreachable by wheel, keys or scrollbar. The gate now re-asserts document
99
+ scrolling the way the Terms and Privacy pages already did.
100
+ - `pnpm dev` recovers from a broken Docker credential helper again. The retry handed Docker a
101
+ replacement config directory holding only empty auths, which also discarded the directory Docker
102
+ Desktop keeps `compose` in — so the rescue attempt failed with `unknown command: docker compose`
103
+ and local speech never started. It now keeps the real plugin directory in view.
104
+
9
105
  ## [1.2.0] - 2026-08-17
10
106
 
11
107
  ### Added
package/PRIVACY.md CHANGED
@@ -25,6 +25,7 @@ Depending on the features you use, browser storage may contain:
25
25
  - drafts, tracked items, presentation settings, and recent feature state;
26
26
  - provider and model configuration;
27
27
  - remembered provider, search, or optional GitHub credentials;
28
+ - a short-lived cache of recent questions and the answers to them, kept on the device so that asking the same thing again does not bill your key a second time; it expires within a day, and it deliberately excludes any answer that drew on attachments, ink, filled-in blanks, cited sources, or your remembered facts;
28
29
  - temporary in-progress and finished video-export files in origin-private browser storage until the export is consumed or discarded; and
29
30
  - short-lived demo, tour, route, and in-progress session data.
30
31
 
package/README.md CHANGED
@@ -21,7 +21,7 @@ and evidence you can check, marking the exact figure each line is about.
21
21
  </p>
22
22
 
23
23
  ```sh
24
- npx @mavea/mavea
24
+ npx @mavea/mavea@latest
25
25
  ```
26
26
 
27
27
  Opens `http://localhost:4173` — no install, no account, no model key required.
@@ -32,10 +32,14 @@ Opens `http://localhost:4173` — no install, no account, no model key required.
32
32
 
33
33
  ## Get started
34
34
 
35
- All you need is **Node 20.19+**. That command above opens the tour and demo replays immediately
35
+ All you need is **Node 22.12+**. That command above opens the tour and demo replays immediately
36
36
  — nothing else to set up. Demo replays are fictional, curated prerecorded examples with scripted
37
37
  feature choreography; playback does not call a model provider.
38
38
 
39
+ The `@latest` tag matters: for a bare package name `npx` can reuse a previously cached copy rather
40
+ than fetching a newer one, so asking for `latest` is what reliably gets you the current release.
41
+ Prefer a pinned local copy? `npm install -g @mavea/mavea`, then run `mavea`.
42
+
39
43
  **To talk to a real model (Live):** click **"Open Mavéa"** and paste an Anthropic / OpenAI /
40
44
  Gemini / Grok / OpenRouter key. It stays in memory unless you opt into encrypted local
41
45
  remembering, and each provider request carries it through your same-origin proxy to that
@@ -91,7 +95,7 @@ is in [docs/FEATURES.md](docs/FEATURES.md). In the app, press **⌘K**.
91
95
  ## What it looks like
92
96
 
93
97
  Twelve moments from the walkthrough and the recorded sessions. Every one replays with no key via
94
- `npx @mavea/mavea` — except the thought map, whose threads need a live model to draw.
98
+ `npx @mavea/mavea@latest` — except the thought map, whose threads need a live model to draw.
95
99
 
96
100
  <!-- Generated, never hand-captured: `pnpm gen:media` re-shoots these against the current build
97
101
  (scripts/capture-media.mts), so a UI change can't quietly leave the README a version behind.
@@ -128,7 +132,7 @@ Mavéa runs on your machine, not in a cloud.
128
132
  | **CPU** | 4 cores | 8 cores |
129
133
  | **RAM** | 8 GB | 16 GB |
130
134
  | **Disk** | 3 GB | 10 GB |
131
- | **Node** | 20.19+ | 20.19+ |
135
+ | **Node** | 22.12+ | 24.11+ |
132
136
 
133
137
  Any browser in [Baseline Widely Available](https://web.dev/baseline) — current Chrome, Edge,
134
138
  Safari, or Firefox — on macOS, Windows, or Linux. **Minimum** covers the app with voice off,
package/TERMS.md CHANGED
@@ -40,7 +40,7 @@ Mavéa can communicate with model, search, speech, media, hosting, OAuth, and ac
40
40
 
41
41
  You provide and control your own accounts, API keys, OAuth grants, and other credentials. Requests send relevant credentials and content through the deployment's same-origin proxy before reaching the selected third party. The proxy operator can access that material in transit. You must use a deployment operator you trust.
42
42
 
43
- All costs of using the Service are your responsibility, including hardware, electricity, network access, hosting, domains, model tokens, search requests, speech services, storage, OAuth applications, connected-account activity, taxes, and any other third-party charges. Labels such as "fast", "balanced", or "thorough" are relative product descriptions, not price quotes or spending limits. You are responsible for provider budgets, quotas, and billing alerts.
43
+ All costs of using the Service are your responsibility, including hardware, electricity, network access, hosting, domains, model tokens, search requests, speech services, storage, OAuth applications, connected-account activity, taxes, and any other third-party charges. Labels such as "fast", "balanced", or "thorough" are relative product descriptions, not price quotes or spending limits. Any token counts or usage figures the Service displays are informational only: they report what a provider stated for the current session in this browser, are not a billing record, and may be incomplete, unavailable, or wrong — your provider's own account is the authoritative measure of what you were charged. You are responsible for provider budgets, quotas, and billing alerts.
44
44
 
45
45
  The repository's container definitions can be used with compatible container engines, but the engine or desktop application you choose is separate software. In particular, Docker Desktop is not free for every commercial organization under Docker's current subscription terms. You are responsible for selecting and licensing your development, build, hosting, and container tools; Mavéa does not grant rights in them.
46
46
 
package/THIRD-PARTY.txt CHANGED
@@ -25244,7 +25244,9 @@ whisper.cpp v1.9.1 MIT https://github.com/ggml-org/whisper.cpp
25244
25244
  Whisper small.en-q5_1 MIT https://huggingface.co/ggerganov/whisper.cpp
25245
25245
  (local STT model; downloaded into a local volume and verified by SHA-256 before execution)
25246
25246
  Self-hosted fonts OFL-1.1 public/fonts/LICENSE.txt carries exact notices; OFL-1.1.txt carries the full license; PROVENANCE.md pins every shipped file
25247
- Demonstration media Pexels License / NASA public domain see public/demo-assets/CREDITS.md
25247
+ Demonstration media CC0-1.0 / NASA public domain see public/demo-assets/CREDITS.md
25248
+ (bundled demo photos and the film plate are Wikimedia Commons CC0 dedications, verified per file
25249
+ against the Commons API; the embedded report is a complete work of the US Government)
25248
25250
  Map rendering MapLibre GL JS (BSD-3-Clause) https://maplibre.org/maplibre-gl-js/
25249
25251
  Map tiles OpenFreeMap public service / MIT server https://openfreemap.org/
25250
25252
  (terms reviewed 2026-08-11 currently permit commercial use without request fees; attribution remains
@@ -25255,12 +25257,18 @@ PDF image decoders BSD-3-Clause / BSD-2-Clause / MIT https://github.com/mozilla/
25255
25257
  (jbig2.wasm from PDFium, openjpeg.wasm from OpenJPEG, and qcms_bg.wasm from Mozilla's qcms,
25256
25258
  redistributed via pdfjs-dist and served from dist/pdfjs/ so a scanned page renders; each carries
25257
25259
  its upstream notice beside it as dist/pdfjs/LICENSE_*)
25258
- Syntax-highlighting grammars & themes MIT and other permissive https://github.com/shikijs/textmate-grammars-themes
25259
- (TextMate grammars and GitHub themes redistributed via @shikijs/langs / @shikijs/themes; upstream
25260
- sources and per-grammar licenses are documented in that repository's tm-grammars / tm-themes metadata)
25260
+ Syntax-highlighting grammars & themes MIT, plus the textmate.org grant for yaml/toml https://github.com/shikijs/textmate-grammars-themes
25261
+ (25 TextMate grammars and the two GitHub themes redistributed via @shikijs/langs / @shikijs/themes.
25262
+ Resolved per grammar against that repository's tm-grammars / tm-themes metadata, 2026-08-17: 23 are
25263
+ MIT — 20 from microsoft/vscode, swift from jtbandes/swift-tmlanguage, kotlin from fwcd/vscode-kotlin,
25264
+ both themes from primer/github-vscode-theme. yaml and toml come from textmate/yaml.tmbundle and
25265
+ textmate/toml.tmbundle, which carry no SPDX tag but state in their bundle README: "Permission to
25266
+ copy, use, modify, sell and distribute this software is granted." That is an unrestricted permissive
25267
+ grant with no attribution clause; it is recorded here because an automated license scan reads it as
25268
+ null, not because anything about it is unresolved)
25261
25269
  Embedded tour documents per-document, see below src/tour/corpus/prism.generated.json
25262
25270
  (byte-for-byte copies embedded for the key-free tour's document-reading chapter; each license
25263
25271
  permits redistribution with this notice)
25264
- NASA CFD education report excerpt US-government work, public use permitted https://ntrs.nasa.gov/citations/19950004435
25272
+ NASA CFD education report (complete, 14pp) US-government work, public use permitted https://ntrs.nasa.gov/citations/19950004435
25265
25273
  react/README.md MIT https://github.com/facebook/react
25266
25274
  cars.json + seattle-weather.csv BSD-3-Clause https://github.com/vega/vega-datasets
package/bin/mavea.mjs CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  renameSync,
15
15
  unlinkSync,
16
16
  realpathSync,
17
+ writeFileSync,
17
18
  } from 'node:fs';
18
19
  import { writeFile } from 'node:fs/promises';
19
20
  import { fileURLToPath } from 'node:url';
@@ -941,12 +942,146 @@ async function serviceReachable(url) {
941
942
  }
942
943
  }
943
944
 
944
- function startSpeechServices(runtime) {
945
+ // ---- Kokoro thread tuning ---------------------------------------------------
946
+ //
947
+ // The measured tuner `pnpm dev` runs (scripts/dev.mjs), ported here. Duplicated rather than
948
+ // imported on purpose: the published package ships bin/ and dist/, never the repo's scripts/, and
949
+ // this executable is deliberately dependency-free. Keep the two in step when either changes.
950
+ //
951
+ // There is no thread count that is right for every machine: the same 4 threads that leave a fast
952
+ // box idling at 4x realtime are barely enough on an older one, and the answer depends on per-core
953
+ // speed, which nothing in a compose file can see. Kokoro's throughput is near-linear in threads up
954
+ // to its measured peak (1.12x / 2.47x / 3.38x / 4.23x at 1-4 threads), so one probe at a known
955
+ // thread count yields per-thread speed, and the smallest count clearing the target follows.
956
+
957
+ /** Speech plays at 1x, so anything above it is only margin — but the margin has to absorb a busy
958
+ * machine mid-sentence, and falling behind is audible as a stutter. 2x is the smallest cushion. */
959
+ const VOICE_TARGET_REALTIME = 2;
960
+ /** The measured peak of Kokoro's thread-scaling curve; past this it gets slower AND hungrier. It
961
+ * is also the compose default, so a tuned machine only ever comes DOWN from it. */
962
+ const VOICE_MAX_THREADS = 4;
963
+ const VOICE_PROBE_TEXT =
964
+ 'Mavéa is a voice first thinking companion that draws what it means as it speaks.';
965
+ /** Kokoro emits 24kHz mono 16-bit PCM, so byte length converts straight to seconds of audio. */
966
+ const VOICE_PCM_BYTES_PER_SECOND = 24_000 * 2;
967
+ /** Kokoro loads its voice model on first run; a cold pull can take a while, so poll generously. */
968
+ const VOICE_READY_TIMEOUT_MS = 180_000;
969
+ const VOICE_POLL_MS = 1_000;
970
+
971
+ export function voiceThreadsCacheFile() {
972
+ return join(lazyCacheDir(), 'voice-threads.json');
973
+ }
974
+
975
+ /** The thread count this machine settled on last time, or null on a first run (or a cache written
976
+ * by a build that measured a different ceiling). */
977
+ export function readCachedVoiceThreads(file = voiceThreadsCacheFile()) {
978
+ try {
979
+ const { threads } = JSON.parse(readFileSync(file, 'utf8'));
980
+ return Number.isInteger(threads) && threads > 0 && threads <= VOICE_MAX_THREADS
981
+ ? threads
982
+ : null;
983
+ } catch {
984
+ return null;
985
+ }
986
+ }
987
+
988
+ export function rememberVoiceThreads(threads, realtimePerThread, file = voiceThreadsCacheFile()) {
989
+ try {
990
+ mkdirSync(dirname(file), { recursive: true });
991
+ writeFileSync(file, JSON.stringify({ threads, realtimePerThread }, null, 2));
992
+ return true;
993
+ } catch {
994
+ // A cache that cannot be written costs one probe per run, which is not worth failing over.
995
+ return false;
996
+ }
997
+ }
998
+
999
+ /** The smallest thread count that clears the realtime target at this machine's measured speed. */
1000
+ export function voiceThreadsFor(realtimePerThread) {
1001
+ if (!(realtimePerThread > 0)) return VOICE_MAX_THREADS;
1002
+ return Math.min(
1003
+ VOICE_MAX_THREADS,
1004
+ Math.max(1, Math.ceil(VOICE_TARGET_REALTIME / realtimePerThread)),
1005
+ );
1006
+ }
1007
+
1008
+ /** The environment a compose spawn runs with: the tuned thread count, or the compose default. */
1009
+ export function voiceThreadEnv(threads, env = process.env) {
1010
+ return threads ? { ...env, MAVEA_VOICE_THREADS: String(threads) } : env;
1011
+ }
1012
+
1013
+ /** Synthesize one clause and return how many seconds of audio came back per second of wall clock. */
1014
+ async function measureVoiceRealtime(kokoroUrl) {
1015
+ try {
1016
+ const started = performance.now();
1017
+ const res = await fetch(`${kokoroUrl}/v1/audio/speech`, {
1018
+ method: 'POST',
1019
+ headers: { 'Content-Type': 'application/json' },
1020
+ body: JSON.stringify({
1021
+ model: 'kokoro',
1022
+ input: VOICE_PROBE_TEXT,
1023
+ voice: 'af_heart',
1024
+ response_format: 'pcm',
1025
+ }),
1026
+ signal: AbortSignal.timeout(60_000),
1027
+ });
1028
+ if (!res.ok) return null;
1029
+ const bytes = (await res.arrayBuffer()).byteLength;
1030
+ const seconds = (performance.now() - started) / 1000;
1031
+ if (!bytes || seconds <= 0) return null;
1032
+ return bytes / VOICE_PCM_BYTES_PER_SECOND / seconds;
1033
+ } catch {
1034
+ return null;
1035
+ }
1036
+ }
1037
+
1038
+ /** Measure this machine and record the answer for next time.
1039
+ *
1040
+ * Deliberately does NOT restart the container to apply the new number now: a restart drops the
1041
+ * voice for as long as the model takes to reload, and the app probes speech availability once per
1042
+ * page session — a browser that asks during that window would go silent for the whole session
1043
+ * with nothing to show for it. The default is already safe; the tuned value takes effect on the
1044
+ * next run, so nobody waits and nothing goes quiet. */
1045
+ async function settleVoiceThreads(kokoroUrl, ranAt) {
1046
+ // Best of three, not an average: a busy moment can only ever make synthesis look slower, so the
1047
+ // fastest run is the one closest to what this machine can actually do. The first call also pays
1048
+ // for warmup, which the later ones do not.
1049
+ const runs = [];
1050
+ for (let i = 0; i < 3; i++) {
1051
+ const realtime = await measureVoiceRealtime(kokoroUrl);
1052
+ if (realtime !== null) runs.push(realtime);
1053
+ }
1054
+ if (!runs.length) return;
1055
+ const perThread = Math.max(...runs) / ranAt;
1056
+ const want = voiceThreadsFor(perThread);
1057
+ rememberVoiceThreads(want, Number(perThread.toFixed(3)));
1058
+ if (want === ranAt) return;
1059
+ console.log(
1060
+ ` Voice: this machine only needs ${want} core${want === 1 ? '' : 's'} — applied from the next run.`,
1061
+ );
1062
+ }
1063
+
1064
+ /** Wait for Kokoro to actually answer before probing it — the model load is what takes the time on
1065
+ * a first run, and a measurement taken through it would over-provision every later session. Runs
1066
+ * in the background: the app is already being served while this waits. */
1067
+ async function tuneVoiceWhenReady(kokoroUrl, ranAt) {
1068
+ const deadline = Date.now() + VOICE_READY_TIMEOUT_MS;
1069
+ while (Date.now() < deadline) {
1070
+ if (await serviceReachable(`${kokoroUrl}/health`)) {
1071
+ await settleVoiceThreads(kokoroUrl, ranAt);
1072
+ return;
1073
+ }
1074
+ await new Promise((resolvePoll) => setTimeout(resolvePoll, VOICE_POLL_MS));
1075
+ }
1076
+ }
1077
+
1078
+ function startSpeechServices(runtime, threads) {
945
1079
  console.log(
946
1080
  ' Starting Kokoro TTS + whisper.cpp STT. The first run builds/downloads pinned models…',
947
1081
  );
948
1082
  spawn(runtime.command, [...runtime.prefix, '-f', COMPOSE_FILE, 'up', '-d', '--build'], {
949
1083
  stdio: 'inherit',
1084
+ env: voiceThreadEnv(threads),
950
1085
  });
951
1086
  }
952
1087
 
@@ -1020,7 +1155,13 @@ async function maybeOfferVoice() {
1020
1155
  return;
1021
1156
  }
1022
1157
  }
1023
- startSpeechServices(runtime);
1158
+ const tuned = readCachedVoiceThreads();
1159
+ const startedAt = tuned ?? VOICE_MAX_THREADS;
1160
+ startSpeechServices(runtime, startedAt);
1161
+ // First run on this machine, and we are the ones bringing the voice up: measure it once it
1162
+ // answers and remember the answer for next time. A voice that was already running is left alone
1163
+ // — the probe costs real CPU, and nothing about it is urgent.
1164
+ if (tuned === null && !kokoroReady) void tuneVoiceWhenReady(kokoroUrl, startedAt);
1024
1165
  }
1025
1166
 
1026
1167
  async function main() {