@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.
- package/CHANGELOG.md +159 -0
- package/DISCLAIMER.md +16 -0
- package/LICENSE +75 -0
- package/PRIVACY.md +127 -0
- package/README.md +248 -0
- package/SECURITY.md +72 -0
- package/SUPPORT.md +13 -0
- package/TERMS.md +122 -0
- package/THIRD-PARTY.txt +639 -0
- package/TRADEMARKS.md +15 -0
- package/bin/mavea.mjs +1079 -0
- package/dist/.vite/manifest.json +4261 -0
- package/dist/_headers +52 -0
- package/dist/assets/AppCommandPalette-DUMSp3rd.js +1 -0
- package/dist/assets/AtlasView-B5fkQhO6.css +1 -0
- package/dist/assets/AtlasView-Dl2fssaG.js +1 -0
- package/dist/assets/BlockEmpty-CLtVQf6c.js +1 -0
- package/dist/assets/BriefingPlayer-DO205Qkh.js +1 -0
- package/dist/assets/BriefingPlayer-TpFZB77N.css +1 -0
- package/dist/assets/CanvasSkeleton-BZZPCuRZ.js +2 -0
- package/dist/assets/CanvasSkeleton-iy6DBvde.css +1 -0
- package/dist/assets/CardEditor-BY1bZiV6.css +1 -0
- package/dist/assets/CardEditor-DzJXb0G7.js +1 -0
- package/dist/assets/CheckLogRail-F4AlgAcc.css +1 -0
- package/dist/assets/CheckLogRail-wUfby67Z.js +1 -0
- package/dist/assets/CodeOutput-Kh6ldxQz.js +97 -0
- package/dist/assets/CommandPalette-Bb-eErih.css +1 -0
- package/dist/assets/CommandPalette-Kl00mMZm.js +1 -0
- package/dist/assets/CourseLessonReader-COmTQdSK.css +1 -0
- package/dist/assets/CourseLessonReader-MBHoknUz.js +2 -0
- package/dist/assets/CourseRail-CUa7uIGG.css +1 -0
- package/dist/assets/CourseRail-q6x5cCpW.js +1 -0
- package/dist/assets/CoursesApp-v89OVJvg.js +2 -0
- package/dist/assets/CrossExamPanel-CZ0ShGma.css +1 -0
- package/dist/assets/CrossExamPanel-DH04p6VS.js +1 -0
- package/dist/assets/DashPresent-BYXbPuGj.js +1 -0
- package/dist/assets/DashPresent-DQYcgp-W.css +1 -0
- package/dist/assets/DashboardDetail-B50ZkeVK.js +2 -0
- package/dist/assets/DashboardLoopRuntime-CFXPx3v_.js +1 -0
- package/dist/assets/DashboardOverview-C-FdGWM5.js +1 -0
- package/dist/assets/DashboardSettings-Dmw6JTbI.js +1 -0
- package/dist/assets/DashboardsApp-Dx-EsaPW.css +1 -0
- package/dist/assets/DashboardsApp-JSY_bVfi.js +2 -0
- package/dist/assets/DeepZoomApp-BFNwli7l.js +37 -0
- package/dist/assets/DeepZoomApp-fRXCJHHZ.css +1 -0
- package/dist/assets/DelegatePanel-BK7rEhIc.js +26 -0
- package/dist/assets/DelegatePanel-_9RZiLHM.css +1 -0
- package/dist/assets/DemoGallery-BPtVG7_y.js +1 -0
- package/dist/assets/DropSelect-DUhdQSta.js +1 -0
- package/dist/assets/ExportModal-D4WpAg2c.css +1 -0
- package/dist/assets/ExportModal-D65cGyj_.js +2 -0
- package/dist/assets/ExtractionPreview-Iwfg2Ogl.js +18 -0
- package/dist/assets/FallbackCard-B489rTd9.js +1 -0
- package/dist/assets/FallbackCard-D_6ps1xA.css +1 -0
- package/dist/assets/FeatureUseNotice-CWt7gOwS.css +1 -0
- package/dist/assets/FeatureUseNotice-DPtQ0OGb.js +1 -0
- package/dist/assets/FlagshipCTA-BXntKhxb.js +1 -0
- package/dist/assets/FlagshipCommandPalette-BDJfasI-.js +1 -0
- package/dist/assets/FlagshipShowcase-DJ8Gxk_G.js +1 -0
- package/dist/assets/FlashcardsApp-CLNo4WX7.js +1 -0
- package/dist/assets/ForecastPanel-Da2ZBUrE.css +1 -0
- package/dist/assets/ForecastPanel-PBO2-dgS.js +1 -0
- package/dist/assets/GalleryApp-B1CB3_81.css +1 -0
- package/dist/assets/GalleryApp-DM03CMRy.js +1 -0
- package/dist/assets/HonestByDesign-Dqyth6nW.js +1 -0
- package/dist/assets/HowItWorks-C0zosIvq.js +1 -0
- package/dist/assets/LegalApp-DZBdExTy.js +1 -0
- package/dist/assets/LegalMarkdownDocument-CSZhRG5r.js +3 -0
- package/dist/assets/LegalPageShell-C_HottbD.css +1 -0
- package/dist/assets/LegalPageShell-DTeXqWyc.js +1 -0
- package/dist/assets/LeverPanel-DhpJY76O.css +1 -0
- package/dist/assets/LeverPanel-aZfhtVJX.js +1 -0
- package/dist/assets/Library-D2XGNXz7.js +1 -0
- package/dist/assets/Library-DmrtHjUf.css +1 -0
- package/dist/assets/LibraryOverlay-B2WQSgwr.js +1 -0
- package/dist/assets/LibraryOverlay-CnKWDMG_.css +1 -0
- package/dist/assets/LiveApp-B9zwXlGC.js +61 -0
- package/dist/assets/LiveApp-BVZGpJ1S.css +1 -0
- package/dist/assets/LiveSettings-CmgrMqvK.css +1 -0
- package/dist/assets/LiveSettings-D9OcWlm6.js +6 -0
- package/dist/assets/MindMapViewerDrawer-YYyZqmAd.js +1 -0
- package/dist/assets/MindShape-Ca3MXEgK.css +1 -0
- package/dist/assets/MindShape-mTlN5mPZ.js +1 -0
- package/dist/assets/Orb-B0NEVfqL.js +1 -0
- package/dist/assets/PinToDashboard-_kIOHs0k.js +1 -0
- package/dist/assets/PlanReview-33V8GTNB.js +1 -0
- package/dist/assets/Presence-CzLJIeSD.js +1 -0
- package/dist/assets/PresentationDeck-BDoGecxr.js +1 -0
- package/dist/assets/PrismApp-PfBTFhMF.js +2 -0
- package/dist/assets/PrismAskController-DBoxQSJR.css +1 -0
- package/dist/assets/PrismAskController-DbQDrlU9.js +37 -0
- package/dist/assets/PrismBriefingPlayer-1fvlfLR8.js +2 -0
- package/dist/assets/PrismOverlay-B7lEspdu.js +131 -0
- package/dist/assets/PrismOverlay-BTfAicBt.css +1 -0
- package/dist/assets/PrivacyApp-CR4lRs0L.js +128 -0
- package/dist/assets/Quiz-CUwtekfu.js +1 -0
- package/dist/assets/Recap-DCiiWNiV.css +1 -0
- package/dist/assets/Recap-H5fhj5Tc.js +1 -0
- package/dist/assets/ReelJelly-3jSVsJsy.js +1 -0
- package/dist/assets/RehearsalPanel-BCU615wg.css +1 -0
- package/dist/assets/RehearsalPanel-BVgjrOPg.js +6 -0
- package/dist/assets/ReplayCard-BpYO5vX-.js +2 -0
- package/dist/assets/ReplayOverlay-DXmVdeIr.js +1 -0
- package/dist/assets/RewindOverlay-BusfWeFq.js +1 -0
- package/dist/assets/RewindOverlay-C92qgvmi.css +1 -0
- package/dist/assets/RippleApp-9KrJPYgN.js +2 -0
- package/dist/assets/RippleAskController-BNAUoIW0.css +1 -0
- package/dist/assets/RippleAskController-CO9wE7hU.js +34 -0
- package/dist/assets/RippleOverlay-DMHLbfh8.js +6 -0
- package/dist/assets/RippleOverlay-_iiZsQVZ.css +1 -0
- package/dist/assets/SeeDontRead-C389viue.js +1 -0
- package/dist/assets/ShareModal-C8S7ySls.css +1 -0
- package/dist/assets/ShareModal-ClnEkudw.js +32 -0
- package/dist/assets/ShipCascade-BUtwvQoW.js +1 -0
- package/dist/assets/ShipCascade-CyFnrlET.css +1 -0
- package/dist/assets/ShipCourse-B7lG6DYW.js +1 -0
- package/dist/assets/ShipCourse-DcT7PUSm.css +1 -0
- package/dist/assets/ShipGate-BVZfCllb.css +1 -0
- package/dist/assets/ShipGate-BYYu9WVq.js +2 -0
- package/dist/assets/ShipHotspots-Bj2CovtT.js +1 -0
- package/dist/assets/ShipHotspots-CLOMutPv.css +1 -0
- package/dist/assets/ShipIncident-BUHvFFiC.css +1 -0
- package/dist/assets/ShipIncident-DcmindmE.js +2 -0
- package/dist/assets/ShipMigration-BznCskNg.css +1 -0
- package/dist/assets/ShipMigration-s0hVjDQl.js +1 -0
- package/dist/assets/ShipOnboarding-BC9Vxkpa.css +1 -0
- package/dist/assets/ShipOnboarding-ekbHL7OH.js +1 -0
- package/dist/assets/ShipRead-BVNgQT6L.js +1 -0
- package/dist/assets/ShipRollout-BdUQzMyP.js +1 -0
- package/dist/assets/ShipRollout-CqeObx5b.css +1 -0
- package/dist/assets/ShipSuggestions-B6fKYh8L.js +1 -0
- package/dist/assets/ShipSuggestions-BKRvk5Mj.css +1 -0
- package/dist/assets/ShipWorkspace-3D3Rrs1p.js +2 -0
- package/dist/assets/ShipWorkspace-D6XQpGEN.css +1 -0
- package/dist/assets/SignatureLoop-C60r8Wm5.js +1 -0
- package/dist/assets/SrsReview-BoaYb6XN.js +1 -0
- package/dist/assets/SrsReview-DmGdGxT0.css +1 -0
- package/dist/assets/SynthesisApp-vJ2Jq0Qe.js +2 -0
- package/dist/assets/SynthesisOverlay-CkERphvG.js +66 -0
- package/dist/assets/TermsApp-C70tW6m6.js +123 -0
- package/dist/assets/TopicCanvas-CT0eSj2M.js +2 -0
- package/dist/assets/TopicCanvas-D2Nax9II.css +1 -0
- package/dist/assets/TourPrism-BvucSkcs.js +1 -0
- package/dist/assets/TrackerTile-CasZNmt4.js +2 -0
- package/dist/assets/TwoSurfaces-C90X7Aj5.js +1 -0
- package/dist/assets/UnderstoodPanel-CHPD2Ttj.js +1 -0
- package/dist/assets/UnderstoodPanel-Q6GX1TFq.css +1 -0
- package/dist/assets/WhyMachineOverlay-BZk3PVTl.css +1 -0
- package/dist/assets/WhyMachineOverlay-CB0_n6Sy.js +1 -0
- package/dist/assets/WowFeatures-Ci_H5QYX.js +1 -0
- package/dist/assets/ZoomDeck-B2SjNwY7.css +1 -0
- package/dist/assets/ZoomDeck-BQHO79ZU.js +1 -0
- package/dist/assets/__vite-browser-external-BufR4LQa.js +1 -0
- package/dist/assets/ai-Ba4lZJ9Y.js +12 -0
- package/dist/assets/alternateFinishes-DZ-rkpkX.js +494 -0
- package/dist/assets/annotationAuto-B0nihA4F.js +1 -0
- package/dist/assets/annotationReel-BcU9Q0Sw.js +1 -0
- package/dist/assets/annotations-D2K9A5GB.js +1 -0
- package/dist/assets/backup-c-Btapzp.js +1 -0
- package/dist/assets/blockLabel-DAqaHKy3.js +1 -0
- package/dist/assets/c-DWGmR78Y.js +1 -0
- package/dist/assets/c-SSSlmE39.js +1 -0
- package/dist/assets/cache-BumECILO.js +1 -0
- package/dist/assets/canvas-QTEIiK23.js +1 -0
- package/dist/assets/catalog-BHjl-1uH.js +2 -0
- package/dist/assets/catalog-Dqaq2YFd.js +1 -0
- package/dist/assets/cfo.generated-Bjl5OGay.js +1 -0
- package/dist/assets/chapters-BiUsDClQ.js +1 -0
- package/dist/assets/charts1-EOoxU_K3.js +1 -0
- package/dist/assets/charts2-tyUiQPff.js +1 -0
- package/dist/assets/chunk-BVpWp9h4.js +1 -0
- package/dist/assets/citation-BcvmjKS8.js +1 -0
- package/dist/assets/code-CpjYCNS8.js +8 -0
- package/dist/assets/codeContext-0UMRSGRr.js +5 -0
- package/dist/assets/colors-D49Req-e.js +1 -0
- package/dist/assets/compose-BJ9EfcQS.js +3 -0
- package/dist/assets/contentVault-DzTYWcbD.js +1 -0
- package/dist/assets/core-DEFyprhs.js +1 -0
- package/dist/assets/corpus.generated-oX9uU93S.js +11 -0
- package/dist/assets/courseSeed-CZdNBTTs.js +1 -0
- package/dist/assets/courseStore-DfafnL-9.js +1 -0
- package/dist/assets/courses-BkH1ntDL.css +1 -0
- package/dist/assets/cpp-BGdv8dzs.js +1 -0
- package/dist/assets/cpp-CNAAXZl-.js +1 -0
- package/dist/assets/csharp-oqKa8noW.js +1 -0
- package/dist/assets/css-CdtkT07m.js +1 -0
- package/dist/assets/css-LbU1hoFO.js +1 -0
- package/dist/assets/dag-C3Xx8pOD.js +2 -0
- package/dist/assets/dashboardEvents-DR9d_c74.js +2 -0
- package/dist/assets/dashboards-rcWxdoXI.css +1 -0
- package/dist/assets/deckLine-NBd3MyGT.js +1 -0
- package/dist/assets/demoPaletteItems-NPCSaSU6.js +1 -0
- package/dist/assets/dev.generated-DYgVxL_4.js +73 -0
- package/dist/assets/diagrams-CaSfjT4I.js +1 -0
- package/dist/assets/diff-woXpYk--.js +1 -0
- package/dist/assets/display-OvC57CMc.js +9 -0
- package/dist/assets/dist-BFx3nZg4.js +2785 -0
- package/dist/assets/dist-xRGLOZwv.js +14 -0
- package/dist/assets/docs-B2aDtm5K.js +1 -0
- package/dist/assets/everyday-CoZa4kDZ.js +1 -0
- package/dist/assets/explode-WBykfhqW.js +13 -0
- package/dist/assets/extractNumbers-CuhagRkd.js +1 -0
- package/dist/assets/facts-BBTt3ImG.js +1 -0
- package/dist/assets/finance-Bxn_Q1p0.js +1 -0
- package/dist/assets/fit-0HxU-rtB.js +1 -0
- package/dist/assets/fitText-CDFmCQzl.js +1 -0
- package/dist/assets/flows-BL81J7yN.js +1 -0
- package/dist/assets/format-DlZTyeMy.js +1 -0
- package/dist/assets/format-hc2QOoIu.js +1 -0
- package/dist/assets/forms-DeoXOxdD.js +1 -0
- package/dist/assets/generate-8odaTyr4.js +17 -0
- package/dist/assets/generateBeats-b64CL54v.js +1 -0
- package/dist/assets/generateCourse-Cj_-vDWu.js +28 -0
- package/dist/assets/generateLive-D4B30fnF.js +52 -0
- package/dist/assets/geometry-DXAbnb0J.js +1 -0
- package/dist/assets/gesture-DabMpPcq.js +2 -0
- package/dist/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/assets/githubBrowser-DywfDeYx.js +1 -0
- package/dist/assets/githubToken-DtcLYqwm.js +11 -0
- package/dist/assets/go-rLFTqkRN.js +1 -0
- package/dist/assets/homeTarget-BgWKI_E1.js +1 -0
- package/dist/assets/html-BcACZWSP.js +1 -0
- package/dist/assets/html-DDNsd9lV.js +1 -0
- package/dist/assets/http-CJCtjYpA.js +2 -0
- package/dist/assets/icons-CHVz6kv_.js +1 -0
- package/dist/assets/index-CepQEz75.css +1 -0
- package/dist/assets/index-y8GL67bB.js +22 -0
- package/dist/assets/index.es-CRLiWwiA.js +5 -0
- package/dist/assets/info-CiqHR5cs.js +1 -0
- package/dist/assets/java-BtIQNnN0.js +1 -0
- package/dist/assets/java-DxlWrXwe.js +1 -0
- package/dist/assets/javascript-BzbQS41l.js +1 -0
- package/dist/assets/javascript-Yelw-5ZN.js +1 -0
- package/dist/assets/json-B0N3XRZU.js +1 -0
- package/dist/assets/json-B88Oqtu5.js +1 -0
- package/dist/assets/json-CaljABEy.js +1 -0
- package/dist/assets/jspdf.es.min-C-Pf79px.js +79 -0
- package/dist/assets/jsx-D3KKoC5L.js +1 -0
- package/dist/assets/jsx-hEbJ82HF.js +1 -0
- package/dist/assets/jsx-runtime-DaSxXjOY.js +1 -0
- package/dist/assets/katex-BMCG0xok.js +257 -0
- package/dist/assets/keyVault-DEsNh9FR.js +1 -0
- package/dist/assets/kokoro-D4GKpSL0.js +1 -0
- package/dist/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/assets/layout-BFQOzXtG.js +1 -0
- package/dist/assets/layout-CkO0Psde.js +1 -0
- package/dist/assets/lazyRetry-D50B1UMY.js +1 -0
- package/dist/assets/leaflet-src-C_xhOQY7.js +1 -0
- package/dist/assets/learn-DVfqN-nf.js +1 -0
- package/dist/assets/lib-DMAxsZKm.css +1 -0
- package/dist/assets/lib-VFqp6Y3w.js +1 -0
- package/dist/assets/links--u_phi0x.js +1 -0
- package/dist/assets/liveSchema-CJ49PX5R.js +98 -0
- package/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/assets/mastery-BPjxP0fN.js +4 -0
- package/dist/assets/media-CsrUl279.js +43 -0
- package/dist/assets/model-BE0UHu1w.js +27 -0
- package/dist/assets/motion-S0NRruNj.js +1 -0
- package/dist/assets/nav-Czm-NzPV.js +1 -0
- package/dist/assets/neighborhoods-C-1Tjr1r.js +1 -0
- package/dist/assets/notes-A9t4jdfx.css +1 -0
- package/dist/assets/notes-lROPCorS.js +1 -0
- package/dist/assets/notify-Bz4wuE4T.js +1 -0
- package/dist/assets/now-C9-UAzTC.js +1 -0
- package/dist/assets/number-DXgzss0v.js +1 -0
- package/dist/assets/officeDoc-B6nEhNp4.js +3 -0
- package/dist/assets/openchemlib-nMLMmg26.js +23 -0
- package/dist/assets/overlays-JxbHtA2o.js +1 -0
- package/dist/assets/owners-FXDGInVq.js +2 -0
- package/dist/assets/pageVisibility-BxUVsw7Z.js +1 -0
- package/dist/assets/pdf-Df7PCH7q.js +11 -0
- package/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
- package/dist/assets/penStrokes-9Q_l7NTt.js +1 -0
- package/dist/assets/perfProbe-COAp9PAa.js +1 -0
- package/dist/assets/php-CYrBA5iX.js +1 -0
- package/dist/assets/pickers-B4-3HOR8.js +1 -0
- package/dist/assets/pin-Bya3BL_a.css +1 -0
- package/dist/assets/pin-CXSuPJYL.js +1 -0
- package/dist/assets/planTracker-7AMCQPNx.js +1 -0
- package/dist/assets/portal-DMw7C32j.js +1 -0
- package/dist/assets/pptxgen.es-CvTILmV9.js +115 -0
- package/dist/assets/predictions-CYS7Vo39.js +1 -0
- package/dist/assets/prewarm--whjQhWJ.js +1 -0
- package/dist/assets/prism-app-CXYElq8-.css +1 -0
- package/dist/assets/prism.generated-BhbHDHR6.js +41 -0
- package/dist/assets/prismExtract.worker-Cws9K1NG.js +13 -0
- package/dist/assets/prismGround.worker-CIvKqxm2.js +1 -0
- package/dist/assets/prismLayout.worker-CZO2CY7B.js +1 -0
- package/dist/assets/providers-wzm7E8Pa.js +1 -0
- package/dist/assets/purify.es-adlwq8Pz.js +3 -0
- package/dist/assets/python-gzcpVVnB.js +1 -0
- package/dist/assets/queue-DHeyJ32F.css +1 -0
- package/dist/assets/queue-J4h7E3uc.js +1 -0
- package/dist/assets/quietHours-BvcsBKKK.js +1 -0
- package/dist/assets/react-BQSORdFI.js +1 -0
- package/dist/assets/reference-sJzyMiL4.js +1 -0
- package/dist/assets/registry-1GuPBfQK.js +1 -0
- package/dist/assets/registry-2GJZ46M8.css +1 -0
- package/dist/assets/registry-2v0jlh5Q.js +2 -0
- package/dist/assets/registry-B8DStMJk.js +1 -0
- package/dist/assets/registry-B940W2j5.js +1 -0
- package/dist/assets/registry-BAoRB8rd.css +1 -0
- package/dist/assets/registry-BPvIPLke.js +1 -0
- package/dist/assets/registry-BVHiKEwE.css +1 -0
- package/dist/assets/registry-BcZXBr3y.css +1 -0
- package/dist/assets/registry-BffpZK5w.js +1 -0
- package/dist/assets/registry-BgGeRiDA.js +2 -0
- package/dist/assets/registry-Buq5uuCv.js +1 -0
- package/dist/assets/registry-BzNLfje1.css +1 -0
- package/dist/assets/registry-C3ezxLR3.css +1 -0
- package/dist/assets/registry-CAusoyBh.js +1 -0
- package/dist/assets/registry-CEVrY72Z.js +1 -0
- package/dist/assets/registry-CKjKq6ct.js +1 -0
- package/dist/assets/registry-CNgybLQv.css +1 -0
- package/dist/assets/registry-CRM7y8QT.css +1 -0
- package/dist/assets/registry-CRisz4Ca.css +1 -0
- package/dist/assets/registry-Cg7qUZPS.js +1 -0
- package/dist/assets/registry-Cix-yqch.js +1 -0
- package/dist/assets/registry-CtbuZWYz.css +1 -0
- package/dist/assets/registry-DCI_BeFJ.js +5 -0
- package/dist/assets/registry-DDLSYDVA.js +1 -0
- package/dist/assets/registry-DI1wSG1Y.js +1 -0
- package/dist/assets/registry-DJinB5ye.js +2 -0
- package/dist/assets/registry-DUvXX_d0.js +1 -0
- package/dist/assets/registry-DVzLacl_.css +1 -0
- package/dist/assets/registry-DWcNVyI2.css +1 -0
- package/dist/assets/registry-D_URPoL4.js +1 -0
- package/dist/assets/registry-Dkc7hN5T.js +1 -0
- package/dist/assets/registry-DmQlNN3y.js +1 -0
- package/dist/assets/registry-DpaaVbmL.css +1 -0
- package/dist/assets/registry-Dpb8EXHn.js +49 -0
- package/dist/assets/registry-Dru0JcTa.css +1 -0
- package/dist/assets/registry-DujBAgn_.js +1 -0
- package/dist/assets/registry-Dye5m3qt.css +1 -0
- package/dist/assets/registry-GeSy4i7R.css +1 -0
- package/dist/assets/registry-QcULZpdE.js +4 -0
- package/dist/assets/registry-T3i2Q9SI.css +1 -0
- package/dist/assets/registry-UFIuwh3i.css +1 -0
- package/dist/assets/registry-Xzq_Rpmm.css +1 -0
- package/dist/assets/registry-ZOWzhOHk.css +1 -0
- package/dist/assets/registry-aIH-Im5Y.css +1 -0
- package/dist/assets/registry-aazwkBJp.js +1 -0
- package/dist/assets/registry-ei6fIgBT.css +1 -0
- package/dist/assets/registry-types-DMuK0vJ6.js +1 -0
- package/dist/assets/registry-upbw6pyj.css +1 -0
- package/dist/assets/registry-zRPjWNl5.js +1 -0
- package/dist/assets/relate-A9ZeaaAI.js +1 -0
- package/dist/assets/richText-BkxJhl9N.js +1 -0
- package/dist/assets/ruby-BhrksQMt.js +1 -0
- package/dist/assets/run-BYP2YlZT.js +23 -0
- package/dist/assets/run-C_0B_41W.js +21 -0
- package/dist/assets/run-DSVvshaB.js +21 -0
- package/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/assets/safeCssColor-di93BXgG.js +1 -0
- package/dist/assets/safeImageUrl-CUkucDUu.js +1 -0
- package/dist/assets/scale-Bcgfo6Hp.js +1 -0
- package/dist/assets/screen-DLR7p_yP.js +1 -0
- package/dist/assets/search-DnjHupRf.js +1 -0
- package/dist/assets/seed-b1xc0dj2.js +1 -0
- package/dist/assets/shapes-RqjqC0ay.js +1 -0
- package/dist/assets/shard000-DM_rqD7W.js +1 -0
- package/dist/assets/shard001-gQEQs7_F.js +1 -0
- package/dist/assets/shard002-DbDas-W-.js +1 -0
- package/dist/assets/shard003-DxMszG4_.js +1 -0
- package/dist/assets/shard004-DZMpLBw1.js +1 -0
- package/dist/assets/shard005-DLVkh9IH.js +1 -0
- package/dist/assets/shard006-B6efKHov.js +1 -0
- package/dist/assets/shard007-AFdZLe38.js +1 -0
- package/dist/assets/shard008-LbSBzwRx.js +1 -0
- package/dist/assets/shard009-D_6-SUDb.js +1 -0
- package/dist/assets/shard010-DbOj-uZW.js +1 -0
- package/dist/assets/shard011-BYSz7EEW.js +1 -0
- package/dist/assets/shard012-B5Ypj7OV.js +1 -0
- package/dist/assets/shard013-BtsliNIe.js +1 -0
- package/dist/assets/shard014-15sjmk68.js +1 -0
- package/dist/assets/shard015-nnXrqru_.js +1 -0
- package/dist/assets/shard016-BayXFE13.js +1 -0
- package/dist/assets/shard017-Cy4cGexs.js +1 -0
- package/dist/assets/shard018-aO-BYJ8H.js +1 -0
- package/dist/assets/shard019-gxaTeA3I.js +1 -0
- package/dist/assets/shard020-BibJdMI0.js +1 -0
- package/dist/assets/shard021-2FE-tze4.js +1 -0
- package/dist/assets/shard022-IXiyG-JK.js +1 -0
- package/dist/assets/shard023-314F6NJS.js +1 -0
- package/dist/assets/shard024-cN5rpQ_X.js +1 -0
- package/dist/assets/shard025-KKTaXOGE.js +1 -0
- package/dist/assets/shard026-C2Dkd1t6.js +1 -0
- package/dist/assets/shard027-Xy-8x9As.js +1 -0
- package/dist/assets/shard028-Bul-klUj.js +1 -0
- package/dist/assets/shard029-BbRSUcUZ.js +1 -0
- package/dist/assets/shard030-GYllsFVC.js +1 -0
- package/dist/assets/shard031-DMigeiyn.js +1 -0
- package/dist/assets/shard032-CcvmzK0l.js +1 -0
- package/dist/assets/shard033-11AU702M.js +1 -0
- package/dist/assets/shard034-Bx3urxjM.js +1 -0
- package/dist/assets/shard035-DBdEeyCt.js +1 -0
- package/dist/assets/shard036-vYgoRBqS.js +1 -0
- package/dist/assets/shard037-DP4MMw91.js +1 -0
- package/dist/assets/shard038-ffxsv7d6.js +1 -0
- package/dist/assets/shard039-C1JHHNp9.js +1 -0
- package/dist/assets/shard040-JbVvCSO_.js +1 -0
- package/dist/assets/shard041-5L_eFwGx.js +1 -0
- package/dist/assets/shard042-C9nsGL79.js +1 -0
- package/dist/assets/shard043-Dx_9HSKI.js +1 -0
- package/dist/assets/shard044-B3QQNC4A.js +1 -0
- package/dist/assets/shard045-B7z0WHO6.js +1 -0
- package/dist/assets/shard046-D1yDablJ.js +1 -0
- package/dist/assets/shard047-DJi3AgeT.js +1 -0
- package/dist/assets/shard048-D_2ipfUr.js +1 -0
- package/dist/assets/shard049-1aGgWZdd.js +1 -0
- package/dist/assets/shard050-Bjwa0Og4.js +1 -0
- package/dist/assets/shard051-Cx_GAk3v.js +1 -0
- package/dist/assets/shard052-LaeOD3V5.js +1 -0
- package/dist/assets/shard053-D-da7Foj.js +1 -0
- package/dist/assets/shard054-CM8eSRQk.js +1 -0
- package/dist/assets/shard055-QRpDl4Vs.js +1 -0
- package/dist/assets/shard056-DkY7CQm3.js +1 -0
- package/dist/assets/shard057-BVCgf7o0.js +1 -0
- package/dist/assets/shard058-93aGtdrX.js +1 -0
- package/dist/assets/shard059-rJE9X1_I.js +1 -0
- package/dist/assets/shard060-Lu_hfl1r.js +1 -0
- package/dist/assets/shard061-C9A8iNiq.js +1 -0
- package/dist/assets/shard062-BBIpEYZO.js +1 -0
- package/dist/assets/shard063-C_uen3Ub.js +1 -0
- package/dist/assets/shard064-DAHUsHST.js +1 -0
- package/dist/assets/shard065-C2edvdvh.js +1 -0
- package/dist/assets/shard066-DFcuVhZm.js +1 -0
- package/dist/assets/shard067-BN8DM8JZ.js +1 -0
- package/dist/assets/shard068-i464K77p.js +1 -0
- package/dist/assets/shard069-Dm9m2a5U.js +1 -0
- package/dist/assets/shard070-BPVvR8GH.js +1 -0
- package/dist/assets/shard071-Bal_0d9L.js +1 -0
- package/dist/assets/shard072-CBQu62kt.js +1 -0
- package/dist/assets/shard073-D5BRae0w.js +1 -0
- package/dist/assets/shard074-DtFvcBnZ.js +1 -0
- package/dist/assets/share-QHGHNDhQ.js +1 -0
- package/dist/assets/shellscript-BiGZg9Om.js +1 -0
- package/dist/assets/shellscript-CqHdAlCp.js +1 -0
- package/dist/assets/shikiHighlight-DUCYbsJ2.js +153 -0
- package/dist/assets/sourceHost-BV3t2XDb.js +1 -0
- package/dist/assets/speed-DwPw9KSv.js +1 -0
- package/dist/assets/spokenText-D4zPX9JY.js +1 -0
- package/dist/assets/sql-0Qcw9ht3.js +1 -0
- package/dist/assets/sql-CP0rg-5b.js +1 -0
- package/dist/assets/src-DbgF7cRH.js +2 -0
- package/dist/assets/stats-BeP5Bws0.js +1 -0
- package/dist/assets/status-BY02LIJt.js +1 -0
- package/dist/assets/stepDriver-DwjFet6U.js +1 -0
- package/dist/assets/store-4JNNn732.js +1 -0
- package/dist/assets/store-BFC7DZcg.js +1 -0
- package/dist/assets/store-BFrJaSxJ.js +1 -0
- package/dist/assets/store-DXmC_fP2.js +0 -0
- package/dist/assets/store-DgG0C1Qx.js +1 -0
- package/dist/assets/streamParse-DRgMHWye.js +2 -0
- package/dist/assets/student.generated-DS_acPaJ.js +1 -0
- package/dist/assets/swift-DonLKvLd.js +1 -0
- package/dist/assets/tables-Dzd3rTqG.js +1 -0
- package/dist/assets/time-BHTmJR1s.js +1 -0
- package/dist/assets/toast-BBNs2h3L.js +1 -0
- package/dist/assets/toml-CcmNWLt0.js +1 -0
- package/dist/assets/traveler.generated-Beun9X7y.js +1 -0
- package/dist/assets/tsx-5f3ulCja.js +1 -0
- package/dist/assets/tsx-BOvsFOI6.js +1 -0
- package/dist/assets/typeof-B5XbjTb1.js +1 -0
- package/dist/assets/typescript-Utq2Cl8c.js +1 -0
- package/dist/assets/typescript-j_1H8WHN.js +1 -0
- package/dist/assets/useDashboardLoop-B6ByHWoE.js +5 -0
- package/dist/assets/useFocusTrap-DbfG6zbM.js +1 -0
- package/dist/assets/useLiveConfig-X9Wxh90k.js +1 -0
- package/dist/assets/useSpatialCanvas-DogK9457.js +1 -0
- package/dist/assets/useSpotlightWalk-rMbmNBKK.js +1 -0
- package/dist/assets/useSrsCards-CagZefwX.js +1 -0
- package/dist/assets/useStudy-Bflreq2a.js +1 -0
- package/dist/assets/useTimeout-BRYvu2jQ.js +1 -0
- package/dist/assets/useValidatedImage-D2fhA198.js +1 -0
- package/dist/assets/useZoomGesture-CYc3tf2z.js +1 -0
- package/dist/assets/verbatim-CBMzUDlf.js +1 -0
- package/dist/assets/worker-BbLKfGzm.js +2 -0
- package/dist/assets/xml-WY0zc4PG.js +1 -0
- package/dist/assets/yaml-CxbubiML.js +1 -0
- package/dist/assets/yaml-DijMHRDA.js +1 -0
- package/dist/demo-assets/CREDITS.md +40 -0
- package/dist/demo-assets/images/basalt-cliffs.jpg +0 -0
- package/dist/demo-assets/images/capelinhos.jpg +0 -0
- package/dist/demo-assets/images/cliff-fields.jpg +0 -0
- package/dist/demo-assets/images/crater-panorama.jpg +0 -0
- package/dist/demo-assets/images/furnas-lake.jpg +0 -0
- package/dist/demo-assets/images/green-coast.jpg +0 -0
- package/dist/demo-assets/images/overcast-coast.jpg +0 -0
- package/dist/demo-assets/images/patchwork-fields.jpg +0 -0
- package/dist/demo-assets/images/ponta-delgada.jpg +0 -0
- package/dist/demo-assets/images/sete-cidades.jpg +0 -0
- package/dist/demo-assets/images/slide-placeholder-light.svg +9 -0
- package/dist/demo-assets/images/slide-placeholder.svg +9 -0
- package/dist/demo-assets/images/village-street.jpg +0 -0
- package/dist/demo-assets/pdf/cfd-primer.pdf +0 -0
- package/dist/demo-assets/video/azores-film.mp4 +0 -0
- package/dist/favicon.svg +19 -0
- package/dist/fonts/LICENSE.txt +34 -0
- package/dist/fonts/archivo-var-latin.woff2 +0 -0
- package/dist/fonts/bodoni-moda-400-italic-latin.woff2 +0 -0
- package/dist/fonts/bodoni-moda-var-latin.woff2 +0 -0
- package/dist/fonts/eb-garamond-var-italic-latin.woff2 +0 -0
- package/dist/fonts/eb-garamond-var-latin.woff2 +0 -0
- package/dist/fonts/export/families/archivo.css +12 -0
- package/dist/fonts/export/families/bodoni-moda.css +23 -0
- package/dist/fonts/export/families/eb-garamond.css +22 -0
- package/dist/fonts/export/families/ibm-plex-sans.css +12 -0
- package/dist/fonts/export/families/instrument-serif.css +22 -0
- package/dist/fonts/export/families/jetbrains-mono.css +12 -0
- package/dist/fonts/export/families/libre-franklin.css +12 -0
- package/dist/fonts/export/families/lora.css +22 -0
- package/dist/fonts/export/families/source-serif-4.css +12 -0
- package/dist/fonts/export/families/space-grotesk.css +12 -0
- package/dist/fonts/export/families/spectral.css +52 -0
- package/dist/fonts/fonts.css +141 -0
- package/dist/fonts/hanken-grotesk-var-latin.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-var-latin.woff2 +0 -0
- package/dist/fonts/instrument-serif-400-italic-latin.woff2 +0 -0
- package/dist/fonts/instrument-serif-400-latin.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-var-latin.woff2 +0 -0
- package/dist/fonts/libre-franklin-var-latin.woff2 +0 -0
- package/dist/fonts/lora-var-italic-latin.woff2 +0 -0
- package/dist/fonts/lora-var-latin.woff2 +0 -0
- package/dist/fonts/newsreader-var-italic-latin.woff2 +0 -0
- package/dist/fonts/newsreader-var-latin.woff2 +0 -0
- package/dist/fonts/plex-mono-400-latin.woff2 +0 -0
- package/dist/fonts/plex-mono-500-latin.woff2 +0 -0
- package/dist/fonts/plex-mono-600-latin.woff2 +0 -0
- package/dist/fonts/source-serif-4-var-latin.woff2 +0 -0
- package/dist/fonts/space-grotesk-var-latin.woff2 +0 -0
- package/dist/fonts/spectral-400-italic-latin.woff2 +0 -0
- package/dist/fonts/spectral-400-latin.woff2 +0 -0
- package/dist/fonts/spectral-500-italic-latin.woff2 +0 -0
- package/dist/fonts/spectral-500-latin.woff2 +0 -0
- package/dist/fonts/spectral-600-latin.woff2 +0 -0
- package/dist/index.html +117 -0
- package/dist/legal/DISCLAIMER.md +16 -0
- package/dist/legal/LICENSE.txt +75 -0
- package/dist/legal/PRIVACY.md +127 -0
- package/dist/legal/SECURITY.md +72 -0
- package/dist/legal/SUPPORT.md +13 -0
- package/dist/legal/TERMS.md +122 -0
- package/dist/legal/THIRD-PARTY.txt +639 -0
- package/dist/legal/TRADEMARKS.md +15 -0
- package/dist/ort-wasm-simd-threaded.mjs +59 -0
- package/dist/sw.js +30 -0
- package/dist/vad.worklet.bundle.min.js +1 -0
- package/docker-compose.yml +33 -0
- package/gateway/README.md +99 -0
- package/gateway/actions-gateway.mjs +537 -0
- package/gateway/connectors.d.mts +27 -0
- package/gateway/connectors.mjs +463 -0
- package/gateway/guard.mjs +110 -0
- package/gateway/tokenStore.mjs +134 -0
- 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
|