agentvibes 5.2.0 → 5.2.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 (49) hide show
  1. package/.claude/config/audio-effects.cfg +1 -1
  2. package/.claude/hooks/audio-cache-utils.sh +246 -246
  3. package/.claude/hooks/background-music-manager.sh +404 -404
  4. package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
  5. package/.claude/hooks/bmad-speak.sh +290 -290
  6. package/.claude/hooks/bmad-tts-injector.sh +568 -568
  7. package/.claude/hooks/bmad-voice-manager.sh +928 -928
  8. package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
  9. package/.claude/hooks/clawdbot-receiver.sh +107 -107
  10. package/.claude/hooks/clean-audio-cache.sh +22 -22
  11. package/.claude/hooks/cleanup-cache.sh +106 -106
  12. package/.claude/hooks/configure-rdp-mode.sh +137 -137
  13. package/.claude/hooks/download-extra-voices.sh +244 -244
  14. package/.claude/hooks/effects-manager.sh +268 -268
  15. package/.claude/hooks/github-star-reminder.sh +154 -154
  16. package/.claude/hooks/language-manager.sh +362 -362
  17. package/.claude/hooks/learn-manager.sh +492 -492
  18. package/.claude/hooks/macos-voice-manager.sh +205 -205
  19. package/.claude/hooks/migrate-background-music.sh +125 -125
  20. package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
  21. package/.claude/hooks/optimize-background-music.sh +87 -87
  22. package/.claude/hooks/path-resolver.sh +60 -60
  23. package/.claude/hooks/personality-manager.sh +448 -448
  24. package/.claude/hooks/piper-installer.sh +292 -292
  25. package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
  26. package/.claude/hooks/play-tts-enhanced.sh +105 -105
  27. package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
  28. package/.claude/hooks/play-tts.sh +14 -5
  29. package/.claude/hooks/prepare-release.sh +54 -54
  30. package/.claude/hooks/provider-commands.sh +617 -617
  31. package/.claude/hooks/provider-manager.sh +399 -399
  32. package/.claude/hooks/replay-target-audio.sh +95 -95
  33. package/.claude/hooks/sentiment-manager.sh +201 -201
  34. package/.claude/hooks/speed-manager.sh +291 -291
  35. package/.claude/hooks/stop-tts.sh +84 -84
  36. package/.claude/hooks/termux-installer.sh +261 -261
  37. package/.claude/hooks/translate-manager.sh +341 -341
  38. package/.claude/hooks/tts-queue-worker.sh +145 -145
  39. package/.claude/hooks/tts-queue.sh +165 -165
  40. package/.claude/hooks/voice-manager.sh +552 -548
  41. package/.claude/hooks-windows/play-tts.ps1 +2 -2
  42. package/README.md +11 -2
  43. package/RELEASE_NOTES.md +38 -0
  44. package/bin/mcp-server.sh +206 -206
  45. package/mcp-server/server.py +35 -6
  46. package/package.json +1 -1
  47. package/src/console/tabs/setup-tab.js +59 -23
  48. package/src/installer.js +79 -213
  49. package/src/services/llm-provider-service.js +126 -75
@@ -54,6 +54,6 @@ default||agent_vibes_chillwave_v2_loop.mp3|0.15
54
54
  # Claude Code LLM default - pretext + music for remote receivers without per-LLM config|||
55
55
  llm:default|reverb 20 50 50|agent_vibes_chillwave_v2_loop.mp3|0.15||AgentVibes here
56
56
  analyst|reverb 70 50 100|agentvibes_soft_flamenco_loop.mp3|0.30
57
- llm:claude-code|light|Midnight Charleston Stomp.mp3|0.15|en_US-libritts-high::Leo-7|AgentVibes here|piper
57
+ llm:claude-code|light|agent_vibes_chillwave_v2_loop.mp3|0.15|en_US-libritts-high::Leo-7|Claude Code here|piper
58
58
  llm:copilot|light|agent_vibes_bossa_nova_v2_loop.mp3|0.15|en_US-libritts-high::Anna-11|Copilot here|piper
59
59
  llm:codex|light|agent_vibes_chillwave_v2_loop.mp3|0.15|en_US-lessac-high|Codex here|piper
@@ -1,246 +1,246 @@
1
- #!/usr/bin/env bash
2
- # AgentVibes Audio Cache Utility Functions
3
- # Provides common functions for file counting, sizing, and cleanup operations
4
-
5
- # Get the audio directory path with priority order
6
- # Returns: Absolute path to audio directory
7
- get_audio_dir() {
8
- local audio_dir=""
9
-
10
- # Priority 1: Project-local directory (if CLAUDE_PROJECT_DIR is set)
11
- if [[ -n "${CLAUDE_PROJECT_DIR:-}" ]]; then
12
- audio_dir="$CLAUDE_PROJECT_DIR/.claude/audio"
13
- else
14
- # Priority 2: Walk up directory tree to find .claude
15
- local current_dir="$PWD"
16
- while [[ "$current_dir" != "/" ]]; do
17
- if [[ -d "$current_dir/.claude" ]]; then
18
- audio_dir="$current_dir/.claude/audio"
19
- break
20
- fi
21
- current_dir=$(dirname "$current_dir")
22
- done
23
- fi
24
-
25
- # Priority 3: Fallback to global ~/.claude/audio
26
- if [[ -z "$audio_dir" ]]; then
27
- audio_dir="$HOME/.claude/audio"
28
- fi
29
-
30
- echo "$audio_dir"
31
- }
32
-
33
- # Count TTS audio files (excludes background music tracks in tracks/ subdirectory)
34
- # Args: $1 = audio_dir (optional, defaults to get_audio_dir)
35
- # Returns: Integer count
36
- count_tts_files() {
37
- local audio_dir="${1:-$(get_audio_dir)}"
38
-
39
- if [[ ! -d "$audio_dir" ]]; then
40
- echo "0"
41
- return
42
- fi
43
-
44
- # Count TTS output files only (excludes subdirectories like tracks/)
45
- local count=0
46
- count=$(find "$audio_dir" -maxdepth 1 -type f \( \
47
- -name "tts-*.wav" -o \
48
- -name "tts-*.mp3" -o \
49
- -name "tts-*.aiff" -o \
50
- -name "tts-padded-*.mp3" -o \
51
- -name "tts-padded-*.wav" \
52
- \) 2>/dev/null | wc -l)
53
-
54
- echo "$count"
55
- }
56
-
57
- # Calculate total size of TTS audio files in bytes
58
- # Args: $1 = audio_dir (optional, defaults to get_audio_dir)
59
- # Returns: Size in bytes (integer)
60
- calculate_tts_size_bytes() {
61
- local audio_dir="${1:-$(get_audio_dir)}"
62
-
63
- if [[ ! -d "$audio_dir" ]]; then
64
- echo "0"
65
- return
66
- fi
67
-
68
- local total_bytes=0
69
- local stat_cmd=""
70
-
71
- # Detect stat command format (BSD vs GNU)
72
- if stat -c%s /dev/null >/dev/null 2>&1; then
73
- stat_cmd="stat -c%s"
74
- else
75
- stat_cmd="stat -f%z"
76
- fi
77
-
78
- # Sum file sizes for all TTS files
79
- while IFS= read -r file; do
80
- if [[ -f "$file" ]]; then
81
- local size=$($stat_cmd "$file" 2>/dev/null || echo "0")
82
- total_bytes=$((total_bytes + size))
83
- fi
84
- done < <(find "$audio_dir" -maxdepth 1 -type f \( \
85
- -name "tts-*.wav" -o \
86
- -name "tts-*.mp3" -o \
87
- -name "tts-*.aiff" -o \
88
- -name "tts-padded-*.mp3" -o \
89
- -name "tts-padded-*.wav" \
90
- \) 2>/dev/null)
91
-
92
- echo "$total_bytes"
93
- }
94
-
95
- # Convert bytes to human-readable format (e.g., "1.4MB", "230KB")
96
- # Args: $1 = bytes
97
- # Returns: Human-readable string (B, KB, MB, GB)
98
- bytes_to_human() {
99
- local bytes="${1:-0}"
100
-
101
- if [[ ! "$bytes" =~ ^[0-9]+$ ]]; then
102
- bytes="0"
103
- fi
104
-
105
- if [[ $bytes -lt 1024 ]]; then
106
- echo "${bytes}B"
107
- elif [[ $bytes -lt 1048576 ]]; then
108
- awk "BEGIN {printf \"%.1fKB\", $bytes/1024}"
109
- elif [[ $bytes -lt 1073741824 ]]; then
110
- awk "BEGIN {printf \"%.1fMB\", $bytes/1048576}"
111
- else
112
- awk "BEGIN {printf \"%.1fGB\", $bytes/1073741824}"
113
- fi
114
- }
115
-
116
- # Get auto-cleanup threshold (number of files before cleanup triggers)
117
- # Returns: Integer threshold (default: 50)
118
- get_auto_clean_threshold() {
119
- local threshold_file=""
120
- local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
121
-
122
- # Priority order for config file
123
- if [[ -n "${CLAUDE_PROJECT_DIR:-}" ]] && [[ -f "$CLAUDE_PROJECT_DIR/.claude/tts-auto-clean-threshold.txt" ]]; then
124
- threshold_file="$CLAUDE_PROJECT_DIR/.claude/tts-auto-clean-threshold.txt"
125
- elif [[ -f "$script_dir/../tts-auto-clean-threshold.txt" ]]; then
126
- threshold_file="$script_dir/../tts-auto-clean-threshold.txt"
127
- elif [[ -f "$HOME/.claude/tts-auto-clean-threshold.txt" ]]; then
128
- threshold_file="$HOME/.claude/tts-auto-clean-threshold.txt"
129
- fi
130
-
131
- if [[ -n "$threshold_file" ]]; then
132
- local threshold=$(grep -v '^\s*#' "$threshold_file" 2>/dev/null | grep -v '^\s*$' | head -1)
133
- if [[ "$threshold" =~ ^[0-9]+$ ]]; then
134
- echo "$threshold"
135
- return
136
- fi
137
- fi
138
-
139
- # Default threshold
140
- echo "50"
141
- }
142
-
143
- # Delete oldest TTS files to stay under size threshold (in MB)
144
- # Args: $1 = audio_dir, $2 = threshold (size in MB)
145
- # Returns: Number of files deleted
146
- auto_clean_old_files() {
147
- local audio_dir="${1:-$(get_audio_dir)}"
148
- local threshold_mb="${2:-15}"
149
- local threshold_bytes=$((threshold_mb * 1048576))
150
-
151
- if [[ ! -d "$audio_dir" ]]; then
152
- echo "0"
153
- return
154
- fi
155
-
156
- local current_size=$(calculate_tts_size_bytes "$audio_dir")
157
-
158
- if [[ $current_size -le $threshold_bytes ]]; then
159
- echo "0"
160
- return
161
- fi
162
-
163
- # SAFETY CHECK: Skip cleanup if any TTS files have active write locks
164
- # Check for .lock files that indicate in-progress TTS generation
165
- local lock_count=$(find "$audio_dir" -maxdepth 1 -name "tts-*.lock" -type f 2>/dev/null | wc -l)
166
- if [[ $lock_count -gt 0 ]]; then
167
- # Active TTS generation in progress, skip cleanup to avoid race condition
168
- return 0
169
- fi
170
-
171
- local files_deleted=0
172
- local current_size_bytes=$current_size
173
-
174
- # Delete oldest files until under threshold
175
- # IMPORTANT: Only delete auto-generated TTS files, NOT project assets like welcome-multivoice-final.wav
176
- while [[ $current_size_bytes -gt $threshold_bytes ]]; do
177
- # Find the oldest file (only tts-processed-* and tts-padded-* files, not other project assets)
178
- local oldest_file=$(find "$audio_dir" -maxdepth 1 -type f \( \
179
- -name "tts-processed-*.wav" -o \
180
- -name "tts-processed-*.mp3" -o \
181
- -name "tts-padded-*.mp3" -o \
182
- -name "tts-padded-*.wav" \
183
- \) -printf '%T+ %p\n' 2>/dev/null | sort | head -1 | cut -d' ' -f2-)
184
-
185
- if [[ -z "$oldest_file" ]]; then
186
- break
187
- fi
188
-
189
- # Get file size and delete it
190
- local file_size=$(stat -c%s "$oldest_file" 2>/dev/null || stat -f%z "$oldest_file" 2>/dev/null || echo "0")
191
- rm -f "$oldest_file" 2>/dev/null || true
192
- current_size_bytes=$((current_size_bytes - file_size))
193
- files_deleted=$((files_deleted + 1))
194
- done
195
-
196
- echo "$files_deleted"
197
- }
198
-
199
- # Clean all TTS audio files and report stats
200
- # Args: $1 = audio_dir (optional, defaults to get_audio_dir)
201
- # Returns: Formatted output with cleanup stats
202
- clean_all_tts_files() {
203
- local audio_dir="${1:-$(get_audio_dir)}"
204
-
205
- # Color codes
206
- local RED='\033[0;31m'
207
- local GREEN='\033[0;32m'
208
- local YELLOW='\033[1;33m'
209
- local BLUE='\033[0;34m'
210
- local NC='\033[0m' # No Color
211
-
212
- # Get stats before cleanup
213
- local count_before=$(count_tts_files "$audio_dir")
214
- local size_before=$(calculate_tts_size_bytes "$audio_dir")
215
- local human_before=$(bytes_to_human "$size_before")
216
-
217
- if [[ $count_before -eq 0 ]]; then
218
- echo -e "${GREEN}✅ Cache is already clean! No TTS files found.${NC}"
219
- return
220
- fi
221
-
222
- # Delete auto-generated TTS files only (preserve project assets like welcome-multivoice-final.wav)
223
- find "$audio_dir" -maxdepth 1 -type f \( \
224
- -name "tts-processed-*.wav" -o \
225
- -name "tts-processed-*.mp3" -o \
226
- -name "tts-padded-*.mp3" -o \
227
- -name "tts-padded-*.wav" \
228
- \) -delete 2>/dev/null || true
229
-
230
- # Also delete BMAD party mode recordings if they exist
231
- if [[ -d "$audio_dir/bmad-party-mode-recordings" ]]; then
232
- rm -rf "$audio_dir/bmad-party-mode-recordings" 2>/dev/null || true
233
- fi
234
-
235
- # Get stats after cleanup
236
- local count_after=$(count_tts_files "$audio_dir")
237
- local size_after=$(calculate_tts_size_bytes "$audio_dir")
238
- local human_after=$(bytes_to_human "$size_after")
239
- local freed=$((size_before - size_after))
240
- local human_freed=$(bytes_to_human "$freed")
241
-
242
- echo -e "${GREEN}✅ Cleanup complete!${NC}"
243
- echo " • Files deleted: ${YELLOW}$count_before${NC}"
244
- echo " • Space freed: ${YELLOW}$human_freed${NC}"
245
- echo " • Before: $human_before | After: $human_after"
246
- }
1
+ #!/usr/bin/env bash
2
+ # AgentVibes Audio Cache Utility Functions
3
+ # Provides common functions for file counting, sizing, and cleanup operations
4
+
5
+ # Get the audio directory path with priority order
6
+ # Returns: Absolute path to audio directory
7
+ get_audio_dir() {
8
+ local audio_dir=""
9
+
10
+ # Priority 1: Project-local directory (if CLAUDE_PROJECT_DIR is set)
11
+ if [[ -n "${CLAUDE_PROJECT_DIR:-}" ]]; then
12
+ audio_dir="$CLAUDE_PROJECT_DIR/.claude/audio"
13
+ else
14
+ # Priority 2: Walk up directory tree to find .claude
15
+ local current_dir="$PWD"
16
+ while [[ "$current_dir" != "/" ]]; do
17
+ if [[ -d "$current_dir/.claude" ]]; then
18
+ audio_dir="$current_dir/.claude/audio"
19
+ break
20
+ fi
21
+ current_dir=$(dirname "$current_dir")
22
+ done
23
+ fi
24
+
25
+ # Priority 3: Fallback to global ~/.claude/audio
26
+ if [[ -z "$audio_dir" ]]; then
27
+ audio_dir="$HOME/.claude/audio"
28
+ fi
29
+
30
+ echo "$audio_dir"
31
+ }
32
+
33
+ # Count TTS audio files (excludes background music tracks in tracks/ subdirectory)
34
+ # Args: $1 = audio_dir (optional, defaults to get_audio_dir)
35
+ # Returns: Integer count
36
+ count_tts_files() {
37
+ local audio_dir="${1:-$(get_audio_dir)}"
38
+
39
+ if [[ ! -d "$audio_dir" ]]; then
40
+ echo "0"
41
+ return
42
+ fi
43
+
44
+ # Count TTS output files only (excludes subdirectories like tracks/)
45
+ local count=0
46
+ count=$(find "$audio_dir" -maxdepth 1 -type f \( \
47
+ -name "tts-*.wav" -o \
48
+ -name "tts-*.mp3" -o \
49
+ -name "tts-*.aiff" -o \
50
+ -name "tts-padded-*.mp3" -o \
51
+ -name "tts-padded-*.wav" \
52
+ \) 2>/dev/null | wc -l)
53
+
54
+ echo "$count"
55
+ }
56
+
57
+ # Calculate total size of TTS audio files in bytes
58
+ # Args: $1 = audio_dir (optional, defaults to get_audio_dir)
59
+ # Returns: Size in bytes (integer)
60
+ calculate_tts_size_bytes() {
61
+ local audio_dir="${1:-$(get_audio_dir)}"
62
+
63
+ if [[ ! -d "$audio_dir" ]]; then
64
+ echo "0"
65
+ return
66
+ fi
67
+
68
+ local total_bytes=0
69
+ local stat_cmd=""
70
+
71
+ # Detect stat command format (BSD vs GNU)
72
+ if stat -c%s /dev/null >/dev/null 2>&1; then
73
+ stat_cmd="stat -c%s"
74
+ else
75
+ stat_cmd="stat -f%z"
76
+ fi
77
+
78
+ # Sum file sizes for all TTS files
79
+ while IFS= read -r file; do
80
+ if [[ -f "$file" ]]; then
81
+ local size=$($stat_cmd "$file" 2>/dev/null || echo "0")
82
+ total_bytes=$((total_bytes + size))
83
+ fi
84
+ done < <(find "$audio_dir" -maxdepth 1 -type f \( \
85
+ -name "tts-*.wav" -o \
86
+ -name "tts-*.mp3" -o \
87
+ -name "tts-*.aiff" -o \
88
+ -name "tts-padded-*.mp3" -o \
89
+ -name "tts-padded-*.wav" \
90
+ \) 2>/dev/null)
91
+
92
+ echo "$total_bytes"
93
+ }
94
+
95
+ # Convert bytes to human-readable format (e.g., "1.4MB", "230KB")
96
+ # Args: $1 = bytes
97
+ # Returns: Human-readable string (B, KB, MB, GB)
98
+ bytes_to_human() {
99
+ local bytes="${1:-0}"
100
+
101
+ if [[ ! "$bytes" =~ ^[0-9]+$ ]]; then
102
+ bytes="0"
103
+ fi
104
+
105
+ if [[ $bytes -lt 1024 ]]; then
106
+ echo "${bytes}B"
107
+ elif [[ $bytes -lt 1048576 ]]; then
108
+ awk "BEGIN {printf \"%.1fKB\", $bytes/1024}"
109
+ elif [[ $bytes -lt 1073741824 ]]; then
110
+ awk "BEGIN {printf \"%.1fMB\", $bytes/1048576}"
111
+ else
112
+ awk "BEGIN {printf \"%.1fGB\", $bytes/1073741824}"
113
+ fi
114
+ }
115
+
116
+ # Get auto-cleanup threshold (number of files before cleanup triggers)
117
+ # Returns: Integer threshold (default: 50)
118
+ get_auto_clean_threshold() {
119
+ local threshold_file=""
120
+ local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
121
+
122
+ # Priority order for config file
123
+ if [[ -n "${CLAUDE_PROJECT_DIR:-}" ]] && [[ -f "$CLAUDE_PROJECT_DIR/.claude/tts-auto-clean-threshold.txt" ]]; then
124
+ threshold_file="$CLAUDE_PROJECT_DIR/.claude/tts-auto-clean-threshold.txt"
125
+ elif [[ -f "$script_dir/../tts-auto-clean-threshold.txt" ]]; then
126
+ threshold_file="$script_dir/../tts-auto-clean-threshold.txt"
127
+ elif [[ -f "$HOME/.claude/tts-auto-clean-threshold.txt" ]]; then
128
+ threshold_file="$HOME/.claude/tts-auto-clean-threshold.txt"
129
+ fi
130
+
131
+ if [[ -n "$threshold_file" ]]; then
132
+ local threshold=$(grep -v '^\s*#' "$threshold_file" 2>/dev/null | grep -v '^\s*$' | head -1)
133
+ if [[ "$threshold" =~ ^[0-9]+$ ]]; then
134
+ echo "$threshold"
135
+ return
136
+ fi
137
+ fi
138
+
139
+ # Default threshold
140
+ echo "50"
141
+ }
142
+
143
+ # Delete oldest TTS files to stay under size threshold (in MB)
144
+ # Args: $1 = audio_dir, $2 = threshold (size in MB)
145
+ # Returns: Number of files deleted
146
+ auto_clean_old_files() {
147
+ local audio_dir="${1:-$(get_audio_dir)}"
148
+ local threshold_mb="${2:-15}"
149
+ local threshold_bytes=$((threshold_mb * 1048576))
150
+
151
+ if [[ ! -d "$audio_dir" ]]; then
152
+ echo "0"
153
+ return
154
+ fi
155
+
156
+ local current_size=$(calculate_tts_size_bytes "$audio_dir")
157
+
158
+ if [[ $current_size -le $threshold_bytes ]]; then
159
+ echo "0"
160
+ return
161
+ fi
162
+
163
+ # SAFETY CHECK: Skip cleanup if any TTS files have active write locks
164
+ # Check for .lock files that indicate in-progress TTS generation
165
+ local lock_count=$(find "$audio_dir" -maxdepth 1 -name "tts-*.lock" -type f 2>/dev/null | wc -l)
166
+ if [[ $lock_count -gt 0 ]]; then
167
+ # Active TTS generation in progress, skip cleanup to avoid race condition
168
+ return 0
169
+ fi
170
+
171
+ local files_deleted=0
172
+ local current_size_bytes=$current_size
173
+
174
+ # Delete oldest files until under threshold
175
+ # IMPORTANT: Only delete auto-generated TTS files, NOT project assets like welcome-multivoice-final.wav
176
+ while [[ $current_size_bytes -gt $threshold_bytes ]]; do
177
+ # Find the oldest file (only tts-processed-* and tts-padded-* files, not other project assets)
178
+ local oldest_file=$(find "$audio_dir" -maxdepth 1 -type f \( \
179
+ -name "tts-processed-*.wav" -o \
180
+ -name "tts-processed-*.mp3" -o \
181
+ -name "tts-padded-*.mp3" -o \
182
+ -name "tts-padded-*.wav" \
183
+ \) -printf '%T+ %p\n' 2>/dev/null | sort | head -1 | cut -d' ' -f2-)
184
+
185
+ if [[ -z "$oldest_file" ]]; then
186
+ break
187
+ fi
188
+
189
+ # Get file size and delete it
190
+ local file_size=$(stat -c%s "$oldest_file" 2>/dev/null || stat -f%z "$oldest_file" 2>/dev/null || echo "0")
191
+ rm -f "$oldest_file" 2>/dev/null || true
192
+ current_size_bytes=$((current_size_bytes - file_size))
193
+ files_deleted=$((files_deleted + 1))
194
+ done
195
+
196
+ echo "$files_deleted"
197
+ }
198
+
199
+ # Clean all TTS audio files and report stats
200
+ # Args: $1 = audio_dir (optional, defaults to get_audio_dir)
201
+ # Returns: Formatted output with cleanup stats
202
+ clean_all_tts_files() {
203
+ local audio_dir="${1:-$(get_audio_dir)}"
204
+
205
+ # Color codes
206
+ local RED='\033[0;31m'
207
+ local GREEN='\033[0;32m'
208
+ local YELLOW='\033[1;33m'
209
+ local BLUE='\033[0;34m'
210
+ local NC='\033[0m' # No Color
211
+
212
+ # Get stats before cleanup
213
+ local count_before=$(count_tts_files "$audio_dir")
214
+ local size_before=$(calculate_tts_size_bytes "$audio_dir")
215
+ local human_before=$(bytes_to_human "$size_before")
216
+
217
+ if [[ $count_before -eq 0 ]]; then
218
+ echo -e "${GREEN}✅ Cache is already clean! No TTS files found.${NC}"
219
+ return
220
+ fi
221
+
222
+ # Delete auto-generated TTS files only (preserve project assets like welcome-multivoice-final.wav)
223
+ find "$audio_dir" -maxdepth 1 -type f \( \
224
+ -name "tts-processed-*.wav" -o \
225
+ -name "tts-processed-*.mp3" -o \
226
+ -name "tts-padded-*.mp3" -o \
227
+ -name "tts-padded-*.wav" \
228
+ \) -delete 2>/dev/null || true
229
+
230
+ # Also delete BMAD party mode recordings if they exist
231
+ if [[ -d "$audio_dir/bmad-party-mode-recordings" ]]; then
232
+ rm -rf "$audio_dir/bmad-party-mode-recordings" 2>/dev/null || true
233
+ fi
234
+
235
+ # Get stats after cleanup
236
+ local count_after=$(count_tts_files "$audio_dir")
237
+ local size_after=$(calculate_tts_size_bytes "$audio_dir")
238
+ local human_after=$(bytes_to_human "$size_after")
239
+ local freed=$((size_before - size_after))
240
+ local human_freed=$(bytes_to_human "$freed")
241
+
242
+ echo -e "${GREEN}✅ Cleanup complete!${NC}"
243
+ echo " • Files deleted: ${YELLOW}$count_before${NC}"
244
+ echo " • Space freed: ${YELLOW}$human_freed${NC}"
245
+ echo " • Before: $human_before | After: $human_after"
246
+ }