agentvibes 4.2.0 → 4.4.0
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/.agentvibes/bmad/bmad-voices.md +69 -69
- package/.agentvibes/config.json +12 -0
- package/.claude/activation-instructions +54 -54
- package/.claude/audio/tracks/README.md +52 -52
- package/.claude/commands/agent-vibes/add.md +21 -21
- package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
- package/.claude/commands/agent-vibes/agent.md +79 -79
- package/.claude/commands/agent-vibes/background-music.md +111 -111
- package/.claude/commands/agent-vibes/bmad.md +198 -198
- package/.claude/commands/agent-vibes/clean.md +18 -18
- package/.claude/commands/agent-vibes/cleanup.md +18 -18
- package/.claude/commands/agent-vibes/commands.json +145 -145
- package/.claude/commands/agent-vibes/effects.md +97 -97
- package/.claude/commands/agent-vibes/get.md +9 -9
- package/.claude/commands/agent-vibes/hide.md +91 -91
- package/.claude/commands/agent-vibes/language.md +23 -23
- package/.claude/commands/agent-vibes/learn.md +67 -67
- package/.claude/commands/agent-vibes/list.md +13 -13
- package/.claude/commands/agent-vibes/mute.md +37 -37
- package/.claude/commands/agent-vibes/preview.md +17 -17
- package/.claude/commands/agent-vibes/provider.md +68 -68
- package/.claude/commands/agent-vibes/replay-target.md +14 -14
- package/.claude/commands/agent-vibes/sample.md +12 -12
- package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
- package/.claude/commands/agent-vibes/set-pretext.md +65 -65
- package/.claude/commands/agent-vibes/set-speed.md +41 -41
- package/.claude/commands/agent-vibes/show.md +84 -84
- package/.claude/commands/agent-vibes/switch.md +87 -87
- package/.claude/commands/agent-vibes/target-voice.md +26 -26
- package/.claude/commands/agent-vibes/target.md +30 -30
- package/.claude/commands/agent-vibes/translate.md +68 -68
- package/.claude/commands/agent-vibes/unmute.md +45 -45
- package/.claude/commands/agent-vibes/verbosity.md +89 -89
- package/.claude/commands/agent-vibes/whoami.md +7 -7
- package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
- package/.claude/commands/agent-vibes-rdp.md +24 -24
- package/.claude/config/agentvibes.json +1 -0
- package/.claude/config/audio-effects.cfg +2 -2
- package/.claude/config/audio-effects.cfg.sample +52 -52
- package/.claude/config/background-music-volume.txt +1 -0
- package/.claude/config/intro-text.txt +1 -0
- package/.claude/config/piper-speech-rate.txt +4 -0
- package/.claude/config/piper-target-speech-rate.txt +1 -0
- package/.claude/config/reverb-level.txt +1 -0
- package/.claude/config/tts-speech-rate.txt +4 -0
- package/.claude/config/tts-target-speech-rate.txt +1 -0
- package/.claude/docs/TERMUX_SETUP.md +408 -408
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/README-TTS-QUEUE.md +135 -135
- package/.claude/hooks/audio-cache-utils.sh +246 -246
- package/.claude/hooks/audio-processor.sh +433 -433
- package/.claude/hooks/background-music-manager.sh +404 -404
- package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
- package/.claude/hooks/bmad-speak.sh +269 -269
- 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-download-voices.sh +225 -225
- package/.claude/hooks/piper-installer.sh +292 -292
- package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
- package/.claude/hooks/piper-voice-manager.sh +24 -3
- package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
- package/.claude/hooks/play-tts-enhanced.sh +105 -105
- package/.claude/hooks/play-tts-macos.sh +368 -368
- package/.claude/hooks/play-tts-piper.sh +679 -679
- package/.claude/hooks/play-tts-soprano.sh +356 -356
- package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
- package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
- package/.claude/hooks/play-tts.sh +301 -301
- 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/requirements.txt +6 -6
- package/.claude/hooks/sentiment-manager.sh +201 -201
- package/.claude/hooks/session-start-tts.sh +81 -81
- package/.claude/hooks/soprano-gradio-synth.py +139 -139
- 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/translator.py +237 -237
- package/.claude/hooks/tts-queue-worker.sh +145 -145
- package/.claude/hooks/tts-queue.sh +165 -165
- package/.claude/hooks/verbosity-manager.sh +178 -178
- package/.claude/hooks/voice-manager.sh +548 -548
- package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
- package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
- package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
- package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
- package/.claude/hooks-windows/effects-manager.ps1 +294 -0
- package/.claude/hooks-windows/language-manager.ps1 +193 -0
- package/.claude/hooks-windows/learn-manager.ps1 +241 -0
- package/.claude/hooks-windows/personality-manager.ps1 +266 -0
- package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
- package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
- package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
- package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
- package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
- package/.claude/hooks-windows/play-tts.ps1 +344 -266
- package/.claude/hooks-windows/provider-manager.ps1 +29 -10
- package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
- package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
- package/.claude/hooks-windows/speed-manager.ps1 +166 -0
- package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
- package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
- package/.claude/output-styles/agent-vibes.md +202 -202
- package/.claude/personalities/angry.md +14 -14
- package/.claude/personalities/annoying.md +14 -14
- package/.claude/personalities/crass.md +14 -14
- package/.claude/personalities/dramatic.md +14 -14
- package/.claude/personalities/dry-humor.md +50 -50
- package/.claude/personalities/flirty.md +20 -20
- package/.claude/personalities/funny.md +14 -14
- package/.claude/personalities/grandpa.md +32 -32
- package/.claude/personalities/millennial.md +14 -14
- package/.claude/personalities/moody.md +14 -14
- package/.claude/personalities/normal.md +16 -16
- package/.claude/personalities/pirate.md +14 -14
- package/.claude/personalities/poetic.md +14 -14
- package/.claude/personalities/professional.md +14 -14
- package/.claude/personalities/rapper.md +55 -55
- package/.claude/personalities/robot.md +14 -14
- package/.claude/personalities/sarcastic.md +38 -38
- package/.claude/personalities/sassy.md +14 -14
- package/.claude/personalities/surfer-dude.md +14 -14
- package/.claude/personalities/zen.md +14 -14
- package/.claude/settings.json +15 -15
- package/.claude/verbosity.txt +1 -1
- package/.clawdbot/README.md +105 -105
- package/.clawdbot/skill/SKILL.md +241 -241
- package/.mcp.json +12 -0
- package/CLAUDE.md +170 -170
- package/README.md +2029 -2007
- package/RELEASE_NOTES.md +1310 -1203
- package/WINDOWS-SETUP.md +208 -208
- package/bin/agent-vibes +39 -39
- package/bin/agentvibes-voice-browser.js +1840 -1840
- package/bin/agentvibes.js +48 -2
- package/bin/mcp-server.js +121 -121
- package/bin/mcp-server.sh +206 -206
- package/bin/test-bmad-pr +78 -78
- package/mcp-server/QUICK_START.md +203 -203
- package/mcp-server/README.md +345 -345
- package/mcp-server/WINDOWS_SETUP.md +260 -260
- package/mcp-server/docs/troubleshooting-audio.md +313 -313
- package/mcp-server/examples/claude_desktop_config.json +11 -11
- package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
- package/mcp-server/examples/custom_instructions.md +169 -169
- package/mcp-server/install-deps.js +130 -130
- package/mcp-server/pyproject.toml +52 -52
- package/mcp-server/requirements.txt +2 -2
- package/mcp-server/server.py +1465 -1453
- package/mcp-server/test_server.py +395 -395
- package/mcp-server/test_windows_script_parity.py +336 -0
- package/package.json +110 -110
- package/setup-windows.ps1 +815 -815
- package/src/bmad-detector.js +71 -71
- package/src/cli/list-personalities.js +110 -110
- package/src/cli/list-voices.js +114 -114
- package/src/commands/bmad-voices.js +394 -394
- package/src/commands/install-mcp.js +476 -476
- package/src/console/app.js +824 -824
- package/src/console/audio-env.js +20 -1
- package/src/console/brand-colors.js +13 -13
- package/src/console/constants/personalities.js +44 -44
- package/src/console/footer-config.js +50 -50
- package/src/console/modals/modal-overlay.js +247 -247
- package/src/console/navigation.js +62 -62
- package/src/console/tabs/agents-tab.js +1684 -1516
- package/src/console/tabs/help-tab.js +261 -261
- package/src/console/tabs/install-tab.js +1007 -991
- package/src/console/tabs/music-tab.js +22 -8
- package/src/console/tabs/placeholder-tab.js +53 -53
- package/src/console/tabs/readme-tab.js +267 -267
- package/src/console/tabs/receiver-tab.js +1472 -1212
- package/src/console/tabs/settings-tab.js +152 -79
- package/src/console/tabs/voices-tab.js +100 -21
- package/src/console/widgets/destroy-list.js +25 -25
- package/src/console/widgets/format-utils.js +89 -89
- package/src/console/widgets/notice.js +55 -55
- package/src/console/widgets/personality-picker.js +185 -185
- package/src/console/widgets/reverb-picker.js +94 -94
- package/src/console/widgets/track-picker.js +285 -285
- package/src/installer/music-file-input.js +304 -304
- package/src/installer.js +5882 -5829
- package/src/services/agent-voice-store.js +423 -423
- package/src/services/config-service.js +264 -264
- package/src/services/navigation-service.js +123 -123
- package/src/services/provider-service.js +132 -132
- package/src/services/verbosity-service.js +157 -157
- package/src/utils/audio-duration-validator.js +298 -298
- package/src/utils/audio-format-validator.js +277 -277
- package/src/utils/dependency-checker.js +469 -466
- package/src/utils/file-ownership-verifier.js +358 -358
- package/src/utils/list-formatter.js +194 -194
- package/src/utils/music-file-validator.js +285 -285
- package/src/utils/preview-list-prompt.js +136 -136
- package/src/utils/provider-validator.js +96 -12
- package/src/utils/secure-music-storage.js +412 -412
- package/templates/agentvibes-receiver.sh +482 -482
- package/templates/audio/welcome-music.mp3 +0 -0
- package/voice-assignments.json +8244 -8244
- package/.claude/config/background-music-position.txt +0 -1
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/clawdbot-receiver.sh (SECURITY-HARDENED VERSION)
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes Clawdbot Receiver - SSH-Remote TTS with Agent Support and Intro Messages
|
|
6
|
-
# Receives base64-encoded text, voice, agent name, and optional intro from remote Clawdbot instances
|
|
7
|
-
# Calls AgentVibes play-tts-enhanced.sh to apply agent-specific audio effects
|
|
8
|
-
#
|
|
9
|
-
# SECURITY ENHANCEMENTS:
|
|
10
|
-
# - Voice name whitelist validation
|
|
11
|
-
# - Agent name format validation (alphanumeric only)
|
|
12
|
-
# - Length limits on decoded content
|
|
13
|
-
# - Safe HOME directory handling
|
|
14
|
-
#
|
|
15
|
-
# Usage (called via SSH from remote):
|
|
16
|
-
# clawdbot-receiver.sh <base64_text> <voice> <base64_agent_name> [base64_intro]
|
|
17
|
-
#
|
|
18
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
19
|
-
# Licensed under the Apache License, Version 2.0
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
set -euo pipefail
|
|
23
|
-
|
|
24
|
-
ENCODED_TEXT="${1:-}"
|
|
25
|
-
VOICE="${2:-en_US-lessac-medium}"
|
|
26
|
-
ENCODED_AGENT="${3:-}"
|
|
27
|
-
ENCODED_INTRO="${4:-}"
|
|
28
|
-
|
|
29
|
-
# Validate inputs
|
|
30
|
-
if [[ -z "$ENCODED_TEXT" ]]; then
|
|
31
|
-
echo "Error: No encoded text provided" >&2
|
|
32
|
-
echo "Usage: $0 <base64_text> <voice> <base64_agent_name> [base64_intro]" >&2
|
|
33
|
-
exit 1
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# SECURITY: Validate base64 format (reject shell metacharacters)
|
|
37
|
-
[[ "$ENCODED_TEXT" =~ ^[A-Za-z0-9+/=]+$ ]] || { echo "Error: invalid base64 text" >&2; exit 1; }
|
|
38
|
-
|
|
39
|
-
# SECURITY: Validate VOICE parameter format (alphanumeric, hyphens, underscores only)
|
|
40
|
-
if [[ ! "$VOICE" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
41
|
-
echo "Error: Invalid voice name format: $VOICE" >&2
|
|
42
|
-
exit 1
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# SECURITY: Decode base64 safely
|
|
46
|
-
# This prevents command injection from malicious text
|
|
47
|
-
DECODED_TEXT=$(echo -n "$ENCODED_TEXT" | base64 -d 2>/dev/null) || {
|
|
48
|
-
echo "❌ Failed to decode text (invalid base64)" >&2
|
|
49
|
-
exit 1
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
# SECURITY: Enforce length limit on decoded text (10KB max)
|
|
53
|
-
if [[ ${#DECODED_TEXT} -gt 10000 ]]; then
|
|
54
|
-
echo "❌ Decoded text too long (${#DECODED_TEXT} chars, max 10000)" >&2
|
|
55
|
-
exit 1
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
DECODED_AGENT="default"
|
|
59
|
-
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
60
|
-
# SECURITY: Validate base64 format before decoding
|
|
61
|
-
[[ "$ENCODED_AGENT" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_AGENT=""
|
|
62
|
-
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
63
|
-
DECODED_AGENT=$(echo -n "$ENCODED_AGENT" | base64 -d 2>/dev/null) || DECODED_AGENT="default"
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# SECURITY: Validate agent name format (alphanumeric, dash, underscore only)
|
|
67
|
-
[[ "$DECODED_AGENT" =~ ^[a-zA-Z0-9_-]+$ ]] || DECODED_AGENT="default"
|
|
68
|
-
|
|
69
|
-
# SECURITY: Enforce length limit on agent name
|
|
70
|
-
[[ ${#DECODED_AGENT} -le 50 ]] || DECODED_AGENT="default"
|
|
71
|
-
fi
|
|
72
|
-
|
|
73
|
-
# Decode and prepend intro if provided
|
|
74
|
-
DECODED_INTRO=""
|
|
75
|
-
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
76
|
-
# SECURITY: Validate base64 format before decoding
|
|
77
|
-
[[ "$ENCODED_INTRO" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_INTRO=""
|
|
78
|
-
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
79
|
-
DECODED_INTRO=$(echo -n "$ENCODED_INTRO" | base64 -d 2>/dev/null) || DECODED_INTRO=""
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# SECURITY: Enforce length limit on intro message
|
|
83
|
-
[[ ${#DECODED_INTRO} -le 200 ]] || DECODED_INTRO="${DECODED_INTRO:0:200}"
|
|
84
|
-
fi
|
|
85
|
-
|
|
86
|
-
# Prepend intro to text if configured
|
|
87
|
-
if [[ -n "$DECODED_INTRO" ]]; then
|
|
88
|
-
DECODED_TEXT="${DECODED_INTRO} ${DECODED_TEXT}"
|
|
89
|
-
fi
|
|
90
|
-
|
|
91
|
-
# Find AgentVibes installation
|
|
92
|
-
# SECURITY: Validate HOME is set and use absolute paths
|
|
93
|
-
if [[ -z "${HOME:-}" ]]; then
|
|
94
|
-
echo "❌ HOME environment variable not set" >&2
|
|
95
|
-
exit 1
|
|
96
|
-
fi
|
|
97
|
-
|
|
98
|
-
# Priority: 1. ~/agentvibes, 2. ~/AgentVibes-dev, 3. current directory
|
|
99
|
-
AGENTVIBES_ROOT=""
|
|
100
|
-
if [[ -f "$HOME/agentvibes/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
101
|
-
AGENTVIBES_ROOT="$HOME/agentvibes"
|
|
102
|
-
elif [[ -f "$HOME/AgentVibes-dev/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
103
|
-
AGENTVIBES_ROOT="$HOME/AgentVibes-dev"
|
|
104
|
-
elif [[ -f ".claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
105
|
-
AGENTVIBES_ROOT="$(pwd)"
|
|
106
|
-
else
|
|
107
|
-
echo "❌ AgentVibes not found" >&2
|
|
108
|
-
echo "💡 Install AgentVibes at ~/agentvibes/ or ~/AgentVibes-dev/" >&2
|
|
109
|
-
exit 1
|
|
110
|
-
fi
|
|
111
|
-
|
|
112
|
-
# SECURITY: Validate AgentVibes root is a directory
|
|
113
|
-
if [[ ! -d "$AGENTVIBES_ROOT" ]]; then
|
|
114
|
-
echo "❌ AgentVibes root is not a directory: $AGENTVIBES_ROOT" >&2
|
|
115
|
-
exit 1
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
echo "🎤 Voice: $VOICE | Agent: $DECODED_AGENT | Vol: 30% | Effects: default" >&2
|
|
119
|
-
|
|
120
|
-
# Call AgentVibes play-tts-enhanced.sh with agent name for audio-effects.cfg lookup
|
|
121
|
-
# SECURITY: Use absolute path and proper quoting
|
|
122
|
-
cd "$AGENTVIBES_ROOT" && \
|
|
123
|
-
bash .claude/hooks/play-tts-enhanced.sh "$DECODED_TEXT" "$DECODED_AGENT" "$VOICE" 2>&1 || {
|
|
124
|
-
# Fallback to standard play-tts if enhanced fails
|
|
125
|
-
echo "⚠️ Enhanced TTS failed, using standard TTS" >&2
|
|
126
|
-
bash .claude/hooks/play-tts.sh "$DECODED_TEXT" "$VOICE" 2>&1
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/clawdbot-receiver.sh (SECURITY-HARDENED VERSION)
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes Clawdbot Receiver - SSH-Remote TTS with Agent Support and Intro Messages
|
|
6
|
+
# Receives base64-encoded text, voice, agent name, and optional intro from remote Clawdbot instances
|
|
7
|
+
# Calls AgentVibes play-tts-enhanced.sh to apply agent-specific audio effects
|
|
8
|
+
#
|
|
9
|
+
# SECURITY ENHANCEMENTS:
|
|
10
|
+
# - Voice name whitelist validation
|
|
11
|
+
# - Agent name format validation (alphanumeric only)
|
|
12
|
+
# - Length limits on decoded content
|
|
13
|
+
# - Safe HOME directory handling
|
|
14
|
+
#
|
|
15
|
+
# Usage (called via SSH from remote):
|
|
16
|
+
# clawdbot-receiver.sh <base64_text> <voice> <base64_agent_name> [base64_intro]
|
|
17
|
+
#
|
|
18
|
+
# Copyright (c) 2025 Paul Preibisch
|
|
19
|
+
# Licensed under the Apache License, Version 2.0
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
set -euo pipefail
|
|
23
|
+
|
|
24
|
+
ENCODED_TEXT="${1:-}"
|
|
25
|
+
VOICE="${2:-en_US-lessac-medium}"
|
|
26
|
+
ENCODED_AGENT="${3:-}"
|
|
27
|
+
ENCODED_INTRO="${4:-}"
|
|
28
|
+
|
|
29
|
+
# Validate inputs
|
|
30
|
+
if [[ -z "$ENCODED_TEXT" ]]; then
|
|
31
|
+
echo "Error: No encoded text provided" >&2
|
|
32
|
+
echo "Usage: $0 <base64_text> <voice> <base64_agent_name> [base64_intro]" >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# SECURITY: Validate base64 format (reject shell metacharacters)
|
|
37
|
+
[[ "$ENCODED_TEXT" =~ ^[A-Za-z0-9+/=]+$ ]] || { echo "Error: invalid base64 text" >&2; exit 1; }
|
|
38
|
+
|
|
39
|
+
# SECURITY: Validate VOICE parameter format (alphanumeric, hyphens, underscores only)
|
|
40
|
+
if [[ ! "$VOICE" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
|
41
|
+
echo "Error: Invalid voice name format: $VOICE" >&2
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# SECURITY: Decode base64 safely
|
|
46
|
+
# This prevents command injection from malicious text
|
|
47
|
+
DECODED_TEXT=$(echo -n "$ENCODED_TEXT" | base64 -d 2>/dev/null) || {
|
|
48
|
+
echo "❌ Failed to decode text (invalid base64)" >&2
|
|
49
|
+
exit 1
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# SECURITY: Enforce length limit on decoded text (10KB max)
|
|
53
|
+
if [[ ${#DECODED_TEXT} -gt 10000 ]]; then
|
|
54
|
+
echo "❌ Decoded text too long (${#DECODED_TEXT} chars, max 10000)" >&2
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
DECODED_AGENT="default"
|
|
59
|
+
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
60
|
+
# SECURITY: Validate base64 format before decoding
|
|
61
|
+
[[ "$ENCODED_AGENT" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_AGENT=""
|
|
62
|
+
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
63
|
+
DECODED_AGENT=$(echo -n "$ENCODED_AGENT" | base64 -d 2>/dev/null) || DECODED_AGENT="default"
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# SECURITY: Validate agent name format (alphanumeric, dash, underscore only)
|
|
67
|
+
[[ "$DECODED_AGENT" =~ ^[a-zA-Z0-9_-]+$ ]] || DECODED_AGENT="default"
|
|
68
|
+
|
|
69
|
+
# SECURITY: Enforce length limit on agent name
|
|
70
|
+
[[ ${#DECODED_AGENT} -le 50 ]] || DECODED_AGENT="default"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Decode and prepend intro if provided
|
|
74
|
+
DECODED_INTRO=""
|
|
75
|
+
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
76
|
+
# SECURITY: Validate base64 format before decoding
|
|
77
|
+
[[ "$ENCODED_INTRO" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_INTRO=""
|
|
78
|
+
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
79
|
+
DECODED_INTRO=$(echo -n "$ENCODED_INTRO" | base64 -d 2>/dev/null) || DECODED_INTRO=""
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# SECURITY: Enforce length limit on intro message
|
|
83
|
+
[[ ${#DECODED_INTRO} -le 200 ]] || DECODED_INTRO="${DECODED_INTRO:0:200}"
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Prepend intro to text if configured
|
|
87
|
+
if [[ -n "$DECODED_INTRO" ]]; then
|
|
88
|
+
DECODED_TEXT="${DECODED_INTRO} ${DECODED_TEXT}"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# Find AgentVibes installation
|
|
92
|
+
# SECURITY: Validate HOME is set and use absolute paths
|
|
93
|
+
if [[ -z "${HOME:-}" ]]; then
|
|
94
|
+
echo "❌ HOME environment variable not set" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# Priority: 1. ~/agentvibes, 2. ~/AgentVibes-dev, 3. current directory
|
|
99
|
+
AGENTVIBES_ROOT=""
|
|
100
|
+
if [[ -f "$HOME/agentvibes/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
101
|
+
AGENTVIBES_ROOT="$HOME/agentvibes"
|
|
102
|
+
elif [[ -f "$HOME/AgentVibes-dev/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
103
|
+
AGENTVIBES_ROOT="$HOME/AgentVibes-dev"
|
|
104
|
+
elif [[ -f ".claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
105
|
+
AGENTVIBES_ROOT="$(pwd)"
|
|
106
|
+
else
|
|
107
|
+
echo "❌ AgentVibes not found" >&2
|
|
108
|
+
echo "💡 Install AgentVibes at ~/agentvibes/ or ~/AgentVibes-dev/" >&2
|
|
109
|
+
exit 1
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# SECURITY: Validate AgentVibes root is a directory
|
|
113
|
+
if [[ ! -d "$AGENTVIBES_ROOT" ]]; then
|
|
114
|
+
echo "❌ AgentVibes root is not a directory: $AGENTVIBES_ROOT" >&2
|
|
115
|
+
exit 1
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
echo "🎤 Voice: $VOICE | Agent: $DECODED_AGENT | Vol: 30% | Effects: default" >&2
|
|
119
|
+
|
|
120
|
+
# Call AgentVibes play-tts-enhanced.sh with agent name for audio-effects.cfg lookup
|
|
121
|
+
# SECURITY: Use absolute path and proper quoting
|
|
122
|
+
cd "$AGENTVIBES_ROOT" && \
|
|
123
|
+
bash .claude/hooks/play-tts-enhanced.sh "$DECODED_TEXT" "$DECODED_AGENT" "$VOICE" 2>&1 || {
|
|
124
|
+
# Fallback to standard play-tts if enhanced fails
|
|
125
|
+
echo "⚠️ Enhanced TTS failed, using standard TTS" >&2
|
|
126
|
+
bash .claude/hooks/play-tts.sh "$DECODED_TEXT" "$VOICE" 2>&1
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
exit 0
|
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/clawdbot-receiver.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes Clawdbot Receiver - SSH-Remote TTS with Agent Support and Intro Messages
|
|
6
|
-
# Receives base64-encoded text, voice, agent name, and optional intro from remote Clawdbot instances
|
|
7
|
-
#
|
|
8
|
-
# Usage (called via SSH from remote):
|
|
9
|
-
# clawdbot-receiver.sh <base64_text> <voice> <base64_agent_name> [base64_intro]
|
|
10
|
-
#
|
|
11
|
-
# Parameters:
|
|
12
|
-
# base64_text - The main TTS text (base64 encoded)
|
|
13
|
-
# voice - Piper voice name (e.g., en_US-amy-medium)
|
|
14
|
-
# base64_agent_name - Agent name for audio effects lookup (base64 encoded)
|
|
15
|
-
# base64_intro - Optional intro message to prepend (base64 encoded)
|
|
16
|
-
# e.g., "Orion ClawdBot here." or "Samuel, your assistant."
|
|
17
|
-
#
|
|
18
|
-
# The intro is prepended to the text: "${INTRO} ${TEXT}"
|
|
19
|
-
#
|
|
20
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
21
|
-
# Licensed under the Apache License, Version 2.0
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
set -euo pipefail
|
|
25
|
-
|
|
26
|
-
ENCODED_TEXT="${1:-}"
|
|
27
|
-
VOICE="${2:-en_US-lessac-medium}"
|
|
28
|
-
ENCODED_AGENT="${3:-}"
|
|
29
|
-
ENCODED_INTRO="${4:-}"
|
|
30
|
-
|
|
31
|
-
# Validate inputs
|
|
32
|
-
if [[ -z "$ENCODED_TEXT" ]]; then
|
|
33
|
-
echo "Error: No encoded text provided" >&2
|
|
34
|
-
echo "Usage: $0 <base64_text> <voice> <base64_agent_name> [base64_intro]" >&2
|
|
35
|
-
exit 1
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
# SECURITY: Validate base64 format (reject shell metacharacters)
|
|
39
|
-
[[ "$ENCODED_TEXT" =~ ^[A-Za-z0-9+/=]+$ ]] || { echo "Error: invalid base64 text" >&2; exit 1; }
|
|
40
|
-
|
|
41
|
-
# SECURITY: Validate voice name format (alphanumeric, hyphens, underscores only)
|
|
42
|
-
[[ "$VOICE" =~ ^[a-zA-Z0-9_-]+$ ]] || { echo "Error: invalid voice format" >&2; exit 1; }
|
|
43
|
-
|
|
44
|
-
# SECURITY: Decode base64 safely
|
|
45
|
-
DECODED_TEXT=$(echo -n "$ENCODED_TEXT" | base64 -d 2>/dev/null) || {
|
|
46
|
-
echo "Error: Failed to decode text (invalid base64)" >&2
|
|
47
|
-
exit 1
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
# SECURITY: Enforce length limit on decoded text (10KB max)
|
|
51
|
-
if [[ ${#DECODED_TEXT} -gt 10000 ]]; then
|
|
52
|
-
echo "Error: Decoded text too long (${#DECODED_TEXT} chars, max 10000)" >&2
|
|
53
|
-
exit 1
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
DECODED_AGENT="default"
|
|
57
|
-
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
58
|
-
[[ "$ENCODED_AGENT" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_AGENT=""
|
|
59
|
-
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
60
|
-
DECODED_AGENT=$(echo -n "$ENCODED_AGENT" | base64 -d 2>/dev/null) || DECODED_AGENT="default"
|
|
61
|
-
fi
|
|
62
|
-
# Validate agent name format (alphanumeric, dash, underscore only)
|
|
63
|
-
[[ "$DECODED_AGENT" =~ ^[a-zA-Z0-9_-]+$ ]] || DECODED_AGENT="default"
|
|
64
|
-
# Enforce length limit
|
|
65
|
-
[[ ${#DECODED_AGENT} -le 50 ]] || DECODED_AGENT="default"
|
|
66
|
-
fi
|
|
67
|
-
|
|
68
|
-
# Decode and prepend intro if provided
|
|
69
|
-
DECODED_INTRO=""
|
|
70
|
-
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
71
|
-
[[ "$ENCODED_INTRO" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_INTRO=""
|
|
72
|
-
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
73
|
-
DECODED_INTRO=$(echo -n "$ENCODED_INTRO" | base64 -d 2>/dev/null) || DECODED_INTRO=""
|
|
74
|
-
fi
|
|
75
|
-
# Enforce length limit on intro (200 chars max)
|
|
76
|
-
[[ ${#DECODED_INTRO} -le 200 ]] || DECODED_INTRO="${DECODED_INTRO:0:200}"
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
# Prepend intro to text if configured
|
|
80
|
-
if [[ -n "$DECODED_INTRO" ]]; then
|
|
81
|
-
DECODED_TEXT="${DECODED_INTRO} ${DECODED_TEXT}"
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# Find AgentVibes installation
|
|
85
|
-
AGENTVIBES_ROOT=""
|
|
86
|
-
if [[ -f "$HOME/agentvibes/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
87
|
-
AGENTVIBES_ROOT="$HOME/agentvibes"
|
|
88
|
-
elif [[ -f "$HOME/AgentVibes-dev/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
89
|
-
AGENTVIBES_ROOT="$HOME/AgentVibes-dev"
|
|
90
|
-
elif [[ -f ".claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
91
|
-
AGENTVIBES_ROOT="$(pwd)"
|
|
92
|
-
else
|
|
93
|
-
echo "❌ AgentVibes not found" >&2
|
|
94
|
-
echo "💡 Install AgentVibes at ~/agentvibes/ or ~/AgentVibes-dev/" >&2
|
|
95
|
-
exit 1
|
|
96
|
-
fi
|
|
97
|
-
|
|
98
|
-
echo "🎤 Voice: $VOICE | Agent: $DECODED_AGENT" >&2
|
|
99
|
-
|
|
100
|
-
# Play TTS directly (lock removed temporarily for testing)
|
|
101
|
-
cd "$AGENTVIBES_ROOT"
|
|
102
|
-
bash .claude/hooks/play-tts-enhanced.sh "$DECODED_TEXT" "$DECODED_AGENT" "$VOICE" 2>&1 || {
|
|
103
|
-
echo "⚠️ Enhanced TTS failed, using standard TTS" >&2
|
|
104
|
-
bash .claude/hooks/play-tts.sh "$DECODED_TEXT" "$VOICE" 2>&1
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/clawdbot-receiver.sh
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes Clawdbot Receiver - SSH-Remote TTS with Agent Support and Intro Messages
|
|
6
|
+
# Receives base64-encoded text, voice, agent name, and optional intro from remote Clawdbot instances
|
|
7
|
+
#
|
|
8
|
+
# Usage (called via SSH from remote):
|
|
9
|
+
# clawdbot-receiver.sh <base64_text> <voice> <base64_agent_name> [base64_intro]
|
|
10
|
+
#
|
|
11
|
+
# Parameters:
|
|
12
|
+
# base64_text - The main TTS text (base64 encoded)
|
|
13
|
+
# voice - Piper voice name (e.g., en_US-amy-medium)
|
|
14
|
+
# base64_agent_name - Agent name for audio effects lookup (base64 encoded)
|
|
15
|
+
# base64_intro - Optional intro message to prepend (base64 encoded)
|
|
16
|
+
# e.g., "Orion ClawdBot here." or "Samuel, your assistant."
|
|
17
|
+
#
|
|
18
|
+
# The intro is prepended to the text: "${INTRO} ${TEXT}"
|
|
19
|
+
#
|
|
20
|
+
# Copyright (c) 2025 Paul Preibisch
|
|
21
|
+
# Licensed under the Apache License, Version 2.0
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
set -euo pipefail
|
|
25
|
+
|
|
26
|
+
ENCODED_TEXT="${1:-}"
|
|
27
|
+
VOICE="${2:-en_US-lessac-medium}"
|
|
28
|
+
ENCODED_AGENT="${3:-}"
|
|
29
|
+
ENCODED_INTRO="${4:-}"
|
|
30
|
+
|
|
31
|
+
# Validate inputs
|
|
32
|
+
if [[ -z "$ENCODED_TEXT" ]]; then
|
|
33
|
+
echo "Error: No encoded text provided" >&2
|
|
34
|
+
echo "Usage: $0 <base64_text> <voice> <base64_agent_name> [base64_intro]" >&2
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# SECURITY: Validate base64 format (reject shell metacharacters)
|
|
39
|
+
[[ "$ENCODED_TEXT" =~ ^[A-Za-z0-9+/=]+$ ]] || { echo "Error: invalid base64 text" >&2; exit 1; }
|
|
40
|
+
|
|
41
|
+
# SECURITY: Validate voice name format (alphanumeric, hyphens, underscores only)
|
|
42
|
+
[[ "$VOICE" =~ ^[a-zA-Z0-9_-]+$ ]] || { echo "Error: invalid voice format" >&2; exit 1; }
|
|
43
|
+
|
|
44
|
+
# SECURITY: Decode base64 safely
|
|
45
|
+
DECODED_TEXT=$(echo -n "$ENCODED_TEXT" | base64 -d 2>/dev/null) || {
|
|
46
|
+
echo "Error: Failed to decode text (invalid base64)" >&2
|
|
47
|
+
exit 1
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# SECURITY: Enforce length limit on decoded text (10KB max)
|
|
51
|
+
if [[ ${#DECODED_TEXT} -gt 10000 ]]; then
|
|
52
|
+
echo "Error: Decoded text too long (${#DECODED_TEXT} chars, max 10000)" >&2
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
DECODED_AGENT="default"
|
|
57
|
+
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
58
|
+
[[ "$ENCODED_AGENT" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_AGENT=""
|
|
59
|
+
if [[ -n "$ENCODED_AGENT" ]]; then
|
|
60
|
+
DECODED_AGENT=$(echo -n "$ENCODED_AGENT" | base64 -d 2>/dev/null) || DECODED_AGENT="default"
|
|
61
|
+
fi
|
|
62
|
+
# Validate agent name format (alphanumeric, dash, underscore only)
|
|
63
|
+
[[ "$DECODED_AGENT" =~ ^[a-zA-Z0-9_-]+$ ]] || DECODED_AGENT="default"
|
|
64
|
+
# Enforce length limit
|
|
65
|
+
[[ ${#DECODED_AGENT} -le 50 ]] || DECODED_AGENT="default"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Decode and prepend intro if provided
|
|
69
|
+
DECODED_INTRO=""
|
|
70
|
+
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
71
|
+
[[ "$ENCODED_INTRO" =~ ^[A-Za-z0-9+/=]+$ ]] || ENCODED_INTRO=""
|
|
72
|
+
if [[ -n "$ENCODED_INTRO" ]]; then
|
|
73
|
+
DECODED_INTRO=$(echo -n "$ENCODED_INTRO" | base64 -d 2>/dev/null) || DECODED_INTRO=""
|
|
74
|
+
fi
|
|
75
|
+
# Enforce length limit on intro (200 chars max)
|
|
76
|
+
[[ ${#DECODED_INTRO} -le 200 ]] || DECODED_INTRO="${DECODED_INTRO:0:200}"
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Prepend intro to text if configured
|
|
80
|
+
if [[ -n "$DECODED_INTRO" ]]; then
|
|
81
|
+
DECODED_TEXT="${DECODED_INTRO} ${DECODED_TEXT}"
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Find AgentVibes installation
|
|
85
|
+
AGENTVIBES_ROOT=""
|
|
86
|
+
if [[ -f "$HOME/agentvibes/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
87
|
+
AGENTVIBES_ROOT="$HOME/agentvibes"
|
|
88
|
+
elif [[ -f "$HOME/AgentVibes-dev/.claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
89
|
+
AGENTVIBES_ROOT="$HOME/AgentVibes-dev"
|
|
90
|
+
elif [[ -f ".claude/hooks/play-tts-enhanced.sh" ]]; then
|
|
91
|
+
AGENTVIBES_ROOT="$(pwd)"
|
|
92
|
+
else
|
|
93
|
+
echo "❌ AgentVibes not found" >&2
|
|
94
|
+
echo "💡 Install AgentVibes at ~/agentvibes/ or ~/AgentVibes-dev/" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
echo "🎤 Voice: $VOICE | Agent: $DECODED_AGENT" >&2
|
|
99
|
+
|
|
100
|
+
# Play TTS directly (lock removed temporarily for testing)
|
|
101
|
+
cd "$AGENTVIBES_ROOT"
|
|
102
|
+
bash .claude/hooks/play-tts-enhanced.sh "$DECODED_TEXT" "$DECODED_AGENT" "$VOICE" 2>&1 || {
|
|
103
|
+
echo "⚠️ Enhanced TTS failed, using standard TTS" >&2
|
|
104
|
+
bash .claude/hooks/play-tts.sh "$DECODED_TEXT" "$VOICE" 2>&1
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
exit 0
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Non-Interactive TTS Audio Cache Cleanup
|
|
3
|
-
# Used by /agent-vibes:clean skill and MCP clean_audio_cache tool
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
# Source audio cache utilities
|
|
8
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
-
source "$SCRIPT_DIR/audio-cache-utils.sh"
|
|
10
|
-
|
|
11
|
-
# Colors
|
|
12
|
-
BLUE='\033[0;34m'
|
|
13
|
-
NC='\033[0m' # No Color
|
|
14
|
-
|
|
15
|
-
echo -e "${BLUE}🧹 AgentVibes Cache Cleanup (Non-Interactive)${NC}"
|
|
16
|
-
echo ""
|
|
17
|
-
|
|
18
|
-
# Get audio directory and perform cleanup
|
|
19
|
-
AUDIO_DIR=$(get_audio_dir)
|
|
20
|
-
clean_all_tts_files "$AUDIO_DIR"
|
|
21
|
-
|
|
22
|
-
echo ""
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Non-Interactive TTS Audio Cache Cleanup
|
|
3
|
+
# Used by /agent-vibes:clean skill and MCP clean_audio_cache tool
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Source audio cache utilities
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
source "$SCRIPT_DIR/audio-cache-utils.sh"
|
|
10
|
+
|
|
11
|
+
# Colors
|
|
12
|
+
BLUE='\033[0;34m'
|
|
13
|
+
NC='\033[0m' # No Color
|
|
14
|
+
|
|
15
|
+
echo -e "${BLUE}🧹 AgentVibes Cache Cleanup (Non-Interactive)${NC}"
|
|
16
|
+
echo ""
|
|
17
|
+
|
|
18
|
+
# Get audio directory and perform cleanup
|
|
19
|
+
AUDIO_DIR=$(get_audio_dir)
|
|
20
|
+
clean_all_tts_files "$AUDIO_DIR"
|
|
21
|
+
|
|
22
|
+
echo ""
|