agentvibes 3.5.8 ā 3.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/play-tts.sh +1 -1
- package/README.md +8 -4
- package/package.json +1 -1
- package/src/installer.js +88 -78
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v3.5.
|
|
14
|
+
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v3.5.9
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
@@ -97,7 +97,7 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
|
|
|
97
97
|
- [š± Android/Termux](#-quick-setup-android--termux-claude-code-on-your-phone) - Run Claude Code on your phone
|
|
98
98
|
- [š Prerequisites](#-prerequisites) - What you actually need (Node.js + optional tools)
|
|
99
99
|
- [⨠What is AgentVibes?](#-what-is-agentvibes) - Overview & key features
|
|
100
|
-
- [š° Latest Release](#-latest-release) - v3.5.
|
|
100
|
+
- [š° Latest Release](#-latest-release) - v3.5.9 Security & UX + v3.5.5 Native Windows Support
|
|
101
101
|
- [šŖ Windows Setup Guide for Claude Desktop](mcp-server/WINDOWS_SETUP.md) - Complete Windows installation with WSL & Python
|
|
102
102
|
|
|
103
103
|
### AgentVibes MCP (Natural Language Control)
|
|
@@ -134,6 +134,7 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
|
|
|
134
134
|
- [šļø Uninstalling](#ļø-uninstalling) - Remove AgentVibes cleanly
|
|
135
135
|
- [ā FAQ](#-frequently-asked-questions-faq) - **NEW!** Common questions answered (git-lfs, MCP tokens, installation)
|
|
136
136
|
- [š macOS Testing](docs/macos-testing.md) - Automated testing on macOS with GitHub Actions
|
|
137
|
+
- [š¤ Hugging Face Voice Models](docs/hugging-face-models.md) - Technical details on AI voice models
|
|
137
138
|
- [š Credits](#-credits) - Acknowledgments
|
|
138
139
|
- [š¤ Contributing](#-contributing) - Show support
|
|
139
140
|
|
|
@@ -141,11 +142,11 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
|
|
|
141
142
|
|
|
142
143
|
## š° Latest Release
|
|
143
144
|
|
|
144
|
-
**[v3.5.
|
|
145
|
+
**[v3.5.9 - Security & Provider Validation](https://github.com/paulpreibisch/AgentVibes/releases/tag/v3.5.9)** š”ļø
|
|
145
146
|
|
|
146
147
|
Critical security update: Fixed command injection vulnerabilities, HOME directory injection prevention, and path traversal protection. Soprano TTS installed via pipx now correctly detected. Enhanced provider detection messaging and debug logging.
|
|
147
148
|
|
|
148
|
-
**Foundation Release:** [v3.5.5 - Native Windows Support](https://github.com/paulpreibisch/AgentVibes/releases/tag/v3.5.
|
|
149
|
+
**Foundation Release:** [v3.5.5 - Native Windows Support](https://github.com/paulpreibisch/AgentVibes/releases/tag/v3.5.9) brings Windows support (Soprano, Piper, SAPI), background music (16 genre tracks), reverb/audio effects, and verbosity control. [See release notes](RELEASE_NOTES.md) for complete v3.5.5-3.5.9 history.
|
|
149
150
|
|
|
150
151
|
š” **Tip:** If `npx agentvibes` shows an older version or missing commands, clear your npm cache: `npm cache clean --force && npx agentvibes@latest --help`
|
|
151
152
|
|
|
@@ -1467,6 +1468,9 @@ Both do the exact same thing - MCP is more convenient, slash commands are more t
|
|
|
1467
1468
|
|
|
1468
1469
|
**Powered by:**
|
|
1469
1470
|
- [Piper TTS](https://github.com/rhasspy/piper) - Free neural voices
|
|
1471
|
+
- [Soprano TTS](https://github.com/suno-ai/bark) - Ultra-fast neural TTS
|
|
1472
|
+
- **Windows SAPI** - Native Windows text-to-speech
|
|
1473
|
+
- **macOS Say** - Native macOS text-to-speech
|
|
1470
1474
|
- [Claude Code](https://claude.com/claude-code) - AI coding assistant
|
|
1471
1475
|
- Licensed under Apache 2.0
|
|
1472
1476
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "agentvibes",
|
|
4
|
-
"version": "3.5.
|
|
4
|
+
"version": "3.5.9",
|
|
5
5
|
"description": "Now your AI Agents can finally talk back! Professional TTS voice for Claude Code, Claude Desktop (via MCP), and Clawdbot with multi-provider support.",
|
|
6
6
|
"homepage": "https://agentvibes.org",
|
|
7
7
|
"keywords": [
|
package/src/installer.js
CHANGED
|
@@ -862,93 +862,103 @@ async function collectConfiguration(options = {}) {
|
|
|
862
862
|
value: '__back__'
|
|
863
863
|
});
|
|
864
864
|
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
choices: providerChoices,
|
|
870
|
-
default: config.provider || (isNativeWindows() ? 'windows-piper' : (isMacOS ? 'macos' : 'piper'))
|
|
871
|
-
}]);
|
|
872
|
-
|
|
873
|
-
// Check if user wants to go back
|
|
874
|
-
if (provider === '__back__') {
|
|
875
|
-
return null;
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
// Validate provider installation before accepting selection
|
|
879
|
-
console.log(chalk.gray(`\n Checking for ${getProviderDisplayName(provider)}...`));
|
|
880
|
-
const validation = await validateProvider(provider);
|
|
881
|
-
|
|
882
|
-
if (!validation.installed) {
|
|
883
|
-
const displayName = getProviderDisplayName(provider);
|
|
884
|
-
console.log(chalk.yellow(`\nā ļø ${validation.message}`));
|
|
885
|
-
|
|
886
|
-
const { action } = await inquirer.prompt([{
|
|
865
|
+
// Provider selection loop - allows user to try different providers without going back
|
|
866
|
+
let providerSelected = false;
|
|
867
|
+
while (!providerSelected) {
|
|
868
|
+
const { provider } = await inquirer.prompt([{
|
|
887
869
|
type: 'list',
|
|
888
|
-
name: '
|
|
889
|
-
message: '
|
|
890
|
-
choices:
|
|
891
|
-
|
|
892
|
-
{ name: 'Choose a different provider', value: 'back' },
|
|
893
|
-
{ name: 'I\'ll install it myself later', value: 'skip' }
|
|
894
|
-
]
|
|
870
|
+
name: 'provider',
|
|
871
|
+
message: chalk.yellow('Select TTS provider:'),
|
|
872
|
+
choices: providerChoices,
|
|
873
|
+
default: config.provider || (isNativeWindows() ? 'windows-piper' : (isMacOS ? 'macos' : 'piper'))
|
|
895
874
|
}]);
|
|
896
875
|
|
|
897
|
-
if
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
const installResult = await attemptProviderInstallation(provider);
|
|
902
|
-
|
|
903
|
-
if (installResult.success && installResult.verified) {
|
|
904
|
-
// Installation succeeded AND verified
|
|
905
|
-
console.log(chalk.green(`\nā ${displayName} installed and verified!\n`));
|
|
906
|
-
console.log(chalk.gray(` Method: ${installResult.command}`));
|
|
907
|
-
console.log(chalk.green(` Status: Ready to use\n`));
|
|
908
|
-
} else if (installResult.success) {
|
|
909
|
-
// Installation command ran but verification failed
|
|
910
|
-
console.log(chalk.yellow(`\nā ļø Installation command completed, but verification failed\n`));
|
|
911
|
-
console.log(chalk.gray(` The installation may have been blocked by system protection (PEP 668).\n`));
|
|
912
|
-
console.log(chalk.cyan(` Try one of these solutions:\n`));
|
|
913
|
-
console.log(chalk.gray(` 1. Use pipx (avoids system protection):\n pipx install soprano-tts\n`));
|
|
914
|
-
console.log(chalk.gray(` 2. Create a virtual environment:\n python3 -m venv ~/my-env\n ~/my-env/bin/pip install soprano-tts\n`));
|
|
915
|
-
|
|
916
|
-
// Pause before returning to provider selection
|
|
917
|
-
await inquirer.prompt([{
|
|
918
|
-
type: 'confirm',
|
|
919
|
-
name: 'continue',
|
|
920
|
-
message: 'Press Enter to go back to provider selection',
|
|
921
|
-
default: true
|
|
922
|
-
}]);
|
|
923
|
-
|
|
924
|
-
return null; // Go back to provider selection
|
|
925
|
-
} else {
|
|
926
|
-
console.log(chalk.red(`\nā ${installResult.message}\n`));
|
|
876
|
+
// Check if user wants to go back to previous page
|
|
877
|
+
if (provider === '__back__') {
|
|
878
|
+
return null;
|
|
879
|
+
}
|
|
927
880
|
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
881
|
+
// Validate provider installation before accepting selection
|
|
882
|
+
console.log(chalk.gray(`\n Checking for ${getProviderDisplayName(provider)}...`));
|
|
883
|
+
const validation = await validateProvider(provider);
|
|
884
|
+
|
|
885
|
+
if (!validation.installed) {
|
|
886
|
+
const displayName = getProviderDisplayName(provider);
|
|
887
|
+
console.log(chalk.yellow(`\nā ļø ${validation.message}`));
|
|
888
|
+
|
|
889
|
+
const { action } = await inquirer.prompt([{
|
|
890
|
+
type: 'list',
|
|
891
|
+
name: 'action',
|
|
892
|
+
message: 'What would you like to do?',
|
|
893
|
+
choices: [
|
|
894
|
+
{ name: chalk.green('Install now (recommended)'), value: 'install' },
|
|
895
|
+
{ name: 'Choose a different provider', value: 'back' },
|
|
896
|
+
{ name: 'I\'ll install it myself later', value: 'skip' }
|
|
897
|
+
]
|
|
898
|
+
}]);
|
|
935
899
|
|
|
936
|
-
|
|
900
|
+
if (action === 'install') {
|
|
901
|
+
console.log(chalk.cyan(`\nš¦ Installing ${displayName}...\n`));
|
|
902
|
+
|
|
903
|
+
// Use smart installation with fallbacks
|
|
904
|
+
const installResult = await attemptProviderInstallation(provider);
|
|
905
|
+
|
|
906
|
+
if (installResult.success && installResult.verified) {
|
|
907
|
+
// Installation succeeded AND verified
|
|
908
|
+
console.log(chalk.green(`\nā ${displayName} installed and verified!\n`));
|
|
909
|
+
console.log(chalk.gray(` Method: ${installResult.command}`));
|
|
910
|
+
console.log(chalk.green(` Status: Ready to use\n`));
|
|
911
|
+
config.provider = provider;
|
|
912
|
+
providerSelected = true; // Exit provider selection loop
|
|
913
|
+
} else if (installResult.success) {
|
|
914
|
+
// Installation command ran but verification failed
|
|
915
|
+
console.log(chalk.yellow(`\nā ļø Installation command completed, but verification failed\n`));
|
|
916
|
+
console.log(chalk.gray(` The installation may have been blocked by system protection (PEP 668).\n`));
|
|
917
|
+
console.log(chalk.cyan(` Try one of these solutions:\n`));
|
|
918
|
+
console.log(chalk.gray(` 1. Use pipx (avoids system protection):\n pipx install soprano-tts\n`));
|
|
919
|
+
console.log(chalk.gray(` 2. Create a virtual environment:\n python3 -m venv ~/my-env\n ~/my-env/bin/pip install soprano-tts\n`));
|
|
920
|
+
|
|
921
|
+
// Pause before returning to provider selection
|
|
922
|
+
await inquirer.prompt([{
|
|
923
|
+
type: 'confirm',
|
|
924
|
+
name: 'continue',
|
|
925
|
+
message: 'Press Enter to try a different provider',
|
|
926
|
+
default: true
|
|
927
|
+
}]);
|
|
928
|
+
|
|
929
|
+
// Loop back to provider selection
|
|
930
|
+
continue;
|
|
931
|
+
} else {
|
|
932
|
+
console.log(chalk.red(`\nā ${installResult.message}\n`));
|
|
933
|
+
|
|
934
|
+
// Pause before returning to provider selection
|
|
935
|
+
await inquirer.prompt([{
|
|
936
|
+
type: 'confirm',
|
|
937
|
+
name: 'continue',
|
|
938
|
+
message: 'Press Enter to try a different provider',
|
|
939
|
+
default: true
|
|
940
|
+
}]);
|
|
941
|
+
|
|
942
|
+
// Loop back to provider selection
|
|
943
|
+
continue;
|
|
944
|
+
}
|
|
945
|
+
} else if (action === 'back') {
|
|
946
|
+
// Loop back to provider selection to choose a different one
|
|
947
|
+
continue;
|
|
948
|
+
} else if (action === 'skip') {
|
|
949
|
+
console.log(chalk.yellow(`\nā ļø No problem! You can set it up anytime with:\n ${getProviderInstallCommand(provider)}\n`));
|
|
950
|
+
config.provider = provider;
|
|
951
|
+
providerSelected = true; // Exit provider selection loop
|
|
937
952
|
}
|
|
938
|
-
} else
|
|
939
|
-
//
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
953
|
+
} else {
|
|
954
|
+
// Provider detected and ready to use
|
|
955
|
+
const displayName = getProviderDisplayName(provider);
|
|
956
|
+
console.log(chalk.green(`\nā ${displayName} Detected and selected!\n`));
|
|
957
|
+
config.provider = provider;
|
|
958
|
+
providerSelected = true; // Exit provider selection loop
|
|
943
959
|
}
|
|
944
|
-
} else {
|
|
945
|
-
// Provider detected and ready to use
|
|
946
|
-
const displayName = getProviderDisplayName(provider);
|
|
947
|
-
console.log(chalk.green(`\nā ${displayName} Detected and selected!\n`));
|
|
948
960
|
}
|
|
949
961
|
|
|
950
|
-
config.provider = provider;
|
|
951
|
-
|
|
952
962
|
// Handle special receiver mode for Termux
|
|
953
963
|
if (config.provider === 'piper-receiver') {
|
|
954
964
|
config.provider = 'piper';
|