voice-mode 4.3.1__tar.gz → 4.4.0__tar.gz
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.
- {voice_mode-4.3.1 → voice_mode-4.4.0}/CHANGELOG.md +56 -1
- {voice_mode-4.3.1 → voice_mode-4.4.0}/PKG-INFO +33 -40
- {voice_mode-4.3.1 → voice_mode-4.4.0}/README.md +31 -39
- {voice_mode-4.3.1 → voice_mode-4.4.0}/pyproject.toml +1 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/__version__.py +1 -1
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/cli.py +3 -2
- voice_mode-4.4.0/voice_mode/cli_commands/claude.py +15 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/cli_commands/hook.py +13 -16
- voice_mode-4.4.0/voice_mode/statistics_tracking.py +42 -0
- voice_mode-4.4.0/voice_mode/tools/__init__.py +50 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/converse.py +1 -1
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/statistics.py +0 -33
- voice_mode-4.3.1/voice_mode/cli_commands/claude.py +0 -208
- voice_mode-4.3.1/voice_mode/tools/__init__.py +0 -24
- voice_mode-4.3.1/voice_mode/tools/claude_thinking.py +0 -285
- {voice_mode-4.3.1 → voice_mode-4.4.0}/.gitignore +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/build_hooks.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/__main__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/cli_commands/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/cli_commands/exchanges.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/cli_commands/pronounce_commands.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/cli_commands/transcribe.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/config.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/conversation_logger.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/core.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/data/default_pronunciation.yaml +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/data/versions.json +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/conversations.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/filters.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/formatters.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/models.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/reader.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/exchanges/stats.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/README.md +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/app/api/connection-details/route.ts +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/app/favicon.ico +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/app/globals.css +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/app/layout.tsx +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/app/page.tsx +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/components/CloseIcon.tsx +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/components/NoAgentNotification.tsx +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/components/TranscriptionView.tsx +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/hooks/useCombinedTranscriptions.ts +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/hooks/useLocalMicTrack.ts +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/next-env.d.ts +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/next.config.mjs +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/package-lock.json +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/package.json +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/pnpm-lock.yaml +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/postcss.config.mjs +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/tailwind.config.ts +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/frontend/tsconfig.json +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/prompts/README.md +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/prompts/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/prompts/converse.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/prompts/release_notes.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/prompts/services.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/pronounce.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/provider_discovery.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/providers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/audio_files.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/changelog.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/configuration.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/statistics.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/version.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/resources/whisper_models.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/server.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/shared.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/simple_failover.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/statistics.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/streaming.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.frontend.plist +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.kokoro.plist +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.livekit.plist +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.whisper.plist +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/launchd/start-kokoro-with-health-check.sh +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/launchd/start-whisper-with-health-check.sh +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/scripts/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/scripts/start-whisper-server.sh +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-frontend.service +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-kokoro.service +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-livekit.service +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-whisper.service +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/configuration_management.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/dependencies.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/devices.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/diagnostics.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/pronounce.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/providers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/service.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/kokoro/install.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/kokoro/uninstall.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/list_versions.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/frontend.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/install.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/production_server.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/uninstall.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/version_info.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/install.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/list_models.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_active.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_benchmark.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_install.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_remove.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/models.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/uninstall.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/audio_player.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/hook_handler.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/player.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/transcription/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/transcription/backends.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/transcription/core.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/transcription/formats.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/transcription/types.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/tools/voice_registry.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/__init__.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/audio_diagnostics.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/event_logger.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/ffmpeg_check.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/format_migration.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/gpu_detection.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/migration_helpers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/services/common.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/services/coreml_setup.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/services/kokoro_helpers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/services/livekit_helpers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/services/whisper_helpers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/services/whisper_version.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/utils/version_helpers.py +0 -0
- {voice_mode-4.3.1 → voice_mode-4.4.0}/voice_mode/version.py +0 -0
@@ -7,10 +7,65 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [4.4.0] - 2025-09-10
|
11
|
+
|
12
|
+
### Added
|
13
|
+
- **MCP Registry Support**
|
14
|
+
- Add server.json configuration for MCP registry publication
|
15
|
+
- Add mcp-name field to README for PyPI package validation
|
16
|
+
- Integrate MCP registry publishing into CI/CD workflow
|
17
|
+
- Support DNS-based namespace authentication (com.failmode/voicemode)
|
18
|
+
- Update Makefile to sync server.json version during releases
|
19
|
+
|
20
|
+
- **Cloudflare Worker for voicemode.sh**
|
21
|
+
- Serve install script via custom domain
|
22
|
+
- Smart user-agent detection for CLI vs browser
|
23
|
+
- Cached script delivery with fallback
|
24
|
+
|
25
|
+
- **Selective Tool Loading**
|
26
|
+
- Reduce token usage by loading tools on demand
|
27
|
+
- Implement smart tool filtering based on context
|
28
|
+
- Add tool loading configuration options
|
29
|
+
|
30
|
+
- **Documentation Improvements**
|
31
|
+
- Complete documentation reorganization
|
32
|
+
- Add tutorials, guides, and reference sections
|
33
|
+
- Improve getting-started guide with clear paths
|
34
|
+
- Add universal installer as primary quick start
|
35
|
+
- Archive outdated documentation
|
36
|
+
|
37
|
+
- **Three Bears Agent Support**
|
38
|
+
- Add baby-bear, mama-bear, and papa-bear agent configurations
|
39
|
+
- Integrate with sound fonts for agent-specific audio feedback
|
40
|
+
|
41
|
+
### Changed
|
42
|
+
- Consolidate PyPI and MCP Registry publishing workflows
|
43
|
+
- Update branch references from 'main' to 'master'
|
44
|
+
- Improve Cloudflare Worker error handling and caching
|
45
|
+
- Rename hook to hooks, stdin-receiver to receiver
|
46
|
+
|
47
|
+
### Fixed
|
48
|
+
- Fix broken documentation links after refactor
|
49
|
+
- Restore minimal claude command group for hook support
|
50
|
+
- Fix Claude settings.json path configuration
|
51
|
+
|
52
|
+
## [4.3.2] - 2025-09-03
|
53
|
+
|
54
|
+
### Fixed
|
55
|
+
- Add missing pyyaml dependency to pyproject.toml
|
56
|
+
- Remove macOS-only restriction from package
|
57
|
+
- Add Claude hooks configuration to repository settings
|
58
|
+
|
10
59
|
## [4.3.1] - 2025-09-03
|
11
60
|
|
61
|
+
### Fixed
|
62
|
+
- Minor bug fixes and improvements
|
63
|
+
|
12
64
|
## [4.3.0] - 2025-09-03
|
13
65
|
|
66
|
+
### Added
|
67
|
+
- Sound fonts with MP3 support and Three Bears sounds integration
|
68
|
+
|
14
69
|
## [4.2.0] - 2025-09-03
|
15
70
|
|
16
71
|
### Added
|
@@ -24,7 +79,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
24
79
|
- **🔊 Sound Fonts Integration - Audio Feedback for Every Action**
|
25
80
|
- Play custom sounds for tool operations, errors, and completions
|
26
81
|
- Filesystem-based sound font system with automatic discovery
|
27
|
-
- Claude Code integration via
|
82
|
+
- Claude Code integration via receiver for hook-based audio
|
28
83
|
- CLI command `play-sound` with theme, action, and sound selection
|
29
84
|
- Enhances user experience with auditory feedback during operations
|
30
85
|
- MP3 support added for 90% file size reduction over WAV
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: voice-mode
|
3
|
-
Version: 4.
|
3
|
+
Version: 4.4.0
|
4
4
|
Summary: VoiceMode - Voice interaction capabilities for AI assistants (formerly voice-mcp)
|
5
5
|
Project-URL: Homepage, https://github.com/mbailey/voicemode
|
6
6
|
Project-URL: Repository, https://github.com/mbailey/voicemode
|
@@ -33,6 +33,7 @@ Requires-Dist: numpy
|
|
33
33
|
Requires-Dist: openai>=1.0.0
|
34
34
|
Requires-Dist: psutil>=5.9.0
|
35
35
|
Requires-Dist: pydub
|
36
|
+
Requires-Dist: pyyaml>=6.0.0
|
36
37
|
Requires-Dist: scipy
|
37
38
|
Requires-Dist: setuptools
|
38
39
|
Requires-Dist: simpleaudio
|
@@ -77,6 +78,8 @@ Description-Content-Type: text/markdown
|
|
77
78
|
|
78
79
|
# Voice Mode
|
79
80
|
|
81
|
+
mcp-name: com.failmode/voicemode
|
82
|
+
|
80
83
|
> **Install via:** `uvx voice-mode` | `pip install voice-mode` | [getvoicemode.com](https://getvoicemode.com)
|
81
84
|
|
82
85
|
[](https://pepy.tech/project/voice-mode)
|
@@ -112,7 +115,7 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
|
|
112
115
|
|
113
116
|
## Quick Start
|
114
117
|
|
115
|
-
> 📖 **Using a different tool?** See our [
|
118
|
+
> 📖 **Using a different tool?** See our [Getting Started Guide](docs/tutorials/getting-started.md) for setup instructions!
|
116
119
|
|
117
120
|
### Automatic Installation (Recommended)
|
118
121
|
|
@@ -139,7 +142,7 @@ This installer will:
|
|
139
142
|
|
140
143
|
### Manual Installation
|
141
144
|
|
142
|
-
For manual setup steps, see the [
|
145
|
+
For manual setup steps, see the [Getting Started Guide](docs/tutorials/getting-started.md).
|
143
146
|
|
144
147
|
## 🎬 Demo
|
145
148
|
|
@@ -179,16 +182,16 @@ The `converse` function makes voice interactions natural - it automatically wait
|
|
179
182
|
|
180
183
|
Voice Mode works with your favorite AI coding assistants:
|
181
184
|
|
182
|
-
- 🤖 **
|
183
|
-
- 🖥️ **
|
184
|
-
- 🌟 **
|
185
|
-
- ⚡ **
|
186
|
-
- 💻 **
|
187
|
-
- 🦘 **
|
188
|
-
- 🔧 **
|
189
|
-
- ⚡ **
|
190
|
-
- 🏄 **
|
191
|
-
- 🔄 **
|
185
|
+
- 🤖 **Claude Code** - Anthropic's official CLI
|
186
|
+
- 🖥️ **Claude Desktop** - Desktop application
|
187
|
+
- 🌟 **Gemini CLI** - Google's CLI tool
|
188
|
+
- ⚡ **Cursor** - AI-first code editor
|
189
|
+
- 💻 **VS Code** - With MCP preview support
|
190
|
+
- 🦘 **Roo Code** - AI dev team in VS Code
|
191
|
+
- 🔧 **Cline** - Autonomous coding agent
|
192
|
+
- ⚡ **Zed** - High-performance editor
|
193
|
+
- 🏄 **Windsurf** - Agentic IDE by Codeium
|
194
|
+
- 🔄 **Continue** - Open-source AI assistant
|
192
195
|
|
193
196
|
## Installation
|
194
197
|
|
@@ -207,7 +210,7 @@ sudo apt update
|
|
207
210
|
sudo apt install -y python3-dev libasound2-dev libasound2-plugins libportaudio2 portaudio19-dev ffmpeg pulseaudio pulseaudio-utils
|
208
211
|
```
|
209
212
|
|
210
|
-
**Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
|
213
|
+
**Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
|
211
214
|
</details>
|
212
215
|
|
213
216
|
<details>
|
@@ -270,7 +273,7 @@ nix run github:mbailey/voicemode
|
|
270
273
|
|
271
274
|
### Configuration for AI Coding Assistants
|
272
275
|
|
273
|
-
> 📖 **Looking for detailed setup instructions?** Check our comprehensive [
|
276
|
+
> 📖 **Looking for detailed setup instructions?** Check our comprehensive [Getting Started Guide](docs/tutorials/getting-started.md) for step-by-step instructions!
|
274
277
|
|
275
278
|
Below are quick configuration snippets. For full installation and setup instructions, see the integration guides above.
|
276
279
|
|
@@ -548,12 +551,12 @@ nix run github:mbailey/voicemode
|
|
548
551
|
|
549
552
|
**Note:** The `converse` tool is the primary interface for voice interactions, combining speaking and listening in a natural flow.
|
550
553
|
|
551
|
-
**New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
|
554
|
+
**New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
|
552
555
|
|
553
556
|
## Configuration
|
554
557
|
|
555
|
-
- 📖 **[
|
556
|
-
- 🔧 **[Configuration Reference](docs/configuration.md)** - All environment variables
|
558
|
+
- 📖 **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup guide
|
559
|
+
- 🔧 **[Configuration Reference](docs/guides/configuration.md)** - All environment variables
|
557
560
|
- 📁 **[Config Examples](config-examples/)** - Ready-to-use configuration files
|
558
561
|
|
559
562
|
### Quick Setup
|
@@ -615,8 +618,8 @@ The audio format is automatically validated against provider capabilities and wi
|
|
615
618
|
|
616
619
|
For privacy-focused or offline usage, Voice Mode supports local speech services:
|
617
620
|
|
618
|
-
- **[Whisper.cpp](docs/whisper.
|
619
|
-
- **[Kokoro](docs/kokoro.md)** - Local text-to-speech with multiple voice options
|
621
|
+
- **[Whisper.cpp](docs/guides/whisper-setup.md)** - Local speech-to-text with OpenAI-compatible API
|
622
|
+
- **[Kokoro](docs/guides/kokoro-setup.md)** - Local text-to-speech with multiple voice options
|
620
623
|
|
621
624
|
These services provide the same API interface as OpenAI, allowing seamless switching between cloud and local processing.
|
622
625
|
|
@@ -662,7 +665,7 @@ The OpenAI SDK handles this automatically - no Voice Mode configuration needed!
|
|
662
665
|
### Common Issues
|
663
666
|
|
664
667
|
- **No microphone access**: Check system permissions for terminal/application
|
665
|
-
- **WSL2 Users**:
|
668
|
+
- **WSL2 Users**: Additional audio packages (pulseaudio, libasound2-plugins) required for microphone access
|
666
669
|
- **UV not found**: Install with `curl -LsSf https://astral.sh/uv/install.sh | sh`
|
667
670
|
- **OpenAI API error**: Verify your `OPENAI_API_KEY` is set correctly
|
668
671
|
- **No audio output**: Check system audio settings and available devices
|
@@ -702,24 +705,17 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
|
|
702
705
|
📚 **[Read the full documentation at voice-mode.readthedocs.io](https://voice-mode.readthedocs.io)**
|
703
706
|
|
704
707
|
### Getting Started
|
705
|
-
- **[
|
706
|
-
- **[Configuration Guide](docs/configuration.md)** - Complete environment variable reference
|
708
|
+
- **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup for all supported tools
|
709
|
+
- **[Configuration Guide](docs/guides/configuration.md)** - Complete environment variable reference
|
707
710
|
|
708
711
|
### Development
|
709
|
-
- **[
|
710
|
-
- **[Local Development](docs/local-development-uvx.md)** - Development setup guide
|
711
|
-
- **[Audio Formats](docs/audio-format-migration.md)** - Audio format configuration and migration
|
712
|
-
- **[Statistics Dashboard](docs/statistics-dashboard.md)** - Performance monitoring and metrics
|
712
|
+
- **[Development Setup](docs/tutorials/development-setup.md)** - Local development guide
|
713
713
|
|
714
714
|
### Service Guides
|
715
|
-
- **[Whisper.cpp Setup](docs/whisper.
|
716
|
-
- **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
|
717
|
-
- **[
|
718
|
-
- **[LiveKit Integration](docs/livekit/README.md)** - Real-time voice communication
|
715
|
+
- **[Whisper.cpp Setup](docs/guides/whisper-setup.md)** - Local speech-to-text configuration
|
716
|
+
- **[Kokoro Setup](docs/guides/kokoro-setup.md)** - Local text-to-speech configuration
|
717
|
+
- **[LiveKit Integration](docs/guides/livekit-setup.md)** - Real-time voice communication
|
719
718
|
|
720
|
-
### Troubleshooting
|
721
|
-
- **[WSL2 Microphone Access](docs/troubleshooting/wsl2-microphone-access.md)** - WSL2 audio setup
|
722
|
-
- **[Migration Guide](docs/migration-guide.md)** - Upgrading from older versions
|
723
719
|
|
724
720
|
## Links
|
725
721
|
|
@@ -737,15 +733,12 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
|
|
737
733
|
|
738
734
|
## See Also
|
739
735
|
|
740
|
-
- 🚀 [
|
741
|
-
- 🔧 [Configuration Reference](docs/configuration.md) - Environment variables and options
|
742
|
-
- 🎤 [Local Services Setup](docs/kokoro.md) - Run TTS/STT locally for privacy
|
743
|
-
- 🐛 [Troubleshooting](docs/troubleshooting/README.md) - Common issues and solutions
|
736
|
+
- 🚀 [Getting Started](docs/tutorials/getting-started.md) - Setup instructions for all supported tools
|
737
|
+
- 🔧 [Configuration Reference](docs/guides/configuration.md) - Environment variables and options
|
738
|
+
- 🎤 [Local Services Setup](docs/guides/kokoro-setup.md) - Run TTS/STT locally for privacy
|
744
739
|
|
745
740
|
## License
|
746
741
|
|
747
742
|
MIT - A [Failmode](https://failmode.com) Project
|
748
743
|
|
749
744
|
---
|
750
|
-
|
751
|
-
<sub>[Project Statistics](docs/project-stats/README.md)</sub>
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# Voice Mode
|
2
2
|
|
3
|
+
mcp-name: com.failmode/voicemode
|
4
|
+
|
3
5
|
> **Install via:** `uvx voice-mode` | `pip install voice-mode` | [getvoicemode.com](https://getvoicemode.com)
|
4
6
|
|
5
7
|
[](https://pepy.tech/project/voice-mode)
|
@@ -35,7 +37,7 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
|
|
35
37
|
|
36
38
|
## Quick Start
|
37
39
|
|
38
|
-
> 📖 **Using a different tool?** See our [
|
40
|
+
> 📖 **Using a different tool?** See our [Getting Started Guide](docs/tutorials/getting-started.md) for setup instructions!
|
39
41
|
|
40
42
|
### Automatic Installation (Recommended)
|
41
43
|
|
@@ -62,7 +64,7 @@ This installer will:
|
|
62
64
|
|
63
65
|
### Manual Installation
|
64
66
|
|
65
|
-
For manual setup steps, see the [
|
67
|
+
For manual setup steps, see the [Getting Started Guide](docs/tutorials/getting-started.md).
|
66
68
|
|
67
69
|
## 🎬 Demo
|
68
70
|
|
@@ -102,16 +104,16 @@ The `converse` function makes voice interactions natural - it automatically wait
|
|
102
104
|
|
103
105
|
Voice Mode works with your favorite AI coding assistants:
|
104
106
|
|
105
|
-
- 🤖 **
|
106
|
-
- 🖥️ **
|
107
|
-
- 🌟 **
|
108
|
-
- ⚡ **
|
109
|
-
- 💻 **
|
110
|
-
- 🦘 **
|
111
|
-
- 🔧 **
|
112
|
-
- ⚡ **
|
113
|
-
- 🏄 **
|
114
|
-
- 🔄 **
|
107
|
+
- 🤖 **Claude Code** - Anthropic's official CLI
|
108
|
+
- 🖥️ **Claude Desktop** - Desktop application
|
109
|
+
- 🌟 **Gemini CLI** - Google's CLI tool
|
110
|
+
- ⚡ **Cursor** - AI-first code editor
|
111
|
+
- 💻 **VS Code** - With MCP preview support
|
112
|
+
- 🦘 **Roo Code** - AI dev team in VS Code
|
113
|
+
- 🔧 **Cline** - Autonomous coding agent
|
114
|
+
- ⚡ **Zed** - High-performance editor
|
115
|
+
- 🏄 **Windsurf** - Agentic IDE by Codeium
|
116
|
+
- 🔄 **Continue** - Open-source AI assistant
|
115
117
|
|
116
118
|
## Installation
|
117
119
|
|
@@ -130,7 +132,7 @@ sudo apt update
|
|
130
132
|
sudo apt install -y python3-dev libasound2-dev libasound2-plugins libportaudio2 portaudio19-dev ffmpeg pulseaudio pulseaudio-utils
|
131
133
|
```
|
132
134
|
|
133
|
-
**Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
|
135
|
+
**Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
|
134
136
|
</details>
|
135
137
|
|
136
138
|
<details>
|
@@ -193,7 +195,7 @@ nix run github:mbailey/voicemode
|
|
193
195
|
|
194
196
|
### Configuration for AI Coding Assistants
|
195
197
|
|
196
|
-
> 📖 **Looking for detailed setup instructions?** Check our comprehensive [
|
198
|
+
> 📖 **Looking for detailed setup instructions?** Check our comprehensive [Getting Started Guide](docs/tutorials/getting-started.md) for step-by-step instructions!
|
197
199
|
|
198
200
|
Below are quick configuration snippets. For full installation and setup instructions, see the integration guides above.
|
199
201
|
|
@@ -471,12 +473,12 @@ nix run github:mbailey/voicemode
|
|
471
473
|
|
472
474
|
**Note:** The `converse` tool is the primary interface for voice interactions, combining speaking and listening in a natural flow.
|
473
475
|
|
474
|
-
**New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
|
476
|
+
**New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
|
475
477
|
|
476
478
|
## Configuration
|
477
479
|
|
478
|
-
- 📖 **[
|
479
|
-
- 🔧 **[Configuration Reference](docs/configuration.md)** - All environment variables
|
480
|
+
- 📖 **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup guide
|
481
|
+
- 🔧 **[Configuration Reference](docs/guides/configuration.md)** - All environment variables
|
480
482
|
- 📁 **[Config Examples](config-examples/)** - Ready-to-use configuration files
|
481
483
|
|
482
484
|
### Quick Setup
|
@@ -538,8 +540,8 @@ The audio format is automatically validated against provider capabilities and wi
|
|
538
540
|
|
539
541
|
For privacy-focused or offline usage, Voice Mode supports local speech services:
|
540
542
|
|
541
|
-
- **[Whisper.cpp](docs/whisper.
|
542
|
-
- **[Kokoro](docs/kokoro.md)** - Local text-to-speech with multiple voice options
|
543
|
+
- **[Whisper.cpp](docs/guides/whisper-setup.md)** - Local speech-to-text with OpenAI-compatible API
|
544
|
+
- **[Kokoro](docs/guides/kokoro-setup.md)** - Local text-to-speech with multiple voice options
|
543
545
|
|
544
546
|
These services provide the same API interface as OpenAI, allowing seamless switching between cloud and local processing.
|
545
547
|
|
@@ -585,7 +587,7 @@ The OpenAI SDK handles this automatically - no Voice Mode configuration needed!
|
|
585
587
|
### Common Issues
|
586
588
|
|
587
589
|
- **No microphone access**: Check system permissions for terminal/application
|
588
|
-
- **WSL2 Users**:
|
590
|
+
- **WSL2 Users**: Additional audio packages (pulseaudio, libasound2-plugins) required for microphone access
|
589
591
|
- **UV not found**: Install with `curl -LsSf https://astral.sh/uv/install.sh | sh`
|
590
592
|
- **OpenAI API error**: Verify your `OPENAI_API_KEY` is set correctly
|
591
593
|
- **No audio output**: Check system audio settings and available devices
|
@@ -625,24 +627,17 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
|
|
625
627
|
📚 **[Read the full documentation at voice-mode.readthedocs.io](https://voice-mode.readthedocs.io)**
|
626
628
|
|
627
629
|
### Getting Started
|
628
|
-
- **[
|
629
|
-
- **[Configuration Guide](docs/configuration.md)** - Complete environment variable reference
|
630
|
+
- **[Getting Started](docs/tutorials/getting-started.md)** - Step-by-step setup for all supported tools
|
631
|
+
- **[Configuration Guide](docs/guides/configuration.md)** - Complete environment variable reference
|
630
632
|
|
631
633
|
### Development
|
632
|
-
- **[
|
633
|
-
- **[Local Development](docs/local-development-uvx.md)** - Development setup guide
|
634
|
-
- **[Audio Formats](docs/audio-format-migration.md)** - Audio format configuration and migration
|
635
|
-
- **[Statistics Dashboard](docs/statistics-dashboard.md)** - Performance monitoring and metrics
|
634
|
+
- **[Development Setup](docs/tutorials/development-setup.md)** - Local development guide
|
636
635
|
|
637
636
|
### Service Guides
|
638
|
-
- **[Whisper.cpp Setup](docs/whisper.
|
639
|
-
- **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
|
640
|
-
- **[
|
641
|
-
- **[LiveKit Integration](docs/livekit/README.md)** - Real-time voice communication
|
637
|
+
- **[Whisper.cpp Setup](docs/guides/whisper-setup.md)** - Local speech-to-text configuration
|
638
|
+
- **[Kokoro Setup](docs/guides/kokoro-setup.md)** - Local text-to-speech configuration
|
639
|
+
- **[LiveKit Integration](docs/guides/livekit-setup.md)** - Real-time voice communication
|
642
640
|
|
643
|
-
### Troubleshooting
|
644
|
-
- **[WSL2 Microphone Access](docs/troubleshooting/wsl2-microphone-access.md)** - WSL2 audio setup
|
645
|
-
- **[Migration Guide](docs/migration-guide.md)** - Upgrading from older versions
|
646
641
|
|
647
642
|
## Links
|
648
643
|
|
@@ -660,15 +655,12 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
|
|
660
655
|
|
661
656
|
## See Also
|
662
657
|
|
663
|
-
- 🚀 [
|
664
|
-
- 🔧 [Configuration Reference](docs/configuration.md) - Environment variables and options
|
665
|
-
- 🎤 [Local Services Setup](docs/kokoro.md) - Run TTS/STT locally for privacy
|
666
|
-
- 🐛 [Troubleshooting](docs/troubleshooting/README.md) - Common issues and solutions
|
658
|
+
- 🚀 [Getting Started](docs/tutorials/getting-started.md) - Setup instructions for all supported tools
|
659
|
+
- 🔧 [Configuration Reference](docs/guides/configuration.md) - Environment variables and options
|
660
|
+
- 🎤 [Local Services Setup](docs/guides/kokoro-setup.md) - Run TTS/STT locally for privacy
|
667
661
|
|
668
662
|
## License
|
669
663
|
|
670
664
|
MIT - A [Failmode](https://failmode.com) Project
|
671
665
|
|
672
666
|
---
|
673
|
-
|
674
|
-
<sub>[Project Statistics](docs/project-stats/README.md)</sub>
|
@@ -1394,8 +1394,9 @@ transcribe_audio_cmd = transcribe_cmd.transcribe.commands['audio']
|
|
1394
1394
|
transcribe_audio_cmd.name = 'transcribe'
|
1395
1395
|
audio.add_command(transcribe_audio_cmd)
|
1396
1396
|
|
1397
|
-
# Add
|
1398
|
-
|
1397
|
+
# Add hooks command under claude group
|
1398
|
+
from voice_mode.cli_commands.hook import hooks
|
1399
|
+
claude.claude_group.add_command(hooks)
|
1399
1400
|
|
1400
1401
|
# Add pronounce under config group
|
1401
1402
|
config.add_command(pronounce_commands.pronounce_group)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"""CLI commands for Claude-related functionality."""
|
2
|
+
|
3
|
+
import click
|
4
|
+
|
5
|
+
|
6
|
+
@click.group(name='claude')
|
7
|
+
def claude_group():
|
8
|
+
"""Claude-related commands."""
|
9
|
+
pass
|
10
|
+
|
11
|
+
|
12
|
+
@click.group(name='hooks')
|
13
|
+
def hooks_group():
|
14
|
+
"""Manage Voice Mode hooks and event handlers for Claude Code."""
|
15
|
+
pass
|
@@ -12,18 +12,18 @@ from typing import Optional
|
|
12
12
|
|
13
13
|
@click.group()
|
14
14
|
@click.help_option('-h', '--help', help='Show this message and exit')
|
15
|
-
def
|
15
|
+
def hooks():
|
16
16
|
"""Manage Voice Mode hooks and event handlers."""
|
17
17
|
pass
|
18
18
|
|
19
19
|
|
20
|
-
@
|
20
|
+
@hooks.command('receiver')
|
21
21
|
@click.option('--tool-name', help='Override tool name (for testing)')
|
22
22
|
@click.option('--action', type=click.Choice(['start', 'end']), help='Override action (for testing)')
|
23
23
|
@click.option('--subagent-type', help='Override subagent type (for testing)')
|
24
24
|
@click.option('--event', type=click.Choice(['PreToolUse', 'PostToolUse']), help='Override event (for testing)')
|
25
25
|
@click.option('--debug', is_flag=True, help='Enable debug output')
|
26
|
-
def
|
26
|
+
def receiver(tool_name, action, subagent_type, event, debug):
|
27
27
|
"""Receive and process hook events from Claude Code via stdin.
|
28
28
|
|
29
29
|
This command reads JSON from stdin when called by Claude Code hooks,
|
@@ -34,13 +34,13 @@ def stdin_receiver(tool_name, action, subagent_type, event, debug):
|
|
34
34
|
|
35
35
|
Examples:
|
36
36
|
# Called by Claude Code (reads JSON from stdin)
|
37
|
-
voicemode
|
37
|
+
voicemode claude hooks receiver
|
38
38
|
|
39
39
|
# Testing with defaults
|
40
|
-
voicemode
|
40
|
+
voicemode claude hooks receiver --debug
|
41
41
|
|
42
42
|
# Testing with specific values
|
43
|
-
voicemode
|
43
|
+
voicemode claude hooks receiver --tool-name Task --action start --subagent-type mama-bear
|
44
44
|
"""
|
45
45
|
from voice_mode.tools.sound_fonts.audio_player import Player
|
46
46
|
|
@@ -188,22 +188,19 @@ def find_sound_file(event: str, tool: str, subagent: Optional[str] = None) -> Op
|
|
188
188
|
return None
|
189
189
|
|
190
190
|
|
191
|
-
# Keep the old receiver command for backwards compatibility (deprecated)
|
192
|
-
@
|
191
|
+
# Keep the old stdin-receiver command for backwards compatibility (deprecated)
|
192
|
+
@hooks.command('stdin-receiver', hidden=True)
|
193
193
|
@click.argument('tool_name')
|
194
194
|
@click.argument('action', type=click.Choice(['start', 'end', 'complete']))
|
195
195
|
@click.argument('subagent_type', required=False)
|
196
196
|
@click.option('--debug', is_flag=True, help='Enable debug output')
|
197
|
-
def
|
198
|
-
"""[DEPRECATED] Use
|
199
|
-
#
|
200
|
-
event = 'PreToolUse' if action == 'start' else 'PostToolUse'
|
201
|
-
|
202
|
-
# Call the new command
|
197
|
+
def stdin_receiver_deprecated(tool_name, action, subagent_type, event, debug):
|
198
|
+
"""[DEPRECATED] Use receiver instead."""
|
199
|
+
# Call the new receiver command
|
203
200
|
ctx = click.get_current_context()
|
204
|
-
ctx.invoke(
|
201
|
+
ctx.invoke(receiver,
|
205
202
|
tool_name=tool_name,
|
206
|
-
action=action
|
203
|
+
action=action,
|
207
204
|
subagent_type=subagent_type,
|
208
205
|
event=event,
|
209
206
|
debug=debug)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
"""Statistics tracking functions used by voice tools.
|
2
|
+
|
3
|
+
This module contains tracking functions that can be imported by tools
|
4
|
+
without causing the statistics tools themselves to be loaded.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from typing import Optional
|
8
|
+
from .statistics import track_conversation
|
9
|
+
from .config import logger
|
10
|
+
|
11
|
+
|
12
|
+
def track_voice_interaction(message: str,
|
13
|
+
response: str,
|
14
|
+
timing_str: Optional[str] = None,
|
15
|
+
transport: Optional[str] = None,
|
16
|
+
voice_provider: Optional[str] = None,
|
17
|
+
voice_name: Optional[str] = None,
|
18
|
+
model: Optional[str] = None,
|
19
|
+
success: bool = True,
|
20
|
+
error_message: Optional[str] = None) -> None:
|
21
|
+
"""
|
22
|
+
Track a voice interaction for statistics.
|
23
|
+
|
24
|
+
This function should be called from conversation tools to record metrics.
|
25
|
+
"""
|
26
|
+
try:
|
27
|
+
track_conversation(
|
28
|
+
message=message,
|
29
|
+
response=response,
|
30
|
+
timing_str=timing_str,
|
31
|
+
transport=transport,
|
32
|
+
voice_provider=voice_provider,
|
33
|
+
voice_name=voice_name,
|
34
|
+
model=model,
|
35
|
+
success=success,
|
36
|
+
error_message=error_message
|
37
|
+
)
|
38
|
+
logger.debug(f"Tracked voice interaction: {len(message)} chars, success={success}")
|
39
|
+
|
40
|
+
except Exception as e:
|
41
|
+
logger.error(f"Error tracking voice interaction: {e}")
|
42
|
+
# Don't raise the error - statistics tracking shouldn't break the main flow
|
@@ -0,0 +1,50 @@
|
|
1
|
+
"""Auto-import all tools for registration with FastMCP."""
|
2
|
+
import os
|
3
|
+
import importlib
|
4
|
+
from pathlib import Path
|
5
|
+
import logging
|
6
|
+
|
7
|
+
logger = logging.getLogger("voice-mode")
|
8
|
+
|
9
|
+
# Get the directory containing this file
|
10
|
+
tools_dir = Path(__file__).parent
|
11
|
+
|
12
|
+
# Check if we should only load specific tools
|
13
|
+
# This can be set in .voicemode.env, shell environment, or .mcp.json
|
14
|
+
allowed_tools = os.environ.get("VOICEMODE_TOOLS", "").strip()
|
15
|
+
|
16
|
+
if allowed_tools:
|
17
|
+
# Only load specified tools (comma-separated list)
|
18
|
+
tool_list = [t.strip() for t in allowed_tools.split(",")]
|
19
|
+
|
20
|
+
logger.info(f"Selective tool loading enabled. Loading only: {', '.join(tool_list)}")
|
21
|
+
|
22
|
+
for tool_name in tool_list:
|
23
|
+
tool_file = tools_dir / f"{tool_name}.py"
|
24
|
+
if tool_file.exists():
|
25
|
+
logger.debug(f"Loading tool: {tool_name}")
|
26
|
+
importlib.import_module(f".{tool_name}", package=__name__)
|
27
|
+
else:
|
28
|
+
logger.warning(f"Tool module not found: {tool_name}.py")
|
29
|
+
else:
|
30
|
+
# Default behavior: load all tools
|
31
|
+
logger.info("Loading all available tools (set VOICEMODE_TOOLS to limit)")
|
32
|
+
|
33
|
+
# Import all Python files in this directory (except __init__.py)
|
34
|
+
for file in tools_dir.glob("*.py"):
|
35
|
+
if file.name != "__init__.py" and not file.name.startswith("_"):
|
36
|
+
module_name = file.stem
|
37
|
+
logger.debug(f"Loading tool: {module_name}")
|
38
|
+
importlib.import_module(f".{module_name}", package=__name__)
|
39
|
+
|
40
|
+
# Import all service tools from subdirectories
|
41
|
+
services_dir = tools_dir / "services"
|
42
|
+
if services_dir.exists():
|
43
|
+
for service_dir in services_dir.iterdir():
|
44
|
+
if service_dir.is_dir() and not service_dir.name.startswith("_"):
|
45
|
+
# Import all Python files in each service directory
|
46
|
+
for file in service_dir.glob("*.py"):
|
47
|
+
if file.name != "__init__.py" and not file.name.startswith("_") and file.name != "helpers.py":
|
48
|
+
module_path = f".services.{service_dir.name}.{file.stem}"
|
49
|
+
logger.debug(f"Loading service tool: {module_path}")
|
50
|
+
importlib.import_module(module_path, package=__name__)
|
@@ -75,7 +75,7 @@ from voice_mode.core import (
|
|
75
75
|
play_chime_start,
|
76
76
|
play_chime_end
|
77
77
|
)
|
78
|
-
from voice_mode.
|
78
|
+
from voice_mode.statistics_tracking import track_voice_interaction
|
79
79
|
from voice_mode.utils import (
|
80
80
|
get_event_logger,
|
81
81
|
log_recording_start,
|