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,169 +1,169 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/play-tts-termux-ssh.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
-
# Website: https://agentvibes.org
|
|
7
|
-
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
8
|
-
#
|
|
9
|
-
# Co-created by Paul Preibisch with Claude AI
|
|
10
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
11
|
-
#
|
|
12
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
# you may not use this file except in compliance with the License.
|
|
14
|
-
# You may obtain a copy of the License at
|
|
15
|
-
#
|
|
16
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
#
|
|
18
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
# See the License for the specific language governing permissions and
|
|
22
|
-
# limitations under the License.
|
|
23
|
-
#
|
|
24
|
-
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
-
# express or implied. Use at your own risk. See the Apache License for details.
|
|
26
|
-
#
|
|
27
|
-
# ---
|
|
28
|
-
#
|
|
29
|
-
# @fileoverview Termux SSH TTS Provider - Android TTS via SSH tunnel
|
|
30
|
-
# @context Enables TTS output on Android devices when connected via SSH from Termux
|
|
31
|
-
# @architecture SSH-based remote TTS invocation using termux-tts-speak on Android
|
|
32
|
-
# @dependencies ssh, termux-tts-speak (on Android), termux-api (on Android)
|
|
33
|
-
# @entrypoints Called by play-tts.sh router when provider=termux-ssh
|
|
34
|
-
# @patterns Remote TTS invocation, SSH host alias configuration, graceful fallback
|
|
35
|
-
# @related play-tts.sh, provider-manager.sh
|
|
36
|
-
# @setup Requires user to configure SSH host alias in ~/.ssh/config
|
|
37
|
-
#
|
|
38
|
-
# SETUP INSTRUCTIONS:
|
|
39
|
-
# ===================
|
|
40
|
-
# 1. On Android device (Termux):
|
|
41
|
-
# - Install: pkg install termux-api openssh
|
|
42
|
-
# - Install Termux:API app from F-Droid
|
|
43
|
-
# - Start SSH server: sshd
|
|
44
|
-
# - Get SSH port: echo $PREFIX/var/run/sshd.pid
|
|
45
|
-
#
|
|
46
|
-
# 2. On server/desktop:
|
|
47
|
-
# - Add to ~/.ssh/config:
|
|
48
|
-
# Host android
|
|
49
|
-
# HostName <your-android-ip>
|
|
50
|
-
# User <your-termux-username>
|
|
51
|
-
# Port 8022
|
|
52
|
-
# IdentityFile ~/.ssh/id_rsa
|
|
53
|
-
#
|
|
54
|
-
# 3. Configure AgentVibes:
|
|
55
|
-
# - echo "android" > ~/.claude/termux-ssh-host.txt
|
|
56
|
-
# OR
|
|
57
|
-
# - export TERMUX_SSH_HOST="android"
|
|
58
|
-
#
|
|
59
|
-
# 4. Set provider:
|
|
60
|
-
# - echo "termux-ssh" > ~/.claude/tts-provider.txt
|
|
61
|
-
#
|
|
62
|
-
|
|
63
|
-
# Fix locale warnings
|
|
64
|
-
export LC_ALL=C
|
|
65
|
-
|
|
66
|
-
TEXT="$1"
|
|
67
|
-
VOICE_OVERRIDE="$2" # Not used for termux-ssh, but kept for interface compatibility
|
|
68
|
-
|
|
69
|
-
# Script directory
|
|
70
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
71
|
-
|
|
72
|
-
# @function get_ssh_host
|
|
73
|
-
# @intent Determine SSH host alias for Android device
|
|
74
|
-
# @why Allows users to configure their own SSH connection without hardcoded values
|
|
75
|
-
# @returns Echoes SSH host alias or empty string if not configured
|
|
76
|
-
# @sideeffects None
|
|
77
|
-
get_ssh_host() {
|
|
78
|
-
local ssh_host=""
|
|
79
|
-
|
|
80
|
-
# Priority order:
|
|
81
|
-
# 1. Environment variable TERMUX_SSH_HOST
|
|
82
|
-
# 2. Project-specific config file (CLAUDE_PROJECT_DIR)
|
|
83
|
-
# 3. Script location config file
|
|
84
|
-
# 4. Global config file (~/.claude/termux-ssh-host.txt)
|
|
85
|
-
|
|
86
|
-
if [[ -n "$TERMUX_SSH_HOST" ]]; then
|
|
87
|
-
ssh_host="$TERMUX_SSH_HOST"
|
|
88
|
-
elif [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -f "$CLAUDE_PROJECT_DIR/.claude/termux-ssh-host.txt" ]]; then
|
|
89
|
-
ssh_host=$(cat "$CLAUDE_PROJECT_DIR/.claude/termux-ssh-host.txt" 2>/dev/null | tr -d '\n\r')
|
|
90
|
-
elif [[ -f "$SCRIPT_DIR/../termux-ssh-host.txt" ]]; then
|
|
91
|
-
ssh_host=$(cat "$SCRIPT_DIR/../termux-ssh-host.txt" 2>/dev/null | tr -d '\n\r')
|
|
92
|
-
elif [[ -f "$HOME/.claude/termux-ssh-host.txt" ]]; then
|
|
93
|
-
ssh_host=$(cat "$HOME/.claude/termux-ssh-host.txt" 2>/dev/null | tr -d '\n\r')
|
|
94
|
-
fi
|
|
95
|
-
|
|
96
|
-
echo "$ssh_host"
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
# @function check_termux_connection
|
|
100
|
-
# @intent Verify SSH connection to Android device is available
|
|
101
|
-
# @why Prevent hanging on SSH timeout if device is unreachable
|
|
102
|
-
# @param $1 SSH host alias
|
|
103
|
-
# @returns 0 if connection successful, 1 otherwise
|
|
104
|
-
# @sideeffects None (uses ConnectTimeout=2)
|
|
105
|
-
check_termux_connection() {
|
|
106
|
-
local host="$1"
|
|
107
|
-
|
|
108
|
-
# Quick connection test (2 second timeout)
|
|
109
|
-
if ssh -o ConnectTimeout=2 -o BatchMode=yes "$host" "echo ok" >/dev/null 2>&1; then
|
|
110
|
-
return 0
|
|
111
|
-
else
|
|
112
|
-
return 1
|
|
113
|
-
fi
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
# Main execution
|
|
117
|
-
SSH_HOST=$(get_ssh_host)
|
|
118
|
-
|
|
119
|
-
if [[ -z "$SSH_HOST" ]]; then
|
|
120
|
-
echo "❌ Termux SSH provider not configured" >&2
|
|
121
|
-
echo " Set SSH host alias in one of:" >&2
|
|
122
|
-
echo " - Environment: export TERMUX_SSH_HOST='android'" >&2
|
|
123
|
-
echo " - Global: echo 'android' > ~/.claude/termux-ssh-host.txt" >&2
|
|
124
|
-
echo " - Project: echo 'android' > .claude/termux-ssh-host.txt" >&2
|
|
125
|
-
echo "" >&2
|
|
126
|
-
echo " See provider documentation for SSH setup instructions" >&2
|
|
127
|
-
exit 1
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
if [[ -z "$TEXT" ]]; then
|
|
131
|
-
echo "❌ No text provided for TTS" >&2
|
|
132
|
-
exit 1
|
|
133
|
-
fi
|
|
134
|
-
|
|
135
|
-
# Check if SSH connection is available (with timeout)
|
|
136
|
-
if ! check_termux_connection "$SSH_HOST"; then
|
|
137
|
-
echo "⚠️ Cannot connect to SSH host '$SSH_HOST'" >&2
|
|
138
|
-
echo " Make sure:" >&2
|
|
139
|
-
echo " - Android device is reachable" >&2
|
|
140
|
-
echo " - SSH server is running: sshd" >&2
|
|
141
|
-
echo " - SSH config is correct in ~/.ssh/config" >&2
|
|
142
|
-
exit 1
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
# Escape single quotes in text for safe shell transmission
|
|
146
|
-
# Replace ' with '\'' (end quote, escaped quote, start quote)
|
|
147
|
-
SAFE_TEXT="${TEXT//\'/\'\\\'\'}"
|
|
148
|
-
|
|
149
|
-
# Send TTS command to Android device via SSH
|
|
150
|
-
# Use termux-tts-speak for native Android TTS
|
|
151
|
-
# Run in background to avoid blocking
|
|
152
|
-
ssh -o ConnectTimeout=5 "$SSH_HOST" "termux-tts-speak '$SAFE_TEXT'" &
|
|
153
|
-
|
|
154
|
-
# Get the background process PID
|
|
155
|
-
SSH_PID=$!
|
|
156
|
-
|
|
157
|
-
# Optional: Wait a moment to detect immediate failures
|
|
158
|
-
sleep 0.2
|
|
159
|
-
|
|
160
|
-
# Check if the SSH process is still running (indicates successful start)
|
|
161
|
-
if kill -0 "$SSH_PID" 2>/dev/null; then
|
|
162
|
-
echo "✓ TTS sent to Android device via SSH" >&2
|
|
163
|
-
else
|
|
164
|
-
echo "⚠️ SSH command may have failed" >&2
|
|
165
|
-
fi
|
|
166
|
-
|
|
167
|
-
# Note: We don't return an audio file path since audio plays on the Android device
|
|
168
|
-
# This is by design - the provider outputs audio remotely, not locally
|
|
169
|
-
echo ""
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/play-tts-termux-ssh.sh
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
+
# Website: https://agentvibes.org
|
|
7
|
+
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
8
|
+
#
|
|
9
|
+
# Co-created by Paul Preibisch with Claude AI
|
|
10
|
+
# Copyright (c) 2025 Paul Preibisch
|
|
11
|
+
#
|
|
12
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
+
# you may not use this file except in compliance with the License.
|
|
14
|
+
# You may obtain a copy of the License at
|
|
15
|
+
#
|
|
16
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
+
#
|
|
18
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
19
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
+
# See the License for the specific language governing permissions and
|
|
22
|
+
# limitations under the License.
|
|
23
|
+
#
|
|
24
|
+
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
+
# express or implied. Use at your own risk. See the Apache License for details.
|
|
26
|
+
#
|
|
27
|
+
# ---
|
|
28
|
+
#
|
|
29
|
+
# @fileoverview Termux SSH TTS Provider - Android TTS via SSH tunnel
|
|
30
|
+
# @context Enables TTS output on Android devices when connected via SSH from Termux
|
|
31
|
+
# @architecture SSH-based remote TTS invocation using termux-tts-speak on Android
|
|
32
|
+
# @dependencies ssh, termux-tts-speak (on Android), termux-api (on Android)
|
|
33
|
+
# @entrypoints Called by play-tts.sh router when provider=termux-ssh
|
|
34
|
+
# @patterns Remote TTS invocation, SSH host alias configuration, graceful fallback
|
|
35
|
+
# @related play-tts.sh, provider-manager.sh
|
|
36
|
+
# @setup Requires user to configure SSH host alias in ~/.ssh/config
|
|
37
|
+
#
|
|
38
|
+
# SETUP INSTRUCTIONS:
|
|
39
|
+
# ===================
|
|
40
|
+
# 1. On Android device (Termux):
|
|
41
|
+
# - Install: pkg install termux-api openssh
|
|
42
|
+
# - Install Termux:API app from F-Droid
|
|
43
|
+
# - Start SSH server: sshd
|
|
44
|
+
# - Get SSH port: echo $PREFIX/var/run/sshd.pid
|
|
45
|
+
#
|
|
46
|
+
# 2. On server/desktop:
|
|
47
|
+
# - Add to ~/.ssh/config:
|
|
48
|
+
# Host android
|
|
49
|
+
# HostName <your-android-ip>
|
|
50
|
+
# User <your-termux-username>
|
|
51
|
+
# Port 8022
|
|
52
|
+
# IdentityFile ~/.ssh/id_rsa
|
|
53
|
+
#
|
|
54
|
+
# 3. Configure AgentVibes:
|
|
55
|
+
# - echo "android" > ~/.claude/termux-ssh-host.txt
|
|
56
|
+
# OR
|
|
57
|
+
# - export TERMUX_SSH_HOST="android"
|
|
58
|
+
#
|
|
59
|
+
# 4. Set provider:
|
|
60
|
+
# - echo "termux-ssh" > ~/.claude/tts-provider.txt
|
|
61
|
+
#
|
|
62
|
+
|
|
63
|
+
# Fix locale warnings
|
|
64
|
+
export LC_ALL=C
|
|
65
|
+
|
|
66
|
+
TEXT="$1"
|
|
67
|
+
VOICE_OVERRIDE="$2" # Not used for termux-ssh, but kept for interface compatibility
|
|
68
|
+
|
|
69
|
+
# Script directory
|
|
70
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
71
|
+
|
|
72
|
+
# @function get_ssh_host
|
|
73
|
+
# @intent Determine SSH host alias for Android device
|
|
74
|
+
# @why Allows users to configure their own SSH connection without hardcoded values
|
|
75
|
+
# @returns Echoes SSH host alias or empty string if not configured
|
|
76
|
+
# @sideeffects None
|
|
77
|
+
get_ssh_host() {
|
|
78
|
+
local ssh_host=""
|
|
79
|
+
|
|
80
|
+
# Priority order:
|
|
81
|
+
# 1. Environment variable TERMUX_SSH_HOST
|
|
82
|
+
# 2. Project-specific config file (CLAUDE_PROJECT_DIR)
|
|
83
|
+
# 3. Script location config file
|
|
84
|
+
# 4. Global config file (~/.claude/termux-ssh-host.txt)
|
|
85
|
+
|
|
86
|
+
if [[ -n "$TERMUX_SSH_HOST" ]]; then
|
|
87
|
+
ssh_host="$TERMUX_SSH_HOST"
|
|
88
|
+
elif [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -f "$CLAUDE_PROJECT_DIR/.claude/termux-ssh-host.txt" ]]; then
|
|
89
|
+
ssh_host=$(cat "$CLAUDE_PROJECT_DIR/.claude/termux-ssh-host.txt" 2>/dev/null | tr -d '\n\r')
|
|
90
|
+
elif [[ -f "$SCRIPT_DIR/../termux-ssh-host.txt" ]]; then
|
|
91
|
+
ssh_host=$(cat "$SCRIPT_DIR/../termux-ssh-host.txt" 2>/dev/null | tr -d '\n\r')
|
|
92
|
+
elif [[ -f "$HOME/.claude/termux-ssh-host.txt" ]]; then
|
|
93
|
+
ssh_host=$(cat "$HOME/.claude/termux-ssh-host.txt" 2>/dev/null | tr -d '\n\r')
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
echo "$ssh_host"
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# @function check_termux_connection
|
|
100
|
+
# @intent Verify SSH connection to Android device is available
|
|
101
|
+
# @why Prevent hanging on SSH timeout if device is unreachable
|
|
102
|
+
# @param $1 SSH host alias
|
|
103
|
+
# @returns 0 if connection successful, 1 otherwise
|
|
104
|
+
# @sideeffects None (uses ConnectTimeout=2)
|
|
105
|
+
check_termux_connection() {
|
|
106
|
+
local host="$1"
|
|
107
|
+
|
|
108
|
+
# Quick connection test (2 second timeout)
|
|
109
|
+
if ssh -o ConnectTimeout=2 -o BatchMode=yes "$host" "echo ok" >/dev/null 2>&1; then
|
|
110
|
+
return 0
|
|
111
|
+
else
|
|
112
|
+
return 1
|
|
113
|
+
fi
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# Main execution
|
|
117
|
+
SSH_HOST=$(get_ssh_host)
|
|
118
|
+
|
|
119
|
+
if [[ -z "$SSH_HOST" ]]; then
|
|
120
|
+
echo "❌ Termux SSH provider not configured" >&2
|
|
121
|
+
echo " Set SSH host alias in one of:" >&2
|
|
122
|
+
echo " - Environment: export TERMUX_SSH_HOST='android'" >&2
|
|
123
|
+
echo " - Global: echo 'android' > ~/.claude/termux-ssh-host.txt" >&2
|
|
124
|
+
echo " - Project: echo 'android' > .claude/termux-ssh-host.txt" >&2
|
|
125
|
+
echo "" >&2
|
|
126
|
+
echo " See provider documentation for SSH setup instructions" >&2
|
|
127
|
+
exit 1
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
if [[ -z "$TEXT" ]]; then
|
|
131
|
+
echo "❌ No text provided for TTS" >&2
|
|
132
|
+
exit 1
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# Check if SSH connection is available (with timeout)
|
|
136
|
+
if ! check_termux_connection "$SSH_HOST"; then
|
|
137
|
+
echo "⚠️ Cannot connect to SSH host '$SSH_HOST'" >&2
|
|
138
|
+
echo " Make sure:" >&2
|
|
139
|
+
echo " - Android device is reachable" >&2
|
|
140
|
+
echo " - SSH server is running: sshd" >&2
|
|
141
|
+
echo " - SSH config is correct in ~/.ssh/config" >&2
|
|
142
|
+
exit 1
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# Escape single quotes in text for safe shell transmission
|
|
146
|
+
# Replace ' with '\'' (end quote, escaped quote, start quote)
|
|
147
|
+
SAFE_TEXT="${TEXT//\'/\'\\\'\'}"
|
|
148
|
+
|
|
149
|
+
# Send TTS command to Android device via SSH
|
|
150
|
+
# Use termux-tts-speak for native Android TTS
|
|
151
|
+
# Run in background to avoid blocking
|
|
152
|
+
ssh -o ConnectTimeout=5 "$SSH_HOST" "termux-tts-speak '$SAFE_TEXT'" &
|
|
153
|
+
|
|
154
|
+
# Get the background process PID
|
|
155
|
+
SSH_PID=$!
|
|
156
|
+
|
|
157
|
+
# Optional: Wait a moment to detect immediate failures
|
|
158
|
+
sleep 0.2
|
|
159
|
+
|
|
160
|
+
# Check if the SSH process is still running (indicates successful start)
|
|
161
|
+
if kill -0 "$SSH_PID" 2>/dev/null; then
|
|
162
|
+
echo "✓ TTS sent to Android device via SSH" >&2
|
|
163
|
+
else
|
|
164
|
+
echo "⚠️ SSH command may have failed" >&2
|
|
165
|
+
fi
|
|
166
|
+
|
|
167
|
+
# Note: We don't return an audio file path since audio plays on the Android device
|
|
168
|
+
# This is by design - the provider outputs audio remotely, not locally
|
|
169
|
+
echo ""
|