@mavea/mavea 1.0.11 → 1.0.13
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 +18 -1
- package/README.md +33 -164
- package/dist/.vite/manifest.json +606 -606
- package/dist/assets/{AppCommandPalette-DzUPm-Qa.js → AppCommandPalette-D_g8-7C0.js} +1 -1
- package/dist/assets/{BlockEmpty-Dp9IPo4S.js → BlockEmpty-Ddhgr5pu.js} +1 -1
- package/dist/assets/{BriefingPlayer-CTab7H0c.js → BriefingPlayer-D-QhLgXI.js} +1 -1
- package/dist/assets/{CanvasSkeleton-BCq4yAAN.js → CanvasSkeleton-BIiOmCMG.js} +2 -2
- package/dist/assets/{CheckLogRail-DbGJtneK.js → CheckLogRail-ZrDqyjQ7.js} +1 -1
- package/dist/assets/{CodeOutput-DjsCJAel.js → CodeOutput-D7sVg1Nr.js} +1 -1
- package/dist/assets/{CommandPalette-Cq9mDWiI.js → CommandPalette-DNa2q8E_.js} +1 -1
- package/dist/assets/{CourseLessonReader-Dz8IhHEw.js → CourseLessonReader-BIpGjcJk.js} +2 -2
- package/dist/assets/{CourseRail-DjK_L3eD.js → CourseRail-CQaotzN0.js} +1 -1
- package/dist/assets/{CoursesApp-Dv4yt63y.js → CoursesApp-q3kZJmu1.js} +2 -2
- package/dist/assets/{CrossExamPanel-DJCn13Aa.js → CrossExamPanel-BIJslibV.js} +1 -1
- package/dist/assets/{DashPresent-pfOEJGzV.js → DashPresent-DGSE0vYM.js} +1 -1
- package/dist/assets/{DashboardDetail-BSZ3CgcK.js → DashboardDetail-BpaLNg8R.js} +2 -2
- package/dist/assets/DashboardLoopRuntime-14yzj-xx.js +1 -0
- package/dist/assets/{DashboardOverview-DpJ2BDNu.js → DashboardOverview-8x3OxX2i.js} +1 -1
- package/dist/assets/{DashboardSettings-C1rC3iTs.js → DashboardSettings-f_zxcs5j.js} +1 -1
- package/dist/assets/{DashboardsApp-DeBWrYDk.js → DashboardsApp-mvMbGmp0.js} +2 -2
- package/dist/assets/{DeepZoomApp-B91oHx2Y.js → DeepZoomApp-E7bDmzuL.js} +1 -1
- package/dist/assets/{DelegatePanel-bFmfn9-D.js → DelegatePanel-pwRk9pFf.js} +1 -1
- package/dist/assets/{DemoGallery-fYIVdHQV.js → DemoGallery-DDzX8Z7I.js} +1 -1
- package/dist/assets/{DropSelect-DbxAWKQn.js → DropSelect-BMZYAX6q.js} +1 -1
- package/dist/assets/{ExportModal-HczU1Zg1.js → ExportModal-CTMJaU1l.js} +2 -2
- package/dist/assets/{ExtractionPreview-BfjJci-N.js → ExtractionPreview-C9wq7CrK.js} +1 -1
- package/dist/assets/{FlagshipCTA-CTb5P2Ix.js → FlagshipCTA-DPNSflKv.js} +1 -1
- package/dist/assets/{FlagshipCommandPalette-DLkDmsF-.js → FlagshipCommandPalette-55zqyPFm.js} +1 -1
- package/dist/assets/{FlagshipShowcase-CrFSCHHX.js → FlagshipShowcase-BWpoPWOn.js} +1 -1
- package/dist/assets/{FlashcardsApp-CV777TGC.js → FlashcardsApp-apCj3I17.js} +1 -1
- package/dist/assets/{ForecastPanel-BfAngk8l.js → ForecastPanel-CMRD-UKn.js} +1 -1
- package/dist/assets/{GalleryApp-DLssAAhN.js → GalleryApp-CcsbirLT.js} +1 -1
- package/dist/assets/{HonestByDesign-B0o03QVw.js → HonestByDesign-DU4qmc61.js} +1 -1
- package/dist/assets/{HowItWorks-DfUsQ2xD.js → HowItWorks-CkZXftN-.js} +1 -1
- package/dist/assets/{LegalApp-CnFE80Ja.js → LegalApp-BmZpqH-6.js} +1 -1
- package/dist/assets/{LegalMarkdownDocument-BidNcrNj.js → LegalMarkdownDocument-CcbAfubz.js} +1 -1
- package/dist/assets/{LegalPageShell-CFktFKTK.js → LegalPageShell-raMATqhx.js} +1 -1
- package/dist/assets/{LeverPanel-DgfX7mTL.js → LeverPanel-DVUgGcYW.js} +1 -1
- package/dist/assets/{Library-CAnmN5YL.js → Library-D725dNcx.js} +1 -1
- package/dist/assets/{LibraryOverlay-D7Gg_GIv.js → LibraryOverlay-D7PzQIpH.js} +1 -1
- package/dist/assets/LiveApp-B8Jw1Q0h.js +61 -0
- package/dist/assets/{LiveApp-COz1ZZp9.css → LiveApp-DQhDk2ma.css} +1 -1
- package/dist/assets/{LiveSettings-5UCN5UWM.js → LiveSettings-BQ06gZB7.js} +3 -3
- package/dist/assets/{MindMapViewerDrawer-DoXy6hCD.js → MindMapViewerDrawer-CIMuABKE.js} +1 -1
- package/dist/assets/{MindShape-BJCnqyTi.js → MindShape-0KPrv0CF.js} +1 -1
- package/dist/assets/MindShape-Bel2yDqO.css +1 -0
- package/dist/assets/{PinToDashboard-Dq77a2iP.js → PinToDashboard-ML4NFCAU.js} +1 -1
- package/dist/assets/{PlanReview-DvxM1675.js → PlanReview-CbJ_7Ld1.js} +1 -1
- package/dist/assets/{Presence-LNSqCz8N.js → Presence-B_zDfiE7.js} +1 -1
- package/dist/assets/{PresentationDeck-8kT0cMtk.js → PresentationDeck-Tm3PUdh5.js} +1 -1
- package/dist/assets/{PrismApp-Jf4pIAkh.js → PrismApp-Bc-6PO_P.js} +2 -2
- package/dist/assets/{PrismAskController-QXSoZBNb.js → PrismAskController-OwqFx5Pk.js} +1 -1
- package/dist/assets/{PrismBriefingPlayer-edFfwMNP.js → PrismBriefingPlayer-Bu_ZxYdh.js} +2 -2
- package/dist/assets/{PrismOverlay-CYItOpax.js → PrismOverlay-UTsJ8R5d.js} +4 -4
- package/dist/assets/{PrivacyApp-Dqz_BgOS.js → PrivacyApp-BLXan6dm.js} +1 -1
- package/dist/assets/{Recap-Ba2qZ2lX.js → Recap-5rYrcMCC.js} +1 -1
- package/dist/assets/{ReelJelly-9SCjNeHq.js → ReelJelly-Dg3XGB0c.js} +1 -1
- package/dist/assets/{RehearsalPanel-CtYKPl6O.js → RehearsalPanel-CM4466Os.js} +3 -3
- package/dist/assets/{ReplayCard-MSWq-Mxr.js → ReplayCard-wMIMlorH.js} +2 -2
- package/dist/assets/{ReplayOverlay-ChDrwMLh.js → ReplayOverlay-BomkTonB.js} +1 -1
- package/dist/assets/{RewindOverlay-CM9d5xhh.js → RewindOverlay-Izf89nG9.js} +1 -1
- package/dist/assets/{RippleApp-B7G_jg05.js → RippleApp-8QSIEjTX.js} +2 -2
- package/dist/assets/{RippleAskController-CJjt7VG8.js → RippleAskController-Cd86GrKs.js} +1 -1
- package/dist/assets/{RippleOverlay-Cfu3ZVL1.js → RippleOverlay-SCrXZTqz.js} +2 -2
- package/dist/assets/{SeeDontRead-DHhwv6RU.js → SeeDontRead-Bp8qsF20.js} +1 -1
- package/dist/assets/ShareModal-C-sD-aia.js +32 -0
- package/dist/assets/{ShareModal-C8S7ySls.css → ShareModal-PobtP7AJ.css} +1 -1
- package/dist/assets/{ShipCascade-B6kVuilv.js → ShipCascade-Cq_I4c_v.js} +1 -1
- package/dist/assets/{ShipCourse-CerQYrsy.js → ShipCourse-CzsJyMnT.js} +1 -1
- package/dist/assets/{ShipHotspots-DOmWYgHH.js → ShipHotspots-OMjPhQWP.js} +1 -1
- package/dist/assets/{ShipIncident-D0lvmytD.js → ShipIncident-Cqn6ZmKz.js} +1 -1
- package/dist/assets/{ShipMigration-D70LbiJk.js → ShipMigration-5_ZWn7K9.js} +1 -1
- package/dist/assets/{ShipOnboarding-B_0dp9a-.js → ShipOnboarding-Yr8oKgmQ.js} +1 -1
- package/dist/assets/{ShipRead-Cp2s7bSL.js → ShipRead-Bnw7mnv3.js} +1 -1
- package/dist/assets/{ShipRollout-Bw9pvbSM.js → ShipRollout-ECsDrqAd.js} +1 -1
- package/dist/assets/{ShipSuggestions-eHLjOJL5.js → ShipSuggestions-C6oDw2F8.js} +1 -1
- package/dist/assets/{ShipWorkspace-DwdoBSix.js → ShipWorkspace-BT6gZrqd.js} +1 -1
- package/dist/assets/{SignatureLoop-Bl43npTM.js → SignatureLoop-D7sibSnc.js} +1 -1
- package/dist/assets/{SynthesisApp-BkOWv_pc.js → SynthesisApp-B768x2r_.js} +2 -2
- package/dist/assets/{SynthesisOverlay-CHlVL7sT.js → SynthesisOverlay-Ds0MhZLQ.js} +1 -1
- package/dist/assets/{TermsApp-PakIMrh0.js → TermsApp-Da8FeMj3.js} +1 -1
- package/dist/assets/{TopicCanvas-wmAsICUd.js → TopicCanvas-D64O3lvD.js} +2 -2
- package/dist/assets/{TourPrism-VQqowXpY.js → TourPrism-CTf1G-Vv.js} +1 -1
- package/dist/assets/{TrackerTile-C1mU8Zxj.js → TrackerTile-DeujTCk-.js} +2 -2
- package/dist/assets/{TwoSurfaces-SNT4AVzV.js → TwoSurfaces-kyK2yqm0.js} +1 -1
- package/dist/assets/{UnderstoodPanel-BkwhDLhW.js → UnderstoodPanel-Dgwk_Cuj.js} +1 -1
- package/dist/assets/{WhyMachineOverlay-DgYhqU53.js → WhyMachineOverlay-C4eQC0lg.js} +1 -1
- package/dist/assets/{WowFeatures-Cky9THxT.js → WowFeatures-CaBZ5WPM.js} +1 -1
- package/dist/assets/{ZoomDeck-BXwcRCO_.js → ZoomDeck-DnCtbhx1.js} +1 -1
- package/dist/assets/{alternateFinishes-Cn5LyQ0-.js → alternateFinishes-FSV_gA1A.js} +1 -1
- package/dist/assets/{annotationAuto-L2AxlJ2F.js → annotationAuto-x_dV8z65.js} +1 -1
- package/dist/assets/annotationReel-SeXzv0P-.js +1 -0
- package/dist/assets/{backup-Cw4GBHBV.js → backup-0zODkqi-.js} +1 -1
- package/dist/assets/canvas-uhcwigAL.js +1 -0
- package/dist/assets/{catalog-2srqP2Jf.js → catalog-Car_1ocN.js} +1 -1
- package/dist/assets/{dashboardEvents-S4Y2aOP_.js → dashboardEvents-BqcPN-K8.js} +2 -2
- package/dist/assets/{dist-BJbBdhc0.js → dist-BTg4yEWr.js} +1 -1
- package/dist/assets/{fit-C3MkNFdn.js → fit-I3tuibfX.js} +1 -1
- package/dist/assets/{generateLive-Ci8kqPD9.js → generateLive-Dk24OxVt.js} +1 -1
- package/dist/assets/{index-DWHIOldG.js → index-CWqRe4-B.js} +3 -3
- package/dist/assets/{jspdf.es.min-CfZM9xhl.js → jspdf.es.min-wkD3BzGZ.js} +1 -1
- package/dist/assets/kokoro-B-3GqktX.js +1 -0
- package/dist/assets/{lib-C9jT-CD8.js → lib-CwruVYU_.js} +1 -1
- package/dist/assets/{liveSchema-Dw4t_k7M.js → liveSchema-CCpVMy0H.js} +1 -1
- package/dist/assets/{motion-QSGW_vc_.js → motion-CURfDtdH.js} +1 -1
- package/dist/assets/{notes-D21K92Wx.js → notes-BG5QP-Dj.js} +1 -1
- package/dist/assets/{pdf-BP_vXBKO.js → pdf-x4qTBJIZ.js} +1 -1
- package/dist/assets/{perfProbe-DFw7brPU.js → perfProbe-BFwfpxJt.js} +1 -1
- package/dist/assets/{pin-BzDcIYD4.js → pin-DRN5H7py.js} +1 -1
- package/dist/assets/{portal-n6TW0FuE.js → portal-BYHo9LOD.js} +1 -1
- package/dist/assets/{pptxgen.es-GleD8us4.js → pptxgen.es-DGywGiaX.js} +1 -1
- package/dist/assets/{prewarm-CehIIttc.js → prewarm-CQNCE4Uq.js} +1 -1
- package/dist/assets/{quietHours-Brg4oaDf.js → quietHours-CKjQ2pGY.js} +1 -1
- package/dist/assets/{registry-CoCl26Tl.js → registry-1BWL6SXY.js} +1 -1
- package/dist/assets/registry-5a-E7vEN.css +1 -0
- package/dist/assets/{registry-mmGDT0wn.js → registry-9S6KiKjR.js} +1 -1
- package/dist/assets/{registry-BE1QBNKm.js → registry-BZQeYzgv.js} +1 -1
- package/dist/assets/{registry-CG5W7Xs6.js → registry-Bc6_RQ8l.js} +1 -1
- package/dist/assets/{registry-_mqmf4_W.js → registry-BklPTZre.js} +1 -1
- package/dist/assets/{registry-ia68k5sK.js → registry-Bl3NkU-0.js} +1 -1
- package/dist/assets/{registry-NNLA0NQi.js → registry-BpBiRe-o.js} +1 -1
- package/dist/assets/{registry-h3m1zDGt.js → registry-Bpx4VBWb.js} +1 -1
- package/dist/assets/{registry-BvEfWbB0.js → registry-BueBIP-N.js} +1 -1
- package/dist/assets/{registry-eQ4cE0zj.js → registry-CNr6L-3z.js} +1 -1
- package/dist/assets/{registry-CrpEXqNF.js → registry-CfTTYQrE.js} +1 -1
- package/dist/assets/{registry-CePhqBU6.js → registry-CqfjqOX5.js} +2 -2
- package/dist/assets/{registry-D86iln18.js → registry-D84Bs-bD.js} +1 -1
- package/dist/assets/{registry-DgIia4dY.js → registry-DBsjgIxw.js} +1 -1
- package/dist/assets/{registry-vPwth4BB.js → registry-DEgW3zel.js} +1 -1
- package/dist/assets/{registry-BPpjU0S5.js → registry-DFmFBfRz.js} +1 -1
- package/dist/assets/{registry-Cpr0zSyk.js → registry-DrqQbf_n.js} +1 -1
- package/dist/assets/{registry-VKh9QiDf.js → registry-Dw42uggW.js} +1 -1
- package/dist/assets/{registry-HB-VAc6H.js → registry-GLjcQX0n.js} +1 -1
- package/dist/assets/{registry-BYn3Bcie.js → registry-Z3TIPbYJ.js} +1 -1
- package/dist/assets/{registry-ChG5tFfx.js → registry-_T6pLDPG.js} +2 -2
- package/dist/assets/{registry-VS55xdsN.js → registry-aUZZeh27.js} +1 -1
- package/dist/assets/{registry-CFU0k7VB.js → registry-cPmSqaRu.js} +1 -1
- package/dist/assets/{relate-DDWak0Tv.js → relate-yq30L3hZ.js} +1 -1
- package/dist/assets/{shikiHighlight-SWupBCFg.js → shikiHighlight-BgZoQAHs.js} +1 -1
- package/dist/assets/src-B-t8Mww-.js +2 -0
- package/dist/assets/{useDashboardLoop-BSBGTrE2.js → useDashboardLoop-mGmJwv27.js} +3 -3
- package/dist/assets/{useLiveConfig-Cc4IKgOd.js → useLiveConfig-vMyjo2gV.js} +1 -1
- package/dist/assets/{useSpatialCanvas-D3nfHkST.js → useSpatialCanvas-CEXy6ZC2.js} +1 -1
- package/dist/assets/{useSpotlightWalk-gVilFhpa.js → useSpotlightWalk-B9XJ6OLK.js} +1 -1
- package/dist/assets/{useSrsCards-BhFfq4vc.js → useSrsCards-Vc6B2_he.js} +1 -1
- package/dist/assets/{useStudy-DRNarubG.js → useStudy-6QnY-Fw_.js} +1 -1
- package/dist/assets/{useZoomGesture-BdeFOm7j.js → useZoomGesture-BONUz5cE.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/DashboardLoopRuntime-DfnDIGFz.js +0 -1
- package/dist/assets/LiveApp-DmU3RMfZ.js +0 -61
- package/dist/assets/MindShape-Ca3MXEgK.css +0 -1
- package/dist/assets/ShareModal-d_o2hebL.js +0 -32
- package/dist/assets/annotationReel-DdHNp2IH.js +0 -1
- package/dist/assets/canvas-BwR8ltlj.js +0 -1
- package/dist/assets/kokoro-Da60jB7C.js +0 -1
- package/dist/assets/registry-CtbuZWYz.css +0 -1
- package/dist/assets/src-DbgF7cRH.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,7 @@ All notable changes to Mavéa are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project aims to follow
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
-
## [
|
|
7
|
+
## [1.0.11] - 2026-07-23
|
|
8
8
|
|
|
9
9
|
### Fixed — the pre-launch pass
|
|
10
10
|
|
|
@@ -141,6 +141,23 @@ Everything below was found by measuring, not by reading.
|
|
|
141
141
|
- **Canvas** — `BlockBoundary` now calls `console.error` in `componentDidCatch` so block render
|
|
142
142
|
failures are visible in the browser console without crashing the canvas or the voice track.
|
|
143
143
|
|
|
144
|
+
### Fixed — shipping the npm package
|
|
145
|
+
|
|
146
|
+
- **`npx @mavea/mavea` silently did nothing.** npm/npx installs `bin` entries as a symlink, and
|
|
147
|
+
the CLI's "is this the main module" check compared an unresolved symlink path against the
|
|
148
|
+
module's real path — they never matched, so `main()` ran zero times with no error and exit
|
|
149
|
+
code 0. Fixed by resolving both sides through the real filesystem path before comparing, and
|
|
150
|
+
added a regression test that reproduces npm's actual symlink mechanism (the existing smoke
|
|
151
|
+
test invoked the file directly, with no symlink involved, so it could never have caught this).
|
|
152
|
+
- **Published under `@mavea/mavea`, not `mavea`.** npm's anti-typosquatting check blocks new
|
|
153
|
+
unscoped package names it judges too similar to existing ones; scoping sidesteps it.
|
|
154
|
+
- **The README's mascot images didn't render on npm's package page.** Relative image paths
|
|
155
|
+
resolve against GitHub's raw-content host, which requires authentication for a private repo —
|
|
156
|
+
they now load from jsDelivr's npm CDN instead, which serves straight from the published
|
|
157
|
+
package regardless of the source repo's visibility.
|
|
158
|
+
- Release publishing no longer requests npm provenance attestation, which npm rejects outright
|
|
159
|
+
for a private source repository.
|
|
160
|
+
|
|
144
161
|
### Removed
|
|
145
162
|
|
|
146
163
|
- Dead code — an unused descriptor system, an unused text-fitting module, and a chain of unused
|
package/README.md
CHANGED
|
@@ -28,20 +28,39 @@ and evidence you can check, marking the exact figure each line is about.
|
|
|
28
28
|
<img src="https://img.shields.io/badge/Vite-8-646CFF?style=flat-square&logo=vite&logoColor=white" alt="Vite 8" />
|
|
29
29
|
</p>
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
```sh
|
|
32
|
+
npx @mavea/mavea
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Opens `http://localhost:4173` — no install, no account, no model key required.
|
|
32
36
|
|
|
33
37
|
</div>
|
|
34
38
|
|
|
35
39
|
---
|
|
36
40
|
|
|
41
|
+
## Get started
|
|
42
|
+
|
|
43
|
+
All you need is **Node 20.19+**. That command above opens the tour and demo replays immediately
|
|
44
|
+
— nothing else to set up.
|
|
45
|
+
|
|
46
|
+
**To talk to a real model (Live):** click **"Open Mavéa"** and paste an Anthropic / OpenAI /
|
|
47
|
+
Gemini / Grok / OpenRouter key. It stays in memory unless you opt into encrypted local
|
|
48
|
+
remembering, and each provider request carries it through your same-origin proxy to that
|
|
49
|
+
provider — your key and prompts never pass through Mavéa's own servers, because there aren't
|
|
50
|
+
any. Full options — models, actions, hosting, and the trust boundary — are in
|
|
51
|
+
[docs/LIVE-SETUP.md](docs/LIVE-SETUP.md).
|
|
52
|
+
|
|
53
|
+
**The voice:** Mavéa speaks through [Kokoro](https://github.com/remsky/Kokoro-FastAPI), a natural
|
|
54
|
+
local text-to-speech model that runs in Docker. The first time you start it, Mavéa offers to set
|
|
55
|
+
Docker up for you; without it, every line just appears as a caption instead — nothing else
|
|
56
|
+
changes.
|
|
57
|
+
|
|
37
58
|
## What it does
|
|
38
59
|
|
|
39
60
|
Mavéa is an AI you talk to and watch think. Ask out loud: a calm face listens, speaks the headline
|
|
40
61
|
the instant it forms, then steps aside while a living canvas draws the answer in charts, timelines,
|
|
41
62
|
and evidence you can check. As it talks, it draws on the answer, circling the exact figure each line
|
|
42
|
-
is about. Sourced claims keep their links and estimates can be labelled.
|
|
43
|
-
memory by default; optional remembering encrypts them locally. Live requests send them through the
|
|
44
|
-
same-origin proxy you run or deploy, onward to the model provider you chose.
|
|
63
|
+
is about. Sourced claims keep their links and estimates can be labelled.
|
|
45
64
|
|
|
46
65
|
A few specific things worth trying:
|
|
47
66
|
|
|
@@ -60,176 +79,26 @@ A few specific things worth trying:
|
|
|
60
79
|
The full tour — Atlas, Rehearsal, living dashboards, Ripple, Share-as-a-Mavéa-Story, and ~30 more —
|
|
61
80
|
is in [docs/FEATURES.md](docs/FEATURES.md). In the app, press **⌘K**.
|
|
62
81
|
|
|
63
|
-
## Two ways in
|
|
64
|
-
|
|
65
|
-
- **Demo replays** — recorded persona sessions (for example, a CFO reviewing her quarter or a
|
|
66
|
-
parent planning dinner). Each answer was generated once by a real model and frozen; it replays
|
|
67
|
-
on the same Live surface, without a key. The characters are fictional; the answers are real
|
|
68
|
-
model output.
|
|
69
|
-
- **Live** — bring your own model (Anthropic, OpenAI, Gemini, xAI Grok, or OpenRouter) and ask
|
|
70
|
-
anything by voice or text, answered on the same canvas.
|
|
71
|
-
|
|
72
|
-
Honesty is built in, not bolted on: confidence labels, sourced claims, and a Live
|
|
73
|
-
[eval harness](docs/BENCHMARK.md) that scores whether a model picks the right visualization and
|
|
74
|
-
labels its estimates honestly.
|
|
75
|
-
|
|
76
|
-
## Quick start
|
|
77
|
-
|
|
78
|
-
Just want to run it? All you need is **Node 20.19+**:
|
|
79
|
-
|
|
80
|
-
```sh
|
|
81
|
-
npx @mavea/mavea # → http://localhost:4173 — tour + demo replays, no model key required
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Working on the source? Use pnpm instead (`corepack enable` once to get the pinned version):
|
|
85
|
-
|
|
86
|
-
```sh
|
|
87
|
-
pnpm install
|
|
88
|
-
pnpm dev # → http://localhost:5173 — dev server, with voice
|
|
89
|
-
pnpm build # → dist/ — production build
|
|
90
|
-
pnpm preview # → http://localhost:4173 — serves dist/ exactly as npx @mavea/mavea does, voice included
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
| Command | What it does |
|
|
94
|
-
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
95
|
-
| `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. |
|
|
96
|
-
| `pnpm dev:web` | Vite alone, no voice container. Faster to start if you don't need speech. |
|
|
97
|
-
| `pnpm build` | Type-checks, then produces the production bundle in `dist/`. |
|
|
98
|
-
| `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. |
|
|
99
|
-
| `pnpm test` | Runs the Vitest suite once. |
|
|
100
|
-
| `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. |
|
|
101
|
-
|
|
102
|
-
That's the everyday set. The rest of the scripts (linting, evals, one-off audits, internal tooling)
|
|
103
|
-
are documented in full in [CONTRIBUTING.md](./CONTRIBUTING.md#scripts-reference).
|
|
104
|
-
|
|
105
|
-
**Talk to a real model (Live):** click **"Open Mavéa"** and paste an Anthropic / OpenAI / Gemini /
|
|
106
|
-
Grok / OpenRouter key. It stays in memory unless you opt into encrypted local remembering, and each
|
|
107
|
-
provider request carries it through your same-origin proxy to that provider. Full options — models,
|
|
108
|
-
actions, hosting, and the trust boundary — are in
|
|
109
|
-
[docs/LIVE-SETUP.md](docs/LIVE-SETUP.md).
|
|
110
|
-
|
|
111
|
-
**The voice:** Mavéa speaks through [Kokoro](https://github.com/remsky/Kokoro-FastAPI), a natural
|
|
112
|
-
local TTS — the one thing that runs in Docker. `pnpm dev` and `pnpm preview` both start it for
|
|
113
|
-
you; it's optional, and without it every line appears as captions. To run or stop it on its own:
|
|
114
|
-
|
|
115
|
-
```sh
|
|
116
|
-
docker compose up -d # Kokoro TTS on :8880 — dev and preview both proxy /tts to it
|
|
117
|
-
docker compose down # stop it (it otherwise stays up between dev sessions)
|
|
118
|
-
```
|
|
119
|
-
|
|
120
82
|
## What it needs
|
|
121
83
|
|
|
122
|
-
Mavéa runs on your machine, not in a cloud.
|
|
123
|
-
it, because the toolchain is the heavier of the two and it still isn't heavy.
|
|
84
|
+
Mavéa runs on your machine, not in a cloud.
|
|
124
85
|
|
|
125
86
|
| | Minimum | Recommended |
|
|
126
87
|
| -------- | ------- | ----------- |
|
|
127
88
|
| **CPU** | 4 cores | 8 cores |
|
|
128
89
|
| **RAM** | 8 GB | 16 GB |
|
|
129
90
|
| **Disk** | 3 GB | 10 GB |
|
|
130
|
-
| **Node** |
|
|
131
|
-
|
|
132
|
-
Both columns describe your whole machine rather than Mavéa's share of it, and neither is a bare
|
|
133
|
-
floor. **Minimum** is the app and its toolchain with the voice off, alongside the browser and editor
|
|
134
|
-
you already have open. **Recommended** adds the voice and Docker on top of that, with enough room
|
|
135
|
-
left that you never think about any of it. Any browser in
|
|
136
|
-
[Baseline Widely Available](https://web.dev/baseline) — current Chrome, Edge, Safari, or Firefox —
|
|
137
|
-
on macOS, Windows, or Linux.
|
|
138
|
-
|
|
139
|
-
For reference, Mavéa itself asks for far less, and it's worth knowing which part costs what.
|
|
140
|
-
`npx @mavea/mavea` serves a static build and the work happens in your browser tab: the page it loads
|
|
141
|
-
is 89 kB over the wire, and every surface becomes usable in under half a second on a CPU throttled
|
|
142
|
-
6×. The toolchain is heavier and still modest — a production build peaks around 1.6 GB of memory and
|
|
143
|
-
finishes in ~12 s, a full typecheck of all 2,200 TypeScript files peaks under 1 GB and takes ~3 s,
|
|
144
|
-
and a checkout with dependencies and a build output on disk comes to ~750 MB. Everything caches, so
|
|
145
|
-
only the first run after a fresh clone is slow.
|
|
146
|
-
|
|
147
|
-
**The voice is the one part that costs real memory, and it's optional.** Kokoro's image is 4.9 GB on
|
|
148
|
-
disk and holds ~1.3 GB resident, and Docker Desktop itself adds ~1.5 GB before a word is spoken.
|
|
149
|
-
Synthesis briefly takes a few cores, and runs ahead of the playhead rather than at it. At the 8 GB
|
|
150
|
-
minimum, leaving the voice off is usually the better trade: every line becomes a caption and nothing
|
|
151
|
-
else changes. `docker compose down` reclaims all of it; the
|
|
152
|
-
container otherwise stays up between sessions on purpose, so the next start is instant, and
|
|
153
|
-
`pnpm dev:web` starts Vite without bringing Docker up at all.
|
|
154
|
-
|
|
155
|
-
**Nothing here should make a fan audible.** The always-on costs are the animated face and the glass
|
|
156
|
-
blur, so rather than guessing from core count, Mavéa watches its own frame pacing for the first few
|
|
157
|
-
seconds and calms both if this particular machine is actually struggling — an integrated GPU choking
|
|
158
|
-
on blurred glass is invisible to a spec sheet. It waits for two bad windows before demoting, so one
|
|
159
|
-
hitch won't do it, and it never promotes back mid-session. You can also just decide for it:
|
|
160
|
-
**Visual richness → Lite** in Live's settings is a per-device choice that takes effect immediately.
|
|
161
|
-
Everything else is idle until you ask it something — the one part that will genuinely work a CPU is
|
|
162
|
-
voice synthesis, and that only runs if you started Docker.
|
|
163
|
-
|
|
164
|
-
## How it works
|
|
165
|
-
|
|
166
|
-
Mavéa is one conversation surface (Live) plus a marketing landing, hash-routed in `main.tsx`.
|
|
167
|
-
However a turn is triggered — voice, text, a chip, or a replayed demo frame — it resolves to
|
|
168
|
-
the same shape:
|
|
91
|
+
| **Node** | 20.19+ | 20.19+ |
|
|
169
92
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
93
|
+
Any browser in [Baseline Widely Available](https://web.dev/baseline) — current Chrome, Edge,
|
|
94
|
+
Safari, or Firefox — on macOS, Windows, or Linux. **Minimum** covers the app with voice off,
|
|
95
|
+
alongside the browser and whatever else you already have open. **Recommended** adds Kokoro
|
|
96
|
+
(voice) and Docker on top, with enough room that you never think about it.
|
|
173
97
|
|
|
174
|
-
The
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
contract and renderer. The generated selection catalog contains **600 component contracts across
|
|
179
|
-
23 families**, and the gallery production-renders every one of them — including the types that are
|
|
180
|
-
gated or surface-owned rather than offered in ordinary model selection. Every provider sits behind
|
|
181
|
-
one `ProviderAdapter`; Live credentials and
|
|
182
|
-
prompts cross the same-origin proxy operated by whoever runs the deployment before reaching the
|
|
183
|
-
selected provider. This repository does not include a hosted account, analytics, or data-retention
|
|
184
|
-
service.
|
|
185
|
-
|
|
186
|
-
The full design — the turn contract, the validation core, the BYOK proxy diagram, and the eval
|
|
187
|
-
harness — is in [ARCHITECTURE.md](./ARCHITECTURE.md).
|
|
188
|
-
|
|
189
|
-
## Built with
|
|
190
|
-
|
|
191
|
-
A deliberately small stack — React 19, TypeScript 6, Vite 8 — with no chart library and no UI
|
|
192
|
-
framework beyond React: every chart, dial, diagram, and the face is hand-rolled SVG/CSS. Beyond
|
|
193
|
-
`react`/`react-dom`, the runtime stays lean: `@ricky0123/vad-web` (Silero VAD for end-of-speech)
|
|
194
|
-
plus a handful of feature-scoped libraries — KaTeX, Leaflet, jsPDF, pdfjs-dist, openchemlib,
|
|
195
|
-
mediabunny, modern-screenshot, pptxgenjs, and Shiki — each lazy-loaded only when that feature is used and
|
|
196
|
-
bundled rather than fetched from a CDN. JavaScript/TypeScript snippets run only after an explicit
|
|
197
|
-
click in a bounded Worker; Python execution is disabled until it has an equally isolated runtime.
|
|
198
|
-
The face is one hand-drawn SVG animated purely by CSS off `data-*` attributes — JS never transforms
|
|
199
|
-
it.
|
|
200
|
-
|
|
201
|
-
## Documentation
|
|
202
|
-
|
|
203
|
-
| Doc | What's in it |
|
|
204
|
-
| ---------------------------------------------------------- | ---------------------------------------------------------- |
|
|
205
|
-
| [docs/FEATURES.md](./docs/FEATURES.md) | The detailed product feature tour |
|
|
206
|
-
| [ARCHITECTURE.md](./ARCHITECTURE.md) | The turn lifecycle, the seams, and how the pieces fit |
|
|
207
|
-
| [docs/BENCHMARK.md](./docs/BENCHMARK.md) | The eval as a benchmark — score any model, leaderboard |
|
|
208
|
-
| [docs/LIVE-SETUP.md](./docs/LIVE-SETUP.md) | Running Live: models, voice, actions, troubleshooting |
|
|
209
|
-
| [docs/DEPLOYMENT.md](./docs/DEPLOYMENT.md) | Edge contract: TLS, HTTP/2/3, compression, cache, headers |
|
|
210
|
-
| [docs/ADDING-A-COMPONENT.md](./docs/ADDING-A-COMPONENT.md) | The full contract + scaffold for a new canvas block |
|
|
211
|
-
| [CONTRIBUTING.md](./CONTRIBUTING.md) | Setup, the full script reference, conventions, and recipes |
|
|
212
|
-
| [docs/ENGINEERING.md](./docs/ENGINEERING.md) | The review rubric: security, scalability, readability |
|
|
213
|
-
| [SECURITY.md](./SECURITY.md) | The BYOK security model and how to report a vulnerability |
|
|
214
|
-
| [TERMS.md](./TERMS.md) | Terms for using the software and connected features |
|
|
215
|
-
| [PRIVACY.md](./PRIVACY.md) | Local, provider, proxy, storage, and transfer data flows |
|
|
216
|
-
| [DISCLAIMER.md](./DISCLAIMER.md) | Plain-language AI and third-party risk summary |
|
|
217
|
-
|
|
218
|
-
## Feedback and maintenance
|
|
219
|
-
|
|
220
|
-
Issues with code-free bug reports and feature suggestions are welcome. This repository does not
|
|
221
|
-
accept external code, patch, or documentation pull requests; see [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
222
|
-
for the maintainer workflow and feedback rules. Maintainer changes are held to the
|
|
223
|
-
[engineering bar](./docs/ENGINEERING.md) (security, scalability, readability), and CI runs
|
|
224
|
-
`typecheck → lint → format → test → build` plus bundle, dependency, secret, and static-analysis
|
|
225
|
-
checks.
|
|
226
|
-
|
|
227
|
-
Two checks the unit suite can't make, both against a running `pnpm dev`:
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
pnpm audit:ui # every block, 280px → 4K, both themes: clipped · overlapping · illegible
|
|
231
|
-
pnpm perf # every surface under CPU throttling — and nothing heavy loaded unasked
|
|
232
|
-
```
|
|
98
|
+
**The voice is the one part that costs real memory, and it's optional.** Kokoro's image holds
|
|
99
|
+
roughly 1.3 GB resident, and Docker Desktop itself adds another ~1.5 GB before a word is spoken.
|
|
100
|
+
At the 8 GB minimum, leaving voice off is usually the better trade — every line becomes a caption
|
|
101
|
+
and nothing else changes. `docker compose down` reclaims it whenever you want it back.
|
|
233
102
|
|
|
234
103
|
## 📄 License
|
|
235
104
|
|