@mavea/mavea 1.0.7

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 (557) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/DISCLAIMER.md +16 -0
  3. package/LICENSE +75 -0
  4. package/PRIVACY.md +127 -0
  5. package/README.md +248 -0
  6. package/SECURITY.md +72 -0
  7. package/SUPPORT.md +13 -0
  8. package/TERMS.md +122 -0
  9. package/THIRD-PARTY.txt +639 -0
  10. package/TRADEMARKS.md +15 -0
  11. package/bin/mavea.mjs +1079 -0
  12. package/dist/.vite/manifest.json +4261 -0
  13. package/dist/_headers +52 -0
  14. package/dist/assets/AppCommandPalette-DUMSp3rd.js +1 -0
  15. package/dist/assets/AtlasView-B5fkQhO6.css +1 -0
  16. package/dist/assets/AtlasView-Dl2fssaG.js +1 -0
  17. package/dist/assets/BlockEmpty-CLtVQf6c.js +1 -0
  18. package/dist/assets/BriefingPlayer-DO205Qkh.js +1 -0
  19. package/dist/assets/BriefingPlayer-TpFZB77N.css +1 -0
  20. package/dist/assets/CanvasSkeleton-BZZPCuRZ.js +2 -0
  21. package/dist/assets/CanvasSkeleton-iy6DBvde.css +1 -0
  22. package/dist/assets/CardEditor-BY1bZiV6.css +1 -0
  23. package/dist/assets/CardEditor-DzJXb0G7.js +1 -0
  24. package/dist/assets/CheckLogRail-F4AlgAcc.css +1 -0
  25. package/dist/assets/CheckLogRail-wUfby67Z.js +1 -0
  26. package/dist/assets/CodeOutput-Kh6ldxQz.js +97 -0
  27. package/dist/assets/CommandPalette-Bb-eErih.css +1 -0
  28. package/dist/assets/CommandPalette-Kl00mMZm.js +1 -0
  29. package/dist/assets/CourseLessonReader-COmTQdSK.css +1 -0
  30. package/dist/assets/CourseLessonReader-MBHoknUz.js +2 -0
  31. package/dist/assets/CourseRail-CUa7uIGG.css +1 -0
  32. package/dist/assets/CourseRail-q6x5cCpW.js +1 -0
  33. package/dist/assets/CoursesApp-v89OVJvg.js +2 -0
  34. package/dist/assets/CrossExamPanel-CZ0ShGma.css +1 -0
  35. package/dist/assets/CrossExamPanel-DH04p6VS.js +1 -0
  36. package/dist/assets/DashPresent-BYXbPuGj.js +1 -0
  37. package/dist/assets/DashPresent-DQYcgp-W.css +1 -0
  38. package/dist/assets/DashboardDetail-B50ZkeVK.js +2 -0
  39. package/dist/assets/DashboardLoopRuntime-CFXPx3v_.js +1 -0
  40. package/dist/assets/DashboardOverview-C-FdGWM5.js +1 -0
  41. package/dist/assets/DashboardSettings-Dmw6JTbI.js +1 -0
  42. package/dist/assets/DashboardsApp-Dx-EsaPW.css +1 -0
  43. package/dist/assets/DashboardsApp-JSY_bVfi.js +2 -0
  44. package/dist/assets/DeepZoomApp-BFNwli7l.js +37 -0
  45. package/dist/assets/DeepZoomApp-fRXCJHHZ.css +1 -0
  46. package/dist/assets/DelegatePanel-BK7rEhIc.js +26 -0
  47. package/dist/assets/DelegatePanel-_9RZiLHM.css +1 -0
  48. package/dist/assets/DemoGallery-BPtVG7_y.js +1 -0
  49. package/dist/assets/DropSelect-DUhdQSta.js +1 -0
  50. package/dist/assets/ExportModal-D4WpAg2c.css +1 -0
  51. package/dist/assets/ExportModal-D65cGyj_.js +2 -0
  52. package/dist/assets/ExtractionPreview-Iwfg2Ogl.js +18 -0
  53. package/dist/assets/FallbackCard-B489rTd9.js +1 -0
  54. package/dist/assets/FallbackCard-D_6ps1xA.css +1 -0
  55. package/dist/assets/FeatureUseNotice-CWt7gOwS.css +1 -0
  56. package/dist/assets/FeatureUseNotice-DPtQ0OGb.js +1 -0
  57. package/dist/assets/FlagshipCTA-BXntKhxb.js +1 -0
  58. package/dist/assets/FlagshipCommandPalette-BDJfasI-.js +1 -0
  59. package/dist/assets/FlagshipShowcase-DJ8Gxk_G.js +1 -0
  60. package/dist/assets/FlashcardsApp-CLNo4WX7.js +1 -0
  61. package/dist/assets/ForecastPanel-Da2ZBUrE.css +1 -0
  62. package/dist/assets/ForecastPanel-PBO2-dgS.js +1 -0
  63. package/dist/assets/GalleryApp-B1CB3_81.css +1 -0
  64. package/dist/assets/GalleryApp-DM03CMRy.js +1 -0
  65. package/dist/assets/HonestByDesign-Dqyth6nW.js +1 -0
  66. package/dist/assets/HowItWorks-C0zosIvq.js +1 -0
  67. package/dist/assets/LegalApp-DZBdExTy.js +1 -0
  68. package/dist/assets/LegalMarkdownDocument-CSZhRG5r.js +3 -0
  69. package/dist/assets/LegalPageShell-C_HottbD.css +1 -0
  70. package/dist/assets/LegalPageShell-DTeXqWyc.js +1 -0
  71. package/dist/assets/LeverPanel-DhpJY76O.css +1 -0
  72. package/dist/assets/LeverPanel-aZfhtVJX.js +1 -0
  73. package/dist/assets/Library-D2XGNXz7.js +1 -0
  74. package/dist/assets/Library-DmrtHjUf.css +1 -0
  75. package/dist/assets/LibraryOverlay-B2WQSgwr.js +1 -0
  76. package/dist/assets/LibraryOverlay-CnKWDMG_.css +1 -0
  77. package/dist/assets/LiveApp-B9zwXlGC.js +61 -0
  78. package/dist/assets/LiveApp-BVZGpJ1S.css +1 -0
  79. package/dist/assets/LiveSettings-CmgrMqvK.css +1 -0
  80. package/dist/assets/LiveSettings-D9OcWlm6.js +6 -0
  81. package/dist/assets/MindMapViewerDrawer-YYyZqmAd.js +1 -0
  82. package/dist/assets/MindShape-Ca3MXEgK.css +1 -0
  83. package/dist/assets/MindShape-mTlN5mPZ.js +1 -0
  84. package/dist/assets/Orb-B0NEVfqL.js +1 -0
  85. package/dist/assets/PinToDashboard-_kIOHs0k.js +1 -0
  86. package/dist/assets/PlanReview-33V8GTNB.js +1 -0
  87. package/dist/assets/Presence-CzLJIeSD.js +1 -0
  88. package/dist/assets/PresentationDeck-BDoGecxr.js +1 -0
  89. package/dist/assets/PrismApp-PfBTFhMF.js +2 -0
  90. package/dist/assets/PrismAskController-DBoxQSJR.css +1 -0
  91. package/dist/assets/PrismAskController-DbQDrlU9.js +37 -0
  92. package/dist/assets/PrismBriefingPlayer-1fvlfLR8.js +2 -0
  93. package/dist/assets/PrismOverlay-B7lEspdu.js +131 -0
  94. package/dist/assets/PrismOverlay-BTfAicBt.css +1 -0
  95. package/dist/assets/PrivacyApp-CR4lRs0L.js +128 -0
  96. package/dist/assets/Quiz-CUwtekfu.js +1 -0
  97. package/dist/assets/Recap-DCiiWNiV.css +1 -0
  98. package/dist/assets/Recap-H5fhj5Tc.js +1 -0
  99. package/dist/assets/ReelJelly-3jSVsJsy.js +1 -0
  100. package/dist/assets/RehearsalPanel-BCU615wg.css +1 -0
  101. package/dist/assets/RehearsalPanel-BVgjrOPg.js +6 -0
  102. package/dist/assets/ReplayCard-BpYO5vX-.js +2 -0
  103. package/dist/assets/ReplayOverlay-DXmVdeIr.js +1 -0
  104. package/dist/assets/RewindOverlay-BusfWeFq.js +1 -0
  105. package/dist/assets/RewindOverlay-C92qgvmi.css +1 -0
  106. package/dist/assets/RippleApp-9KrJPYgN.js +2 -0
  107. package/dist/assets/RippleAskController-BNAUoIW0.css +1 -0
  108. package/dist/assets/RippleAskController-CO9wE7hU.js +34 -0
  109. package/dist/assets/RippleOverlay-DMHLbfh8.js +6 -0
  110. package/dist/assets/RippleOverlay-_iiZsQVZ.css +1 -0
  111. package/dist/assets/SeeDontRead-C389viue.js +1 -0
  112. package/dist/assets/ShareModal-C8S7ySls.css +1 -0
  113. package/dist/assets/ShareModal-ClnEkudw.js +32 -0
  114. package/dist/assets/ShipCascade-BUtwvQoW.js +1 -0
  115. package/dist/assets/ShipCascade-CyFnrlET.css +1 -0
  116. package/dist/assets/ShipCourse-B7lG6DYW.js +1 -0
  117. package/dist/assets/ShipCourse-DcT7PUSm.css +1 -0
  118. package/dist/assets/ShipGate-BVZfCllb.css +1 -0
  119. package/dist/assets/ShipGate-BYYu9WVq.js +2 -0
  120. package/dist/assets/ShipHotspots-Bj2CovtT.js +1 -0
  121. package/dist/assets/ShipHotspots-CLOMutPv.css +1 -0
  122. package/dist/assets/ShipIncident-BUHvFFiC.css +1 -0
  123. package/dist/assets/ShipIncident-DcmindmE.js +2 -0
  124. package/dist/assets/ShipMigration-BznCskNg.css +1 -0
  125. package/dist/assets/ShipMigration-s0hVjDQl.js +1 -0
  126. package/dist/assets/ShipOnboarding-BC9Vxkpa.css +1 -0
  127. package/dist/assets/ShipOnboarding-ekbHL7OH.js +1 -0
  128. package/dist/assets/ShipRead-BVNgQT6L.js +1 -0
  129. package/dist/assets/ShipRollout-BdUQzMyP.js +1 -0
  130. package/dist/assets/ShipRollout-CqeObx5b.css +1 -0
  131. package/dist/assets/ShipSuggestions-B6fKYh8L.js +1 -0
  132. package/dist/assets/ShipSuggestions-BKRvk5Mj.css +1 -0
  133. package/dist/assets/ShipWorkspace-3D3Rrs1p.js +2 -0
  134. package/dist/assets/ShipWorkspace-D6XQpGEN.css +1 -0
  135. package/dist/assets/SignatureLoop-C60r8Wm5.js +1 -0
  136. package/dist/assets/SrsReview-BoaYb6XN.js +1 -0
  137. package/dist/assets/SrsReview-DmGdGxT0.css +1 -0
  138. package/dist/assets/SynthesisApp-vJ2Jq0Qe.js +2 -0
  139. package/dist/assets/SynthesisOverlay-CkERphvG.js +66 -0
  140. package/dist/assets/TermsApp-C70tW6m6.js +123 -0
  141. package/dist/assets/TopicCanvas-CT0eSj2M.js +2 -0
  142. package/dist/assets/TopicCanvas-D2Nax9II.css +1 -0
  143. package/dist/assets/TourPrism-BvucSkcs.js +1 -0
  144. package/dist/assets/TrackerTile-CasZNmt4.js +2 -0
  145. package/dist/assets/TwoSurfaces-C90X7Aj5.js +1 -0
  146. package/dist/assets/UnderstoodPanel-CHPD2Ttj.js +1 -0
  147. package/dist/assets/UnderstoodPanel-Q6GX1TFq.css +1 -0
  148. package/dist/assets/WhyMachineOverlay-BZk3PVTl.css +1 -0
  149. package/dist/assets/WhyMachineOverlay-CB0_n6Sy.js +1 -0
  150. package/dist/assets/WowFeatures-Ci_H5QYX.js +1 -0
  151. package/dist/assets/ZoomDeck-B2SjNwY7.css +1 -0
  152. package/dist/assets/ZoomDeck-BQHO79ZU.js +1 -0
  153. package/dist/assets/__vite-browser-external-BufR4LQa.js +1 -0
  154. package/dist/assets/ai-Ba4lZJ9Y.js +12 -0
  155. package/dist/assets/alternateFinishes-DZ-rkpkX.js +494 -0
  156. package/dist/assets/annotationAuto-B0nihA4F.js +1 -0
  157. package/dist/assets/annotationReel-BcU9Q0Sw.js +1 -0
  158. package/dist/assets/annotations-D2K9A5GB.js +1 -0
  159. package/dist/assets/backup-c-Btapzp.js +1 -0
  160. package/dist/assets/blockLabel-DAqaHKy3.js +1 -0
  161. package/dist/assets/c-DWGmR78Y.js +1 -0
  162. package/dist/assets/c-SSSlmE39.js +1 -0
  163. package/dist/assets/cache-BumECILO.js +1 -0
  164. package/dist/assets/canvas-QTEIiK23.js +1 -0
  165. package/dist/assets/catalog-BHjl-1uH.js +2 -0
  166. package/dist/assets/catalog-Dqaq2YFd.js +1 -0
  167. package/dist/assets/cfo.generated-Bjl5OGay.js +1 -0
  168. package/dist/assets/chapters-BiUsDClQ.js +1 -0
  169. package/dist/assets/charts1-EOoxU_K3.js +1 -0
  170. package/dist/assets/charts2-tyUiQPff.js +1 -0
  171. package/dist/assets/chunk-BVpWp9h4.js +1 -0
  172. package/dist/assets/citation-BcvmjKS8.js +1 -0
  173. package/dist/assets/code-CpjYCNS8.js +8 -0
  174. package/dist/assets/codeContext-0UMRSGRr.js +5 -0
  175. package/dist/assets/colors-D49Req-e.js +1 -0
  176. package/dist/assets/compose-BJ9EfcQS.js +3 -0
  177. package/dist/assets/contentVault-DzTYWcbD.js +1 -0
  178. package/dist/assets/core-DEFyprhs.js +1 -0
  179. package/dist/assets/corpus.generated-oX9uU93S.js +11 -0
  180. package/dist/assets/courseSeed-CZdNBTTs.js +1 -0
  181. package/dist/assets/courseStore-DfafnL-9.js +1 -0
  182. package/dist/assets/courses-BkH1ntDL.css +1 -0
  183. package/dist/assets/cpp-BGdv8dzs.js +1 -0
  184. package/dist/assets/cpp-CNAAXZl-.js +1 -0
  185. package/dist/assets/csharp-oqKa8noW.js +1 -0
  186. package/dist/assets/css-CdtkT07m.js +1 -0
  187. package/dist/assets/css-LbU1hoFO.js +1 -0
  188. package/dist/assets/dag-C3Xx8pOD.js +2 -0
  189. package/dist/assets/dashboardEvents-DR9d_c74.js +2 -0
  190. package/dist/assets/dashboards-rcWxdoXI.css +1 -0
  191. package/dist/assets/deckLine-NBd3MyGT.js +1 -0
  192. package/dist/assets/demoPaletteItems-NPCSaSU6.js +1 -0
  193. package/dist/assets/dev.generated-DYgVxL_4.js +73 -0
  194. package/dist/assets/diagrams-CaSfjT4I.js +1 -0
  195. package/dist/assets/diff-woXpYk--.js +1 -0
  196. package/dist/assets/display-OvC57CMc.js +9 -0
  197. package/dist/assets/dist-BFx3nZg4.js +2785 -0
  198. package/dist/assets/dist-xRGLOZwv.js +14 -0
  199. package/dist/assets/docs-B2aDtm5K.js +1 -0
  200. package/dist/assets/everyday-CoZa4kDZ.js +1 -0
  201. package/dist/assets/explode-WBykfhqW.js +13 -0
  202. package/dist/assets/extractNumbers-CuhagRkd.js +1 -0
  203. package/dist/assets/facts-BBTt3ImG.js +1 -0
  204. package/dist/assets/finance-Bxn_Q1p0.js +1 -0
  205. package/dist/assets/fit-0HxU-rtB.js +1 -0
  206. package/dist/assets/fitText-CDFmCQzl.js +1 -0
  207. package/dist/assets/flows-BL81J7yN.js +1 -0
  208. package/dist/assets/format-DlZTyeMy.js +1 -0
  209. package/dist/assets/format-hc2QOoIu.js +1 -0
  210. package/dist/assets/forms-DeoXOxdD.js +1 -0
  211. package/dist/assets/generate-8odaTyr4.js +17 -0
  212. package/dist/assets/generateBeats-b64CL54v.js +1 -0
  213. package/dist/assets/generateCourse-Cj_-vDWu.js +28 -0
  214. package/dist/assets/generateLive-D4B30fnF.js +52 -0
  215. package/dist/assets/geometry-DXAbnb0J.js +1 -0
  216. package/dist/assets/gesture-DabMpPcq.js +2 -0
  217. package/dist/assets/github-dark-C-LZuMrd.js +1 -0
  218. package/dist/assets/github-light-EUqPIrTm.js +1 -0
  219. package/dist/assets/githubBrowser-DywfDeYx.js +1 -0
  220. package/dist/assets/githubToken-DtcLYqwm.js +11 -0
  221. package/dist/assets/go-rLFTqkRN.js +1 -0
  222. package/dist/assets/homeTarget-BgWKI_E1.js +1 -0
  223. package/dist/assets/html-BcACZWSP.js +1 -0
  224. package/dist/assets/html-DDNsd9lV.js +1 -0
  225. package/dist/assets/http-CJCtjYpA.js +2 -0
  226. package/dist/assets/icons-CHVz6kv_.js +1 -0
  227. package/dist/assets/index-CepQEz75.css +1 -0
  228. package/dist/assets/index-y8GL67bB.js +22 -0
  229. package/dist/assets/index.es-CRLiWwiA.js +5 -0
  230. package/dist/assets/info-CiqHR5cs.js +1 -0
  231. package/dist/assets/java-BtIQNnN0.js +1 -0
  232. package/dist/assets/java-DxlWrXwe.js +1 -0
  233. package/dist/assets/javascript-BzbQS41l.js +1 -0
  234. package/dist/assets/javascript-Yelw-5ZN.js +1 -0
  235. package/dist/assets/json-B0N3XRZU.js +1 -0
  236. package/dist/assets/json-B88Oqtu5.js +1 -0
  237. package/dist/assets/json-CaljABEy.js +1 -0
  238. package/dist/assets/jspdf.es.min-C-Pf79px.js +79 -0
  239. package/dist/assets/jsx-D3KKoC5L.js +1 -0
  240. package/dist/assets/jsx-hEbJ82HF.js +1 -0
  241. package/dist/assets/jsx-runtime-DaSxXjOY.js +1 -0
  242. package/dist/assets/katex-BMCG0xok.js +257 -0
  243. package/dist/assets/keyVault-DEsNh9FR.js +1 -0
  244. package/dist/assets/kokoro-D4GKpSL0.js +1 -0
  245. package/dist/assets/kotlin-DhhofPvG.js +1 -0
  246. package/dist/assets/layout-BFQOzXtG.js +1 -0
  247. package/dist/assets/layout-CkO0Psde.js +1 -0
  248. package/dist/assets/lazyRetry-D50B1UMY.js +1 -0
  249. package/dist/assets/leaflet-src-C_xhOQY7.js +1 -0
  250. package/dist/assets/learn-DVfqN-nf.js +1 -0
  251. package/dist/assets/lib-DMAxsZKm.css +1 -0
  252. package/dist/assets/lib-VFqp6Y3w.js +1 -0
  253. package/dist/assets/links--u_phi0x.js +1 -0
  254. package/dist/assets/liveSchema-CJ49PX5R.js +98 -0
  255. package/dist/assets/markdown-BYOwaDjH.js +1 -0
  256. package/dist/assets/mastery-BPjxP0fN.js +4 -0
  257. package/dist/assets/media-CsrUl279.js +43 -0
  258. package/dist/assets/model-BE0UHu1w.js +27 -0
  259. package/dist/assets/motion-S0NRruNj.js +1 -0
  260. package/dist/assets/nav-Czm-NzPV.js +1 -0
  261. package/dist/assets/neighborhoods-C-1Tjr1r.js +1 -0
  262. package/dist/assets/notes-A9t4jdfx.css +1 -0
  263. package/dist/assets/notes-lROPCorS.js +1 -0
  264. package/dist/assets/notify-Bz4wuE4T.js +1 -0
  265. package/dist/assets/now-C9-UAzTC.js +1 -0
  266. package/dist/assets/number-DXgzss0v.js +1 -0
  267. package/dist/assets/officeDoc-B6nEhNp4.js +3 -0
  268. package/dist/assets/openchemlib-nMLMmg26.js +23 -0
  269. package/dist/assets/overlays-JxbHtA2o.js +1 -0
  270. package/dist/assets/owners-FXDGInVq.js +2 -0
  271. package/dist/assets/pageVisibility-BxUVsw7Z.js +1 -0
  272. package/dist/assets/pdf-Df7PCH7q.js +11 -0
  273. package/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
  274. package/dist/assets/penStrokes-9Q_l7NTt.js +1 -0
  275. package/dist/assets/perfProbe-COAp9PAa.js +1 -0
  276. package/dist/assets/php-CYrBA5iX.js +1 -0
  277. package/dist/assets/pickers-B4-3HOR8.js +1 -0
  278. package/dist/assets/pin-Bya3BL_a.css +1 -0
  279. package/dist/assets/pin-CXSuPJYL.js +1 -0
  280. package/dist/assets/planTracker-7AMCQPNx.js +1 -0
  281. package/dist/assets/portal-DMw7C32j.js +1 -0
  282. package/dist/assets/pptxgen.es-CvTILmV9.js +115 -0
  283. package/dist/assets/predictions-CYS7Vo39.js +1 -0
  284. package/dist/assets/prewarm--whjQhWJ.js +1 -0
  285. package/dist/assets/prism-app-CXYElq8-.css +1 -0
  286. package/dist/assets/prism.generated-BhbHDHR6.js +41 -0
  287. package/dist/assets/prismExtract.worker-Cws9K1NG.js +13 -0
  288. package/dist/assets/prismGround.worker-CIvKqxm2.js +1 -0
  289. package/dist/assets/prismLayout.worker-CZO2CY7B.js +1 -0
  290. package/dist/assets/providers-wzm7E8Pa.js +1 -0
  291. package/dist/assets/purify.es-adlwq8Pz.js +3 -0
  292. package/dist/assets/python-gzcpVVnB.js +1 -0
  293. package/dist/assets/queue-DHeyJ32F.css +1 -0
  294. package/dist/assets/queue-J4h7E3uc.js +1 -0
  295. package/dist/assets/quietHours-BvcsBKKK.js +1 -0
  296. package/dist/assets/react-BQSORdFI.js +1 -0
  297. package/dist/assets/reference-sJzyMiL4.js +1 -0
  298. package/dist/assets/registry-1GuPBfQK.js +1 -0
  299. package/dist/assets/registry-2GJZ46M8.css +1 -0
  300. package/dist/assets/registry-2v0jlh5Q.js +2 -0
  301. package/dist/assets/registry-B8DStMJk.js +1 -0
  302. package/dist/assets/registry-B940W2j5.js +1 -0
  303. package/dist/assets/registry-BAoRB8rd.css +1 -0
  304. package/dist/assets/registry-BPvIPLke.js +1 -0
  305. package/dist/assets/registry-BVHiKEwE.css +1 -0
  306. package/dist/assets/registry-BcZXBr3y.css +1 -0
  307. package/dist/assets/registry-BffpZK5w.js +1 -0
  308. package/dist/assets/registry-BgGeRiDA.js +2 -0
  309. package/dist/assets/registry-Buq5uuCv.js +1 -0
  310. package/dist/assets/registry-BzNLfje1.css +1 -0
  311. package/dist/assets/registry-C3ezxLR3.css +1 -0
  312. package/dist/assets/registry-CAusoyBh.js +1 -0
  313. package/dist/assets/registry-CEVrY72Z.js +1 -0
  314. package/dist/assets/registry-CKjKq6ct.js +1 -0
  315. package/dist/assets/registry-CNgybLQv.css +1 -0
  316. package/dist/assets/registry-CRM7y8QT.css +1 -0
  317. package/dist/assets/registry-CRisz4Ca.css +1 -0
  318. package/dist/assets/registry-Cg7qUZPS.js +1 -0
  319. package/dist/assets/registry-Cix-yqch.js +1 -0
  320. package/dist/assets/registry-CtbuZWYz.css +1 -0
  321. package/dist/assets/registry-DCI_BeFJ.js +5 -0
  322. package/dist/assets/registry-DDLSYDVA.js +1 -0
  323. package/dist/assets/registry-DI1wSG1Y.js +1 -0
  324. package/dist/assets/registry-DJinB5ye.js +2 -0
  325. package/dist/assets/registry-DUvXX_d0.js +1 -0
  326. package/dist/assets/registry-DVzLacl_.css +1 -0
  327. package/dist/assets/registry-DWcNVyI2.css +1 -0
  328. package/dist/assets/registry-D_URPoL4.js +1 -0
  329. package/dist/assets/registry-Dkc7hN5T.js +1 -0
  330. package/dist/assets/registry-DmQlNN3y.js +1 -0
  331. package/dist/assets/registry-DpaaVbmL.css +1 -0
  332. package/dist/assets/registry-Dpb8EXHn.js +49 -0
  333. package/dist/assets/registry-Dru0JcTa.css +1 -0
  334. package/dist/assets/registry-DujBAgn_.js +1 -0
  335. package/dist/assets/registry-Dye5m3qt.css +1 -0
  336. package/dist/assets/registry-GeSy4i7R.css +1 -0
  337. package/dist/assets/registry-QcULZpdE.js +4 -0
  338. package/dist/assets/registry-T3i2Q9SI.css +1 -0
  339. package/dist/assets/registry-UFIuwh3i.css +1 -0
  340. package/dist/assets/registry-Xzq_Rpmm.css +1 -0
  341. package/dist/assets/registry-ZOWzhOHk.css +1 -0
  342. package/dist/assets/registry-aIH-Im5Y.css +1 -0
  343. package/dist/assets/registry-aazwkBJp.js +1 -0
  344. package/dist/assets/registry-ei6fIgBT.css +1 -0
  345. package/dist/assets/registry-types-DMuK0vJ6.js +1 -0
  346. package/dist/assets/registry-upbw6pyj.css +1 -0
  347. package/dist/assets/registry-zRPjWNl5.js +1 -0
  348. package/dist/assets/relate-A9ZeaaAI.js +1 -0
  349. package/dist/assets/richText-BkxJhl9N.js +1 -0
  350. package/dist/assets/ruby-BhrksQMt.js +1 -0
  351. package/dist/assets/run-BYP2YlZT.js +23 -0
  352. package/dist/assets/run-C_0B_41W.js +21 -0
  353. package/dist/assets/run-DSVvshaB.js +21 -0
  354. package/dist/assets/rust-Cfkwpbl8.js +1 -0
  355. package/dist/assets/safeCssColor-di93BXgG.js +1 -0
  356. package/dist/assets/safeImageUrl-CUkucDUu.js +1 -0
  357. package/dist/assets/scale-Bcgfo6Hp.js +1 -0
  358. package/dist/assets/screen-DLR7p_yP.js +1 -0
  359. package/dist/assets/search-DnjHupRf.js +1 -0
  360. package/dist/assets/seed-b1xc0dj2.js +1 -0
  361. package/dist/assets/shapes-RqjqC0ay.js +1 -0
  362. package/dist/assets/shard000-DM_rqD7W.js +1 -0
  363. package/dist/assets/shard001-gQEQs7_F.js +1 -0
  364. package/dist/assets/shard002-DbDas-W-.js +1 -0
  365. package/dist/assets/shard003-DxMszG4_.js +1 -0
  366. package/dist/assets/shard004-DZMpLBw1.js +1 -0
  367. package/dist/assets/shard005-DLVkh9IH.js +1 -0
  368. package/dist/assets/shard006-B6efKHov.js +1 -0
  369. package/dist/assets/shard007-AFdZLe38.js +1 -0
  370. package/dist/assets/shard008-LbSBzwRx.js +1 -0
  371. package/dist/assets/shard009-D_6-SUDb.js +1 -0
  372. package/dist/assets/shard010-DbOj-uZW.js +1 -0
  373. package/dist/assets/shard011-BYSz7EEW.js +1 -0
  374. package/dist/assets/shard012-B5Ypj7OV.js +1 -0
  375. package/dist/assets/shard013-BtsliNIe.js +1 -0
  376. package/dist/assets/shard014-15sjmk68.js +1 -0
  377. package/dist/assets/shard015-nnXrqru_.js +1 -0
  378. package/dist/assets/shard016-BayXFE13.js +1 -0
  379. package/dist/assets/shard017-Cy4cGexs.js +1 -0
  380. package/dist/assets/shard018-aO-BYJ8H.js +1 -0
  381. package/dist/assets/shard019-gxaTeA3I.js +1 -0
  382. package/dist/assets/shard020-BibJdMI0.js +1 -0
  383. package/dist/assets/shard021-2FE-tze4.js +1 -0
  384. package/dist/assets/shard022-IXiyG-JK.js +1 -0
  385. package/dist/assets/shard023-314F6NJS.js +1 -0
  386. package/dist/assets/shard024-cN5rpQ_X.js +1 -0
  387. package/dist/assets/shard025-KKTaXOGE.js +1 -0
  388. package/dist/assets/shard026-C2Dkd1t6.js +1 -0
  389. package/dist/assets/shard027-Xy-8x9As.js +1 -0
  390. package/dist/assets/shard028-Bul-klUj.js +1 -0
  391. package/dist/assets/shard029-BbRSUcUZ.js +1 -0
  392. package/dist/assets/shard030-GYllsFVC.js +1 -0
  393. package/dist/assets/shard031-DMigeiyn.js +1 -0
  394. package/dist/assets/shard032-CcvmzK0l.js +1 -0
  395. package/dist/assets/shard033-11AU702M.js +1 -0
  396. package/dist/assets/shard034-Bx3urxjM.js +1 -0
  397. package/dist/assets/shard035-DBdEeyCt.js +1 -0
  398. package/dist/assets/shard036-vYgoRBqS.js +1 -0
  399. package/dist/assets/shard037-DP4MMw91.js +1 -0
  400. package/dist/assets/shard038-ffxsv7d6.js +1 -0
  401. package/dist/assets/shard039-C1JHHNp9.js +1 -0
  402. package/dist/assets/shard040-JbVvCSO_.js +1 -0
  403. package/dist/assets/shard041-5L_eFwGx.js +1 -0
  404. package/dist/assets/shard042-C9nsGL79.js +1 -0
  405. package/dist/assets/shard043-Dx_9HSKI.js +1 -0
  406. package/dist/assets/shard044-B3QQNC4A.js +1 -0
  407. package/dist/assets/shard045-B7z0WHO6.js +1 -0
  408. package/dist/assets/shard046-D1yDablJ.js +1 -0
  409. package/dist/assets/shard047-DJi3AgeT.js +1 -0
  410. package/dist/assets/shard048-D_2ipfUr.js +1 -0
  411. package/dist/assets/shard049-1aGgWZdd.js +1 -0
  412. package/dist/assets/shard050-Bjwa0Og4.js +1 -0
  413. package/dist/assets/shard051-Cx_GAk3v.js +1 -0
  414. package/dist/assets/shard052-LaeOD3V5.js +1 -0
  415. package/dist/assets/shard053-D-da7Foj.js +1 -0
  416. package/dist/assets/shard054-CM8eSRQk.js +1 -0
  417. package/dist/assets/shard055-QRpDl4Vs.js +1 -0
  418. package/dist/assets/shard056-DkY7CQm3.js +1 -0
  419. package/dist/assets/shard057-BVCgf7o0.js +1 -0
  420. package/dist/assets/shard058-93aGtdrX.js +1 -0
  421. package/dist/assets/shard059-rJE9X1_I.js +1 -0
  422. package/dist/assets/shard060-Lu_hfl1r.js +1 -0
  423. package/dist/assets/shard061-C9A8iNiq.js +1 -0
  424. package/dist/assets/shard062-BBIpEYZO.js +1 -0
  425. package/dist/assets/shard063-C_uen3Ub.js +1 -0
  426. package/dist/assets/shard064-DAHUsHST.js +1 -0
  427. package/dist/assets/shard065-C2edvdvh.js +1 -0
  428. package/dist/assets/shard066-DFcuVhZm.js +1 -0
  429. package/dist/assets/shard067-BN8DM8JZ.js +1 -0
  430. package/dist/assets/shard068-i464K77p.js +1 -0
  431. package/dist/assets/shard069-Dm9m2a5U.js +1 -0
  432. package/dist/assets/shard070-BPVvR8GH.js +1 -0
  433. package/dist/assets/shard071-Bal_0d9L.js +1 -0
  434. package/dist/assets/shard072-CBQu62kt.js +1 -0
  435. package/dist/assets/shard073-D5BRae0w.js +1 -0
  436. package/dist/assets/shard074-DtFvcBnZ.js +1 -0
  437. package/dist/assets/share-QHGHNDhQ.js +1 -0
  438. package/dist/assets/shellscript-BiGZg9Om.js +1 -0
  439. package/dist/assets/shellscript-CqHdAlCp.js +1 -0
  440. package/dist/assets/shikiHighlight-DUCYbsJ2.js +153 -0
  441. package/dist/assets/sourceHost-BV3t2XDb.js +1 -0
  442. package/dist/assets/speed-DwPw9KSv.js +1 -0
  443. package/dist/assets/spokenText-D4zPX9JY.js +1 -0
  444. package/dist/assets/sql-0Qcw9ht3.js +1 -0
  445. package/dist/assets/sql-CP0rg-5b.js +1 -0
  446. package/dist/assets/src-DbgF7cRH.js +2 -0
  447. package/dist/assets/stats-BeP5Bws0.js +1 -0
  448. package/dist/assets/status-BY02LIJt.js +1 -0
  449. package/dist/assets/stepDriver-DwjFet6U.js +1 -0
  450. package/dist/assets/store-4JNNn732.js +1 -0
  451. package/dist/assets/store-BFC7DZcg.js +1 -0
  452. package/dist/assets/store-BFrJaSxJ.js +1 -0
  453. package/dist/assets/store-DXmC_fP2.js +0 -0
  454. package/dist/assets/store-DgG0C1Qx.js +1 -0
  455. package/dist/assets/streamParse-DRgMHWye.js +2 -0
  456. package/dist/assets/student.generated-DS_acPaJ.js +1 -0
  457. package/dist/assets/swift-DonLKvLd.js +1 -0
  458. package/dist/assets/tables-Dzd3rTqG.js +1 -0
  459. package/dist/assets/time-BHTmJR1s.js +1 -0
  460. package/dist/assets/toast-BBNs2h3L.js +1 -0
  461. package/dist/assets/toml-CcmNWLt0.js +1 -0
  462. package/dist/assets/traveler.generated-Beun9X7y.js +1 -0
  463. package/dist/assets/tsx-5f3ulCja.js +1 -0
  464. package/dist/assets/tsx-BOvsFOI6.js +1 -0
  465. package/dist/assets/typeof-B5XbjTb1.js +1 -0
  466. package/dist/assets/typescript-Utq2Cl8c.js +1 -0
  467. package/dist/assets/typescript-j_1H8WHN.js +1 -0
  468. package/dist/assets/useDashboardLoop-B6ByHWoE.js +5 -0
  469. package/dist/assets/useFocusTrap-DbfG6zbM.js +1 -0
  470. package/dist/assets/useLiveConfig-X9Wxh90k.js +1 -0
  471. package/dist/assets/useSpatialCanvas-DogK9457.js +1 -0
  472. package/dist/assets/useSpotlightWalk-rMbmNBKK.js +1 -0
  473. package/dist/assets/useSrsCards-CagZefwX.js +1 -0
  474. package/dist/assets/useStudy-Bflreq2a.js +1 -0
  475. package/dist/assets/useTimeout-BRYvu2jQ.js +1 -0
  476. package/dist/assets/useValidatedImage-D2fhA198.js +1 -0
  477. package/dist/assets/useZoomGesture-CYc3tf2z.js +1 -0
  478. package/dist/assets/verbatim-CBMzUDlf.js +1 -0
  479. package/dist/assets/worker-BbLKfGzm.js +2 -0
  480. package/dist/assets/xml-WY0zc4PG.js +1 -0
  481. package/dist/assets/yaml-CxbubiML.js +1 -0
  482. package/dist/assets/yaml-DijMHRDA.js +1 -0
  483. package/dist/demo-assets/CREDITS.md +40 -0
  484. package/dist/demo-assets/images/basalt-cliffs.jpg +0 -0
  485. package/dist/demo-assets/images/capelinhos.jpg +0 -0
  486. package/dist/demo-assets/images/cliff-fields.jpg +0 -0
  487. package/dist/demo-assets/images/crater-panorama.jpg +0 -0
  488. package/dist/demo-assets/images/furnas-lake.jpg +0 -0
  489. package/dist/demo-assets/images/green-coast.jpg +0 -0
  490. package/dist/demo-assets/images/overcast-coast.jpg +0 -0
  491. package/dist/demo-assets/images/patchwork-fields.jpg +0 -0
  492. package/dist/demo-assets/images/ponta-delgada.jpg +0 -0
  493. package/dist/demo-assets/images/sete-cidades.jpg +0 -0
  494. package/dist/demo-assets/images/slide-placeholder-light.svg +9 -0
  495. package/dist/demo-assets/images/slide-placeholder.svg +9 -0
  496. package/dist/demo-assets/images/village-street.jpg +0 -0
  497. package/dist/demo-assets/pdf/cfd-primer.pdf +0 -0
  498. package/dist/demo-assets/video/azores-film.mp4 +0 -0
  499. package/dist/favicon.svg +19 -0
  500. package/dist/fonts/LICENSE.txt +34 -0
  501. package/dist/fonts/archivo-var-latin.woff2 +0 -0
  502. package/dist/fonts/bodoni-moda-400-italic-latin.woff2 +0 -0
  503. package/dist/fonts/bodoni-moda-var-latin.woff2 +0 -0
  504. package/dist/fonts/eb-garamond-var-italic-latin.woff2 +0 -0
  505. package/dist/fonts/eb-garamond-var-latin.woff2 +0 -0
  506. package/dist/fonts/export/families/archivo.css +12 -0
  507. package/dist/fonts/export/families/bodoni-moda.css +23 -0
  508. package/dist/fonts/export/families/eb-garamond.css +22 -0
  509. package/dist/fonts/export/families/ibm-plex-sans.css +12 -0
  510. package/dist/fonts/export/families/instrument-serif.css +22 -0
  511. package/dist/fonts/export/families/jetbrains-mono.css +12 -0
  512. package/dist/fonts/export/families/libre-franklin.css +12 -0
  513. package/dist/fonts/export/families/lora.css +22 -0
  514. package/dist/fonts/export/families/source-serif-4.css +12 -0
  515. package/dist/fonts/export/families/space-grotesk.css +12 -0
  516. package/dist/fonts/export/families/spectral.css +52 -0
  517. package/dist/fonts/fonts.css +141 -0
  518. package/dist/fonts/hanken-grotesk-var-latin.woff2 +0 -0
  519. package/dist/fonts/ibm-plex-sans-var-latin.woff2 +0 -0
  520. package/dist/fonts/instrument-serif-400-italic-latin.woff2 +0 -0
  521. package/dist/fonts/instrument-serif-400-latin.woff2 +0 -0
  522. package/dist/fonts/jetbrains-mono-var-latin.woff2 +0 -0
  523. package/dist/fonts/libre-franklin-var-latin.woff2 +0 -0
  524. package/dist/fonts/lora-var-italic-latin.woff2 +0 -0
  525. package/dist/fonts/lora-var-latin.woff2 +0 -0
  526. package/dist/fonts/newsreader-var-italic-latin.woff2 +0 -0
  527. package/dist/fonts/newsreader-var-latin.woff2 +0 -0
  528. package/dist/fonts/plex-mono-400-latin.woff2 +0 -0
  529. package/dist/fonts/plex-mono-500-latin.woff2 +0 -0
  530. package/dist/fonts/plex-mono-600-latin.woff2 +0 -0
  531. package/dist/fonts/source-serif-4-var-latin.woff2 +0 -0
  532. package/dist/fonts/space-grotesk-var-latin.woff2 +0 -0
  533. package/dist/fonts/spectral-400-italic-latin.woff2 +0 -0
  534. package/dist/fonts/spectral-400-latin.woff2 +0 -0
  535. package/dist/fonts/spectral-500-italic-latin.woff2 +0 -0
  536. package/dist/fonts/spectral-500-latin.woff2 +0 -0
  537. package/dist/fonts/spectral-600-latin.woff2 +0 -0
  538. package/dist/index.html +117 -0
  539. package/dist/legal/DISCLAIMER.md +16 -0
  540. package/dist/legal/LICENSE.txt +75 -0
  541. package/dist/legal/PRIVACY.md +127 -0
  542. package/dist/legal/SECURITY.md +72 -0
  543. package/dist/legal/SUPPORT.md +13 -0
  544. package/dist/legal/TERMS.md +122 -0
  545. package/dist/legal/THIRD-PARTY.txt +639 -0
  546. package/dist/legal/TRADEMARKS.md +15 -0
  547. package/dist/ort-wasm-simd-threaded.mjs +59 -0
  548. package/dist/sw.js +30 -0
  549. package/dist/vad.worklet.bundle.min.js +1 -0
  550. package/docker-compose.yml +33 -0
  551. package/gateway/README.md +99 -0
  552. package/gateway/actions-gateway.mjs +537 -0
  553. package/gateway/connectors.d.mts +27 -0
  554. package/gateway/connectors.mjs +463 -0
  555. package/gateway/guard.mjs +110 -0
  556. package/gateway/tokenStore.mjs +134 -0
  557. package/package.json +143 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,159 @@
1
+ # Changelog
2
+
3
+ All notable changes to Mavéa are documented here. The format is based on
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project aims to follow
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ### Fixed — the pre-launch pass
10
+
11
+ Everything below was found by measuring, not by reading.
12
+
13
+ - **OpenAI was broken for every substantive question.** A reasoning model spends its thinking tokens
14
+ out of the same `max_output_tokens` budget as its answer, and when it runs out mid-thought the run
15
+ ends `incomplete` having written nothing at all. Asking it to plan a three-day trip took 72 seconds
16
+ and returned the honest-fallback card. The thinking headroom Gemini and Anthropic already had now
17
+ extends to OpenAI and Grok; `response.incomplete` is surfaced instead of silently swallowed; and
18
+ reasoning effort is pinned to `low`, where it demonstrably works (above that, the reasoning runs
19
+ away — at ~18k tokens it thought for 119 seconds and still wrote nothing). Same question, search
20
+ on: **72s → 27s, one model call instead of two, a real eight-block itinerary with live sources.**
21
+ - **Push-to-talk never worked in Live.** The hold listener refused to arm inside a text field, and
22
+ the composer takes focus whenever you aren't speaking — so the target was always an input. A bare
23
+ modifier types no character, so it now arms there and stands down the moment another key joins it
24
+ (a real combination like ⌥E).
25
+ - **The app needed a refresh on `pnpm dev`, and could lose an answer mid-flight.** Vite's scanner
26
+ only follows static imports, so a package reached solely through `import()` was invisible to it;
27
+ the first time the running app touched one it re-bundled and hard-reloaded the page — a blank first
28
+ paint on arrival, and on the mic (which pulls in the voice model) a reload straight through
29
+ whatever turn was in flight.
30
+ - **The block library now fits a phone.** 76 of ~580 blocks clipped their content at 320px. Two
31
+ shared rules caused most of it: the card footer could not wrap, and the card eyebrow carried
32
+ `nowrap` over a label the model writes.
33
+ - **Nothing heavy loads before you ask for it.** The ~7MB on-device embedder was fetched the moment
34
+ Live mounted; someone who opened Live, looked around and left paid for all of it. It waits for a
35
+ sign you mean to ask something.
36
+ - Photos were stamped "AI image" though Mavéa does not generate images; a re-ask replayed the old
37
+ answer when you toggled "explain simply"; a failed file read left the Synthesis drop zone spinning
38
+ forever; a broken chunk could reload the browser without end; and `GradientDescent` drew no surface
39
+ at all (it mixed data and pixel coordinates and emitted negative SVG rects, which browsers refuse).
40
+
41
+ ### Removed
42
+
43
+ - `vercel.json`. It was never used, and its own comment conceded that BYOK Live could not work there
44
+ without serverless forwarders that were never written — so deploying with it would have shipped an
45
+ app with every provider call broken.
46
+
47
+ ### Added
48
+
49
+ - **The voice-first redesign.** The spoken answer leads as a serif headline over the evidence;
50
+ six theme templates (paper / daylight / ink / console / marquee / original), each a complete
51
+ token re-skin with its own light **and** dark; honest turn states (a live listening card,
52
+ skeletons labeled with the real streaming block type, a said-vs-shown speak ribbon); a
53
+ "What are we figuring out?" welcome hub with starter chips and resumable moments cards.
54
+ - **It points while it talks.** Mavéa draws hand-style circles, underlines, and arrows on the
55
+ exact figure each spoken line is about — targets are model-authored and located in the card's
56
+ real DOM (no reason, no ink), with a generous **teach mode** ("walk me through it"). Strokes
57
+ persist on the card, replay in shared Stories, and survive follow-up turns.
58
+ - **Edit its mind** — every answer lists the constraints it rests on as tappable chips; fixing
59
+ one fires a single correction turn. **Self-healing history** — a genuine reversal marks the
60
+ earlier moment _corrected_ (was → now) in the rail and recap instead of rewriting it silently.
61
+ - **Blocks fuse** — drag any card onto another for a grounded answer about the real relationship
62
+ between their data. **Ask about this** pins blocks so follow-ups are grounded in their exact
63
+ on-screen props.
64
+ - **Time as a medium.** Per-turn frames with replay; a session **Recap** ("Tonight, so far.");
65
+ **semantic zoom** (pinch out to chapters, again to one breath); and **scrub-the-voice** — the
66
+ settled answer's real spoken track as a waveform that un-builds the canvas to what had been
67
+ _said_ at any moment, then rebuilds as it replays.
68
+ - **Ghost blocks** — while you're still talking, dashed _forming / maybe_ cards sketch the answer
69
+ taking shape (speculative, abortable, off on the Fast quality dial).
70
+ - **The companion.** **Hold my thought** catches unfinished sentences and offers one back at
71
+ wind-down; **whisper mode** dims the room and the voice during quiet hours (10 PM–6 AM,
72
+ opt-out); **think-out-loud** banks a ramble and sorts it into decisions / todos /
73
+ contradictions on "thoughts?".
74
+ - **The Rehearsal** — practice a hard conversation against a counterpart grounded only in
75
+ context you supply, with a coach card between takes. **The Table** — two real agents negotiate
76
+ on your key inside code-enforced boundaries; the deal stays pending both humans.
77
+ - **Living answers.** **Track this** turns anything you asked about into a **living dashboard**
78
+ (`#/dashboards`) that re-checks itself on a cadence you set — an honest re-ask on your own key,
79
+ never a fake background update — with a running check log, a spend ledger, tripwire alerts, and
80
+ a Rewind of how the answer changed; **bendable answers** carry model-authored formulas so
81
+ dragging the one number that matters recomputes the outputs, auditable (whitelist evaluator,
82
+ never `eval`).
83
+ - **Reach.** **Share-to-Mavéa** — paste or drop a link/screenshot anywhere on Live for a
84
+ source-grounded claim check; **Present mode** — a full-theater stage with slide nav and the
85
+ mic left live so room questions become canvases ("from the room"); **Your Atlas** — every
86
+ conversation as a flyable map clustered by your own words; **Mavéa Story** — share a session as
87
+ a cinematic MP4 of the real components; **per-fact memory provenance** ("you said so" vs
88
+ inferred — and an inferred guess is never asserted as fact) with grouped view and JSON export,
89
+ plus memory that **learns how you like answers** — honoring a correction or a stated
90
+ format/depth on the very next turn, query-conditioned recall, all local and at no extra cost,
91
+ with a multi-turn eval that proves the lift.
92
+ - **The new face** — an aurora jelly replaces the original orb: its bell gradient _is_ the mood,
93
+ and four tentacle curtains carry the state. Same data-attribute contract (state / emotion /
94
+ gaze), so templates, docking, and voice-energy sync carry over.
95
+ - `pnpm new:block <family> <type>` — a scaffold that wires a new canvas block into the family
96
+ types, registry, and the `ComponentMeta` catalog — plus `docs/ADDING-A-COMPONENT.md` as the
97
+ one canonical guide to the block contract.
98
+ - A registry ↔ `ComponentMeta` bijection test and a gallery-family coverage test: a block added
99
+ without metadata (so Live can never select it) or a family missing from the `#/gallery` QA
100
+ surface now fails the suite instead of slipping through silently.
101
+ - `.env.example` documenting local service URLs, gateway credentials, and eval keys.
102
+ - A Content-Security-Policy (meta + nginx headers) plus `X-Content-Type-Options`,
103
+ `Referrer-Policy`, `X-Frame-Options`, and a microphone/screen-capture-scoped
104
+ `Permissions-Policy` — verified against the production build with the policy enforcing.
105
+
106
+ ### Changed
107
+
108
+ - **Kokoro is now the only voice.** The browser `speechSynthesis` engine is removed — when the
109
+ model isn't reachable, lines are captions-only rather than read in a robotic system voice.
110
+ Kokoro's container now runs by default (`docker compose up`), not only under `--profile live`,
111
+ so a hosted-model Live user hears the natural voice; Whisper stays live-profile-only.
112
+ - Consolidated to a single documented block standard (`ComponentMeta`); the orphaned
113
+ `BlockDescriptor` "standard" that no code used was removed.
114
+ - Wired the `code`, `compose`, `diagrams`, `everyday`, and `reference` families into the gallery
115
+ so their blocks group correctly instead of falling into a catch-all bucket.
116
+
117
+ ### Fixed
118
+
119
+ - **Security** — add SRI integrity check (`sha384`) to the PDF.js worker `fetch()` call in
120
+ Prism; the code sandbox already pinned Pyodide the same way — this closes the asymmetric gap.
121
+ - **Security** — sanitize the HTML render boundary for model- and search-derived content
122
+ (message-draft bodies, web-search excerpts, source snippets, accordion bodies). Closes an
123
+ entity-decode XSS in the search path and an un-neutralized message-draft body.
124
+ - **Security** — validate and bound actions-gateway inputs: reject CR/LF in Gmail
125
+ recipients/subjects (MIME header injection) and length-cap every field.
126
+ - **CSP** — `<object type="application/pdf">` silently blocked by `object-src 'none'`; replaced
127
+ with `<iframe>` (permitted by `default-src 'self'` for same-origin PDFs).
128
+ - **Mobile nav** — More-menu and topbar divider failed to hide at ≤430px because `voice.css`
129
+ (imported later) was winning the cascade; added `!important` to the mobile CSS rules.
130
+ - **Accessibility** — Combobox: added `role="combobox"`, `aria-expanded`, `aria-autocomplete`
131
+ so screen readers announce it as a combobox, not a bare text field.
132
+ - **Accessibility** — Formpanel: labels were siblings without `for`/`id` pairing; added
133
+ `htmlFor`/`id` association on every field type (text, email, select, textarea).
134
+ - **Accessibility** — Hidden file-picker inputs (attach + import settings) now carry
135
+ `aria-hidden="true"` so they are invisible to assistive technology.
136
+ - **Accessibility** — Composer text input and the demo play-stop button were missing
137
+ `aria-label`; both are now properly labelled for screen readers.
138
+ - **Tests** — `parsetree [extreme]` gauntlet fixture was O(exponential): `stressValue()` expanded
139
+ `children` arrays ×10 (cap 50), creating ~27 000 SVG nodes at 3 levels of nesting. Capped
140
+ `children`/`nodes` keys at 4 items; render time dropped from >20 s to 6 ms.
141
+ - **Canvas** — `BlockBoundary` now calls `console.error` in `componentDidCatch` so block render
142
+ failures are visible in the browser console without crashing the canvas or the voice track.
143
+
144
+ ### Removed
145
+
146
+ - Dead code — an unused descriptor system, an unused text-fitting module, and a chain of unused
147
+ exports; `pnpm knip` now reports zero.
148
+
149
+ ## [1.0.0]
150
+
151
+ Initial release. Two surfaces that share one component library and one stylesheet:
152
+
153
+ - **Demo** — a home library of spoken, two-voice persona conversations across a large
154
+ visualization library (the "living canvas").
155
+ - **Live** — bring-your-own-key, multi-provider (Anthropic, OpenAI, Gemini, xAI Grok, OpenRouter)
156
+ talk-to-a-real-model mode with a real canvas, two-voice TTS, and web search.
157
+
158
+ React 19 + Vite + TypeScript with a bespoke CSS design system; keys stay client-side; runs in
159
+ Docker.
package/DISCLAIMER.md ADDED
@@ -0,0 +1,16 @@
1
+ # Mavéa Disclaimer
2
+
3
+ Effective: July 16, 2026
4
+
5
+ Mavéa uses probabilistic AI systems and can be wrong.
6
+
7
+ - AI-generated text, citations, calculations, classifications, transcriptions, translations, and visualizations may be inaccurate, incomplete, misleading, offensive, or outdated.
8
+ - A citation, confidence label, validation step, or polished visualization does not guarantee that a claim is correct.
9
+ - Verify important information with authoritative sources and qualified professionals before relying on it.
10
+ - Mavéa does not provide medical, legal, financial, tax, accounting, safety, engineering, mental-health, or other professional advice. Do not use it for emergencies or as the sole basis for high-impact decisions.
11
+ - You are responsible for the prompts, files, audio, accounts, credentials, and actions you provide or authorize.
12
+ - Model, search, speech, hosting, OAuth, media, and connected-action providers are independent third parties. Their terms, privacy practices, availability, and charges apply. All costs are your responsibility.
13
+ - Credentials and relevant content travel through the deployment operator's same-origin proxy before reaching selected providers. The operator can access them in transit.
14
+ - Confirmed actions may create external communications, account changes, charges, or other consequences. Review every action and use test accounts and backups where appropriate.
15
+
16
+ To the maximum extent permitted by law, Mavéa is provided as is and as available, without warranties, and you assume the risk of using it. The [Terms of Use](./TERMS.md) and [PolyForm Noncommercial License 1.0.0](./LICENSE) contain the controlling warranty disclaimers and liability limitations. This summary does not expand or replace them, and no document can waive rights or liabilities that applicable law does not allow to be waived.
package/LICENSE ADDED
@@ -0,0 +1,75 @@
1
+ # PolyForm Noncommercial License 1.0.0
2
+
3
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
4
+
5
+ Required Notice: Copyright (c) 2026 Akash Maitra and Aryan Chordia
6
+
7
+ ## Acceptance
8
+
9
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
10
+
11
+ ## Copyright License
12
+
13
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
14
+
15
+ ## Distribution License
16
+
17
+ The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
18
+
19
+ ## Notices
20
+
21
+ You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
22
+
23
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
24
+
25
+ ## Changes and New Works License
26
+
27
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
28
+
29
+ ## Patent License
30
+
31
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
32
+
33
+ ## Noncommercial Purposes
34
+
35
+ Any noncommercial purpose is a permitted purpose.
36
+
37
+ ## Personal Uses
38
+
39
+ Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
40
+
41
+ ## Noncommercial Organizations
42
+
43
+ Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
44
+
45
+ ## Fair Use
46
+
47
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
48
+
49
+ ## No Other Rights
50
+
51
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
52
+
53
+ ## Patent Defense
54
+
55
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
56
+
57
+ ## Violations
58
+
59
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
60
+
61
+ ## No Liability
62
+
63
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
64
+
65
+ ## Definitions
66
+
67
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
68
+
69
+ **You** refers to the individual or entity agreeing to these terms.
70
+
71
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
72
+
73
+ **Your licenses** are all the licenses granted to you for the software under these terms.
74
+
75
+ **Use** means anything you do with the software requiring one of your licenses.
package/PRIVACY.md ADDED
@@ -0,0 +1,127 @@
1
+ # Mavéa Privacy Notice
2
+
3
+ Effective: July 19, 2026
4
+
5
+ This notice describes the current, unmodified local and self-hosted Mavéa software. It does not describe a future hosted service. Local-first does not mean every feature stays on your device: connected features send data through the deployment to third parties you choose. If a person or organization deploys Mavéa for others, that operator must provide any additional privacy notices and controls required for its deployment.
6
+
7
+ ## 1. Who handles your information
8
+
9
+ The Mavéa Maintainers publish software. They do not receive your prompts or browser-local data merely because you install or run it. The person or organization hosting the copy you use is the **deployment operator**. When you self-host, you control that deployment and its logs, storage, configuration, and provider accounts.
10
+
11
+ The unmodified project has no Mavéa user-account system, first-party cloud database, advertising network, product-analytics service, telemetry, or conversation-retention service. Normal network requests can still be visible to the deployment host, infrastructure providers, and the third-party services described below. A modified or separately hosted deployment may behave differently, and its operator is responsible for disclosing any additional collection, logging, accounts, analytics, retention, or sharing it adds.
12
+
13
+ The current repository does not set analytics or advertising cookies and does not include first-party usage tracking. A modified deployment that adds cookies, analytics, advertising, or other tracking must disclose and manage those technologies separately.
14
+
15
+ ## 2. Information kept in your browser or deployment
16
+
17
+ Depending on the features you use, browser storage may contain:
18
+
19
+ - conversations, saved canvases, bookmarks, memory items, and session history;
20
+ - courses, lessons, flashcards, quiz progress, Ripple analyses, and dashboards;
21
+ - preferences such as theme, performance, visual richness, voice, and setup state;
22
+ - drafts, tracked items, presentation settings, and recent feature state;
23
+ - provider and model configuration;
24
+ - remembered provider, search, or optional GitHub credentials; and
25
+ - short-lived demo, tour, route, and in-progress session data.
26
+
27
+ Saved content is encrypted in browser storage only where the relevant feature and browser support it. Course data, mastery and progress, some Ripple data and analysis caches, preferences, metadata, and fallback content can be stored in ordinary local storage or IndexedDB. Anyone who can use your unlocked device or browser profile, and malicious extensions or same-origin code, may be able to access browser data.
28
+
29
+ Because this browser data is encrypted to this specific browser, it does not carry over to a different browser, an incognito window, or another device. You can export a backup file of your dashboards, memory, flashcards, saved canvases, map, and courses, and import it elsewhere to move that data. The backup is plain, unencrypted JSON under your control, so store and share it carefully; it deliberately excludes your provider and search keys. Importing a backup merges into existing data and never deletes it, and importing a file you did not create can add content from that file — import only backups you trust.
30
+
31
+ Browser and operating-system caches may retain application assets and optional voice models. The actions gateway may store connected-service credentials and configuration on the deployment operator's machine.
32
+
33
+ ## 3. Credentials and connected-service tokens
34
+
35
+ Provider and search keys stay in memory until reload unless you choose Remember. When supported, Remember encrypts them with a non-extractable, device-bound browser key and stores ciphertext locally. Without the required browser cryptography, the unmodified app keeps them session-only rather than writing plaintext. Settings exports exclude provider and search keys.
36
+
37
+ Keys are decrypted when needed and pass through the deployment's same-origin proxy to the provider you selected. The proxy and its host can technically access credentials and content in transit. Browser encryption does not protect against an active compromise of the device, browser, extension, deployment, proxy, or provider.
38
+
39
+ Optional GitHub and Google connections can store access tokens, refresh tokens, or repository settings in the actions gateway or its host configuration. The unmodified gateway writes persisted OAuth tokens to an owner-readable host file and keeps limited audit metadata, not request bodies or provider response text. Whoever runs the gateway controls that file, its backups, logs, deletion, and security.
40
+
41
+ The unmodified gateway has no separate Mavéa user accounts. On a shared deployment, everyone allowed to use action features may act through the deployment operator's connected GitHub or Google account. Use a dedicated, least-privilege gateway and do not expose it to people who should not share those permissions.
42
+
43
+ ## 4. Prompts, files, code, and generated content
44
+
45
+ Text you type or paste, conversation context, remembered facts, attached files, extracted document text, images, repository content, diffs, search queries, and feature instructions may be sent through the deployment to the model, search, or connected provider needed for the feature you request. Responses and generated content return through the deployment to your browser.
46
+
47
+ Prism and Synthesis stage and extract supported files locally where possible, but relevant content can still be sent for analysis. Ripple can parse code locally before optional model enrichment sends relevant code or diffs. Local staging is not a promise that later analysis remains local.
48
+
49
+ ## 5. Voice, microphone, speech, and reels
50
+
51
+ If you enable listening, the browser captures microphone input and its speech-recognition implementation converts speech to text. Depending on the mode, browser, and operating system, audio may be processed by a remote browser-vendor service or sent through the deployment's configured speech-to-text endpoint. Recognized transcripts may then be sent to your selected model provider.
52
+
53
+ Spoken answers send narration text to the configured text-to-speech service. Reel rendering and encoding are performed in the browser, but optional model direction and narration use the selected providers. A finished export leaves Mavéa only when you save, publish, or send it to a destination you choose.
54
+
55
+ ## 6. Services that can receive data
56
+
57
+ According to the feature and configuration you choose, recipients can include:
58
+
59
+ - Google Gemini, Anthropic Claude, OpenAI, xAI Grok, OpenRouter, or another model endpoint you configure;
60
+ - configured web-search providers and Wikipedia;
61
+ - your browser vendor's speech-recognition service and the configured speech-to-text or text-to-speech service;
62
+ - GitHub, Google Calendar, or another configured action destination;
63
+ - map-tile, font, image, and other content hosts such as OpenStreetMap, CARTO, Google Fonts, Wikimedia, or configured image sources used by a view you open;
64
+ - a notification relay URL you configure, which can receive dashboard titles, alert labels, values, units, and timestamps;
65
+ - the jsDelivr content-delivery network, from which the local command-line server downloads version-pinned voice-recognition assets once on first voice use and then serves them from its own cache; and
66
+ - the deployment host, reverse proxy, network, and infrastructure providers.
67
+
68
+ Those parties process data under their own terms and privacy notices. They may retain requests, use data for abuse prevention or service improvement, or process it in other countries according to your account settings and their policies. The Maintainers do not control those practices. Review each recipient's terms, retention, training, security, location, and deletion settings before use. Mavéa cannot delete data retained by those providers.
69
+
70
+ ## 7. Why information is processed
71
+
72
+ Information is processed only as needed to:
73
+
74
+ - provide the feature you request and return results;
75
+ - save state and preferences on your device;
76
+ - authenticate to providers and connected services you configure;
77
+ - perform an external action after the required confirmation;
78
+ - protect a deployment, enforce limits, diagnose failures, and prevent abuse; or
79
+ - comply with law or protect rights and safety where legally required.
80
+
81
+ The unmodified project does not sell personal information or use it for cross-context behavioral advertising. A deployment operator must separately disclose any different purpose it introduces.
82
+
83
+ ## 8. Retention and deletion
84
+
85
+ Memory-only values disappear on reload. Session storage generally remains until the tab or browser session ends. Local storage and IndexedDB remain until a feature removes the item, you use an available clear, forget, or reset control, you clear site data, or the browser evicts it. Some session history is capped and expires, but many course, progress, dashboard, memory, and Ripple records have no automatic expiration. Clearing all browser site data is the broadest local deletion control. Removing browser data does not delete copies already sent elsewhere.
86
+
87
+ Gateway tokens remain until disconnected or removed by the gateway operator. Server, proxy, infrastructure, browser-vendor, and provider retention depends on the relevant operator, logs, backups, account settings, and third-party policy. Contact those parties for deletion of data they control and revoke credentials at the issuing service.
88
+
89
+ Exports, downloaded files, backups, browser sync, system backups, provider records, and recipients of anything you share must be deleted separately.
90
+
91
+ ## 9. Your controls and privacy rights
92
+
93
+ You can reduce or remove data by:
94
+
95
+ - leaving Remember off and using restricted, revocable provider keys;
96
+ - using Mavéa's forget, delete, disconnect, reset, and clear controls where offered;
97
+ - clearing this site's local storage, session storage, IndexedDB, cache, and permissions;
98
+ - revoking model, search, GitHub, Google, and other connected credentials;
99
+ - turning off microphone access and avoiding voice features;
100
+ - not uploading information you do not want sent to a selected provider; and
101
+ - contacting the deployment operator or relevant provider about data they control.
102
+
103
+ Depending on where you live, you may have legal rights to access, correct, delete, restrict, object to, or obtain a copy of personal information held by a deployment operator. The Maintainers cannot retrieve browser-local or provider-held data they do not possess.
104
+
105
+ ## 10. Sensitive, confidential, and regulated information
106
+
107
+ Mavéa is not designed as a system of record for health, financial, student, employment, government-identifier, biometric, trade-secret, or other regulated information. Do not submit such information unless you have authority, have assessed every recipient, and have put any legally required contracts and safeguards in place. A disclaimer does not make a deployment compliant with HIPAA, FERPA, GDPR, financial-services rules, workplace duties, or another regulatory regime.
108
+
109
+ Do not submit children's data or another person's personal, confidential, privileged, or regulated information unless you have appropriate authority and a lawful basis. Mavéa is not a confidential or privileged channel.
110
+
111
+ ## 11. Security
112
+
113
+ Mavéa uses safeguards such as browser encryption for supported stored data, content sanitization, same-origin request boundaries, confirmation for connected actions, and restricted gateway token-file permissions. No safeguard is perfect. Do not treat local storage or encryption as a guarantee, and do not use Mavéa as a password manager or secret vault.
114
+
115
+ You are responsible for device security, access controls, backups, proxy configuration, least-privilege provider credentials, and connected-account security. Do not expose a local proxy, development server, or actions gateway to an untrusted network.
116
+
117
+ ## 12. Children
118
+
119
+ Mavéa is intended for adults and is not directed to children. Do not allow anyone under 18 to use connected model, upload, microphone, or action features or submit personal information through Mavéa. If you believe a child's information reached a deployment or provider, contact that operator and the relevant provider promptly and revoke any affected connection.
120
+
121
+ ## 13. Changes, business transfers, and contact
122
+
123
+ Material changes to this notice require an updated effective date and, where appropriate, a new in-product acceptance version. A deployment operator must provide its own identity and contact details where applicable law requires them.
124
+
125
+ If a project, deployment, or relevant assets are reorganized, financed, sold, merged, or transferred, information actually controlled by the relevant operator may be disclosed to advisers and transferred to a successor as permitted by law. Browser-local and provider-held information that the operator does not possess cannot be transferred by that operator. A successor must describe its identity and any materially different data practices.
126
+
127
+ For a hosted copy, contact the person or organization that gave you access. For the public repository, use the Mavéa GitHub issue tracker for non-sensitive questions. Do not put personal or confidential information in a public issue. Report security concerns through [SECURITY.md](./SECURITY.md).
package/README.md ADDED
@@ -0,0 +1,248 @@
1
+ <div align="center">
2
+
3
+ # Mavéa
4
+
5
+ <picture>
6
+ <source media="(prefers-color-scheme: dark)" srcset="docs/media/mascot-dark.svg" />
7
+ <img src="docs/media/mascot-light.svg" width="150" alt="The Mavéa presence" />
8
+ </picture>
9
+
10
+ ### Talk to AI. See what it means.
11
+
12
+ <!-- HERO GIF — the single highest-leverage thing in this README. Record a 10-second autoplay loop
13
+ (voice asks → face listens → canvas blooms into charts → ink draws on the answer) from the Demo
14
+ (needs no keys) or via "Share as a Mavéa Story", save it to docs/media/hero.gif, and uncomment
15
+ the <img> below. Until then the signature-move line keeps the fold looking intentional. -->
16
+ <!-- <img src="docs/media/hero.gif" alt="Mavéa in ten seconds — voice in, a living canvas out" width="820" /> -->
17
+
18
+ It listens, speaks the headline the instant it forms, then draws the answer — in charts, timelines,
19
+ and evidence you can check, marking the exact figure each line is about.
20
+ [See it in motion →](docs/FEATURES.md)
21
+
22
+ <p>
23
+ <a href="https://github.com/TryMaveaAI/mavea/actions/workflows/ci.yml"><img src="https://github.com/TryMaveaAI/mavea/actions/workflows/ci.yml/badge.svg" alt="CI status" /></a>
24
+ <img src="https://img.shields.io/badge/React-19-61DAFB?style=flat-square&logo=react&logoColor=black" alt="React 19" />
25
+ <img src="https://img.shields.io/badge/TypeScript-6-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript 6" />
26
+ <img src="https://img.shields.io/badge/Vite-8-646CFF?style=flat-square&logo=vite&logoColor=white" alt="Vite 8" />
27
+ </p>
28
+
29
+ **Try it in one command:** `npx @mavea/mavea`
30
+
31
+ </div>
32
+
33
+ ---
34
+
35
+ ## What it does
36
+
37
+ Mavéa is an AI you talk to and watch think. Ask out loud: a calm face listens, speaks the headline
38
+ the instant it forms, then steps aside while a living canvas draws the answer in charts, timelines,
39
+ and evidence you can check. As it talks, it draws on the answer, circling the exact figure each line
40
+ is about. Sourced claims keep their links and estimates can be labelled. Provider keys stay in
41
+ memory by default; optional remembering encrypts them locally. Live requests send them through the
42
+ same-origin proxy you run or deploy, onward to the model provider you chose.
43
+
44
+ A few specific things worth trying:
45
+
46
+ - **Ink is the interface.** Draw on the answer to ask — circle a value to explain it, cross one
47
+ out, arrow between two figures, drop a "?". The gesture grounds the next turn on that exact bar,
48
+ row, or number.
49
+ - **It draws while it talks.** It speaks each headline as it streams, then lands hand-style circles
50
+ and arrows on the figure it's narrating.
51
+ - **It answers while you talk.** Mid-sentence, dashed ghost cards sketch the answer taking shape
52
+ behind your words, reshaping as your question turns.
53
+ - **It maps your thinking.** Ramble for a minute and Mavéa clusters your words into the themes that
54
+ surface from what you actually said — never fixed buckets — with the tensions between them.
55
+ - **The Blank Space.** When an answer needs a number only you have, Mavéa leaves a hole to fill —
56
+ by voice, type, or a dragged card — instead of quietly guessing.
57
+
58
+ The full tour — Atlas, Rehearsal, living dashboards, Ripple, Share-as-a-Mavéa-Story, and ~30 more —
59
+ is in [docs/FEATURES.md](docs/FEATURES.md). In the app, press **⌘K**.
60
+
61
+ ## Two ways in
62
+
63
+ - **Demo replays** — recorded persona sessions (for example, a CFO reviewing her quarter or a
64
+ parent planning dinner). Each answer was generated once by a real model and frozen; it replays
65
+ on the same Live surface, without a key. The characters are fictional; the answers are real
66
+ model output.
67
+ - **Live** — bring your own model (Anthropic, OpenAI, Gemini, xAI Grok, or OpenRouter) and ask
68
+ anything by voice or text, answered on the same canvas.
69
+
70
+ Honesty is built in, not bolted on: confidence labels, sourced claims, and a Live
71
+ [eval harness](docs/BENCHMARK.md) that scores whether a model picks the right visualization and
72
+ labels its estimates honestly.
73
+
74
+ ## Quick start
75
+
76
+ Just want to run it? All you need is **Node 20.19+**:
77
+
78
+ ```sh
79
+ npx @mavea/mavea # → http://localhost:4173 — tour + demo replays, no model key required
80
+ ```
81
+
82
+ Working on the source? Use pnpm instead (`corepack enable` once to get the pinned version):
83
+
84
+ ```sh
85
+ pnpm install
86
+ pnpm dev # → http://localhost:5173 — dev server, with voice
87
+ pnpm build # → dist/ — production build
88
+ pnpm preview # → http://localhost:4173 — serves dist/ exactly as npx @mavea/mavea does, voice included
89
+ ```
90
+
91
+ | Command | What it does |
92
+ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
93
+ | `pnpm dev` | Starts everything: brings up the Kokoro voice container, then Vite. If Docker isn't running, it says so and serves the app anyway — answers appear as captions instead of being spoken. |
94
+ | `pnpm dev:web` | Vite alone, no voice container. Faster to start if you don't need speech. |
95
+ | `pnpm build` | Type-checks, then produces the production bundle in `dist/`. |
96
+ | `pnpm preview` | Serves the `dist/` build with the exact server `npx @mavea/mavea` runs: same-origin `/tts` + `/llm` proxies included, and it offers to bring up the Kokoro voice container when Docker is present. Without Docker it says so in one line and answers appear as captions. |
97
+ | `pnpm test` | Runs the Vitest suite once. |
98
+ | `pnpm verify` | The full pre-PR gate: reference-example + gallery-fixture freshness → typecheck → lint → format check → test → build → bundle-size budget → artifact + package boundary checks. Run this before opening a PR. |
99
+
100
+ That's the everyday set. The rest of the scripts (linting, evals, one-off audits, internal tooling)
101
+ are documented in full in [CONTRIBUTING.md](./CONTRIBUTING.md#scripts-reference).
102
+
103
+ **Talk to a real model (Live):** click **"Open Mavéa"** and paste an Anthropic / OpenAI / Gemini /
104
+ Grok / OpenRouter key. It stays in memory unless you opt into encrypted local remembering, and each
105
+ provider request carries it through your same-origin proxy to that provider. Full options — models,
106
+ actions, hosting, and the trust boundary — are in
107
+ [docs/LIVE-SETUP.md](docs/LIVE-SETUP.md).
108
+
109
+ **The voice:** Mavéa speaks through [Kokoro](https://github.com/remsky/Kokoro-FastAPI), a natural
110
+ local TTS — the one thing that runs in Docker. `pnpm dev` and `pnpm preview` both start it for
111
+ you; it's optional, and without it every line appears as captions. To run or stop it on its own:
112
+
113
+ ```sh
114
+ docker compose up -d # Kokoro TTS on :8880 — dev and preview both proxy /tts to it
115
+ docker compose down # stop it (it otherwise stays up between dev sessions)
116
+ ```
117
+
118
+ ## What it needs
119
+
120
+ Mavéa runs on your machine, not in a cloud. One set of numbers covers both using it and working on
121
+ it, because the toolchain is the heavier of the two and it still isn't heavy.
122
+
123
+ | | Minimum | Recommended |
124
+ | -------- | ------- | ----------- |
125
+ | **CPU** | 4 cores | 8 cores |
126
+ | **RAM** | 8 GB | 16 GB |
127
+ | **Disk** | 3 GB | 10 GB |
128
+ | **Node** | 24.11+ | 24.11+ |
129
+
130
+ Both columns describe your whole machine rather than Mavéa's share of it, and neither is a bare
131
+ floor. **Minimum** is the app and its toolchain with the voice off, alongside the browser and editor
132
+ you already have open. **Recommended** adds the voice and Docker on top of that, with enough room
133
+ left that you never think about any of it. Any browser in
134
+ [Baseline Widely Available](https://web.dev/baseline) — current Chrome, Edge, Safari, or Firefox —
135
+ on macOS, Windows, or Linux.
136
+
137
+ For reference, Mavéa itself asks for far less, and it's worth knowing which part costs what.
138
+ `npx @mavea/mavea` serves a static build and the work happens in your browser tab: the page it loads
139
+ is 89 kB over the wire, and every surface becomes usable in under half a second on a CPU throttled
140
+ 6×. The toolchain is heavier and still modest — a production build peaks around 1.6 GB of memory and
141
+ finishes in ~12 s, a full typecheck of all 2,200 TypeScript files peaks under 1 GB and takes ~3 s,
142
+ and a checkout with dependencies and a build output on disk comes to ~750 MB. Everything caches, so
143
+ only the first run after a fresh clone is slow.
144
+
145
+ **The voice is the one part that costs real memory, and it's optional.** Kokoro's image is 4.9 GB on
146
+ disk and holds ~1.3 GB resident, and Docker Desktop itself adds ~1.5 GB before a word is spoken.
147
+ Synthesis briefly takes a few cores, and runs ahead of the playhead rather than at it. At the 8 GB
148
+ minimum, leaving the voice off is usually the better trade: every line becomes a caption and nothing
149
+ else changes. `docker compose down` reclaims all of it; the
150
+ container otherwise stays up between sessions on purpose, so the next start is instant, and
151
+ `pnpm dev:web` starts Vite without bringing Docker up at all.
152
+
153
+ **Nothing here should make a fan audible.** The always-on costs are the animated face and the glass
154
+ blur, so rather than guessing from core count, Mavéa watches its own frame pacing for the first few
155
+ seconds and calms both if this particular machine is actually struggling — an integrated GPU choking
156
+ on blurred glass is invisible to a spec sheet. It waits for two bad windows before demoting, so one
157
+ hitch won't do it, and it never promotes back mid-session. You can also just decide for it:
158
+ **Visual richness → Lite** in Live's settings is a per-device choice that takes effect immediately.
159
+ Everything else is idle until you ask it something — the one part that will genuinely work a CPU is
160
+ voice synthesis, and that only runs if you started Docker.
161
+
162
+ ## How it works
163
+
164
+ Mavéa is one conversation surface (Live) plus a marketing landing, hash-routed in `main.tsx`.
165
+ However a turn is triggered — voice, text, a chip, or a replayed demo frame — it resolves to
166
+ the same shape:
167
+
168
+ ```
169
+ ask ─▶ generateLive ─▶ validate/repair ─▶ settle (merge + tour) ─▶ Presence (the face) + Canvas (the blocks)
170
+ ```
171
+
172
+ The canvas is data, not components: every answer is a list of typed `{ type, props }` blocks
173
+ (`data/conversation.ts`). A model never emits UI — it emits those same blocks, which
174
+ `live/generateLive` streams, validates, and repairs into the `ConversationSpec` contract. The
175
+ demo replays are frozen outputs of this exact pipeline, so they render through the same
176
+ contract and renderer. The generated selection catalog contains **600 component contracts across
177
+ 23 families**, and the gallery production-renders every one of them — including the types that are
178
+ gated or surface-owned rather than offered in ordinary model selection. Every provider sits behind
179
+ one `ProviderAdapter`; Live credentials and
180
+ prompts cross the same-origin proxy operated by whoever runs the deployment before reaching the
181
+ selected provider. This repository does not include a hosted account, analytics, or data-retention
182
+ service.
183
+
184
+ The full design — the turn contract, the validation core, the BYOK proxy diagram, and the eval
185
+ harness — is in [ARCHITECTURE.md](./ARCHITECTURE.md).
186
+
187
+ ## Built with
188
+
189
+ A deliberately small stack — React 19, TypeScript 6, Vite 8 — with no chart library and no UI
190
+ framework beyond React: every chart, dial, diagram, and the face is hand-rolled SVG/CSS. Beyond
191
+ `react`/`react-dom`, the runtime stays lean: `@ricky0123/vad-web` (Silero VAD for end-of-speech)
192
+ plus a handful of feature-scoped libraries — KaTeX, Leaflet, jsPDF, pdfjs-dist, openchemlib,
193
+ mediabunny, modern-screenshot, pptxgenjs, and Shiki — each lazy-loaded only when that feature is used and
194
+ bundled rather than fetched from a CDN. JavaScript/TypeScript snippets run only after an explicit
195
+ click in a bounded Worker; Python execution is disabled until it has an equally isolated runtime.
196
+ The face is one hand-drawn SVG animated purely by CSS off `data-*` attributes — JS never transforms
197
+ it.
198
+
199
+ ## Documentation
200
+
201
+ | Doc | What's in it |
202
+ | ---------------------------------------------------------- | ---------------------------------------------------------- |
203
+ | [docs/FEATURES.md](./docs/FEATURES.md) | The detailed product feature tour |
204
+ | [ARCHITECTURE.md](./ARCHITECTURE.md) | The turn lifecycle, the seams, and how the pieces fit |
205
+ | [docs/BENCHMARK.md](./docs/BENCHMARK.md) | The eval as a benchmark — score any model, leaderboard |
206
+ | [docs/LIVE-SETUP.md](./docs/LIVE-SETUP.md) | Running Live: models, voice, actions, troubleshooting |
207
+ | [docs/DEPLOYMENT.md](./docs/DEPLOYMENT.md) | Edge contract: TLS, HTTP/2/3, compression, cache, headers |
208
+ | [docs/ADDING-A-COMPONENT.md](./docs/ADDING-A-COMPONENT.md) | The full contract + scaffold for a new canvas block |
209
+ | [CONTRIBUTING.md](./CONTRIBUTING.md) | Setup, the full script reference, conventions, and recipes |
210
+ | [docs/ENGINEERING.md](./docs/ENGINEERING.md) | The review rubric: security, scalability, readability |
211
+ | [SECURITY.md](./SECURITY.md) | The BYOK security model and how to report a vulnerability |
212
+ | [TERMS.md](./TERMS.md) | Terms for using the software and connected features |
213
+ | [PRIVACY.md](./PRIVACY.md) | Local, provider, proxy, storage, and transfer data flows |
214
+ | [DISCLAIMER.md](./DISCLAIMER.md) | Plain-language AI and third-party risk summary |
215
+
216
+ ## Feedback and maintenance
217
+
218
+ Issues with code-free bug reports and feature suggestions are welcome. This repository does not
219
+ accept external code, patch, or documentation pull requests; see [CONTRIBUTING.md](./CONTRIBUTING.md)
220
+ for the maintainer workflow and feedback rules. Maintainer changes are held to the
221
+ [engineering bar](./docs/ENGINEERING.md) (security, scalability, readability), and CI runs
222
+ `typecheck → lint → format → test → build` plus bundle, dependency, secret, and static-analysis
223
+ checks.
224
+
225
+ Two checks the unit suite can't make, both against a running `pnpm dev`:
226
+
227
+ ```bash
228
+ pnpm audit:ui # every block, 280px → 4K, both themes: clipped · overlapping · illegible
229
+ pnpm perf # every surface under CPU throttling — and nothing heavy loaded unasked
230
+ ```
231
+
232
+ ## 📄 License
233
+
234
+ Mavéa is **source-available under the
235
+ [PolyForm Noncommercial License 1.0.0](./LICENSE)**. It is not licensed under MIT and is not
236
+ distributed under an Open Source Initiative-approved open-source license. The PolyForm license
237
+ permits use, modification, and distribution only for purposes it defines as noncommercial.
238
+ Commercial use requires separate written permission or a separate license from the applicable
239
+ rights holder.
240
+
241
+ That restriction applies to recipients of the PolyForm license. It does not stop an applicable
242
+ rights holder from selling or commercially licensing Mavéa, offering it under different terms, or
243
+ transferring rights it owns or controls, including as part of an acquisition. Third-party
244
+ components remain under their own licenses.
245
+
246
+ Copies of the software must keep the license's required notice:
247
+
248
+ > Required Notice: Copyright (c) 2026 Akash Maitra and Aryan Chordia