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.
@@ -77,7 +77,7 @@ elif [[ -f "$GLOBAL_MUTE_FILE" ]]; then
77
77
  exit 0
78
78
  fi
79
79
 
80
- TEXT="$1"
80
+ TEXT="${1:-}"
81
81
  VOICE_OVERRIDE="${2:-}" # Optional: voice name or ID
82
82
 
83
83
  # Security: Validate inputs
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![Publish](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
12
12
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
13
 
14
- **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v3.5.8
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.8 Security & UX + v3.5.5 Native Windows Support
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.8 - Security & Provider Validation](https://github.com/paulpreibisch/AgentVibes/releases/tag/v3.5.8)** šŸ›”ļø
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.5) 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.8 history.
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.8",
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
- const { provider } = await inquirer.prompt([{
866
- type: 'list',
867
- name: 'provider',
868
- message: chalk.yellow('Select TTS provider:'),
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: 'action',
889
- message: 'What would you like to do?',
890
- choices: [
891
- { name: chalk.green('Install now (recommended)'), value: 'install' },
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 (action === 'install') {
898
- console.log(chalk.cyan(`\nšŸ“¦ Installing ${displayName}...\n`));
899
-
900
- // Use smart installation with fallbacks
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
- // Pause before returning to provider selection
929
- await inquirer.prompt([{
930
- type: 'confirm',
931
- name: 'continue',
932
- message: 'Press Enter to go back to provider selection',
933
- default: true
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
- return null; // Go back to provider selection
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 if (action === 'back') {
939
- // Go back to provider selection
940
- return null;
941
- } else if (action === 'skip') {
942
- console.log(chalk.yellow(`\nāš ļø No problem! You can set it up anytime with:\n ${getProviderInstallCommand(provider)}\n`));
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';