agentvibes 5.1.3 → 5.2.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/.agentvibes/config.json +23 -13
- package/.claude/commands/agent-vibes/verbosity.md +98 -89
- package/.claude/config/audio-effects.cfg +6 -1
- package/.claude/hooks/bmad-speak.sh +2 -2
- package/.claude/hooks/piper-download-voices.sh +233 -225
- package/.claude/hooks/piper-installer.sh +1 -1
- package/.claude/hooks/piper-voice-manager.sh +125 -0
- package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +97 -90
- package/.claude/hooks/play-tts-enhanced.sh +1 -1
- package/.claude/hooks/play-tts-piper.sh +16 -5
- package/.claude/hooks/play-tts-ssh-remote.sh +168 -167
- package/.claude/hooks/play-tts.sh +31 -9
- package/.claude/hooks/session-start-tts.sh +4 -1
- package/.claude/hooks/stop-tts.sh +1 -1
- package/.claude/hooks/verbosity-manager.sh +185 -178
- package/.claude/hooks-windows/download-extra-voices.ps1 +243 -185
- package/.claude/hooks-windows/play-tts-piper.ps1 +7 -2
- package/.claude/hooks-windows/play-tts.ps1 +219 -65
- package/.claude/hooks-windows/session-start-tts.ps1 +2 -1
- package/.claude/hooks-windows/verbosity-manager.ps1 +126 -119
- package/README.md +24 -1
- package/RELEASE_NOTES.md +113 -0
- package/bin/agentvibes-voice-browser.js +1939 -1840
- package/mcp-server/server.py +75 -25
- package/package.json +1 -1
- package/src/console/tabs/receiver-tab.js +1527 -1483
- package/src/console/tabs/settings-tab.js +2 -2
- package/src/console/tabs/setup-tab.js +122 -20
- package/src/console/tabs/voices-tab.js +130 -13
- package/src/i18n/en.js +202 -202
- package/src/installer.js +29 -25
- package/src/services/llm-provider-service.js +114 -11
- package/src/services/verbosity-service.js +159 -157
- package/templates/agentvibes-receiver.sh +3 -2
|
@@ -1,119 +1,126 @@
|
|
|
1
|
-
#
|
|
2
|
-
# File: .claude/hooks-windows/verbosity-manager.ps1
|
|
3
|
-
#
|
|
4
|
-
# AgentVibes - Finally, your AI Agents can Talk Back!
|
|
5
|
-
# Website: https://agentvibes.org
|
|
6
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
7
|
-
# Licensed under the Apache License, Version 2.0
|
|
8
|
-
|
|
9
|
-
param(
|
|
10
|
-
[Parameter(Position=0)]
|
|
11
|
-
[string]$Command = "info",
|
|
12
|
-
[Parameter(Position=1)]
|
|
13
|
-
[string]$Arg1 = ""
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
17
|
-
$ClaudeDir = Split-Path -Parent $ScriptDir
|
|
18
|
-
|
|
19
|
-
# Respect CLAUDE_PROJECT_DIR when set by MCP
|
|
20
|
-
if ($env:CLAUDE_PROJECT_DIR) {
|
|
21
|
-
$ConfigClaudeDir = Join-Path $env:CLAUDE_PROJECT_DIR ".claude"
|
|
22
|
-
} else {
|
|
23
|
-
$ConfigClaudeDir = $ClaudeDir
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
$VerbosityFile = Join-Path $ConfigClaudeDir "tts-verbosity.txt"
|
|
27
|
-
$GlobalVerbosityFile = Join-Path $env:USERPROFILE ".claude\tts-verbosity.txt"
|
|
28
|
-
|
|
29
|
-
function Get-Verbosity {
|
|
30
|
-
if (Test-Path $VerbosityFile) {
|
|
31
|
-
return (Get-Content $VerbosityFile -Raw).Trim()
|
|
32
|
-
}
|
|
33
|
-
if (Test-Path $GlobalVerbosityFile) {
|
|
34
|
-
return (Get-Content $GlobalVerbosityFile -Raw).Trim()
|
|
35
|
-
}
|
|
36
|
-
return "high"
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function Set-Verbosity {
|
|
40
|
-
param([string]$Level)
|
|
41
|
-
|
|
42
|
-
if ($Level -notmatch '^(low|medium|high)$') {
|
|
43
|
-
Write-Output "Invalid verbosity level: $Level"
|
|
44
|
-
Write-Output "Valid options: low, medium, high"
|
|
45
|
-
exit 1
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (Test-Path $ConfigClaudeDir) {
|
|
49
|
-
Set-Content -Path $VerbosityFile -Value $Level -NoNewline
|
|
50
|
-
Write-Output "Verbosity set to: $Level (project-local)"
|
|
51
|
-
} else {
|
|
52
|
-
$globalDir = Split-Path -Parent $GlobalVerbosityFile
|
|
53
|
-
if (-not (Test-Path $globalDir)) { New-Item -ItemType Directory -Path $globalDir -Force | Out-Null }
|
|
54
|
-
Set-Content -Path $GlobalVerbosityFile -Value $Level -NoNewline
|
|
55
|
-
Write-Output "Verbosity set to: $Level (global)"
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
Write-Output ""
|
|
59
|
-
Write-Output "Verbosity levels:"
|
|
60
|
-
Write-Output " LOW: Acknowledgments + Completions only"
|
|
61
|
-
Write-Output " MEDIUM: + Major decisions and findings"
|
|
62
|
-
Write-Output " HIGH: All reasoning (maximum transparency)"
|
|
63
|
-
Write-Output ""
|
|
64
|
-
Write-Output "
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
Write-Output "
|
|
72
|
-
Write-Output "
|
|
73
|
-
Write-Output ""
|
|
74
|
-
Write-Output "
|
|
75
|
-
Write-Output ""
|
|
76
|
-
Write-Output "
|
|
77
|
-
Write-Output "
|
|
78
|
-
Write-Output "
|
|
79
|
-
Write-Output "
|
|
80
|
-
Write-Output ""
|
|
81
|
-
Write-Output "
|
|
82
|
-
Write-Output "
|
|
83
|
-
Write-Output "
|
|
84
|
-
Write-Output "
|
|
85
|
-
Write-Output "
|
|
86
|
-
Write-Output ""
|
|
87
|
-
Write-Output "
|
|
88
|
-
Write-Output "
|
|
89
|
-
Write-Output "
|
|
90
|
-
Write-Output " All
|
|
91
|
-
Write-Output " All
|
|
92
|
-
Write-Output "
|
|
93
|
-
Write-Output ""
|
|
94
|
-
Write-Output "
|
|
95
|
-
Write-Output "
|
|
96
|
-
Write-Output "
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
"
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"set"
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
1
|
+
#
|
|
2
|
+
# File: .claude/hooks-windows/verbosity-manager.ps1
|
|
3
|
+
#
|
|
4
|
+
# AgentVibes - Finally, your AI Agents can Talk Back!
|
|
5
|
+
# Website: https://agentvibes.org
|
|
6
|
+
# Copyright (c) 2025 Paul Preibisch
|
|
7
|
+
# Licensed under the Apache License, Version 2.0
|
|
8
|
+
|
|
9
|
+
param(
|
|
10
|
+
[Parameter(Position=0)]
|
|
11
|
+
[string]$Command = "info",
|
|
12
|
+
[Parameter(Position=1)]
|
|
13
|
+
[string]$Arg1 = ""
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
17
|
+
$ClaudeDir = Split-Path -Parent $ScriptDir
|
|
18
|
+
|
|
19
|
+
# Respect CLAUDE_PROJECT_DIR when set by MCP
|
|
20
|
+
if ($env:CLAUDE_PROJECT_DIR) {
|
|
21
|
+
$ConfigClaudeDir = Join-Path $env:CLAUDE_PROJECT_DIR ".claude"
|
|
22
|
+
} else {
|
|
23
|
+
$ConfigClaudeDir = $ClaudeDir
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
$VerbosityFile = Join-Path $ConfigClaudeDir "tts-verbosity.txt"
|
|
27
|
+
$GlobalVerbosityFile = Join-Path $env:USERPROFILE ".claude\tts-verbosity.txt"
|
|
28
|
+
|
|
29
|
+
function Get-Verbosity {
|
|
30
|
+
if (Test-Path $VerbosityFile) {
|
|
31
|
+
return (Get-Content $VerbosityFile -Raw).Trim()
|
|
32
|
+
}
|
|
33
|
+
if (Test-Path $GlobalVerbosityFile) {
|
|
34
|
+
return (Get-Content $GlobalVerbosityFile -Raw).Trim()
|
|
35
|
+
}
|
|
36
|
+
return "high"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function Set-Verbosity {
|
|
40
|
+
param([string]$Level)
|
|
41
|
+
|
|
42
|
+
if ($Level -notmatch '^(low|medium|high|caveman)$') {
|
|
43
|
+
Write-Output "Invalid verbosity level: $Level"
|
|
44
|
+
Write-Output "Valid options: low, medium, high, caveman"
|
|
45
|
+
exit 1
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (Test-Path $ConfigClaudeDir) {
|
|
49
|
+
Set-Content -Path $VerbosityFile -Value $Level -NoNewline
|
|
50
|
+
Write-Output "Verbosity set to: $Level (project-local)"
|
|
51
|
+
} else {
|
|
52
|
+
$globalDir = Split-Path -Parent $GlobalVerbosityFile
|
|
53
|
+
if (-not (Test-Path $globalDir)) { New-Item -ItemType Directory -Path $globalDir -Force | Out-Null }
|
|
54
|
+
Set-Content -Path $GlobalVerbosityFile -Value $Level -NoNewline
|
|
55
|
+
Write-Output "Verbosity set to: $Level (global)"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Write-Output ""
|
|
59
|
+
Write-Output "Verbosity levels:"
|
|
60
|
+
Write-Output " LOW: Acknowledgments + Completions only"
|
|
61
|
+
Write-Output " MEDIUM: + Major decisions and findings"
|
|
62
|
+
Write-Output " HIGH: All reasoning (maximum transparency)"
|
|
63
|
+
Write-Output " CAVEMAN: Ultra-terse fragments, max token savings"
|
|
64
|
+
Write-Output ""
|
|
65
|
+
Write-Output "Restart Claude Code for changes to take effect"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function Show-Info {
|
|
69
|
+
$currentLevel = Get-Verbosity
|
|
70
|
+
|
|
71
|
+
Write-Output "AgentVibes Verbosity Control"
|
|
72
|
+
Write-Output "------------------------------------"
|
|
73
|
+
Write-Output "Current level: $currentLevel"
|
|
74
|
+
Write-Output ""
|
|
75
|
+
Write-Output "Available levels:"
|
|
76
|
+
Write-Output ""
|
|
77
|
+
Write-Output "LOW (Minimal)"
|
|
78
|
+
Write-Output " Acknowledgments only"
|
|
79
|
+
Write-Output " Completions only"
|
|
80
|
+
Write-Output " No reasoning spoken"
|
|
81
|
+
Write-Output ""
|
|
82
|
+
Write-Output "MEDIUM (Balanced)"
|
|
83
|
+
Write-Output " Acknowledgments"
|
|
84
|
+
Write-Output " Major decisions"
|
|
85
|
+
Write-Output " Key findings"
|
|
86
|
+
Write-Output " Completions"
|
|
87
|
+
Write-Output ""
|
|
88
|
+
Write-Output "HIGH (Maximum Transparency)"
|
|
89
|
+
Write-Output " Acknowledgments"
|
|
90
|
+
Write-Output " All reasoning"
|
|
91
|
+
Write-Output " All decisions"
|
|
92
|
+
Write-Output " All findings"
|
|
93
|
+
Write-Output " Completions"
|
|
94
|
+
Write-Output ""
|
|
95
|
+
Write-Output "CAVEMAN (Ultra-Terse)"
|
|
96
|
+
Write-Output " Fragments only, no filler"
|
|
97
|
+
Write-Output " 65-75% fewer output tokens"
|
|
98
|
+
Write-Output " Abbreviations (DB/auth/config/fn/impl)"
|
|
99
|
+
Write-Output " Arrows instead of prose (X -> Y)"
|
|
100
|
+
Write-Output ""
|
|
101
|
+
Write-Output "Usage:"
|
|
102
|
+
Write-Output " verbosity-manager.ps1 get Show current level"
|
|
103
|
+
Write-Output " verbosity-manager.ps1 set low|medium|high|caveman Change level"
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
switch ($Command) {
|
|
107
|
+
"get" {
|
|
108
|
+
Write-Output (Get-Verbosity)
|
|
109
|
+
}
|
|
110
|
+
"set" {
|
|
111
|
+
if (-not $Arg1) {
|
|
112
|
+
Write-Output "Error: Missing verbosity level"
|
|
113
|
+
Write-Output "Usage: verbosity-manager.ps1 set low|medium|high|caveman"
|
|
114
|
+
exit 1
|
|
115
|
+
}
|
|
116
|
+
Set-Verbosity $Arg1
|
|
117
|
+
}
|
|
118
|
+
{ $_ -in "info", "" } {
|
|
119
|
+
Show-Info
|
|
120
|
+
}
|
|
121
|
+
default {
|
|
122
|
+
Write-Output "Unknown command: $Command"
|
|
123
|
+
Write-Output "Usage: verbosity-manager.ps1 {get|set|info} [level]"
|
|
124
|
+
exit 1
|
|
125
|
+
}
|
|
126
|
+
}
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.
|
|
14
|
+
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.2.0
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
@@ -43,6 +43,29 @@ Whether you're using Claude Code, GitHub Copilot, OpenAI Codex, Claude Desktop,
|
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|
|
46
|
+
## 🎯 NEW IN v5.2.0 — Remote Voice Preview + Caveman Mode + Voice Ratings
|
|
47
|
+
|
|
48
|
+
- **Caveman verbosity mode** — Ultra-terse TTS fragments. Set via `/agent-vibes:verbosity caveman`.
|
|
49
|
+
- **👍/👎 voice ratings** — Press `+` to thumbs up, `-` to thumbs down in any voice list. Replaces star favorites.
|
|
50
|
+
- **Remote voice preview** — TUI voice preview works on headless servers via SSH receiver. No local audio needed.
|
|
51
|
+
- **SSH receiver routing** — `ssh-remote` and `agentvibes-receiver` are now first-class providers.
|
|
52
|
+
- **Voice validation hardened** — Multi-speaker `::` format, cross-platform base64, no backslash injection.
|
|
53
|
+
|
|
54
|
+
## 🛡️ v5.1.4 — TTS Resilience Overhaul + Default LLM Provider
|
|
55
|
+
|
|
56
|
+
- **Default LLM provider** — New fallback entry at the bottom of Setup → Providers. Config-only; opens the standard Configure modal. Used when a tool calls TTS without identifying its LLM.
|
|
57
|
+
- **Per-LLM background music auto-enables** — Setting a bg track on the per-LLM Configure modal actually plays it now (no need to also toggle global bg music).
|
|
58
|
+
- **Copilot CLI support** — `installCopilotMcp` now writes both `.vscode/mcp.json` (Copilot Chat) AND `~/.copilot/mcp-config.json` (Copilot CLI — different product, different config path).
|
|
59
|
+
- **Per-client routing architecture** — `.mcp.json` no longer sets `AGENTVIBES_LLM`. Claude Code is auto-detected via `CLAUDECODE=1` env var. Copilot CLI reads its own global config. No more client config conflicts.
|
|
60
|
+
- **Self-healing TTS mutex** — When a stuck `play-tts.ps1` process blocks the playback queue, the next caller auto-kills it (no manual `taskkill` needed). 25-second watchdog guarantees forward progress.
|
|
61
|
+
- **No more stale audio replay** — `play-tts.ps1` captures the exact synth output filename from provider stdout instead of guessing "most recent `tts-*.wav`". Silent replay of old audio is gone.
|
|
62
|
+
- **Per-LLM voice wins over explicit `VoiceOverride`** — LLMs echo back `get_config` results on every call, which was overriding per-LLM routing. Fixed.
|
|
63
|
+
- **`lessac-medium` → `lessac-high`** default for codex — Silent synthesis failure workaround.
|
|
64
|
+
- **Scratch file rename + ASCII-only encoding** — Eliminates accumulating compound audio files and CP1252 parse errors on Windows.
|
|
65
|
+
- **Setup → Install confirmation** now advances focus to the next provider row (Install → Install → Install flow).
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
46
69
|
## 🛡️ v5.1.3 — Hardening Pass (Adversarial Review Followup)
|
|
47
70
|
|
|
48
71
|
- **Existing `.mcp.json` is now auto-migrated** — v5.1.2's installer detected an existing `.mcp.json` and printed instructions instead of fixing it, leaving v5.1.0/v5.1.1 users still broken after upgrade. v5.1.3 merges the `AGENTVIBES_LLM` env var into existing configs in-place.
|
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,5 +1,118 @@
|
|
|
1
1
|
# AgentVibes Release Notes
|
|
2
2
|
|
|
3
|
+
## 🎯 v5.2.0 — Remote Voice Preview + Caveman Mode + Voice Ratings
|
|
4
|
+
|
|
5
|
+
**Release Date:** April 2026
|
|
6
|
+
|
|
7
|
+
This release adds remote TTS preview support, a new ultra-terse verbosity mode, and thumbs up/down voice ratings across the TUI.
|
|
8
|
+
|
|
9
|
+
### New Features
|
|
10
|
+
|
|
11
|
+
- **Caveman verbosity mode** — New `caveman` verbosity level for ultra-terse TTS output. Fragments instead of sentences. Set via `/agent-vibes:verbosity caveman` or the MCP `set_verbosity` tool. Auto-downloads a voice on fresh install if none are present.
|
|
12
|
+
|
|
13
|
+
- **Thumbs up/down voice ratings** — Replace the old star favorites with 👍/👎 ratings. Press `+` to thumbs up, `-` to thumbs down in both the Voices tab and the voice picker (Setup tab). Ratings persist across sessions and are shared between all voice selection UIs.
|
|
14
|
+
|
|
15
|
+
- **Remote voice preview** — Voice preview in the TUI Voices tab, voice picker, and voice browser now works on headless servers. When the active provider is `ssh-remote` or `agentvibes-receiver`, preview routes through `play-tts.sh` to play audio on the remote receiver instead of requiring local Piper + audio player. Platform-aware: uses PowerShell on Windows, bash on Linux.
|
|
16
|
+
|
|
17
|
+
- **SSH receiver provider routing** — `ssh-remote` and `agentvibes-receiver` are now first-class providers in `play-tts.sh`. Both the `speak_text()` function and the main routing case statement support them, eliminating "Unknown provider" errors.
|
|
18
|
+
|
|
19
|
+
### Fixes
|
|
20
|
+
|
|
21
|
+
- **Auto-patch LibriTTS speaker names** — Voice download now auto-patches LibriTTS speaker names so multi-speaker voices work correctly out of the box.
|
|
22
|
+
|
|
23
|
+
- **Voice validation regex hardened** — The VOICE parameter regex in `play-tts-ssh-remote.sh` and `play-tts-agentvibes-receiver.sh` now allows `::` (multi-speaker), `.` (locale), and spaces (speaker names) without accepting backslash (injection risk). Linux and Windows receiver templates updated to match.
|
|
24
|
+
|
|
25
|
+
- **`base64` cross-platform compatibility** — `play-tts-agentvibes-receiver.sh` now probes for GNU `base64 -w 0`, falls back to BSD `-b 0`, then `tr -d '\n'`. Fixes script abort on macOS/BSD systems.
|
|
26
|
+
|
|
27
|
+
- **Audio effects double-processing fix** — `play-tts-piper.ps1` skips its own audio-processor call when `AGENTVIBES_NO_PLAY` is set, preventing reverb/music from being applied twice.
|
|
28
|
+
|
|
29
|
+
- **Exit code leak fix** — `play-tts.ps1` now exits with code 0 explicitly, preventing native command exit codes (piper, ffmpeg, sox) from leaking through and causing false TTS failure reports.
|
|
30
|
+
|
|
31
|
+
- **Windows receiver-tab platform support** — Tailscale IP detection, local IP via PowerShell, sshd_config reading, and clipboard copy all work natively on Windows now.
|
|
32
|
+
|
|
33
|
+
- **`llm:default` audio effects row** — New default row in `audio-effects.cfg` ensures remote receivers get reverb, music, and pretext even without a per-LLM config entry.
|
|
34
|
+
|
|
35
|
+
- **Preview sample text** — Changed from "Here is a preview of your audio settings" to avoid Piper pronunciation glitch on the word "preview".
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 🛡️ v5.1.4 — TTS Resilience Overhaul + Default LLM Provider + Per-Client Routing
|
|
40
|
+
|
|
41
|
+
**Release Date:** April 2026
|
|
42
|
+
|
|
43
|
+
This release closes a long-running cluster of bugs around per-LLM TTS routing, parallel audio playback, stuck-process deadlocks, and stale-audio replay. It also adds a new "Default" provider slot in the Setup tab for fallback audio configuration, and switches to a per-client config scheme that correctly routes Claude Code, GitHub Copilot (Chat + CLI), and OpenAI Codex to their own voices and pretexts.
|
|
44
|
+
|
|
45
|
+
### New Features
|
|
46
|
+
|
|
47
|
+
- **Default LLM provider** — New entry at the bottom of Setup → Providers. Config-only (no install/remove buttons) with a Configure button that opens the standard per-LLM audio modal. When any tool calls TTS without identifying its LLM, the `llm:default` row in `audio-effects.cfg` provides the fallback voice, pretext, music, reverb, and engine. Empty pretext by default — users opt in.
|
|
48
|
+
|
|
49
|
+
- **Per-LLM background music now auto-enables** — Setting a `bg_track` on any per-LLM Configure modal now actually plays that track. Previously you also had to toggle the global `backgroundMusic.enabled` flag, which made the per-LLM bg track field silently dead.
|
|
50
|
+
|
|
51
|
+
- **Copilot CLI support** — `installCopilotMcp` now writes BOTH `.vscode/mcp.json` (for VS Code Copilot Chat) AND `~/.copilot/mcp-config.json` (for the standalone `copilot` CLI, which is a different product). Fresh installs support both tools automatically.
|
|
52
|
+
|
|
53
|
+
### Per-Client Routing Architecture
|
|
54
|
+
|
|
55
|
+
Previously `AGENTVIBES_LLM=claude-code` was set in `.mcp.json`, which broke Copilot CLI because Copilot CLI also reads `.mcp.json` with precedence over its own `~/.copilot/mcp-config.json` — so it adopted Claude Code's env and mis-routed.
|
|
56
|
+
|
|
57
|
+
The new architecture splits per-LLM identification per-client:
|
|
58
|
+
|
|
59
|
+
- `.mcp.json` (project) has **no `AGENTVIBES_LLM` env block**
|
|
60
|
+
- `~/.copilot/mcp-config.json` sets `AGENTVIBES_LLM=copilot` for GitHub Copilot CLI
|
|
61
|
+
- `~/.codex/config.toml` sets `AGENTVIBES_LLM=codex` for OpenAI Codex
|
|
62
|
+
- The MCP server (`mcp-server/server.py`) **auto-detects Claude Code** via the `CLAUDECODE=1` env var that Claude Code sets on every subprocess it spawns. Copilot CLI and Codex don't set this var, so each client reliably routes to its own config.
|
|
63
|
+
|
|
64
|
+
Upgrade path: re-run the AgentVibes installer in any existing project. The new `installClaudeMcp` auto-strips any stale `AGENTVIBES_LLM` env block from existing `.mcp.json` files so Copilot CLI stops mis-routing.
|
|
65
|
+
|
|
66
|
+
### TTS Resilience Overhaul (`play-tts.ps1`)
|
|
67
|
+
|
|
68
|
+
- **Cross-process playback mutex** — `AgentVibesPlaybackLock` (named mutex) serializes playback across all callers: Claude Code hooks, MCP `text_to_speech`, direct CLI, party mode. No more overlapping or parallel audio when multiple LLMs run in the same project.
|
|
69
|
+
|
|
70
|
+
- **Self-healing on mutex timeout** — When the 15-second mutex acquisition fails, the new code queries `Win32_Process` for any stuck `play-tts.ps1` process older than 20 seconds, calls `Stop-Process -Force` on each, and logs the kill to stderr. The next TTS call succeeds immediately — no manual `taskkill` needed.
|
|
71
|
+
|
|
72
|
+
- **25-second script watchdog** — A sibling PowerShell job force-kills `play-tts.ps1` after 25 seconds regardless of where it's stuck (SoundPlayer deadlock, locked audio device, zombie ffmpeg). Guarantees forward progress.
|
|
73
|
+
|
|
74
|
+
- **Hard error on mutex timeout** — Replaces the old "play anyway" fallback which just stacked more stuck processes behind the first. Now exits cleanly with code 2 and a diagnostic message.
|
|
75
|
+
|
|
76
|
+
- **Exact filename capture from provider stdout** — `play-tts.ps1` parses the `[OK] Saved to: <path>` line from `play-tts-piper.ps1` and uses that exact file. Replaces the old "pick most recent `tts-*.wav` in the audio dir" heuristic which silently replayed stale audio from earlier sessions whenever synthesis failed. Root cause of the "Codex speaks Claude Code's audio" bug.
|
|
77
|
+
|
|
78
|
+
- **Synthesis-failure hard error** — When the provider doesn't produce an output file, `play-tts.ps1` exits with code 3 and a loud error instead of falling back to any older file in the cache.
|
|
79
|
+
|
|
80
|
+
- **Scratch file rename** — Reverb post-processing now writes to `av-reverbed-scratch.wav` and mix post-processing writes to `av-mixed-scratch.wav`. Fixed names outside the `tts-XXXXXXXX` random namespace so the file lookup can never pick them up as a synth input. Eliminates the compound `tts-xxx.wav.effected-mixed-mixed-mixed-mixed.wav` chain that accumulated on every run.
|
|
81
|
+
|
|
82
|
+
- **Per-LLM voice overrides explicit `VoiceOverride`** — LLMs call `get_config` at session start and echo the returned voice back on every `text_to_speech` call as an explicit MCP parameter. With the old "explicit wins" priority, that global voice overrode per-LLM routing. Now the `llm:<key>` voice row always wins when `-llm` is set.
|
|
83
|
+
|
|
84
|
+
- **`$LlmBgTrack` and `$LlmBgVolume` parsed from cfg row** — Previously fields 2 and 3 of the `llm:<key>` line were ignored in the PowerShell version (the bash version already parsed them).
|
|
85
|
+
|
|
86
|
+
- **Per-LLM `bg_track` force-enables `$BgEnabled`** — When a per-LLM row specifies a background track, it's auto-enabled regardless of the global `backgroundMusic.enabled` flag.
|
|
87
|
+
|
|
88
|
+
- **ASCII-only encoding** — Removed em-dash `—` and right-arrow `→` from `play-tts.ps1`. PowerShell on some Windows locales loads scripts in CP1252 and choked on the UTF-8 bytes with a misleading "Missing closing `}`" parse error.
|
|
89
|
+
|
|
90
|
+
- **`lessac-medium` → `lessac-high` default for codex** — `en_US-lessac-medium` silently fails to synthesize on some Windows Piper installs (loads the model, exits with empty output). `lessac-high` works reliably and is the new default in `DEFAULT_LLM_CONFIGS.codex` and the packaged `audio-effects.cfg`.
|
|
91
|
+
|
|
92
|
+
### UX Improvements
|
|
93
|
+
|
|
94
|
+
- **Setup → Providers Install confirmation** — Pressing Enter to dismiss the post-install confirmation page now advances focus to the NEXT provider row's same-column button (Install → Install, Configure → Configure), instead of snapping back to Claude Code's Install. Installing all three providers is now a natural Enter-Enter-Enter flow.
|
|
95
|
+
|
|
96
|
+
### Testing & Hardening
|
|
97
|
+
|
|
98
|
+
- **30 new/updated regression tests** in `test/unit/llm-provider-mcp-routing.test.js` and `test/unit/windows-tts.test.js` covering:
|
|
99
|
+
- Default LLM provider config shape + setup-tab wiring
|
|
100
|
+
- `CLAUDECODE` auto-detection in `server.py`
|
|
101
|
+
- `.mcp.json` template MUST NOT contain `AGENTVIBES_LLM`
|
|
102
|
+
- `~/.copilot/mcp-config.json` writer in `installCopilotMcp`
|
|
103
|
+
- `play-tts.ps1` PowerShell-parseable (catches em-dash / encoding regressions via `[System.Management.Automation.Language.Parser]`)
|
|
104
|
+
|
|
105
|
+
### How to Update
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
npm cache clean --force
|
|
109
|
+
npx --yes agentvibes@5.1.4
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
If you have any existing project with AgentVibes installed, re-run the installer there once so the per-client config migration takes effect. The `.mcp.json` in each project will be auto-upgraded to strip the stale `AGENTVIBES_LLM` env block, and `~/.copilot/mcp-config.json` will be created if you have the Copilot provider enabled.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
3
116
|
## 🛡️ v5.1.3 — Hardening Pass (Adversarial Review Followup)
|
|
4
117
|
|
|
5
118
|
**Release Date:** April 2026
|