@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.
- package/CHANGELOG.md +26 -0
- package/README.md +6 -2
- package/bin/mavea.mjs +40 -8
- package/dist/.vite/manifest.json +393 -393
- package/dist/assets/{AnnotationLayer-Cccb12ps.js → AnnotationLayer-BsAcAd59.js} +0 -0
- package/dist/assets/{AppCommandPalette-DdOPNZ0e.js → AppCommandPalette-Cucwjk5N.js} +1 -1
- package/dist/assets/{CheckLogRail-BibJTid0.js → CheckLogRail-vq2lZ7a5.js} +1 -1
- package/dist/assets/ConversationVideoStudio-Df892wqs.js +1 -0
- package/dist/assets/{CourseLessonReader-D29Kix4f.js → CourseLessonReader-DKQimh2S.js} +2 -2
- package/dist/assets/{CoursesApp-DcDsS_ZS.js → CoursesApp-LeqL6dWT.js} +1 -1
- package/dist/assets/{DashPresent-BDWgO9am.js → DashPresent-DZcRdu6R.js} +1 -1
- package/dist/assets/{DashboardDetail-BrnAdWfy.js → DashboardDetail-2XL-J4rS.js} +2 -2
- package/dist/assets/{DashboardLoopGate-NxMcQ4rD.js → DashboardLoopGate-B95S4oKR.js} +2 -2
- package/dist/assets/DashboardLoopRuntime-Wzk85QXi.js +1 -0
- package/dist/assets/{DashboardsApp-DxyMn3x_.js → DashboardsApp-ZGuT2QBi.js} +2 -2
- package/dist/assets/{DeepZoomApp-nNjqoyYE.js → DeepZoomApp-CPOsar8c.js} +1 -1
- package/dist/assets/{DelegatePanel-DN_ZL0j7.js → DelegatePanel-BkTtUMSl.js} +1 -1
- package/dist/assets/{DemoGallery-DrSlMsnu.js → DemoGallery-BcQ9yz2u.js} +1 -1
- package/dist/assets/{DropSelect-GwIXHA5o.js → DropSelect-GKioj__f.js} +1 -1
- package/dist/assets/{ExportModal-DBUjC71U.js → ExportModal-1pWr-c7I.js} +1 -1
- package/dist/assets/{ExtractionPreview-D4M6eXqb.js → ExtractionPreview-TKyfEqwM.js} +1 -1
- package/dist/assets/{FeatureUseNotice-Bda9jr3W.js → FeatureUseNotice-pQe4YHgJ.js} +1 -1
- package/dist/assets/{FlagshipCommandPalette-DAO849RC.js → FlagshipCommandPalette-D1pv3hfZ.js} +1 -1
- package/dist/assets/{FlagshipShowcase-g2x-1c70.js → FlagshipShowcase-CCFFcaL7.js} +1 -1
- package/dist/assets/{FlashcardsApp-BUKzCr65.js → FlashcardsApp-Dbe-8UkQ.js} +1 -1
- package/dist/assets/{GalleryApp-ot_A7ZF-.js → GalleryApp-CCLYcEqn.js} +1 -1
- package/dist/assets/{HonestByDesign-DgZFEpEx.js → HonestByDesign-ByOR1sRQ.js} +1 -1
- package/dist/assets/{HowItWorks-DPFpdeGE.js → HowItWorks-Dllc30ph.js} +1 -1
- package/dist/assets/{LegalApp-C56kWdmK.js → LegalApp-CpblxmmB.js} +1 -1
- package/dist/assets/{LegalMarkdownDocument-BBTHuW_M.js → LegalMarkdownDocument-CmxHsXlb.js} +1 -1
- package/dist/assets/{LegalPageShell-hMA-7JLf.js → LegalPageShell-CDD6D6T_.js} +1 -1
- package/dist/assets/{LibraryOverlay-DSUWcUe4.js → LibraryOverlay-CHmubwG3.js} +1 -1
- package/dist/assets/{LiveApp-B62EMybC.js → LiveApp-CSbjhgzM.js} +4 -4
- package/dist/assets/{LiveSettings-BITIaMoT.js → LiveSettings-B4T6x41n.js} +3 -3
- package/dist/assets/{MindMapViewerDrawer-CKdJtHno.js → MindMapViewerDrawer-BLRBWsTz.js} +1 -1
- package/dist/assets/{MindShape-B3lg_z4X.js → MindShape-CaDuLyGa.js} +1 -1
- package/dist/assets/{PinToDashboard-DpQjBLPa.js → PinToDashboard-ChK2Ou73.js} +1 -1
- package/dist/assets/{PlanReview-CrTbmMAd.js → PlanReview-Dg6VE0xF.js} +1 -1
- package/dist/assets/{PresentationDeck-CfYadu9V.js → PresentationDeck-oEd6TXdN.js} +1 -1
- package/dist/assets/{PrismApp-bRKK_3JA.js → PrismApp-Bju264hL.js} +2 -2
- package/dist/assets/{PrismBriefingPlayer-ChJj6hSS.js → PrismBriefingPlayer-BY0RREUu.js} +2 -2
- package/dist/assets/{PrismOverlay-Pp6ZKmTc.js → PrismOverlay-DOWyOUVW.js} +3 -3
- package/dist/assets/{PrismWorkbench-BCV7r4Oa.js → PrismWorkbench-9RonO2uv.js} +1 -1
- package/dist/assets/{PrivacyApp-A2Bu6LVd.js → PrivacyApp-CBPMqUEA.js} +1 -1
- package/dist/assets/{ReplayCard-B6NYiYzQ.js → ReplayCard-BnX73r9n.js} +2 -2
- package/dist/assets/{ReplayOverlay-BJKtJ-vc.js → ReplayOverlay-B-Ok0mEs.js} +1 -1
- package/dist/assets/{RippleApp-BXt7tenS.js → RippleApp-BnIUhIA0.js} +2 -2
- package/dist/assets/{RippleOverlay-BSxubBwj.js → RippleOverlay-C9W7uVOp.js} +2 -2
- package/dist/assets/{SeeDontRead-0He5hS2C.js → SeeDontRead-ByW9HnOj.js} +1 -1
- package/dist/assets/{ShareModal-xYdZWJxy.js → ShareModal-Mo-dkgAZ.js} +2 -2
- package/dist/assets/{ShipCourse-Dg6kCWyH.js → ShipCourse-CT_F9oJH.js} +1 -1
- package/dist/assets/{SignatureLoop-QPwB2oNN.js → SignatureLoop-DejFTZ-Y.js} +1 -1
- package/dist/assets/{SynthesisApp-DrCq6NDa.js → SynthesisApp-6W04mrMU.js} +2 -2
- package/dist/assets/{SynthesisOverlay-DCa-2Pz_.js → SynthesisOverlay-DDyFFiO8.js} +1 -1
- package/dist/assets/{TermsApp-zcPDYfuh.js → TermsApp-ZzlhrXhd.js} +1 -1
- package/dist/assets/{TopicCanvas-Bw4bMFpe.js → TopicCanvas-CkqP92SC.js} +2 -2
- package/dist/assets/{TourPrism-DbinDupp.js → TourPrism-Cng4h9Ly.js} +1 -1
- package/dist/assets/{TrackerTile-CrT9u1I4.js → TrackerTile-DuUsFQTj.js} +2 -2
- package/dist/assets/{TwoSurfaces-L0CDuyOZ.js → TwoSurfaces-BeYMvVuX.js} +1 -1
- package/dist/assets/{WorldOverlay-BcjqG1BR.js → WorldOverlay-DeVpS8HE.js} +1 -1
- package/dist/assets/{WowFeatures-CwBk4ZMO.js → WowFeatures-D58JgpLg.js} +1 -1
- package/dist/assets/{ZoomDeck-DlnesweX.js → ZoomDeck-CPG2XQhr.js} +1 -1
- package/dist/assets/{backup-685QrAjt.js → backup-CtEvuZoL.js} +1 -1
- package/dist/assets/canvas-Ct-O9Jok.js +1 -0
- package/dist/assets/{capture-DgJLQ_0-.js → capture-CgaD86-q.js} +1 -1
- package/dist/assets/{catalog-Db9GWM6N.js → catalog-DfIYAG3v.js} +1 -1
- package/dist/assets/{confirmAdd-CZ829Mbx.js → confirmAdd-CxWIORcu.js} +1 -1
- package/dist/assets/{dashboardEvents-CiayRLrH.js → dashboardEvents-D1OP4ARB.js} +1 -1
- package/dist/assets/{deepen-DAeHHFiI.js → deepen-BhP9OmH3.js} +1 -1
- package/dist/assets/{effort-jJe4iMIq.js → effort-Bqti44UZ.js} +1 -1
- package/dist/assets/{generateBeats-COflu5Zi.js → generateBeats-CtffeoEa.js} +1 -1
- package/dist/assets/{generateLive-DGwnpIip.js → generateLive-D5M8v38b.js} +1 -1
- package/dist/assets/{index-LiHcEJt_.js → index-CdUH6Eo9.js} +3 -3
- package/dist/assets/{kokoro-DXRj0KQX.js → kokoro-D15HDMcP.js} +1 -1
- package/dist/assets/{liveSchema-DyfND6P2.js → liveSchema-B8Y9HZxd.js} +1 -1
- package/dist/assets/{loader-DgMLGfAC.js → loader-ChcXMM9W.js} +2 -2
- package/dist/assets/{notes-DzIAEESd.js → notes-BG5pIVAJ.js} +1 -1
- package/dist/assets/{perfProbe-ezVn1mOu.js → perfProbe-DaLsQQBb.js} +1 -1
- package/dist/assets/{pin-BPGVDgnq.js → pin-BcKMUOiV.js} +1 -1
- package/dist/assets/{portal-B9DmFo6J.js → portal-BIN_aqvw.js} +1 -1
- package/dist/assets/{prewarm-BgUqAJbF.js → prewarm-CyvSJKv4.js} +1 -1
- package/dist/assets/{quietHours-DyynzDyC.js → quietHours-D1nboK5q.js} +1 -1
- package/dist/assets/{registry-BlujNlQJ.js → registry-BFQQpjO2.js} +1 -1
- package/dist/assets/{registry-D06LKiUk.js → registry-C8FuGbOr.js} +1 -1
- package/dist/assets/{registry-CEV5h2cu.css → registry-CIcGBgtK.css} +1 -1
- package/dist/assets/{registry-BJEvFgoL.js → registry-CcHxIYQN.js} +1 -1
- package/dist/assets/{registry-BT6ydF33.js → registry-DPBJYRmC.js} +1 -1
- package/dist/assets/registry-DdVZGvkL.js +48 -0
- package/dist/assets/{registry-7tKTrzeZ.js → registry-DdgeK4fY.js} +1 -1
- package/dist/assets/{registry-Bl7zAWKt.js → registry-Dt0wu9rC.js} +1 -1
- package/dist/assets/{relate-aQFFr11O.js → relate-CqYpFpsO.js} +1 -1
- package/dist/assets/{replay-CalqEgdW.js → replay-NognvQfM.js} +1 -1
- package/dist/assets/{select-wEtBn9U6.js → select-Dp-OeZfq.js} +1 -1
- package/dist/assets/shard054-CNzJxw2V.js +1 -0
- package/dist/assets/{useDashboardLoop-ifcuVRo-.js → useDashboardLoop-C3iCNS8X.js} +3 -3
- package/dist/assets/{useStudy-CySgE3Cx.js → useStudy-CwCIyiTb.js} +1 -1
- package/dist/assets/{walkSync-DBne70gg.js → walkSync-DC9iE0BX.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/ConversationVideoStudio-DMIPUCcq.js +0 -1
- package/dist/assets/DashboardLoopRuntime-Dsy9u1wa.js +0 -1
- package/dist/assets/canvas-C3O7MEA3.js +0 -1
- package/dist/assets/registry-KRYoVMCh.js +0 -48
- 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.
|
|
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).
|
|
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
|
-
|
|
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
|
-
|
|
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/
|