@mavea/mavea 2.0.0 → 2.0.1

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 (104) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +6 -2
  3. package/bin/mavea.mjs +40 -8
  4. package/dist/.vite/manifest.json +393 -393
  5. package/dist/assets/{AnnotationLayer-Cccb12ps.js → AnnotationLayer-BsAcAd59.js} +0 -0
  6. package/dist/assets/{AppCommandPalette-DdOPNZ0e.js → AppCommandPalette-Cucwjk5N.js} +1 -1
  7. package/dist/assets/{CheckLogRail-BibJTid0.js → CheckLogRail-vq2lZ7a5.js} +1 -1
  8. package/dist/assets/ConversationVideoStudio-Df892wqs.js +1 -0
  9. package/dist/assets/{CourseLessonReader-D29Kix4f.js → CourseLessonReader-DKQimh2S.js} +2 -2
  10. package/dist/assets/{CoursesApp-DcDsS_ZS.js → CoursesApp-LeqL6dWT.js} +1 -1
  11. package/dist/assets/{DashPresent-BDWgO9am.js → DashPresent-DZcRdu6R.js} +1 -1
  12. package/dist/assets/{DashboardDetail-BrnAdWfy.js → DashboardDetail-2XL-J4rS.js} +2 -2
  13. package/dist/assets/{DashboardLoopGate-NxMcQ4rD.js → DashboardLoopGate-B95S4oKR.js} +2 -2
  14. package/dist/assets/DashboardLoopRuntime-Wzk85QXi.js +1 -0
  15. package/dist/assets/{DashboardsApp-DxyMn3x_.js → DashboardsApp-ZGuT2QBi.js} +2 -2
  16. package/dist/assets/{DeepZoomApp-nNjqoyYE.js → DeepZoomApp-CPOsar8c.js} +1 -1
  17. package/dist/assets/{DelegatePanel-DN_ZL0j7.js → DelegatePanel-BkTtUMSl.js} +1 -1
  18. package/dist/assets/{DemoGallery-DrSlMsnu.js → DemoGallery-BcQ9yz2u.js} +1 -1
  19. package/dist/assets/{DropSelect-GwIXHA5o.js → DropSelect-GKioj__f.js} +1 -1
  20. package/dist/assets/{ExportModal-DBUjC71U.js → ExportModal-1pWr-c7I.js} +1 -1
  21. package/dist/assets/{ExtractionPreview-D4M6eXqb.js → ExtractionPreview-TKyfEqwM.js} +1 -1
  22. package/dist/assets/{FeatureUseNotice-Bda9jr3W.js → FeatureUseNotice-pQe4YHgJ.js} +1 -1
  23. package/dist/assets/{FlagshipCommandPalette-DAO849RC.js → FlagshipCommandPalette-D1pv3hfZ.js} +1 -1
  24. package/dist/assets/{FlagshipShowcase-g2x-1c70.js → FlagshipShowcase-CCFFcaL7.js} +1 -1
  25. package/dist/assets/{FlashcardsApp-BUKzCr65.js → FlashcardsApp-Dbe-8UkQ.js} +1 -1
  26. package/dist/assets/{GalleryApp-ot_A7ZF-.js → GalleryApp-CCLYcEqn.js} +1 -1
  27. package/dist/assets/{HonestByDesign-DgZFEpEx.js → HonestByDesign-ByOR1sRQ.js} +1 -1
  28. package/dist/assets/{HowItWorks-DPFpdeGE.js → HowItWorks-Dllc30ph.js} +1 -1
  29. package/dist/assets/{LegalApp-C56kWdmK.js → LegalApp-CpblxmmB.js} +1 -1
  30. package/dist/assets/{LegalMarkdownDocument-BBTHuW_M.js → LegalMarkdownDocument-CmxHsXlb.js} +1 -1
  31. package/dist/assets/{LegalPageShell-hMA-7JLf.js → LegalPageShell-CDD6D6T_.js} +1 -1
  32. package/dist/assets/{LibraryOverlay-DSUWcUe4.js → LibraryOverlay-CHmubwG3.js} +1 -1
  33. package/dist/assets/{LiveApp-B62EMybC.js → LiveApp-CSbjhgzM.js} +4 -4
  34. package/dist/assets/{LiveSettings-BITIaMoT.js → LiveSettings-B4T6x41n.js} +3 -3
  35. package/dist/assets/{MindMapViewerDrawer-CKdJtHno.js → MindMapViewerDrawer-BLRBWsTz.js} +1 -1
  36. package/dist/assets/{MindShape-B3lg_z4X.js → MindShape-CaDuLyGa.js} +1 -1
  37. package/dist/assets/{PinToDashboard-DpQjBLPa.js → PinToDashboard-ChK2Ou73.js} +1 -1
  38. package/dist/assets/{PlanReview-CrTbmMAd.js → PlanReview-Dg6VE0xF.js} +1 -1
  39. package/dist/assets/{PresentationDeck-CfYadu9V.js → PresentationDeck-oEd6TXdN.js} +1 -1
  40. package/dist/assets/{PrismApp-bRKK_3JA.js → PrismApp-Bju264hL.js} +2 -2
  41. package/dist/assets/{PrismBriefingPlayer-ChJj6hSS.js → PrismBriefingPlayer-BY0RREUu.js} +2 -2
  42. package/dist/assets/{PrismOverlay-Pp6ZKmTc.js → PrismOverlay-DOWyOUVW.js} +3 -3
  43. package/dist/assets/{PrismWorkbench-BCV7r4Oa.js → PrismWorkbench-9RonO2uv.js} +1 -1
  44. package/dist/assets/{PrivacyApp-A2Bu6LVd.js → PrivacyApp-CBPMqUEA.js} +1 -1
  45. package/dist/assets/{ReplayCard-B6NYiYzQ.js → ReplayCard-BnX73r9n.js} +2 -2
  46. package/dist/assets/{ReplayOverlay-BJKtJ-vc.js → ReplayOverlay-B-Ok0mEs.js} +1 -1
  47. package/dist/assets/{RippleApp-BXt7tenS.js → RippleApp-BnIUhIA0.js} +2 -2
  48. package/dist/assets/{RippleOverlay-BSxubBwj.js → RippleOverlay-C9W7uVOp.js} +2 -2
  49. package/dist/assets/{SeeDontRead-0He5hS2C.js → SeeDontRead-ByW9HnOj.js} +1 -1
  50. package/dist/assets/{ShareModal-xYdZWJxy.js → ShareModal-Mo-dkgAZ.js} +2 -2
  51. package/dist/assets/{ShipCourse-Dg6kCWyH.js → ShipCourse-CT_F9oJH.js} +1 -1
  52. package/dist/assets/{SignatureLoop-QPwB2oNN.js → SignatureLoop-DejFTZ-Y.js} +1 -1
  53. package/dist/assets/{SynthesisApp-DrCq6NDa.js → SynthesisApp-6W04mrMU.js} +2 -2
  54. package/dist/assets/{SynthesisOverlay-DCa-2Pz_.js → SynthesisOverlay-DDyFFiO8.js} +1 -1
  55. package/dist/assets/{TermsApp-zcPDYfuh.js → TermsApp-ZzlhrXhd.js} +1 -1
  56. package/dist/assets/{TopicCanvas-Bw4bMFpe.js → TopicCanvas-CkqP92SC.js} +2 -2
  57. package/dist/assets/{TourPrism-DbinDupp.js → TourPrism-Cng4h9Ly.js} +1 -1
  58. package/dist/assets/{TrackerTile-CrT9u1I4.js → TrackerTile-DuUsFQTj.js} +2 -2
  59. package/dist/assets/{TwoSurfaces-L0CDuyOZ.js → TwoSurfaces-BeYMvVuX.js} +1 -1
  60. package/dist/assets/{WorldOverlay-BcjqG1BR.js → WorldOverlay-DeVpS8HE.js} +1 -1
  61. package/dist/assets/{WowFeatures-CwBk4ZMO.js → WowFeatures-D58JgpLg.js} +1 -1
  62. package/dist/assets/{ZoomDeck-DlnesweX.js → ZoomDeck-CPG2XQhr.js} +1 -1
  63. package/dist/assets/{backup-685QrAjt.js → backup-CtEvuZoL.js} +1 -1
  64. package/dist/assets/canvas-Ct-O9Jok.js +1 -0
  65. package/dist/assets/{capture-DgJLQ_0-.js → capture-CgaD86-q.js} +1 -1
  66. package/dist/assets/{catalog-Db9GWM6N.js → catalog-DfIYAG3v.js} +1 -1
  67. package/dist/assets/{confirmAdd-CZ829Mbx.js → confirmAdd-CxWIORcu.js} +1 -1
  68. package/dist/assets/{dashboardEvents-CiayRLrH.js → dashboardEvents-D1OP4ARB.js} +1 -1
  69. package/dist/assets/{deepen-DAeHHFiI.js → deepen-BhP9OmH3.js} +1 -1
  70. package/dist/assets/{effort-jJe4iMIq.js → effort-Bqti44UZ.js} +1 -1
  71. package/dist/assets/{generateBeats-COflu5Zi.js → generateBeats-CtffeoEa.js} +1 -1
  72. package/dist/assets/{generateLive-DGwnpIip.js → generateLive-D5M8v38b.js} +1 -1
  73. package/dist/assets/{index-LiHcEJt_.js → index-CdUH6Eo9.js} +3 -3
  74. package/dist/assets/{kokoro-DXRj0KQX.js → kokoro-D15HDMcP.js} +1 -1
  75. package/dist/assets/{liveSchema-DyfND6P2.js → liveSchema-B8Y9HZxd.js} +1 -1
  76. package/dist/assets/{loader-DgMLGfAC.js → loader-ChcXMM9W.js} +2 -2
  77. package/dist/assets/{notes-DzIAEESd.js → notes-BG5pIVAJ.js} +1 -1
  78. package/dist/assets/{perfProbe-ezVn1mOu.js → perfProbe-DaLsQQBb.js} +1 -1
  79. package/dist/assets/{pin-BPGVDgnq.js → pin-BcKMUOiV.js} +1 -1
  80. package/dist/assets/{portal-B9DmFo6J.js → portal-BIN_aqvw.js} +1 -1
  81. package/dist/assets/{prewarm-BgUqAJbF.js → prewarm-CyvSJKv4.js} +1 -1
  82. package/dist/assets/{quietHours-DyynzDyC.js → quietHours-D1nboK5q.js} +1 -1
  83. package/dist/assets/{registry-BlujNlQJ.js → registry-BFQQpjO2.js} +1 -1
  84. package/dist/assets/{registry-D06LKiUk.js → registry-C8FuGbOr.js} +1 -1
  85. package/dist/assets/{registry-CEV5h2cu.css → registry-CIcGBgtK.css} +1 -1
  86. package/dist/assets/{registry-BJEvFgoL.js → registry-CcHxIYQN.js} +1 -1
  87. package/dist/assets/{registry-BT6ydF33.js → registry-DPBJYRmC.js} +1 -1
  88. package/dist/assets/registry-DdVZGvkL.js +48 -0
  89. package/dist/assets/{registry-7tKTrzeZ.js → registry-DdgeK4fY.js} +1 -1
  90. package/dist/assets/{registry-Bl7zAWKt.js → registry-Dt0wu9rC.js} +1 -1
  91. package/dist/assets/{relate-aQFFr11O.js → relate-CqYpFpsO.js} +1 -1
  92. package/dist/assets/{replay-CalqEgdW.js → replay-NognvQfM.js} +1 -1
  93. package/dist/assets/{select-wEtBn9U6.js → select-Dp-OeZfq.js} +1 -1
  94. package/dist/assets/shard054-CNzJxw2V.js +1 -0
  95. package/dist/assets/{useDashboardLoop-ifcuVRo-.js → useDashboardLoop-C3iCNS8X.js} +3 -3
  96. package/dist/assets/{useStudy-CySgE3Cx.js → useStudy-CwCIyiTb.js} +1 -1
  97. package/dist/assets/{walkSync-DBne70gg.js → walkSync-DC9iE0BX.js} +1 -1
  98. package/dist/index.html +1 -1
  99. package/package.json +1 -1
  100. package/dist/assets/ConversationVideoStudio-DMIPUCcq.js +0 -1
  101. package/dist/assets/DashboardLoopRuntime-Dsy9u1wa.js +0 -1
  102. package/dist/assets/canvas-C3O7MEA3.js +0 -1
  103. package/dist/assets/registry-KRYoVMCh.js +0 -48
  104. package/dist/assets/shard054-BoC-LNYu.js +0 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,32 @@ All notable changes to Mavéa are documented here. The format is based on
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.0.1] - 2026-08-18
10
+
11
+ ### Fixed
12
+
13
+ - **A downloaded conversation video no longer ends inside a spotlight.** The closing beat hands
14
+ the canvas back and plays wide, carved out of the last scene so the cut still ends exactly
15
+ where the narration does; the closing caption and Pen marks stay.
16
+ - **A map now names its places.** Each pin's name and detail line render in a numbered list
17
+ beside the map — numbered to the circles themselves — instead of living only in a click-away
18
+ popup. The list survives a map that fails to load, the same way a route keeps its stops.
19
+ - **First run: the speech questions come before the browser opens.** The window used to open
20
+ over the terminal mid-prompt, so the voice and transcription setup was easy to never see and
21
+ the first impression was silently captions-only. `npx @mavea/mavea` now asks first, then opens.
22
+ - **`npx @mavea/mavea` no longer reports a running voice as missing.** The reachability probe
23
+ hit the service roots, and Kokoro's root answers 404 — so every start offered to set up
24
+ speech services that were already up. It probes the health endpoints now.
25
+ - **Repeat starts stop rebuilding speech images the machine already has.** Compose builds only a
26
+ missing image now (the whisper tag carries its version, so a version bump still builds), on
27
+ Docker and Podman alike.
28
+
29
+ ### Changed
30
+
31
+ - The README and setup guide say plainly what is free and what is metered: the model call is
32
+ billed by the provider under your key; the app and both speech services run locally at no
33
+ per-use cost, and published transcripts or voiced videos owe no fee and no credit line.
34
+
9
35
  ## [2.0.0] - 2026-08-18
10
36
 
11
37
  ### Added
package/README.md CHANGED
@@ -41,7 +41,9 @@ than fetching a newer one, so asking for `latest` is what reliably gets you the
41
41
  Prefer a pinned local copy? `npm install -g @mavea/mavea`, then run `mavea`.
42
42
 
43
43
  **To talk to a real model (Live):** click **"Open Mavéa"** and paste an Anthropic / OpenAI /
44
- Gemini / Grok / OpenRouter key. It stays in memory unless you opt into encrypted local
44
+ Gemini / Grok / OpenRouter key. Model usage is billed by that provider under your key, at its
45
+ rates — the model call is the part of a turn that costs money; the app and the speech services
46
+ run on your machine for free. The key stays in memory unless you opt into encrypted local
45
47
  remembering, and each provider request carries it through your same-origin proxy to that
46
48
  provider — your key and prompts never pass through Mavéa's own servers, because there aren't
47
49
  any. Full options — models, actions, hosting, and the trust boundary — are in
@@ -49,7 +51,9 @@ any. Full options — models, actions, hosting, and the trust boundary — are i
49
51
 
50
52
  **Local speech:** Mavéa speaks through Apache-2.0
51
53
  [Kokoro weights and wrapper](https://github.com/remsky/Kokoro-FastAPI) and transcribes through MIT-licensed
52
- [whisper.cpp](https://github.com/ggml-org/whisper.cpp). The defaults run on your machine through
54
+ [whisper.cpp](https://github.com/ggml-org/whisper.cpp). Both cost nothing per use, and what they
55
+ produce is yours: publishing a transcript, or a video spoken in Mavéa's voices, owes no fee and no
56
+ credit line — those licenses cover the software, not its output. The defaults run on your machine through
53
57
  loopback-only proxies; a deployment that overrides `WHISPER_URL` sends microphone audio to that
54
58
  configured endpoint. [Podman](https://podman.io/) is the recommended free/open-source
55
59
  container runtime. Docker also works, but Docker Desktop has separate commercial subscription
package/bin/mavea.mjs CHANGED
@@ -1075,11 +1075,24 @@ async function tuneVoiceWhenReady(kokoroUrl, ranAt) {
1075
1075
  }
1076
1076
  }
1077
1077
 
1078
+ /**
1079
+ * The compose invocation that starts speech, for whichever runtime is present — Docker, Podman and
1080
+ * podman-compose all take the same verbs, so the caching behaviour below is identical on each.
1081
+ *
1082
+ * `--build` is deliberately absent. It forces a build pass on EVERY run, which re-resolves the
1083
+ * whisper image on a machine that already has it; without it compose builds only when the image is
1084
+ * missing and reuses what is already there. That is safe because the tag carries the version
1085
+ * (`mavea-whisper-cpp:1.9.1` in docker-compose.yml), so a version bump is a new tag and does build,
1086
+ * while a repeat run on the same version costs nothing. Kokoro is pinned by digest and compose's
1087
+ * default `--pull missing` never re-pulls a digest it already holds.
1088
+ */
1089
+ export function composeUpArgs(runtime, composeFile = COMPOSE_FILE) {
1090
+ return [...runtime.prefix, '-f', composeFile, 'up', '-d'];
1091
+ }
1092
+
1078
1093
  function startSpeechServices(runtime, threads) {
1079
- console.log(
1080
- ' Starting Kokoro TTS + whisper.cpp STT. The first run builds/downloads pinned models…',
1081
- );
1082
- spawn(runtime.command, [...runtime.prefix, '-f', COMPOSE_FILE, 'up', '-d', '--build'], {
1094
+ console.log(' Starting Kokoro TTS + whisper.cpp STT. The first run downloads pinned models…');
1095
+ spawn(runtime.command, composeUpArgs(runtime), {
1083
1096
  stdio: 'inherit',
1084
1097
  env: voiceThreadEnv(threads),
1085
1098
  });
@@ -1100,12 +1113,19 @@ const VOICE_INTRO =
1100
1113
  '\n◌ Configured speech — Kokoro reads replies and whisper.cpp transcribes your mic.\n' +
1101
1114
  ' The defaults are loopback-only. A custom WHISPER_URL receives microphone audio at that endpoint.\n';
1102
1115
 
1116
+ /** A speech service's health endpoint. Probed instead of the root because the roots differ —
1117
+ * Kokoro's answers 404 (FastAPI routes /health, not /) — so a root probe reported a running
1118
+ * voice as missing on every start and offered to set up services that were already up. */
1119
+ export function speechHealthUrl(base) {
1120
+ return base.replace(/\/+$/, '') + '/health';
1121
+ }
1122
+
1103
1123
  async function maybeOfferVoice() {
1104
1124
  const kokoroUrl = process.env.KOKORO_URL || 'http://localhost:8880';
1105
1125
  const whisperUrl = process.env.WHISPER_URL || 'http://localhost:8100';
1106
1126
  const [kokoroReady, whisperReady] = await Promise.all([
1107
- serviceReachable(kokoroUrl),
1108
- serviceReachable(whisperUrl),
1127
+ serviceReachable(speechHealthUrl(kokoroUrl)),
1128
+ serviceReachable(speechHealthUrl(whisperUrl)),
1109
1129
  ]);
1110
1130
  if (kokoroReady && whisperReady) return;
1111
1131
  if (!existsSync(COMPOSE_FILE) || !process.stdin.isTTY) {
@@ -1164,6 +1184,19 @@ async function maybeOfferVoice() {
1164
1184
  if (tuned === null && !kokoroReady) void tuneVoiceWhenReady(kokoroUrl, startedAt);
1165
1185
  }
1166
1186
 
1187
+ /**
1188
+ * Speech is settled BEFORE the browser opens, and the order is the whole point: the setup questions
1189
+ * live in this terminal, so a window opening over them is how a first run ends up permanently
1190
+ * without voice or transcription — the reader never sees the prompt, the answer falls to a default
1191
+ * nobody chose, and the experience they judge Mavéa on is the degraded one. Nothing here waits on
1192
+ * containers (the compose spawn is detached), so the cost is one reachability probe plus however
1193
+ * long the answers take.
1194
+ */
1195
+ export async function settleStartup(args, { offerVoice, openApp }) {
1196
+ if (args.voice) await offerVoice();
1197
+ if (args.open) openApp();
1198
+ }
1199
+
1167
1200
  async function main() {
1168
1201
  let args;
1169
1202
  try {
@@ -1228,8 +1261,7 @@ Podman is the recommended free/open-source container runtime. Docker Desktop has
1228
1261
  console.log(`Terms: ${base}/legal/TERMS.md`);
1229
1262
  console.log(`Privacy: ${base}/legal/PRIVACY.md`);
1230
1263
  console.log(`License: ${base}/legal/LICENSE.txt (PolyForm Noncommercial 1.0.0)`);
1231
- if (args.open) openBrowser(base);
1232
- if (args.voice) await maybeOfferVoice();
1264
+ await settleStartup(args, { offerVoice: maybeOfferVoice, openApp: () => openBrowser(base) });
1233
1265
  }
1234
1266
 
1235
1267
  // npm/npx installs `bin` entries as a symlink (node_modules/.bin/mavea -> ../@mavea/mavea/bin/