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