@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.
Files changed (158) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/README.md +33 -164
  3. package/dist/.vite/manifest.json +606 -606
  4. package/dist/assets/{AppCommandPalette-DzUPm-Qa.js → AppCommandPalette-D_g8-7C0.js} +1 -1
  5. package/dist/assets/{BlockEmpty-Dp9IPo4S.js → BlockEmpty-Ddhgr5pu.js} +1 -1
  6. package/dist/assets/{BriefingPlayer-CTab7H0c.js → BriefingPlayer-D-QhLgXI.js} +1 -1
  7. package/dist/assets/{CanvasSkeleton-BCq4yAAN.js → CanvasSkeleton-BIiOmCMG.js} +2 -2
  8. package/dist/assets/{CheckLogRail-DbGJtneK.js → CheckLogRail-ZrDqyjQ7.js} +1 -1
  9. package/dist/assets/{CodeOutput-DjsCJAel.js → CodeOutput-D7sVg1Nr.js} +1 -1
  10. package/dist/assets/{CommandPalette-Cq9mDWiI.js → CommandPalette-DNa2q8E_.js} +1 -1
  11. package/dist/assets/{CourseLessonReader-Dz8IhHEw.js → CourseLessonReader-BIpGjcJk.js} +2 -2
  12. package/dist/assets/{CourseRail-DjK_L3eD.js → CourseRail-CQaotzN0.js} +1 -1
  13. package/dist/assets/{CoursesApp-Dv4yt63y.js → CoursesApp-q3kZJmu1.js} +2 -2
  14. package/dist/assets/{CrossExamPanel-DJCn13Aa.js → CrossExamPanel-BIJslibV.js} +1 -1
  15. package/dist/assets/{DashPresent-pfOEJGzV.js → DashPresent-DGSE0vYM.js} +1 -1
  16. package/dist/assets/{DashboardDetail-BSZ3CgcK.js → DashboardDetail-BpaLNg8R.js} +2 -2
  17. package/dist/assets/DashboardLoopRuntime-14yzj-xx.js +1 -0
  18. package/dist/assets/{DashboardOverview-DpJ2BDNu.js → DashboardOverview-8x3OxX2i.js} +1 -1
  19. package/dist/assets/{DashboardSettings-C1rC3iTs.js → DashboardSettings-f_zxcs5j.js} +1 -1
  20. package/dist/assets/{DashboardsApp-DeBWrYDk.js → DashboardsApp-mvMbGmp0.js} +2 -2
  21. package/dist/assets/{DeepZoomApp-B91oHx2Y.js → DeepZoomApp-E7bDmzuL.js} +1 -1
  22. package/dist/assets/{DelegatePanel-bFmfn9-D.js → DelegatePanel-pwRk9pFf.js} +1 -1
  23. package/dist/assets/{DemoGallery-fYIVdHQV.js → DemoGallery-DDzX8Z7I.js} +1 -1
  24. package/dist/assets/{DropSelect-DbxAWKQn.js → DropSelect-BMZYAX6q.js} +1 -1
  25. package/dist/assets/{ExportModal-HczU1Zg1.js → ExportModal-CTMJaU1l.js} +2 -2
  26. package/dist/assets/{ExtractionPreview-BfjJci-N.js → ExtractionPreview-C9wq7CrK.js} +1 -1
  27. package/dist/assets/{FlagshipCTA-CTb5P2Ix.js → FlagshipCTA-DPNSflKv.js} +1 -1
  28. package/dist/assets/{FlagshipCommandPalette-DLkDmsF-.js → FlagshipCommandPalette-55zqyPFm.js} +1 -1
  29. package/dist/assets/{FlagshipShowcase-CrFSCHHX.js → FlagshipShowcase-BWpoPWOn.js} +1 -1
  30. package/dist/assets/{FlashcardsApp-CV777TGC.js → FlashcardsApp-apCj3I17.js} +1 -1
  31. package/dist/assets/{ForecastPanel-BfAngk8l.js → ForecastPanel-CMRD-UKn.js} +1 -1
  32. package/dist/assets/{GalleryApp-DLssAAhN.js → GalleryApp-CcsbirLT.js} +1 -1
  33. package/dist/assets/{HonestByDesign-B0o03QVw.js → HonestByDesign-DU4qmc61.js} +1 -1
  34. package/dist/assets/{HowItWorks-DfUsQ2xD.js → HowItWorks-CkZXftN-.js} +1 -1
  35. package/dist/assets/{LegalApp-CnFE80Ja.js → LegalApp-BmZpqH-6.js} +1 -1
  36. package/dist/assets/{LegalMarkdownDocument-BidNcrNj.js → LegalMarkdownDocument-CcbAfubz.js} +1 -1
  37. package/dist/assets/{LegalPageShell-CFktFKTK.js → LegalPageShell-raMATqhx.js} +1 -1
  38. package/dist/assets/{LeverPanel-DgfX7mTL.js → LeverPanel-DVUgGcYW.js} +1 -1
  39. package/dist/assets/{Library-CAnmN5YL.js → Library-D725dNcx.js} +1 -1
  40. package/dist/assets/{LibraryOverlay-D7Gg_GIv.js → LibraryOverlay-D7PzQIpH.js} +1 -1
  41. package/dist/assets/LiveApp-B8Jw1Q0h.js +61 -0
  42. package/dist/assets/{LiveApp-COz1ZZp9.css → LiveApp-DQhDk2ma.css} +1 -1
  43. package/dist/assets/{LiveSettings-5UCN5UWM.js → LiveSettings-BQ06gZB7.js} +3 -3
  44. package/dist/assets/{MindMapViewerDrawer-DoXy6hCD.js → MindMapViewerDrawer-CIMuABKE.js} +1 -1
  45. package/dist/assets/{MindShape-BJCnqyTi.js → MindShape-0KPrv0CF.js} +1 -1
  46. package/dist/assets/MindShape-Bel2yDqO.css +1 -0
  47. package/dist/assets/{PinToDashboard-Dq77a2iP.js → PinToDashboard-ML4NFCAU.js} +1 -1
  48. package/dist/assets/{PlanReview-DvxM1675.js → PlanReview-CbJ_7Ld1.js} +1 -1
  49. package/dist/assets/{Presence-LNSqCz8N.js → Presence-B_zDfiE7.js} +1 -1
  50. package/dist/assets/{PresentationDeck-8kT0cMtk.js → PresentationDeck-Tm3PUdh5.js} +1 -1
  51. package/dist/assets/{PrismApp-Jf4pIAkh.js → PrismApp-Bc-6PO_P.js} +2 -2
  52. package/dist/assets/{PrismAskController-QXSoZBNb.js → PrismAskController-OwqFx5Pk.js} +1 -1
  53. package/dist/assets/{PrismBriefingPlayer-edFfwMNP.js → PrismBriefingPlayer-Bu_ZxYdh.js} +2 -2
  54. package/dist/assets/{PrismOverlay-CYItOpax.js → PrismOverlay-UTsJ8R5d.js} +4 -4
  55. package/dist/assets/{PrivacyApp-Dqz_BgOS.js → PrivacyApp-BLXan6dm.js} +1 -1
  56. package/dist/assets/{Recap-Ba2qZ2lX.js → Recap-5rYrcMCC.js} +1 -1
  57. package/dist/assets/{ReelJelly-9SCjNeHq.js → ReelJelly-Dg3XGB0c.js} +1 -1
  58. package/dist/assets/{RehearsalPanel-CtYKPl6O.js → RehearsalPanel-CM4466Os.js} +3 -3
  59. package/dist/assets/{ReplayCard-MSWq-Mxr.js → ReplayCard-wMIMlorH.js} +2 -2
  60. package/dist/assets/{ReplayOverlay-ChDrwMLh.js → ReplayOverlay-BomkTonB.js} +1 -1
  61. package/dist/assets/{RewindOverlay-CM9d5xhh.js → RewindOverlay-Izf89nG9.js} +1 -1
  62. package/dist/assets/{RippleApp-B7G_jg05.js → RippleApp-8QSIEjTX.js} +2 -2
  63. package/dist/assets/{RippleAskController-CJjt7VG8.js → RippleAskController-Cd86GrKs.js} +1 -1
  64. package/dist/assets/{RippleOverlay-Cfu3ZVL1.js → RippleOverlay-SCrXZTqz.js} +2 -2
  65. package/dist/assets/{SeeDontRead-DHhwv6RU.js → SeeDontRead-Bp8qsF20.js} +1 -1
  66. package/dist/assets/ShareModal-C-sD-aia.js +32 -0
  67. package/dist/assets/{ShareModal-C8S7ySls.css → ShareModal-PobtP7AJ.css} +1 -1
  68. package/dist/assets/{ShipCascade-B6kVuilv.js → ShipCascade-Cq_I4c_v.js} +1 -1
  69. package/dist/assets/{ShipCourse-CerQYrsy.js → ShipCourse-CzsJyMnT.js} +1 -1
  70. package/dist/assets/{ShipHotspots-DOmWYgHH.js → ShipHotspots-OMjPhQWP.js} +1 -1
  71. package/dist/assets/{ShipIncident-D0lvmytD.js → ShipIncident-Cqn6ZmKz.js} +1 -1
  72. package/dist/assets/{ShipMigration-D70LbiJk.js → ShipMigration-5_ZWn7K9.js} +1 -1
  73. package/dist/assets/{ShipOnboarding-B_0dp9a-.js → ShipOnboarding-Yr8oKgmQ.js} +1 -1
  74. package/dist/assets/{ShipRead-Cp2s7bSL.js → ShipRead-Bnw7mnv3.js} +1 -1
  75. package/dist/assets/{ShipRollout-Bw9pvbSM.js → ShipRollout-ECsDrqAd.js} +1 -1
  76. package/dist/assets/{ShipSuggestions-eHLjOJL5.js → ShipSuggestions-C6oDw2F8.js} +1 -1
  77. package/dist/assets/{ShipWorkspace-DwdoBSix.js → ShipWorkspace-BT6gZrqd.js} +1 -1
  78. package/dist/assets/{SignatureLoop-Bl43npTM.js → SignatureLoop-D7sibSnc.js} +1 -1
  79. package/dist/assets/{SynthesisApp-BkOWv_pc.js → SynthesisApp-B768x2r_.js} +2 -2
  80. package/dist/assets/{SynthesisOverlay-CHlVL7sT.js → SynthesisOverlay-Ds0MhZLQ.js} +1 -1
  81. package/dist/assets/{TermsApp-PakIMrh0.js → TermsApp-Da8FeMj3.js} +1 -1
  82. package/dist/assets/{TopicCanvas-wmAsICUd.js → TopicCanvas-D64O3lvD.js} +2 -2
  83. package/dist/assets/{TourPrism-VQqowXpY.js → TourPrism-CTf1G-Vv.js} +1 -1
  84. package/dist/assets/{TrackerTile-C1mU8Zxj.js → TrackerTile-DeujTCk-.js} +2 -2
  85. package/dist/assets/{TwoSurfaces-SNT4AVzV.js → TwoSurfaces-kyK2yqm0.js} +1 -1
  86. package/dist/assets/{UnderstoodPanel-BkwhDLhW.js → UnderstoodPanel-Dgwk_Cuj.js} +1 -1
  87. package/dist/assets/{WhyMachineOverlay-DgYhqU53.js → WhyMachineOverlay-C4eQC0lg.js} +1 -1
  88. package/dist/assets/{WowFeatures-Cky9THxT.js → WowFeatures-CaBZ5WPM.js} +1 -1
  89. package/dist/assets/{ZoomDeck-BXwcRCO_.js → ZoomDeck-DnCtbhx1.js} +1 -1
  90. package/dist/assets/{alternateFinishes-Cn5LyQ0-.js → alternateFinishes-FSV_gA1A.js} +1 -1
  91. package/dist/assets/{annotationAuto-L2AxlJ2F.js → annotationAuto-x_dV8z65.js} +1 -1
  92. package/dist/assets/annotationReel-SeXzv0P-.js +1 -0
  93. package/dist/assets/{backup-Cw4GBHBV.js → backup-0zODkqi-.js} +1 -1
  94. package/dist/assets/canvas-uhcwigAL.js +1 -0
  95. package/dist/assets/{catalog-2srqP2Jf.js → catalog-Car_1ocN.js} +1 -1
  96. package/dist/assets/{dashboardEvents-S4Y2aOP_.js → dashboardEvents-BqcPN-K8.js} +2 -2
  97. package/dist/assets/{dist-BJbBdhc0.js → dist-BTg4yEWr.js} +1 -1
  98. package/dist/assets/{fit-C3MkNFdn.js → fit-I3tuibfX.js} +1 -1
  99. package/dist/assets/{generateLive-Ci8kqPD9.js → generateLive-Dk24OxVt.js} +1 -1
  100. package/dist/assets/{index-DWHIOldG.js → index-CWqRe4-B.js} +3 -3
  101. package/dist/assets/{jspdf.es.min-CfZM9xhl.js → jspdf.es.min-wkD3BzGZ.js} +1 -1
  102. package/dist/assets/kokoro-B-3GqktX.js +1 -0
  103. package/dist/assets/{lib-C9jT-CD8.js → lib-CwruVYU_.js} +1 -1
  104. package/dist/assets/{liveSchema-Dw4t_k7M.js → liveSchema-CCpVMy0H.js} +1 -1
  105. package/dist/assets/{motion-QSGW_vc_.js → motion-CURfDtdH.js} +1 -1
  106. package/dist/assets/{notes-D21K92Wx.js → notes-BG5QP-Dj.js} +1 -1
  107. package/dist/assets/{pdf-BP_vXBKO.js → pdf-x4qTBJIZ.js} +1 -1
  108. package/dist/assets/{perfProbe-DFw7brPU.js → perfProbe-BFwfpxJt.js} +1 -1
  109. package/dist/assets/{pin-BzDcIYD4.js → pin-DRN5H7py.js} +1 -1
  110. package/dist/assets/{portal-n6TW0FuE.js → portal-BYHo9LOD.js} +1 -1
  111. package/dist/assets/{pptxgen.es-GleD8us4.js → pptxgen.es-DGywGiaX.js} +1 -1
  112. package/dist/assets/{prewarm-CehIIttc.js → prewarm-CQNCE4Uq.js} +1 -1
  113. package/dist/assets/{quietHours-Brg4oaDf.js → quietHours-CKjQ2pGY.js} +1 -1
  114. package/dist/assets/{registry-CoCl26Tl.js → registry-1BWL6SXY.js} +1 -1
  115. package/dist/assets/registry-5a-E7vEN.css +1 -0
  116. package/dist/assets/{registry-mmGDT0wn.js → registry-9S6KiKjR.js} +1 -1
  117. package/dist/assets/{registry-BE1QBNKm.js → registry-BZQeYzgv.js} +1 -1
  118. package/dist/assets/{registry-CG5W7Xs6.js → registry-Bc6_RQ8l.js} +1 -1
  119. package/dist/assets/{registry-_mqmf4_W.js → registry-BklPTZre.js} +1 -1
  120. package/dist/assets/{registry-ia68k5sK.js → registry-Bl3NkU-0.js} +1 -1
  121. package/dist/assets/{registry-NNLA0NQi.js → registry-BpBiRe-o.js} +1 -1
  122. package/dist/assets/{registry-h3m1zDGt.js → registry-Bpx4VBWb.js} +1 -1
  123. package/dist/assets/{registry-BvEfWbB0.js → registry-BueBIP-N.js} +1 -1
  124. package/dist/assets/{registry-eQ4cE0zj.js → registry-CNr6L-3z.js} +1 -1
  125. package/dist/assets/{registry-CrpEXqNF.js → registry-CfTTYQrE.js} +1 -1
  126. package/dist/assets/{registry-CePhqBU6.js → registry-CqfjqOX5.js} +2 -2
  127. package/dist/assets/{registry-D86iln18.js → registry-D84Bs-bD.js} +1 -1
  128. package/dist/assets/{registry-DgIia4dY.js → registry-DBsjgIxw.js} +1 -1
  129. package/dist/assets/{registry-vPwth4BB.js → registry-DEgW3zel.js} +1 -1
  130. package/dist/assets/{registry-BPpjU0S5.js → registry-DFmFBfRz.js} +1 -1
  131. package/dist/assets/{registry-Cpr0zSyk.js → registry-DrqQbf_n.js} +1 -1
  132. package/dist/assets/{registry-VKh9QiDf.js → registry-Dw42uggW.js} +1 -1
  133. package/dist/assets/{registry-HB-VAc6H.js → registry-GLjcQX0n.js} +1 -1
  134. package/dist/assets/{registry-BYn3Bcie.js → registry-Z3TIPbYJ.js} +1 -1
  135. package/dist/assets/{registry-ChG5tFfx.js → registry-_T6pLDPG.js} +2 -2
  136. package/dist/assets/{registry-VS55xdsN.js → registry-aUZZeh27.js} +1 -1
  137. package/dist/assets/{registry-CFU0k7VB.js → registry-cPmSqaRu.js} +1 -1
  138. package/dist/assets/{relate-DDWak0Tv.js → relate-yq30L3hZ.js} +1 -1
  139. package/dist/assets/{shikiHighlight-SWupBCFg.js → shikiHighlight-BgZoQAHs.js} +1 -1
  140. package/dist/assets/src-B-t8Mww-.js +2 -0
  141. package/dist/assets/{useDashboardLoop-BSBGTrE2.js → useDashboardLoop-mGmJwv27.js} +3 -3
  142. package/dist/assets/{useLiveConfig-Cc4IKgOd.js → useLiveConfig-vMyjo2gV.js} +1 -1
  143. package/dist/assets/{useSpatialCanvas-D3nfHkST.js → useSpatialCanvas-CEXy6ZC2.js} +1 -1
  144. package/dist/assets/{useSpotlightWalk-gVilFhpa.js → useSpotlightWalk-B9XJ6OLK.js} +1 -1
  145. package/dist/assets/{useSrsCards-BhFfq4vc.js → useSrsCards-Vc6B2_he.js} +1 -1
  146. package/dist/assets/{useStudy-DRNarubG.js → useStudy-6QnY-Fw_.js} +1 -1
  147. package/dist/assets/{useZoomGesture-BdeFOm7j.js → useZoomGesture-BONUz5cE.js} +1 -1
  148. package/dist/index.html +1 -1
  149. package/package.json +1 -1
  150. package/dist/assets/DashboardLoopRuntime-DfnDIGFz.js +0 -1
  151. package/dist/assets/LiveApp-DmU3RMfZ.js +0 -61
  152. package/dist/assets/MindShape-Ca3MXEgK.css +0 -1
  153. package/dist/assets/ShareModal-d_o2hebL.js +0 -32
  154. package/dist/assets/annotationReel-DdHNp2IH.js +0 -1
  155. package/dist/assets/canvas-BwR8ltlj.js +0 -1
  156. package/dist/assets/kokoro-Da60jB7C.js +0 -1
  157. package/dist/assets/registry-CtbuZWYz.css +0 -1
  158. 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
- ## [Unreleased]
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
- **Try it in one command:** `npx @mavea/mavea`
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. Provider keys stay in
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. One set of numbers covers both using it and working on
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** | 24.11+ | 24.11+ |
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
- ask ─▶ generateLive ─▶ validate/repair ─▶ settle (merge + tour) ─▶ Presence (the face) + Canvas (the blocks)
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 canvas is data, not components: every answer is a list of typed `{ type, props }` blocks
175
- (`data/conversation.ts`). A model never emits UI it emits those same blocks, which
176
- `live/generateLive` streams, validates, and repairs into the `ConversationSpec` contract. The
177
- demo replays are frozen outputs of this exact pipeline, so they render through the same
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