agentvibes 5.1.4 → 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 (69) hide show
  1. package/.agentvibes/config.json +23 -13
  2. package/.claude/commands/agent-vibes/verbosity.md +98 -89
  3. package/.claude/config/audio-effects.cfg +4 -1
  4. package/.claude/hooks/audio-cache-utils.sh +246 -246
  5. package/.claude/hooks/background-music-manager.sh +404 -404
  6. package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
  7. package/.claude/hooks/bmad-speak.sh +290 -290
  8. package/.claude/hooks/bmad-tts-injector.sh +568 -568
  9. package/.claude/hooks/bmad-voice-manager.sh +928 -928
  10. package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
  11. package/.claude/hooks/clawdbot-receiver.sh +107 -107
  12. package/.claude/hooks/clean-audio-cache.sh +22 -22
  13. package/.claude/hooks/cleanup-cache.sh +106 -106
  14. package/.claude/hooks/configure-rdp-mode.sh +137 -137
  15. package/.claude/hooks/download-extra-voices.sh +244 -244
  16. package/.claude/hooks/effects-manager.sh +268 -268
  17. package/.claude/hooks/github-star-reminder.sh +154 -154
  18. package/.claude/hooks/language-manager.sh +362 -362
  19. package/.claude/hooks/learn-manager.sh +492 -492
  20. package/.claude/hooks/macos-voice-manager.sh +205 -205
  21. package/.claude/hooks/migrate-background-music.sh +125 -125
  22. package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
  23. package/.claude/hooks/optimize-background-music.sh +87 -87
  24. package/.claude/hooks/path-resolver.sh +60 -60
  25. package/.claude/hooks/personality-manager.sh +448 -448
  26. package/.claude/hooks/piper-download-voices.sh +233 -225
  27. package/.claude/hooks/piper-installer.sh +292 -292
  28. package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
  29. package/.claude/hooks/piper-voice-manager.sh +125 -0
  30. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +97 -90
  31. package/.claude/hooks/play-tts-enhanced.sh +105 -105
  32. package/.claude/hooks/play-tts-piper.sh +16 -5
  33. package/.claude/hooks/play-tts-ssh-remote.sh +168 -167
  34. package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
  35. package/.claude/hooks/play-tts.sh +35 -14
  36. package/.claude/hooks/prepare-release.sh +54 -54
  37. package/.claude/hooks/provider-commands.sh +617 -617
  38. package/.claude/hooks/provider-manager.sh +399 -399
  39. package/.claude/hooks/replay-target-audio.sh +95 -95
  40. package/.claude/hooks/sentiment-manager.sh +201 -201
  41. package/.claude/hooks/session-start-tts.sh +4 -1
  42. package/.claude/hooks/speed-manager.sh +291 -291
  43. package/.claude/hooks/stop-tts.sh +84 -84
  44. package/.claude/hooks/termux-installer.sh +261 -261
  45. package/.claude/hooks/translate-manager.sh +341 -341
  46. package/.claude/hooks/tts-queue-worker.sh +145 -145
  47. package/.claude/hooks/tts-queue.sh +165 -165
  48. package/.claude/hooks/verbosity-manager.sh +185 -178
  49. package/.claude/hooks/voice-manager.sh +552 -548
  50. package/.claude/hooks-windows/download-extra-voices.ps1 +243 -185
  51. package/.claude/hooks-windows/play-tts-piper.ps1 +7 -2
  52. package/.claude/hooks-windows/play-tts.ps1 +9 -3
  53. package/.claude/hooks-windows/session-start-tts.ps1 +2 -1
  54. package/.claude/hooks-windows/verbosity-manager.ps1 +126 -119
  55. package/README.md +19 -2
  56. package/RELEASE_NOTES.md +74 -0
  57. package/bin/agentvibes-voice-browser.js +1939 -1840
  58. package/bin/mcp-server.sh +206 -206
  59. package/mcp-server/server.py +87 -15
  60. package/package.json +1 -1
  61. package/src/console/tabs/receiver-tab.js +1527 -1483
  62. package/src/console/tabs/settings-tab.js +2 -2
  63. package/src/console/tabs/setup-tab.js +112 -31
  64. package/src/console/tabs/voices-tab.js +130 -13
  65. package/src/i18n/en.js +202 -202
  66. package/src/installer.js +79 -213
  67. package/src/services/llm-provider-service.js +126 -75
  68. package/src/services/verbosity-service.js +159 -157
  69. package/templates/agentvibes-receiver.sh +3 -2
@@ -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
+ }