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
|
@@ -1,404 +1,404 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/background-music-manager.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes - Background Music Manager
|
|
6
|
-
# Manages background music settings for TTS
|
|
7
|
-
#
|
|
8
|
-
# Usage:
|
|
9
|
-
# background-music-manager.sh status - Show current status
|
|
10
|
-
# background-music-manager.sh on - Enable background music
|
|
11
|
-
# background-music-manager.sh off - Disable background music
|
|
12
|
-
# background-music-manager.sh volume X - Set volume (0.0-1.0)
|
|
13
|
-
# background-music-manager.sh list - List all pre-packaged background music
|
|
14
|
-
# background-music-manager.sh set-default TRACK - Set default background music
|
|
15
|
-
# background-music-manager.sh get-enabled - Returns "true" or "false"
|
|
16
|
-
# background-music-manager.sh get-volume - Returns current volume
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
set -euo pipefail
|
|
20
|
-
export LC_ALL=C
|
|
21
|
-
|
|
22
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
23
|
-
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
24
|
-
|
|
25
|
-
# Config file location
|
|
26
|
-
CONFIG_DIR="$SCRIPT_DIR/../config"
|
|
27
|
-
ENABLED_FILE="$CONFIG_DIR/background-music-enabled.txt"
|
|
28
|
-
VOLUME_FILE="$CONFIG_DIR/background-music-volume.txt"
|
|
29
|
-
|
|
30
|
-
# Defaults
|
|
31
|
-
DEFAULT_VOLUME="0.34"
|
|
32
|
-
|
|
33
|
-
# Ensure config directory exists
|
|
34
|
-
mkdir -p "$CONFIG_DIR"
|
|
35
|
-
|
|
36
|
-
# @function is_enabled
|
|
37
|
-
# @intent Check if background music is enabled
|
|
38
|
-
# @returns 0 if enabled, 1 if disabled
|
|
39
|
-
is_enabled() {
|
|
40
|
-
if [[ -f "$ENABLED_FILE" ]]; then
|
|
41
|
-
local status
|
|
42
|
-
status=$(cat "$ENABLED_FILE" 2>/dev/null | tr -d '[:space:]')
|
|
43
|
-
[[ "$status" == "true" || "$status" == "on" || "$status" == "1" ]]
|
|
44
|
-
else
|
|
45
|
-
# Default: disabled
|
|
46
|
-
return 1
|
|
47
|
-
fi
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
# @function get_volume
|
|
51
|
-
# @intent Get current volume setting
|
|
52
|
-
# @returns Volume value (0.0-1.0)
|
|
53
|
-
get_volume() {
|
|
54
|
-
if [[ -f "$VOLUME_FILE" ]]; then
|
|
55
|
-
cat "$VOLUME_FILE" 2>/dev/null | tr -d '[:space:]'
|
|
56
|
-
else
|
|
57
|
-
echo "$DEFAULT_VOLUME"
|
|
58
|
-
fi
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
# @function set_enabled
|
|
62
|
-
# @intent Enable or disable background music
|
|
63
|
-
# @param $1 "true" or "false"
|
|
64
|
-
set_enabled() {
|
|
65
|
-
local value="$1"
|
|
66
|
-
echo "$value" > "$ENABLED_FILE"
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
# @function set_volume
|
|
70
|
-
# @intent Set background music volume
|
|
71
|
-
# @param $1 Volume value (0.0-1.0)
|
|
72
|
-
set_volume() {
|
|
73
|
-
local value="$1"
|
|
74
|
-
|
|
75
|
-
# Validate it's a number between 0 and 1
|
|
76
|
-
if ! [[ "$value" =~ ^[0-9]*\.?[0-9]+$ ]]; then
|
|
77
|
-
echo "Error: Volume must be a number between 0.0 and 1.0" >&2
|
|
78
|
-
return 1
|
|
79
|
-
fi
|
|
80
|
-
|
|
81
|
-
# Check range using bc
|
|
82
|
-
if command -v bc &> /dev/null; then
|
|
83
|
-
if (( $(echo "$value < 0" | bc -l) )) || (( $(echo "$value > 1" | bc -l) )); then
|
|
84
|
-
echo "Error: Volume must be between 0.0 and 1.0" >&2
|
|
85
|
-
return 1
|
|
86
|
-
fi
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
|
-
echo "$value" > "$VOLUME_FILE"
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
# @function list_tracks
|
|
93
|
-
# @intent List all pre-packaged background music files
|
|
94
|
-
list_tracks() {
|
|
95
|
-
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
96
|
-
|
|
97
|
-
if [[ ! -d "$bg_dir" ]]; then
|
|
98
|
-
echo "❌ No tracks folder found at $bg_dir"
|
|
99
|
-
return 1
|
|
100
|
-
fi
|
|
101
|
-
|
|
102
|
-
echo "🎵 Available Background Music Tracks"
|
|
103
|
-
echo "===================================="
|
|
104
|
-
echo ""
|
|
105
|
-
|
|
106
|
-
local count=0
|
|
107
|
-
while IFS= read -r -d '' file; do
|
|
108
|
-
local basename
|
|
109
|
-
basename=$(basename "$file")
|
|
110
|
-
count=$((count + 1))
|
|
111
|
-
printf "%2d. %s\n" "$count" "$basename"
|
|
112
|
-
done < <(find "$bg_dir" -type f \( -name "*.mp3" -o -name "*.wav" -o -name "*.ogg" \) -print0 2>/dev/null | sort -z)
|
|
113
|
-
|
|
114
|
-
if [[ $count -eq 0 ]]; then
|
|
115
|
-
echo "No audio files found in tracks folder"
|
|
116
|
-
else
|
|
117
|
-
echo ""
|
|
118
|
-
echo "Total: $count track(s)"
|
|
119
|
-
fi
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
# @function get_default_track
|
|
123
|
-
# @intent Get the current default background music track
|
|
124
|
-
get_default_track() {
|
|
125
|
-
local audio_effects_cfg="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
126
|
-
|
|
127
|
-
if [[ ! -f "$audio_effects_cfg" ]]; then
|
|
128
|
-
echo ""
|
|
129
|
-
return
|
|
130
|
-
fi
|
|
131
|
-
|
|
132
|
-
# Extract the background file from the default entry
|
|
133
|
-
grep "^default|" "$audio_effects_cfg" 2>/dev/null | cut -d'|' -f3 || echo ""
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
# @function set_default_track
|
|
137
|
-
# @intent Set the default background music track
|
|
138
|
-
# @param $1 Track filename
|
|
139
|
-
set_default_track() {
|
|
140
|
-
local track="$1"
|
|
141
|
-
local audio_effects_cfg="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
142
|
-
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
143
|
-
|
|
144
|
-
if [[ -z "$track" ]]; then
|
|
145
|
-
echo "❌ Error: No track name provided"
|
|
146
|
-
echo "Usage: $0 set-default TRACK_NAME"
|
|
147
|
-
return 1
|
|
148
|
-
fi
|
|
149
|
-
|
|
150
|
-
# Check if track exists
|
|
151
|
-
if [[ ! -f "$bg_dir/$track" ]]; then
|
|
152
|
-
echo "❌ Error: Track '$track' not found in tracks folder"
|
|
153
|
-
echo "Run '$0 list' to see available tracks"
|
|
154
|
-
return 1
|
|
155
|
-
fi
|
|
156
|
-
|
|
157
|
-
# Check if audio-effects.cfg exists
|
|
158
|
-
if [[ ! -f "$audio_effects_cfg" ]]; then
|
|
159
|
-
echo "❌ Error: audio-effects.cfg not found at $audio_effects_cfg"
|
|
160
|
-
return 1
|
|
161
|
-
fi
|
|
162
|
-
|
|
163
|
-
# Update the default entry in audio-effects.cfg
|
|
164
|
-
# Preserve the sox effects and volume, just update the background file
|
|
165
|
-
local temp_file
|
|
166
|
-
temp_file=$(mktemp)
|
|
167
|
-
|
|
168
|
-
if grep -q "^default|" "$audio_effects_cfg"; then
|
|
169
|
-
# Replace existing default entry - preserve effects and volume
|
|
170
|
-
awk -F'|' -v track="$track" '
|
|
171
|
-
/^default\|/ {
|
|
172
|
-
print $1 "|" $2 "|" track "|" $4
|
|
173
|
-
next
|
|
174
|
-
}
|
|
175
|
-
{ print }
|
|
176
|
-
' "$audio_effects_cfg" > "$temp_file"
|
|
177
|
-
|
|
178
|
-
mv "$temp_file" "$audio_effects_cfg"
|
|
179
|
-
|
|
180
|
-
# Auto-enable background music if it was disabled
|
|
181
|
-
if ! is_enabled; then
|
|
182
|
-
set_enabled "true"
|
|
183
|
-
echo "✅ Default background music set to: $track"
|
|
184
|
-
echo "🎵 Background music enabled automatically"
|
|
185
|
-
else
|
|
186
|
-
echo "✅ Default background music set to: $track"
|
|
187
|
-
fi
|
|
188
|
-
else
|
|
189
|
-
echo "❌ Error: No default entry found in audio-effects.cfg"
|
|
190
|
-
return 1
|
|
191
|
-
fi
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
# @function show_status
|
|
195
|
-
# @intent Display current background music status
|
|
196
|
-
show_status() {
|
|
197
|
-
echo "🎵 Background Music Status"
|
|
198
|
-
echo "=========================="
|
|
199
|
-
|
|
200
|
-
if is_enabled; then
|
|
201
|
-
echo "Status: ✅ ENABLED"
|
|
202
|
-
else
|
|
203
|
-
echo "Status: 🔇 DISABLED"
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
echo "Volume: $(get_volume) ($(echo "scale=0; $(get_volume) * 100 / 1" | bc -l 2>/dev/null || echo "?")%)"
|
|
207
|
-
|
|
208
|
-
# Show default track
|
|
209
|
-
local default_track
|
|
210
|
-
default_track=$(get_default_track)
|
|
211
|
-
if [[ -n "$default_track" ]]; then
|
|
212
|
-
echo "Default Track: $default_track"
|
|
213
|
-
else
|
|
214
|
-
echo "Default Track: (none)"
|
|
215
|
-
fi
|
|
216
|
-
|
|
217
|
-
# Check for background files
|
|
218
|
-
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
219
|
-
if [[ -d "$bg_dir" ]]; then
|
|
220
|
-
local count
|
|
221
|
-
count=$(find "$bg_dir" -type f \( -name "*.mp3" -o -name "*.wav" -o -name "*.ogg" \) 2>/dev/null | wc -l)
|
|
222
|
-
echo "Tracks: $count audio file(s) in tracks folder"
|
|
223
|
-
else
|
|
224
|
-
echo "Tracks: No tracks folder found"
|
|
225
|
-
fi
|
|
226
|
-
|
|
227
|
-
# Check dependencies
|
|
228
|
-
echo ""
|
|
229
|
-
echo "Dependencies:"
|
|
230
|
-
if command -v sox &> /dev/null; then
|
|
231
|
-
echo " sox: ✅ installed"
|
|
232
|
-
else
|
|
233
|
-
echo " sox: ❌ not installed (needed for effects)"
|
|
234
|
-
fi
|
|
235
|
-
if command -v ffmpeg &> /dev/null; then
|
|
236
|
-
echo " ffmpeg: ✅ installed"
|
|
237
|
-
else
|
|
238
|
-
echo " ffmpeg: ❌ not installed (needed for mixing)"
|
|
239
|
-
fi
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
# Set background music for a specific agent
|
|
243
|
-
set_agent_track() {
|
|
244
|
-
local agent="$1"
|
|
245
|
-
local track="$2"
|
|
246
|
-
local config_file="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
247
|
-
|
|
248
|
-
if [[ -z "$agent" ]] || [[ -z "$track" ]]; then
|
|
249
|
-
echo "❌ Error: Agent name and track required"
|
|
250
|
-
echo "Usage: $0 set-agent AGENT_NAME TRACK_NAME"
|
|
251
|
-
exit 1
|
|
252
|
-
fi
|
|
253
|
-
|
|
254
|
-
# Verify track exists
|
|
255
|
-
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
256
|
-
if [[ ! -f "$bg_dir/$track" ]]; then
|
|
257
|
-
echo "❌ Error: Track not found: $track"
|
|
258
|
-
echo "Run '$0 list' to see available tracks"
|
|
259
|
-
exit 1
|
|
260
|
-
fi
|
|
261
|
-
|
|
262
|
-
# Update or add agent config line
|
|
263
|
-
if grep -q "^${agent}|" "$config_file" 2>/dev/null; then
|
|
264
|
-
# Agent exists - update track (preserve effects and volume)
|
|
265
|
-
local temp_file
|
|
266
|
-
temp_file=$(mktemp)
|
|
267
|
-
awk -F'|' -v agent="$agent" -v track="$track" '
|
|
268
|
-
$1 == agent {
|
|
269
|
-
print $1 "|" $2 "|" track "|" $4
|
|
270
|
-
next
|
|
271
|
-
}
|
|
272
|
-
{ print }
|
|
273
|
-
' "$config_file" > "$temp_file"
|
|
274
|
-
mv "$temp_file" "$config_file"
|
|
275
|
-
echo "✅ Updated background music for $agent: $track"
|
|
276
|
-
else
|
|
277
|
-
# Agent doesn't exist - add new line with track
|
|
278
|
-
echo "${agent}||${track}|0.30" >> "$config_file"
|
|
279
|
-
echo "✅ Added background music for $agent: $track"
|
|
280
|
-
fi
|
|
281
|
-
|
|
282
|
-
# Auto-enable background music if it was disabled
|
|
283
|
-
if ! is_enabled; then
|
|
284
|
-
set_enabled "true"
|
|
285
|
-
echo "🎵 Background music enabled automatically"
|
|
286
|
-
fi
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
# Set background music for all agents
|
|
290
|
-
set_all_agents_track() {
|
|
291
|
-
local track="$1"
|
|
292
|
-
local config_file="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
293
|
-
|
|
294
|
-
if [[ -z "$track" ]]; then
|
|
295
|
-
echo "❌ Error: Track name required"
|
|
296
|
-
echo "Usage: $0 set-all TRACK_NAME"
|
|
297
|
-
exit 1
|
|
298
|
-
fi
|
|
299
|
-
|
|
300
|
-
# Verify track exists
|
|
301
|
-
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
302
|
-
if [[ ! -f "$bg_dir/$track" ]]; then
|
|
303
|
-
echo "❌ Error: Track not found: $track"
|
|
304
|
-
echo "Run '$0 list' to see available tracks"
|
|
305
|
-
exit 1
|
|
306
|
-
fi
|
|
307
|
-
|
|
308
|
-
# Update all non-comment, non-empty, non-default lines
|
|
309
|
-
local temp_file
|
|
310
|
-
temp_file=$(mktemp)
|
|
311
|
-
local count=0
|
|
312
|
-
|
|
313
|
-
awk -F'|' -v track="$track" '
|
|
314
|
-
# Skip comments and empty lines
|
|
315
|
-
/^#/ || /^[[:space:]]*$/ { print; next }
|
|
316
|
-
|
|
317
|
-
# Skip only _party_mode (but UPDATE default!)
|
|
318
|
-
$1 == "_party_mode" { print; next }
|
|
319
|
-
|
|
320
|
-
# Update all agent lines including default
|
|
321
|
-
{
|
|
322
|
-
print $1 "|" $2 "|" track "|" $4
|
|
323
|
-
}
|
|
324
|
-
' "$config_file" > "$temp_file"
|
|
325
|
-
|
|
326
|
-
# Count updated agents (including default)
|
|
327
|
-
count=$(grep -v '^#' "$config_file" | grep -v '^[[:space:]]*$' | grep -v '^_party_mode|' | wc -l)
|
|
328
|
-
|
|
329
|
-
mv "$temp_file" "$config_file"
|
|
330
|
-
echo "✅ Updated background music for $count agents: $track"
|
|
331
|
-
|
|
332
|
-
# Auto-enable background music if it was disabled
|
|
333
|
-
if ! is_enabled; then
|
|
334
|
-
set_enabled "true"
|
|
335
|
-
echo "🎵 Background music enabled automatically"
|
|
336
|
-
fi
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
# Main command handler
|
|
340
|
-
case "${1:-status}" in
|
|
341
|
-
status|"")
|
|
342
|
-
show_status
|
|
343
|
-
;;
|
|
344
|
-
on|enable|true)
|
|
345
|
-
set_enabled "true"
|
|
346
|
-
echo "🎵 Background music ENABLED at $(get_volume) volume"
|
|
347
|
-
;;
|
|
348
|
-
off|disable|false)
|
|
349
|
-
set_enabled "false"
|
|
350
|
-
echo "🔇 Background music DISABLED"
|
|
351
|
-
;;
|
|
352
|
-
volume)
|
|
353
|
-
if [[ -z "${2:-}" ]]; then
|
|
354
|
-
echo "Current volume: $(get_volume)"
|
|
355
|
-
else
|
|
356
|
-
set_volume "$2"
|
|
357
|
-
echo "🎵 Background music volume set to $2"
|
|
358
|
-
fi
|
|
359
|
-
;;
|
|
360
|
-
list)
|
|
361
|
-
list_tracks
|
|
362
|
-
;;
|
|
363
|
-
set-default)
|
|
364
|
-
if [[ -z "${2:-}" ]]; then
|
|
365
|
-
echo "❌ Error: No track name provided"
|
|
366
|
-
echo "Usage: $0 set-default TRACK_NAME"
|
|
367
|
-
echo "Run '$0 list' to see available tracks"
|
|
368
|
-
exit 1
|
|
369
|
-
fi
|
|
370
|
-
set_default_track "$2"
|
|
371
|
-
;;
|
|
372
|
-
set-agent)
|
|
373
|
-
if [[ -z "${2:-}" ]] || [[ -z "${3:-}" ]]; then
|
|
374
|
-
echo "❌ Error: Agent name and track required"
|
|
375
|
-
echo "Usage: $0 set-agent AGENT_NAME TRACK_NAME"
|
|
376
|
-
echo "Run '$0 list' to see available tracks"
|
|
377
|
-
exit 1
|
|
378
|
-
fi
|
|
379
|
-
set_agent_track "$2" "$3"
|
|
380
|
-
;;
|
|
381
|
-
set-all)
|
|
382
|
-
if [[ -z "${2:-}" ]]; then
|
|
383
|
-
echo "❌ Error: Track name required"
|
|
384
|
-
echo "Usage: $0 set-all TRACK_NAME"
|
|
385
|
-
echo "Run '$0 list' to see available tracks"
|
|
386
|
-
exit 1
|
|
387
|
-
fi
|
|
388
|
-
set_all_agents_track "$2"
|
|
389
|
-
;;
|
|
390
|
-
get-enabled)
|
|
391
|
-
if is_enabled; then
|
|
392
|
-
echo "true"
|
|
393
|
-
else
|
|
394
|
-
echo "false"
|
|
395
|
-
fi
|
|
396
|
-
;;
|
|
397
|
-
get-volume)
|
|
398
|
-
get_volume
|
|
399
|
-
;;
|
|
400
|
-
*)
|
|
401
|
-
echo "Usage: $0 {status|on|off|volume [X]|list|set-default TRACK|set-agent AGENT TRACK|set-all TRACK|get-enabled|get-volume}"
|
|
402
|
-
exit 1
|
|
403
|
-
;;
|
|
404
|
-
esac
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/background-music-manager.sh
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes - Background Music Manager
|
|
6
|
+
# Manages background music settings for TTS
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# background-music-manager.sh status - Show current status
|
|
10
|
+
# background-music-manager.sh on - Enable background music
|
|
11
|
+
# background-music-manager.sh off - Disable background music
|
|
12
|
+
# background-music-manager.sh volume X - Set volume (0.0-1.0)
|
|
13
|
+
# background-music-manager.sh list - List all pre-packaged background music
|
|
14
|
+
# background-music-manager.sh set-default TRACK - Set default background music
|
|
15
|
+
# background-music-manager.sh get-enabled - Returns "true" or "false"
|
|
16
|
+
# background-music-manager.sh get-volume - Returns current volume
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
export LC_ALL=C
|
|
21
|
+
|
|
22
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
23
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
24
|
+
|
|
25
|
+
# Config file location
|
|
26
|
+
CONFIG_DIR="$SCRIPT_DIR/../config"
|
|
27
|
+
ENABLED_FILE="$CONFIG_DIR/background-music-enabled.txt"
|
|
28
|
+
VOLUME_FILE="$CONFIG_DIR/background-music-volume.txt"
|
|
29
|
+
|
|
30
|
+
# Defaults
|
|
31
|
+
DEFAULT_VOLUME="0.34"
|
|
32
|
+
|
|
33
|
+
# Ensure config directory exists
|
|
34
|
+
mkdir -p "$CONFIG_DIR"
|
|
35
|
+
|
|
36
|
+
# @function is_enabled
|
|
37
|
+
# @intent Check if background music is enabled
|
|
38
|
+
# @returns 0 if enabled, 1 if disabled
|
|
39
|
+
is_enabled() {
|
|
40
|
+
if [[ -f "$ENABLED_FILE" ]]; then
|
|
41
|
+
local status
|
|
42
|
+
status=$(cat "$ENABLED_FILE" 2>/dev/null | tr -d '[:space:]')
|
|
43
|
+
[[ "$status" == "true" || "$status" == "on" || "$status" == "1" ]]
|
|
44
|
+
else
|
|
45
|
+
# Default: disabled
|
|
46
|
+
return 1
|
|
47
|
+
fi
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# @function get_volume
|
|
51
|
+
# @intent Get current volume setting
|
|
52
|
+
# @returns Volume value (0.0-1.0)
|
|
53
|
+
get_volume() {
|
|
54
|
+
if [[ -f "$VOLUME_FILE" ]]; then
|
|
55
|
+
cat "$VOLUME_FILE" 2>/dev/null | tr -d '[:space:]'
|
|
56
|
+
else
|
|
57
|
+
echo "$DEFAULT_VOLUME"
|
|
58
|
+
fi
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# @function set_enabled
|
|
62
|
+
# @intent Enable or disable background music
|
|
63
|
+
# @param $1 "true" or "false"
|
|
64
|
+
set_enabled() {
|
|
65
|
+
local value="$1"
|
|
66
|
+
echo "$value" > "$ENABLED_FILE"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# @function set_volume
|
|
70
|
+
# @intent Set background music volume
|
|
71
|
+
# @param $1 Volume value (0.0-1.0)
|
|
72
|
+
set_volume() {
|
|
73
|
+
local value="$1"
|
|
74
|
+
|
|
75
|
+
# Validate it's a number between 0 and 1
|
|
76
|
+
if ! [[ "$value" =~ ^[0-9]*\.?[0-9]+$ ]]; then
|
|
77
|
+
echo "Error: Volume must be a number between 0.0 and 1.0" >&2
|
|
78
|
+
return 1
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Check range using bc
|
|
82
|
+
if command -v bc &> /dev/null; then
|
|
83
|
+
if (( $(echo "$value < 0" | bc -l) )) || (( $(echo "$value > 1" | bc -l) )); then
|
|
84
|
+
echo "Error: Volume must be between 0.0 and 1.0" >&2
|
|
85
|
+
return 1
|
|
86
|
+
fi
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
echo "$value" > "$VOLUME_FILE"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# @function list_tracks
|
|
93
|
+
# @intent List all pre-packaged background music files
|
|
94
|
+
list_tracks() {
|
|
95
|
+
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
96
|
+
|
|
97
|
+
if [[ ! -d "$bg_dir" ]]; then
|
|
98
|
+
echo "❌ No tracks folder found at $bg_dir"
|
|
99
|
+
return 1
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
echo "🎵 Available Background Music Tracks"
|
|
103
|
+
echo "===================================="
|
|
104
|
+
echo ""
|
|
105
|
+
|
|
106
|
+
local count=0
|
|
107
|
+
while IFS= read -r -d '' file; do
|
|
108
|
+
local basename
|
|
109
|
+
basename=$(basename "$file")
|
|
110
|
+
count=$((count + 1))
|
|
111
|
+
printf "%2d. %s\n" "$count" "$basename"
|
|
112
|
+
done < <(find "$bg_dir" -type f \( -name "*.mp3" -o -name "*.wav" -o -name "*.ogg" \) -print0 2>/dev/null | sort -z)
|
|
113
|
+
|
|
114
|
+
if [[ $count -eq 0 ]]; then
|
|
115
|
+
echo "No audio files found in tracks folder"
|
|
116
|
+
else
|
|
117
|
+
echo ""
|
|
118
|
+
echo "Total: $count track(s)"
|
|
119
|
+
fi
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
# @function get_default_track
|
|
123
|
+
# @intent Get the current default background music track
|
|
124
|
+
get_default_track() {
|
|
125
|
+
local audio_effects_cfg="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
126
|
+
|
|
127
|
+
if [[ ! -f "$audio_effects_cfg" ]]; then
|
|
128
|
+
echo ""
|
|
129
|
+
return
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# Extract the background file from the default entry
|
|
133
|
+
grep "^default|" "$audio_effects_cfg" 2>/dev/null | cut -d'|' -f3 || echo ""
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
# @function set_default_track
|
|
137
|
+
# @intent Set the default background music track
|
|
138
|
+
# @param $1 Track filename
|
|
139
|
+
set_default_track() {
|
|
140
|
+
local track="$1"
|
|
141
|
+
local audio_effects_cfg="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
142
|
+
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
143
|
+
|
|
144
|
+
if [[ -z "$track" ]]; then
|
|
145
|
+
echo "❌ Error: No track name provided"
|
|
146
|
+
echo "Usage: $0 set-default TRACK_NAME"
|
|
147
|
+
return 1
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Check if track exists
|
|
151
|
+
if [[ ! -f "$bg_dir/$track" ]]; then
|
|
152
|
+
echo "❌ Error: Track '$track' not found in tracks folder"
|
|
153
|
+
echo "Run '$0 list' to see available tracks"
|
|
154
|
+
return 1
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
# Check if audio-effects.cfg exists
|
|
158
|
+
if [[ ! -f "$audio_effects_cfg" ]]; then
|
|
159
|
+
echo "❌ Error: audio-effects.cfg not found at $audio_effects_cfg"
|
|
160
|
+
return 1
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# Update the default entry in audio-effects.cfg
|
|
164
|
+
# Preserve the sox effects and volume, just update the background file
|
|
165
|
+
local temp_file
|
|
166
|
+
temp_file=$(mktemp)
|
|
167
|
+
|
|
168
|
+
if grep -q "^default|" "$audio_effects_cfg"; then
|
|
169
|
+
# Replace existing default entry - preserve effects and volume
|
|
170
|
+
awk -F'|' -v track="$track" '
|
|
171
|
+
/^default\|/ {
|
|
172
|
+
print $1 "|" $2 "|" track "|" $4
|
|
173
|
+
next
|
|
174
|
+
}
|
|
175
|
+
{ print }
|
|
176
|
+
' "$audio_effects_cfg" > "$temp_file"
|
|
177
|
+
|
|
178
|
+
mv "$temp_file" "$audio_effects_cfg"
|
|
179
|
+
|
|
180
|
+
# Auto-enable background music if it was disabled
|
|
181
|
+
if ! is_enabled; then
|
|
182
|
+
set_enabled "true"
|
|
183
|
+
echo "✅ Default background music set to: $track"
|
|
184
|
+
echo "🎵 Background music enabled automatically"
|
|
185
|
+
else
|
|
186
|
+
echo "✅ Default background music set to: $track"
|
|
187
|
+
fi
|
|
188
|
+
else
|
|
189
|
+
echo "❌ Error: No default entry found in audio-effects.cfg"
|
|
190
|
+
return 1
|
|
191
|
+
fi
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
# @function show_status
|
|
195
|
+
# @intent Display current background music status
|
|
196
|
+
show_status() {
|
|
197
|
+
echo "🎵 Background Music Status"
|
|
198
|
+
echo "=========================="
|
|
199
|
+
|
|
200
|
+
if is_enabled; then
|
|
201
|
+
echo "Status: ✅ ENABLED"
|
|
202
|
+
else
|
|
203
|
+
echo "Status: 🔇 DISABLED"
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
echo "Volume: $(get_volume) ($(echo "scale=0; $(get_volume) * 100 / 1" | bc -l 2>/dev/null || echo "?")%)"
|
|
207
|
+
|
|
208
|
+
# Show default track
|
|
209
|
+
local default_track
|
|
210
|
+
default_track=$(get_default_track)
|
|
211
|
+
if [[ -n "$default_track" ]]; then
|
|
212
|
+
echo "Default Track: $default_track"
|
|
213
|
+
else
|
|
214
|
+
echo "Default Track: (none)"
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
# Check for background files
|
|
218
|
+
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
219
|
+
if [[ -d "$bg_dir" ]]; then
|
|
220
|
+
local count
|
|
221
|
+
count=$(find "$bg_dir" -type f \( -name "*.mp3" -o -name "*.wav" -o -name "*.ogg" \) 2>/dev/null | wc -l)
|
|
222
|
+
echo "Tracks: $count audio file(s) in tracks folder"
|
|
223
|
+
else
|
|
224
|
+
echo "Tracks: No tracks folder found"
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# Check dependencies
|
|
228
|
+
echo ""
|
|
229
|
+
echo "Dependencies:"
|
|
230
|
+
if command -v sox &> /dev/null; then
|
|
231
|
+
echo " sox: ✅ installed"
|
|
232
|
+
else
|
|
233
|
+
echo " sox: ❌ not installed (needed for effects)"
|
|
234
|
+
fi
|
|
235
|
+
if command -v ffmpeg &> /dev/null; then
|
|
236
|
+
echo " ffmpeg: ✅ installed"
|
|
237
|
+
else
|
|
238
|
+
echo " ffmpeg: ❌ not installed (needed for mixing)"
|
|
239
|
+
fi
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
# Set background music for a specific agent
|
|
243
|
+
set_agent_track() {
|
|
244
|
+
local agent="$1"
|
|
245
|
+
local track="$2"
|
|
246
|
+
local config_file="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
247
|
+
|
|
248
|
+
if [[ -z "$agent" ]] || [[ -z "$track" ]]; then
|
|
249
|
+
echo "❌ Error: Agent name and track required"
|
|
250
|
+
echo "Usage: $0 set-agent AGENT_NAME TRACK_NAME"
|
|
251
|
+
exit 1
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
# Verify track exists
|
|
255
|
+
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
256
|
+
if [[ ! -f "$bg_dir/$track" ]]; then
|
|
257
|
+
echo "❌ Error: Track not found: $track"
|
|
258
|
+
echo "Run '$0 list' to see available tracks"
|
|
259
|
+
exit 1
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
# Update or add agent config line
|
|
263
|
+
if grep -q "^${agent}|" "$config_file" 2>/dev/null; then
|
|
264
|
+
# Agent exists - update track (preserve effects and volume)
|
|
265
|
+
local temp_file
|
|
266
|
+
temp_file=$(mktemp)
|
|
267
|
+
awk -F'|' -v agent="$agent" -v track="$track" '
|
|
268
|
+
$1 == agent {
|
|
269
|
+
print $1 "|" $2 "|" track "|" $4
|
|
270
|
+
next
|
|
271
|
+
}
|
|
272
|
+
{ print }
|
|
273
|
+
' "$config_file" > "$temp_file"
|
|
274
|
+
mv "$temp_file" "$config_file"
|
|
275
|
+
echo "✅ Updated background music for $agent: $track"
|
|
276
|
+
else
|
|
277
|
+
# Agent doesn't exist - add new line with track
|
|
278
|
+
echo "${agent}||${track}|0.30" >> "$config_file"
|
|
279
|
+
echo "✅ Added background music for $agent: $track"
|
|
280
|
+
fi
|
|
281
|
+
|
|
282
|
+
# Auto-enable background music if it was disabled
|
|
283
|
+
if ! is_enabled; then
|
|
284
|
+
set_enabled "true"
|
|
285
|
+
echo "🎵 Background music enabled automatically"
|
|
286
|
+
fi
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
# Set background music for all agents
|
|
290
|
+
set_all_agents_track() {
|
|
291
|
+
local track="$1"
|
|
292
|
+
local config_file="$SCRIPT_DIR/../config/audio-effects.cfg"
|
|
293
|
+
|
|
294
|
+
if [[ -z "$track" ]]; then
|
|
295
|
+
echo "❌ Error: Track name required"
|
|
296
|
+
echo "Usage: $0 set-all TRACK_NAME"
|
|
297
|
+
exit 1
|
|
298
|
+
fi
|
|
299
|
+
|
|
300
|
+
# Verify track exists
|
|
301
|
+
local bg_dir="$SCRIPT_DIR/../audio/tracks"
|
|
302
|
+
if [[ ! -f "$bg_dir/$track" ]]; then
|
|
303
|
+
echo "❌ Error: Track not found: $track"
|
|
304
|
+
echo "Run '$0 list' to see available tracks"
|
|
305
|
+
exit 1
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
# Update all non-comment, non-empty, non-default lines
|
|
309
|
+
local temp_file
|
|
310
|
+
temp_file=$(mktemp)
|
|
311
|
+
local count=0
|
|
312
|
+
|
|
313
|
+
awk -F'|' -v track="$track" '
|
|
314
|
+
# Skip comments and empty lines
|
|
315
|
+
/^#/ || /^[[:space:]]*$/ { print; next }
|
|
316
|
+
|
|
317
|
+
# Skip only _party_mode (but UPDATE default!)
|
|
318
|
+
$1 == "_party_mode" { print; next }
|
|
319
|
+
|
|
320
|
+
# Update all agent lines including default
|
|
321
|
+
{
|
|
322
|
+
print $1 "|" $2 "|" track "|" $4
|
|
323
|
+
}
|
|
324
|
+
' "$config_file" > "$temp_file"
|
|
325
|
+
|
|
326
|
+
# Count updated agents (including default)
|
|
327
|
+
count=$(grep -v '^#' "$config_file" | grep -v '^[[:space:]]*$' | grep -v '^_party_mode|' | wc -l)
|
|
328
|
+
|
|
329
|
+
mv "$temp_file" "$config_file"
|
|
330
|
+
echo "✅ Updated background music for $count agents: $track"
|
|
331
|
+
|
|
332
|
+
# Auto-enable background music if it was disabled
|
|
333
|
+
if ! is_enabled; then
|
|
334
|
+
set_enabled "true"
|
|
335
|
+
echo "🎵 Background music enabled automatically"
|
|
336
|
+
fi
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
# Main command handler
|
|
340
|
+
case "${1:-status}" in
|
|
341
|
+
status|"")
|
|
342
|
+
show_status
|
|
343
|
+
;;
|
|
344
|
+
on|enable|true)
|
|
345
|
+
set_enabled "true"
|
|
346
|
+
echo "🎵 Background music ENABLED at $(get_volume) volume"
|
|
347
|
+
;;
|
|
348
|
+
off|disable|false)
|
|
349
|
+
set_enabled "false"
|
|
350
|
+
echo "🔇 Background music DISABLED"
|
|
351
|
+
;;
|
|
352
|
+
volume)
|
|
353
|
+
if [[ -z "${2:-}" ]]; then
|
|
354
|
+
echo "Current volume: $(get_volume)"
|
|
355
|
+
else
|
|
356
|
+
set_volume "$2"
|
|
357
|
+
echo "🎵 Background music volume set to $2"
|
|
358
|
+
fi
|
|
359
|
+
;;
|
|
360
|
+
list)
|
|
361
|
+
list_tracks
|
|
362
|
+
;;
|
|
363
|
+
set-default)
|
|
364
|
+
if [[ -z "${2:-}" ]]; then
|
|
365
|
+
echo "❌ Error: No track name provided"
|
|
366
|
+
echo "Usage: $0 set-default TRACK_NAME"
|
|
367
|
+
echo "Run '$0 list' to see available tracks"
|
|
368
|
+
exit 1
|
|
369
|
+
fi
|
|
370
|
+
set_default_track "$2"
|
|
371
|
+
;;
|
|
372
|
+
set-agent)
|
|
373
|
+
if [[ -z "${2:-}" ]] || [[ -z "${3:-}" ]]; then
|
|
374
|
+
echo "❌ Error: Agent name and track required"
|
|
375
|
+
echo "Usage: $0 set-agent AGENT_NAME TRACK_NAME"
|
|
376
|
+
echo "Run '$0 list' to see available tracks"
|
|
377
|
+
exit 1
|
|
378
|
+
fi
|
|
379
|
+
set_agent_track "$2" "$3"
|
|
380
|
+
;;
|
|
381
|
+
set-all)
|
|
382
|
+
if [[ -z "${2:-}" ]]; then
|
|
383
|
+
echo "❌ Error: Track name required"
|
|
384
|
+
echo "Usage: $0 set-all TRACK_NAME"
|
|
385
|
+
echo "Run '$0 list' to see available tracks"
|
|
386
|
+
exit 1
|
|
387
|
+
fi
|
|
388
|
+
set_all_agents_track "$2"
|
|
389
|
+
;;
|
|
390
|
+
get-enabled)
|
|
391
|
+
if is_enabled; then
|
|
392
|
+
echo "true"
|
|
393
|
+
else
|
|
394
|
+
echo "false"
|
|
395
|
+
fi
|
|
396
|
+
;;
|
|
397
|
+
get-volume)
|
|
398
|
+
get_volume
|
|
399
|
+
;;
|
|
400
|
+
*)
|
|
401
|
+
echo "Usage: $0 {status|on|off|volume [X]|list|set-default TRACK|set-agent AGENT TRACK|set-all TRACK|get-enabled|get-volume}"
|
|
402
|
+
exit 1
|
|
403
|
+
;;
|
|
404
|
+
esac
|