agentvibes 5.11.1 → 5.11.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "agentvibes",
4
- "version": "5.11.1",
4
+ "version": "5.11.2-beta.0",
5
5
  "description": "Now your AI Agents can finally talk back! Professional TTS voice for Claude Code, Claude Desktop (via MCP), and Clawdbot with multi-provider support.",
6
6
  "homepage": "https://agentvibes.org",
7
7
  "keywords": [
@@ -3009,7 +3009,21 @@ export function createSetupTab(screen, services) {
3009
3009
  iMod.key(['escape'], cancelInstall);
3010
3010
  screen.render();
3011
3011
 
3012
- _installProc = spawn(_pythonCmd, ['-m', 'pip', 'install', '--progress-bar', 'on', ...pkg.split(/\s+/)], { // NOSONAR
3012
+ // PEP 668: modern Ubuntu/Debian mark the system Python "externally
3013
+ // managed", so a bare `pip install` fails with
3014
+ // "error: externally-managed-environment" — which is exactly why the
3015
+ // Kokoro deps never install on a fresh server. Detect the marker and add
3016
+ // --break-system-packages so the install actually proceeds. (The marker
3017
+ // only exists on pip ≥ 23.0, which is also where the flag exists.)
3018
+ let _pep668Args = [];
3019
+ try {
3020
+ const _chk = spawnSync(_pythonCmd, ['-c', // NOSONAR
3021
+ "import sysconfig,os;print('1' if os.path.exists(os.path.join(sysconfig.get_path('stdlib'),'EXTERNALLY-MANAGED')) else '0')"],
3022
+ { encoding: 'utf8', timeout: 4000 });
3023
+ if ((_chk.stdout || '').trim() === '1') _pep668Args = ['--break-system-packages'];
3024
+ } catch { /* fall back to a plain install */ }
3025
+
3026
+ _installProc = spawn(_pythonCmd, ['-m', 'pip', 'install', '--progress-bar', 'on', ..._pep668Args, ...pkg.split(/\s+/)], { // NOSONAR
3013
3027
  stdio: ['ignore', 'pipe', 'pipe'],
3014
3028
  });
3015
3029
 
@@ -3075,9 +3089,11 @@ export function createSetupTab(screen, services) {
3075
3089
  const allOut = _pipBuf + _pipErrBuf;
3076
3090
  const needsDev = /Python\.h|python3-dev/i.test(allOut);
3077
3091
  const needsCmake = /cmake not found|cmake.*required/i.test(allOut);
3092
+ const extManaged = /externally-managed-environment/i.test(allOut);
3078
3093
  let hint;
3079
3094
  if (needsDev) hint = ` {yellow-fg}Fix:{/yellow-fg} {cyan-fg}sudo apt install python3-dev build-essential{/cyan-fg}`;
3080
3095
  else if (needsCmake) hint = ` {yellow-fg}Fix:{/yellow-fg} {cyan-fg}sudo apt install cmake{/cyan-fg}`;
3096
+ else if (extManaged) hint = ` {yellow-fg}Fix:{/yellow-fg} {cyan-fg}${_pythonCmd} -m pip install --break-system-packages ${pkg}{/cyan-fg}`;
3081
3097
  else hint = ` {#9e9e9e-fg}Run {/#9e9e9e-fg}{cyan-fg}pip install ${pkg}{/cyan-fg}{#9e9e9e-fg} in a terminal to see the error.{/#9e9e9e-fg}`;
3082
3098
  iMod.setLabel(` {red-fg}✗ Install Failed{/red-fg} `);
3083
3099
  iMod.style.border.fg = 'red';
@@ -3487,6 +3503,16 @@ export function createSetupTab(screen, services) {
3487
3503
  let _dlAllProc = null;
3488
3504
  kPicker.key(['d', 'D'], () => {
3489
3505
  if (_kPreviewProc || _dlAllActive) return;
3506
+ // Without the kokoro package every "download" (a synthesis that pulls the
3507
+ // .pt file) fails, so prompt to install the engine first instead of
3508
+ // grinding through the whole list and falsely reporting success.
3509
+ if (!_kokoroInstalled) {
3510
+ _promptInstallPkg('kokoro soundfile numpy', 'Kokoro TTS engine', voices[kPicker.selected] ?? voices[0], () => {
3511
+ _kokoroInstalled = true;
3512
+ voices.forEach((v, i) => kPicker.setItem(i, _kokoroItem(v)));
3513
+ });
3514
+ return;
3515
+ }
3490
3516
  const toDownload = voices.filter(v => !cached.has(v));
3491
3517
  if (!toDownload.length) {
3492
3518
  kBox.setLabel(` {green-fg}✓ All ${voices.length} voices already cached{/green-fg} `);
@@ -3503,8 +3529,15 @@ export function createSetupTab(screen, services) {
3503
3529
  _dlAllProc = null;
3504
3530
  if (!_kClosed) {
3505
3531
  const total = voices.filter(v => cached.has(v)).length;
3506
- kBox.setLabel(` {green-fg}✓ Download complete ${total}/${voices.length} cached{/green-fg} `);
3507
- setTimeout(() => { if (!_kClosed) { kBox.setLabel(IDLE_LABEL); screen.render(); } }, 3000);
3532
+ const got = toDownload.filter(v => cached.has(v)).length;
3533
+ // Only claim success if voices actually cached. If nothing downloaded
3534
+ // (e.g. kokoro/misaki missing), say so instead of a false green ✓.
3535
+ if (got > 0) {
3536
+ kBox.setLabel(` {green-fg}✓ Download complete — ${total}/${voices.length} cached{/green-fg} `);
3537
+ } else {
3538
+ kBox.setLabel(` {yellow-fg}⚠ Nothing downloaded — install deps: ${_pythonCmd} -m pip install --break-system-packages kokoro soundfile{/yellow-fg} `);
3539
+ }
3540
+ setTimeout(() => { if (!_kClosed) { kBox.setLabel(IDLE_LABEL); screen.render(); } }, got > 0 ? 3000 : 6000);
3508
3541
  screen.render();
3509
3542
  }
3510
3543
  return;