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.
Files changed (219) hide show
  1. package/.agentvibes/bmad/bmad-voices.md +69 -69
  2. package/.agentvibes/config.json +12 -0
  3. package/.claude/activation-instructions +54 -54
  4. package/.claude/audio/tracks/README.md +52 -52
  5. package/.claude/commands/agent-vibes/add.md +21 -21
  6. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  7. package/.claude/commands/agent-vibes/agent.md +79 -79
  8. package/.claude/commands/agent-vibes/background-music.md +111 -111
  9. package/.claude/commands/agent-vibes/bmad.md +198 -198
  10. package/.claude/commands/agent-vibes/clean.md +18 -18
  11. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  12. package/.claude/commands/agent-vibes/commands.json +145 -145
  13. package/.claude/commands/agent-vibes/effects.md +97 -97
  14. package/.claude/commands/agent-vibes/get.md +9 -9
  15. package/.claude/commands/agent-vibes/hide.md +91 -91
  16. package/.claude/commands/agent-vibes/language.md +23 -23
  17. package/.claude/commands/agent-vibes/learn.md +67 -67
  18. package/.claude/commands/agent-vibes/list.md +13 -13
  19. package/.claude/commands/agent-vibes/mute.md +37 -37
  20. package/.claude/commands/agent-vibes/preview.md +17 -17
  21. package/.claude/commands/agent-vibes/provider.md +68 -68
  22. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  23. package/.claude/commands/agent-vibes/sample.md +12 -12
  24. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  25. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  26. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  27. package/.claude/commands/agent-vibes/show.md +84 -84
  28. package/.claude/commands/agent-vibes/switch.md +87 -87
  29. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  30. package/.claude/commands/agent-vibes/target.md +30 -30
  31. package/.claude/commands/agent-vibes/translate.md +68 -68
  32. package/.claude/commands/agent-vibes/unmute.md +45 -45
  33. package/.claude/commands/agent-vibes/verbosity.md +89 -89
  34. package/.claude/commands/agent-vibes/whoami.md +7 -7
  35. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  36. package/.claude/commands/agent-vibes-rdp.md +24 -24
  37. package/.claude/config/agentvibes.json +1 -0
  38. package/.claude/config/audio-effects.cfg +2 -2
  39. package/.claude/config/audio-effects.cfg.sample +52 -52
  40. package/.claude/config/background-music-volume.txt +1 -0
  41. package/.claude/config/intro-text.txt +1 -0
  42. package/.claude/config/piper-speech-rate.txt +4 -0
  43. package/.claude/config/piper-target-speech-rate.txt +1 -0
  44. package/.claude/config/reverb-level.txt +1 -0
  45. package/.claude/config/tts-speech-rate.txt +4 -0
  46. package/.claude/config/tts-target-speech-rate.txt +1 -0
  47. package/.claude/docs/TERMUX_SETUP.md +408 -408
  48. package/.claude/github-star-reminder.txt +1 -1
  49. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  50. package/.claude/hooks/audio-cache-utils.sh +246 -246
  51. package/.claude/hooks/audio-processor.sh +433 -433
  52. package/.claude/hooks/background-music-manager.sh +404 -404
  53. package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
  54. package/.claude/hooks/bmad-speak.sh +269 -269
  55. package/.claude/hooks/bmad-tts-injector.sh +568 -568
  56. package/.claude/hooks/bmad-voice-manager.sh +928 -928
  57. package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
  58. package/.claude/hooks/clawdbot-receiver.sh +107 -107
  59. package/.claude/hooks/clean-audio-cache.sh +22 -22
  60. package/.claude/hooks/cleanup-cache.sh +106 -106
  61. package/.claude/hooks/configure-rdp-mode.sh +137 -137
  62. package/.claude/hooks/download-extra-voices.sh +244 -244
  63. package/.claude/hooks/effects-manager.sh +268 -268
  64. package/.claude/hooks/github-star-reminder.sh +154 -154
  65. package/.claude/hooks/language-manager.sh +362 -362
  66. package/.claude/hooks/learn-manager.sh +492 -492
  67. package/.claude/hooks/macos-voice-manager.sh +205 -205
  68. package/.claude/hooks/migrate-background-music.sh +125 -125
  69. package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
  70. package/.claude/hooks/optimize-background-music.sh +87 -87
  71. package/.claude/hooks/path-resolver.sh +60 -60
  72. package/.claude/hooks/personality-manager.sh +448 -448
  73. package/.claude/hooks/piper-download-voices.sh +225 -225
  74. package/.claude/hooks/piper-installer.sh +292 -292
  75. package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
  76. package/.claude/hooks/piper-voice-manager.sh +24 -3
  77. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
  78. package/.claude/hooks/play-tts-enhanced.sh +105 -105
  79. package/.claude/hooks/play-tts-macos.sh +368 -368
  80. package/.claude/hooks/play-tts-piper.sh +679 -679
  81. package/.claude/hooks/play-tts-soprano.sh +356 -356
  82. package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
  83. package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
  84. package/.claude/hooks/play-tts.sh +301 -301
  85. package/.claude/hooks/prepare-release.sh +54 -54
  86. package/.claude/hooks/provider-commands.sh +617 -617
  87. package/.claude/hooks/provider-manager.sh +399 -399
  88. package/.claude/hooks/replay-target-audio.sh +95 -95
  89. package/.claude/hooks/requirements.txt +6 -6
  90. package/.claude/hooks/sentiment-manager.sh +201 -201
  91. package/.claude/hooks/session-start-tts.sh +81 -81
  92. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  93. package/.claude/hooks/speed-manager.sh +291 -291
  94. package/.claude/hooks/stop-tts.sh +84 -84
  95. package/.claude/hooks/termux-installer.sh +261 -261
  96. package/.claude/hooks/translate-manager.sh +341 -341
  97. package/.claude/hooks/translator.py +237 -237
  98. package/.claude/hooks/tts-queue-worker.sh +145 -145
  99. package/.claude/hooks/tts-queue.sh +165 -165
  100. package/.claude/hooks/verbosity-manager.sh +178 -178
  101. package/.claude/hooks/voice-manager.sh +548 -548
  102. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  103. package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
  104. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
  105. package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
  106. package/.claude/hooks-windows/effects-manager.ps1 +294 -0
  107. package/.claude/hooks-windows/language-manager.ps1 +193 -0
  108. package/.claude/hooks-windows/learn-manager.ps1 +241 -0
  109. package/.claude/hooks-windows/personality-manager.ps1 +266 -0
  110. package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
  111. package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
  112. package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
  113. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
  114. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
  115. package/.claude/hooks-windows/play-tts.ps1 +344 -266
  116. package/.claude/hooks-windows/provider-manager.ps1 +29 -10
  117. package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
  118. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  119. package/.claude/hooks-windows/speed-manager.ps1 +166 -0
  120. package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
  121. package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
  122. package/.claude/output-styles/agent-vibes.md +202 -202
  123. package/.claude/personalities/angry.md +14 -14
  124. package/.claude/personalities/annoying.md +14 -14
  125. package/.claude/personalities/crass.md +14 -14
  126. package/.claude/personalities/dramatic.md +14 -14
  127. package/.claude/personalities/dry-humor.md +50 -50
  128. package/.claude/personalities/flirty.md +20 -20
  129. package/.claude/personalities/funny.md +14 -14
  130. package/.claude/personalities/grandpa.md +32 -32
  131. package/.claude/personalities/millennial.md +14 -14
  132. package/.claude/personalities/moody.md +14 -14
  133. package/.claude/personalities/normal.md +16 -16
  134. package/.claude/personalities/pirate.md +14 -14
  135. package/.claude/personalities/poetic.md +14 -14
  136. package/.claude/personalities/professional.md +14 -14
  137. package/.claude/personalities/rapper.md +55 -55
  138. package/.claude/personalities/robot.md +14 -14
  139. package/.claude/personalities/sarcastic.md +38 -38
  140. package/.claude/personalities/sassy.md +14 -14
  141. package/.claude/personalities/surfer-dude.md +14 -14
  142. package/.claude/personalities/zen.md +14 -14
  143. package/.claude/settings.json +15 -15
  144. package/.claude/verbosity.txt +1 -1
  145. package/.clawdbot/README.md +105 -105
  146. package/.clawdbot/skill/SKILL.md +241 -241
  147. package/.mcp.json +12 -0
  148. package/CLAUDE.md +170 -170
  149. package/README.md +2029 -2007
  150. package/RELEASE_NOTES.md +1310 -1203
  151. package/WINDOWS-SETUP.md +208 -208
  152. package/bin/agent-vibes +39 -39
  153. package/bin/agentvibes-voice-browser.js +1840 -1840
  154. package/bin/agentvibes.js +48 -2
  155. package/bin/mcp-server.js +121 -121
  156. package/bin/mcp-server.sh +206 -206
  157. package/bin/test-bmad-pr +78 -78
  158. package/mcp-server/QUICK_START.md +203 -203
  159. package/mcp-server/README.md +345 -345
  160. package/mcp-server/WINDOWS_SETUP.md +260 -260
  161. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  162. package/mcp-server/examples/claude_desktop_config.json +11 -11
  163. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  164. package/mcp-server/examples/custom_instructions.md +169 -169
  165. package/mcp-server/install-deps.js +130 -130
  166. package/mcp-server/pyproject.toml +52 -52
  167. package/mcp-server/requirements.txt +2 -2
  168. package/mcp-server/server.py +1465 -1453
  169. package/mcp-server/test_server.py +395 -395
  170. package/mcp-server/test_windows_script_parity.py +336 -0
  171. package/package.json +110 -110
  172. package/setup-windows.ps1 +815 -815
  173. package/src/bmad-detector.js +71 -71
  174. package/src/cli/list-personalities.js +110 -110
  175. package/src/cli/list-voices.js +114 -114
  176. package/src/commands/bmad-voices.js +394 -394
  177. package/src/commands/install-mcp.js +476 -476
  178. package/src/console/app.js +824 -824
  179. package/src/console/audio-env.js +20 -1
  180. package/src/console/brand-colors.js +13 -13
  181. package/src/console/constants/personalities.js +44 -44
  182. package/src/console/footer-config.js +50 -50
  183. package/src/console/modals/modal-overlay.js +247 -247
  184. package/src/console/navigation.js +62 -62
  185. package/src/console/tabs/agents-tab.js +1684 -1516
  186. package/src/console/tabs/help-tab.js +261 -261
  187. package/src/console/tabs/install-tab.js +1007 -991
  188. package/src/console/tabs/music-tab.js +22 -8
  189. package/src/console/tabs/placeholder-tab.js +53 -53
  190. package/src/console/tabs/readme-tab.js +267 -267
  191. package/src/console/tabs/receiver-tab.js +1472 -1212
  192. package/src/console/tabs/settings-tab.js +152 -79
  193. package/src/console/tabs/voices-tab.js +100 -21
  194. package/src/console/widgets/destroy-list.js +25 -25
  195. package/src/console/widgets/format-utils.js +89 -89
  196. package/src/console/widgets/notice.js +55 -55
  197. package/src/console/widgets/personality-picker.js +185 -185
  198. package/src/console/widgets/reverb-picker.js +94 -94
  199. package/src/console/widgets/track-picker.js +285 -285
  200. package/src/installer/music-file-input.js +304 -304
  201. package/src/installer.js +5882 -5829
  202. package/src/services/agent-voice-store.js +423 -423
  203. package/src/services/config-service.js +264 -264
  204. package/src/services/navigation-service.js +123 -123
  205. package/src/services/provider-service.js +132 -132
  206. package/src/services/verbosity-service.js +157 -157
  207. package/src/utils/audio-duration-validator.js +298 -298
  208. package/src/utils/audio-format-validator.js +277 -277
  209. package/src/utils/dependency-checker.js +469 -466
  210. package/src/utils/file-ownership-verifier.js +358 -358
  211. package/src/utils/list-formatter.js +194 -194
  212. package/src/utils/music-file-validator.js +285 -285
  213. package/src/utils/preview-list-prompt.js +136 -136
  214. package/src/utils/provider-validator.js +96 -12
  215. package/src/utils/secure-music-storage.js +412 -412
  216. package/templates/agentvibes-receiver.sh +482 -482
  217. package/templates/audio/welcome-music.mp3 +0 -0
  218. package/voice-assignments.json +8244 -8244
  219. 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 ""