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.
- package/.claude/config/audio-effects.cfg +1 -1
- package/.claude/hooks/audio-cache-utils.sh +246 -246
- package/.claude/hooks/background-music-manager.sh +404 -404
- package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
- package/.claude/hooks/bmad-speak.sh +290 -290
- package/.claude/hooks/bmad-tts-injector.sh +568 -568
- package/.claude/hooks/bmad-voice-manager.sh +928 -928
- package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
- package/.claude/hooks/clawdbot-receiver.sh +107 -107
- package/.claude/hooks/clean-audio-cache.sh +22 -22
- package/.claude/hooks/cleanup-cache.sh +106 -106
- package/.claude/hooks/configure-rdp-mode.sh +137 -137
- package/.claude/hooks/download-extra-voices.sh +244 -244
- package/.claude/hooks/effects-manager.sh +268 -268
- package/.claude/hooks/github-star-reminder.sh +154 -154
- package/.claude/hooks/language-manager.sh +362 -362
- package/.claude/hooks/learn-manager.sh +492 -492
- package/.claude/hooks/macos-voice-manager.sh +205 -205
- package/.claude/hooks/migrate-background-music.sh +125 -125
- package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
- package/.claude/hooks/optimize-background-music.sh +87 -87
- package/.claude/hooks/path-resolver.sh +60 -60
- package/.claude/hooks/personality-manager.sh +448 -448
- package/.claude/hooks/piper-installer.sh +292 -292
- package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
- package/.claude/hooks/play-tts-enhanced.sh +105 -105
- package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
- package/.claude/hooks/play-tts.sh +14 -5
- package/.claude/hooks/prepare-release.sh +54 -54
- package/.claude/hooks/provider-commands.sh +617 -617
- package/.claude/hooks/provider-manager.sh +399 -399
- package/.claude/hooks/replay-target-audio.sh +95 -95
- package/.claude/hooks/sentiment-manager.sh +201 -201
- package/.claude/hooks/speed-manager.sh +291 -291
- package/.claude/hooks/stop-tts.sh +84 -84
- package/.claude/hooks/termux-installer.sh +261 -261
- package/.claude/hooks/translate-manager.sh +341 -341
- package/.claude/hooks/tts-queue-worker.sh +145 -145
- package/.claude/hooks/tts-queue.sh +165 -165
- package/.claude/hooks/voice-manager.sh +552 -548
- package/.claude/hooks-windows/play-tts.ps1 +2 -2
- package/README.md +11 -2
- package/RELEASE_NOTES.md +38 -0
- package/bin/mcp-server.sh +206 -206
- package/mcp-server/server.py +35 -6
- package/package.json +1 -1
- package/src/console/tabs/setup-tab.js +59 -23
- package/src/installer.js +79 -213
- 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|
|
|
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
|
+
}
|