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
@@ -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