voice-mode 4.3.2__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.
Files changed (137) hide show
  1. {voice_mode-4.3.2 → voice_mode-4.4.0}/CHANGELOG.md +54 -1
  2. {voice_mode-4.3.2 → voice_mode-4.4.0}/PKG-INFO +32 -40
  3. {voice_mode-4.3.2 → voice_mode-4.4.0}/README.md +31 -39
  4. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/__version__.py +1 -1
  5. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/cli.py +3 -2
  6. voice_mode-4.4.0/voice_mode/cli_commands/claude.py +15 -0
  7. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/cli_commands/hook.py +13 -16
  8. voice_mode-4.4.0/voice_mode/statistics_tracking.py +42 -0
  9. voice_mode-4.4.0/voice_mode/tools/__init__.py +50 -0
  10. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/converse.py +1 -1
  11. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/statistics.py +0 -33
  12. voice_mode-4.3.2/voice_mode/cli_commands/claude.py +0 -208
  13. voice_mode-4.3.2/voice_mode/tools/__init__.py +0 -24
  14. voice_mode-4.3.2/voice_mode/tools/claude_thinking.py +0 -285
  15. {voice_mode-4.3.2 → voice_mode-4.4.0}/.gitignore +0 -0
  16. {voice_mode-4.3.2 → voice_mode-4.4.0}/build_hooks.py +0 -0
  17. {voice_mode-4.3.2 → voice_mode-4.4.0}/pyproject.toml +0 -0
  18. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/__init__.py +0 -0
  19. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/__main__.py +0 -0
  20. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/cli_commands/__init__.py +0 -0
  21. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/cli_commands/exchanges.py +0 -0
  22. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/cli_commands/pronounce_commands.py +0 -0
  23. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/cli_commands/transcribe.py +0 -0
  24. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/config.py +0 -0
  25. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/conversation_logger.py +0 -0
  26. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/core.py +0 -0
  27. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/data/default_pronunciation.yaml +0 -0
  28. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/data/versions.json +0 -0
  29. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/__init__.py +0 -0
  30. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/conversations.py +0 -0
  31. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/filters.py +0 -0
  32. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/formatters.py +0 -0
  33. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/models.py +0 -0
  34. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/reader.py +0 -0
  35. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/exchanges/stats.py +0 -0
  36. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/README.md +0 -0
  37. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/app/api/connection-details/route.ts +0 -0
  38. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/app/favicon.ico +0 -0
  39. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/app/globals.css +0 -0
  40. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/app/layout.tsx +0 -0
  41. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/app/page.tsx +0 -0
  42. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/components/CloseIcon.tsx +0 -0
  43. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/components/NoAgentNotification.tsx +0 -0
  44. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/components/TranscriptionView.tsx +0 -0
  45. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/hooks/useCombinedTranscriptions.ts +0 -0
  46. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/hooks/useLocalMicTrack.ts +0 -0
  47. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/next-env.d.ts +0 -0
  48. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/next.config.mjs +0 -0
  49. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/package-lock.json +0 -0
  50. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/package.json +0 -0
  51. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/pnpm-lock.yaml +0 -0
  52. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/postcss.config.mjs +0 -0
  53. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/tailwind.config.ts +0 -0
  54. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/frontend/tsconfig.json +0 -0
  55. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/prompts/README.md +0 -0
  56. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/prompts/__init__.py +0 -0
  57. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/prompts/converse.py +0 -0
  58. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/prompts/release_notes.py +0 -0
  59. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/prompts/services.py +0 -0
  60. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/pronounce.py +0 -0
  61. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/provider_discovery.py +0 -0
  62. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/providers.py +0 -0
  63. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/__init__.py +0 -0
  64. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/audio_files.py +0 -0
  65. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/changelog.py +0 -0
  66. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/configuration.py +0 -0
  67. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/statistics.py +0 -0
  68. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/version.py +0 -0
  69. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/resources/whisper_models.py +0 -0
  70. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/server.py +0 -0
  71. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/shared.py +0 -0
  72. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/simple_failover.py +0 -0
  73. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/statistics.py +0 -0
  74. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/streaming.py +0 -0
  75. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/__init__.py +0 -0
  76. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.frontend.plist +0 -0
  77. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.kokoro.plist +0 -0
  78. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.livekit.plist +0 -0
  79. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/launchd/com.voicemode.whisper.plist +0 -0
  80. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/launchd/start-kokoro-with-health-check.sh +0 -0
  81. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/launchd/start-whisper-with-health-check.sh +0 -0
  82. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/scripts/__init__.py +0 -0
  83. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/scripts/start-whisper-server.sh +0 -0
  84. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-frontend.service +0 -0
  85. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-kokoro.service +0 -0
  86. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-livekit.service +0 -0
  87. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/templates/systemd/voicemode-whisper.service +0 -0
  88. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/configuration_management.py +0 -0
  89. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/dependencies.py +0 -0
  90. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/devices.py +0 -0
  91. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/diagnostics.py +0 -0
  92. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/pronounce.py +0 -0
  93. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/providers.py +0 -0
  94. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/service.py +0 -0
  95. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/kokoro/install.py +0 -0
  96. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/kokoro/uninstall.py +0 -0
  97. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/list_versions.py +0 -0
  98. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/__init__.py +0 -0
  99. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/frontend.py +0 -0
  100. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/install.py +0 -0
  101. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/production_server.py +0 -0
  102. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/livekit/uninstall.py +0 -0
  103. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/version_info.py +0 -0
  104. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/__init__.py +0 -0
  105. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/install.py +0 -0
  106. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/list_models.py +0 -0
  107. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_active.py +0 -0
  108. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_benchmark.py +0 -0
  109. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_install.py +0 -0
  110. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/model_remove.py +0 -0
  111. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/models.py +0 -0
  112. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/services/whisper/uninstall.py +0 -0
  113. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/__init__.py +0 -0
  114. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/audio_player.py +0 -0
  115. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/hook_handler.py +0 -0
  116. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/sound_fonts/player.py +0 -0
  117. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/transcription/__init__.py +0 -0
  118. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/transcription/backends.py +0 -0
  119. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/transcription/core.py +0 -0
  120. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/transcription/formats.py +0 -0
  121. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/transcription/types.py +0 -0
  122. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/tools/voice_registry.py +0 -0
  123. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/__init__.py +0 -0
  124. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/audio_diagnostics.py +0 -0
  125. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/event_logger.py +0 -0
  126. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/ffmpeg_check.py +0 -0
  127. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/format_migration.py +0 -0
  128. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/gpu_detection.py +0 -0
  129. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/migration_helpers.py +0 -0
  130. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/services/common.py +0 -0
  131. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/services/coreml_setup.py +0 -0
  132. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/services/kokoro_helpers.py +0 -0
  133. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/services/livekit_helpers.py +0 -0
  134. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/services/whisper_helpers.py +0 -0
  135. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/services/whisper_version.py +0 -0
  136. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/utils/version_helpers.py +0 -0
  137. {voice_mode-4.3.2 → voice_mode-4.4.0}/voice_mode/version.py +0 -0
@@ -7,12 +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
+
10
52
  ## [4.3.2] - 2025-09-03
11
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
+
12
59
  ## [4.3.1] - 2025-09-03
13
60
 
61
+ ### Fixed
62
+ - Minor bug fixes and improvements
63
+
14
64
  ## [4.3.0] - 2025-09-03
15
65
 
66
+ ### Added
67
+ - Sound fonts with MP3 support and Three Bears sounds integration
68
+
16
69
  ## [4.2.0] - 2025-09-03
17
70
 
18
71
  ### Added
@@ -26,7 +79,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
26
79
  - **🔊 Sound Fonts Integration - Audio Feedback for Every Action**
27
80
  - Play custom sounds for tool operations, errors, and completions
28
81
  - Filesystem-based sound font system with automatic discovery
29
- - Claude Code integration via stdin-receiver for hook-based audio
82
+ - Claude Code integration via receiver for hook-based audio
30
83
  - CLI command `play-sound` with theme, action, and sound selection
31
84
  - Enhances user experience with auditory feedback during operations
32
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.2
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
@@ -78,6 +78,8 @@ Description-Content-Type: text/markdown
78
78
 
79
79
  # Voice Mode
80
80
 
81
+ mcp-name: com.failmode/voicemode
82
+
81
83
  > **Install via:** `uvx voice-mode` | `pip install voice-mode` | [getvoicemode.com](https://getvoicemode.com)
82
84
 
83
85
  [![PyPI Downloads](https://static.pepy.tech/badge/voice-mode)](https://pepy.tech/project/voice-mode)
@@ -113,7 +115,7 @@ Natural voice conversations for AI assistants. Voice Mode brings human-like voic
113
115
 
114
116
  ## Quick Start
115
117
 
116
- > 📖 **Using a different tool?** See our [Integration Guides](docs/integrations/README.md) for Cursor, VS Code, Gemini CLI, and more!
118
+ > 📖 **Using a different tool?** See our [Getting Started Guide](docs/tutorials/getting-started.md) for setup instructions!
117
119
 
118
120
  ### Automatic Installation (Recommended)
119
121
 
@@ -140,7 +142,7 @@ This installer will:
140
142
 
141
143
  ### Manual Installation
142
144
 
143
- For manual setup steps, see the [Claude Code Integration Guide](docs/integrations/claude-code/README.md).
145
+ For manual setup steps, see the [Getting Started Guide](docs/tutorials/getting-started.md).
144
146
 
145
147
  ## 🎬 Demo
146
148
 
@@ -180,16 +182,16 @@ The `converse` function makes voice interactions natural - it automatically wait
180
182
 
181
183
  Voice Mode works with your favorite AI coding assistants:
182
184
 
183
- - 🤖 **[Claude Code](docs/integrations/claude-code/README.md)** - Anthropic's official CLI
184
- - 🖥️ **[Claude Desktop](docs/integrations/claude-desktop/README.md)** - Desktop application
185
- - 🌟 **[Gemini CLI](docs/integrations/gemini-cli/README.md)** - Google's CLI tool
186
- - ⚡ **[Cursor](docs/integrations/cursor/README.md)** - AI-first code editor
187
- - 💻 **[VS Code](docs/integrations/vscode/README.md)** - With MCP preview support
188
- - 🦘 **[Roo Code](docs/integrations/roo-code/README.md)** - AI dev team in VS Code
189
- - 🔧 **[Cline](docs/integrations/cline/README.md)** - Autonomous coding agent
190
- - ⚡ **[Zed](docs/integrations/zed/README.md)** - High-performance editor
191
- - 🏄 **[Windsurf](docs/integrations/windsurf/README.md)** - Agentic IDE by Codeium
192
- - 🔄 **[Continue](docs/integrations/continue/README.md)** - Open-source AI assistant
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
193
195
 
194
196
  ## Installation
195
197
 
@@ -208,7 +210,7 @@ sudo apt update
208
210
  sudo apt install -y python3-dev libasound2-dev libasound2-plugins libportaudio2 portaudio19-dev ffmpeg pulseaudio pulseaudio-utils
209
211
  ```
210
212
 
211
- **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access. See our [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md) if you encounter issues.
213
+ **Note for WSL2 users**: WSL2 requires additional audio packages (pulseaudio, libasound2-plugins) for microphone access.
212
214
  </details>
213
215
 
214
216
  <details>
@@ -271,7 +273,7 @@ nix run github:mbailey/voicemode
271
273
 
272
274
  ### Configuration for AI Coding Assistants
273
275
 
274
- > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Integration Guides](docs/integrations/README.md) for step-by-step instructions for each tool!
276
+ > 📖 **Looking for detailed setup instructions?** Check our comprehensive [Getting Started Guide](docs/tutorials/getting-started.md) for step-by-step instructions!
275
277
 
276
278
  Below are quick configuration snippets. For full installation and setup instructions, see the integration guides above.
277
279
 
@@ -549,12 +551,12 @@ nix run github:mbailey/voicemode
549
551
 
550
552
  **Note:** The `converse` tool is the primary interface for voice interactions, combining speaking and listening in a natural flow.
551
553
 
552
- **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally. See [Installation Tools Documentation](docs/installation-tools.md) for detailed usage.
554
+ **New:** The `install_whisper_cpp` and `install_kokoro_fastapi` tools help you set up free, private, open-source voice services locally.
553
555
 
554
556
  ## Configuration
555
557
 
556
- - 📖 **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for each tool
557
- - 🔧 **[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
558
560
  - 📁 **[Config Examples](config-examples/)** - Ready-to-use configuration files
559
561
 
560
562
  ### Quick Setup
@@ -616,8 +618,8 @@ The audio format is automatically validated against provider capabilities and wi
616
618
 
617
619
  For privacy-focused or offline usage, Voice Mode supports local speech services:
618
620
 
619
- - **[Whisper.cpp](docs/whisper.cpp.md)** - Local speech-to-text with OpenAI-compatible API
620
- - **[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
621
623
 
622
624
  These services provide the same API interface as OpenAI, allowing seamless switching between cloud and local processing.
623
625
 
@@ -663,7 +665,7 @@ The OpenAI SDK handles this automatically - no Voice Mode configuration needed!
663
665
  ### Common Issues
664
666
 
665
667
  - **No microphone access**: Check system permissions for terminal/application
666
- - **WSL2 Users**: See [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md)
668
+ - **WSL2 Users**: Additional audio packages (pulseaudio, libasound2-plugins) required for microphone access
667
669
  - **UV not found**: Install with `curl -LsSf https://astral.sh/uv/install.sh | sh`
668
670
  - **OpenAI API error**: Verify your `OPENAI_API_KEY` is set correctly
669
671
  - **No audio output**: Check system audio settings and available devices
@@ -703,24 +705,17 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
703
705
  📚 **[Read the full documentation at voice-mode.readthedocs.io](https://voice-mode.readthedocs.io)**
704
706
 
705
707
  ### Getting Started
706
- - **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for all supported tools
707
- - **[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
708
710
 
709
711
  ### Development
710
- - **[Using uv/uvx](docs/uv.md)** - Package management with uv and uvx
711
- - **[Local Development](docs/local-development-uvx.md)** - Development setup guide
712
- - **[Audio Formats](docs/audio-format-migration.md)** - Audio format configuration and migration
713
- - **[Statistics Dashboard](docs/statistics-dashboard.md)** - Performance monitoring and metrics
712
+ - **[Development Setup](docs/tutorials/development-setup.md)** - Local development guide
714
713
 
715
714
  ### Service Guides
716
- - **[Whisper.cpp Setup](docs/whisper.cpp.md)** - Local speech-to-text configuration
717
- - **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
718
- - **[Service Health Checks](docs/service-health-checks.md)** - Service readiness and health monitoring
719
- - **[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
720
718
 
721
- ### Troubleshooting
722
- - **[WSL2 Microphone Access](docs/troubleshooting/wsl2-microphone-access.md)** - WSL2 audio setup
723
- - **[Migration Guide](docs/migration-guide.md)** - Upgrading from older versions
724
719
 
725
720
  ## Links
726
721
 
@@ -738,15 +733,12 @@ Audio files are saved to: `~/.voicemode/audio/YYYY/MM/` with timestamps in the f
738
733
 
739
734
  ## See Also
740
735
 
741
- - 🚀 [Integration Guides](docs/integrations/README.md) - Setup instructions for all supported tools
742
- - 🔧 [Configuration Reference](docs/configuration.md) - Environment variables and options
743
- - 🎤 [Local Services Setup](docs/kokoro.md) - Run TTS/STT locally for privacy
744
- - 🐛 [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
745
739
 
746
740
  ## License
747
741
 
748
742
  MIT - A [Failmode](https://failmode.com) Project
749
743
 
750
744
  ---
751
-
752
- <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
  [![PyPI Downloads](https://static.pepy.tech/badge/voice-mode)](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 [Integration Guides](docs/integrations/README.md) for Cursor, VS Code, Gemini CLI, and more!
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 [Claude Code Integration Guide](docs/integrations/claude-code/README.md).
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
- - 🤖 **[Claude Code](docs/integrations/claude-code/README.md)** - Anthropic's official CLI
106
- - 🖥️ **[Claude Desktop](docs/integrations/claude-desktop/README.md)** - Desktop application
107
- - 🌟 **[Gemini CLI](docs/integrations/gemini-cli/README.md)** - Google's CLI tool
108
- - ⚡ **[Cursor](docs/integrations/cursor/README.md)** - AI-first code editor
109
- - 💻 **[VS Code](docs/integrations/vscode/README.md)** - With MCP preview support
110
- - 🦘 **[Roo Code](docs/integrations/roo-code/README.md)** - AI dev team in VS Code
111
- - 🔧 **[Cline](docs/integrations/cline/README.md)** - Autonomous coding agent
112
- - ⚡ **[Zed](docs/integrations/zed/README.md)** - High-performance editor
113
- - 🏄 **[Windsurf](docs/integrations/windsurf/README.md)** - Agentic IDE by Codeium
114
- - 🔄 **[Continue](docs/integrations/continue/README.md)** - Open-source AI assistant
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. See our [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md) if you encounter issues.
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 [Integration Guides](docs/integrations/README.md) for step-by-step instructions for each tool!
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. See [Installation Tools Documentation](docs/installation-tools.md) for detailed usage.
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
- - 📖 **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for each tool
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.cpp.md)** - Local speech-to-text with OpenAI-compatible API
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**: See [WSL2 Microphone Access Guide](docs/troubleshooting/wsl2-microphone-access.md)
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
- - **[Integration Guides](docs/integrations/README.md)** - Step-by-step setup for all supported tools
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
- - **[Using uv/uvx](docs/uv.md)** - Package management with uv and uvx
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.cpp.md)** - Local speech-to-text configuration
639
- - **[Kokoro Setup](docs/kokoro.md)** - Local text-to-speech configuration
640
- - **[Service Health Checks](docs/service-health-checks.md)** - Service readiness and health monitoring
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
- - 🚀 [Integration Guides](docs/integrations/README.md) - Setup instructions for all supported tools
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>
@@ -1,3 +1,3 @@
1
1
  # This file is automatically updated by 'make release'
2
2
  # Do not edit manually
3
- __version__ = "4.3.2"
3
+ __version__ = "4.4.0"
@@ -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 hook command under claude group
1398
- claude.claude_group.add_command(hook_cmd.hook)
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 hook():
15
+ def hooks():
16
16
  """Manage Voice Mode hooks and event handlers."""
17
17
  pass
18
18
 
19
19
 
20
- @hook.command('stdin-receiver')
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 stdin_receiver(tool_name, action, subagent_type, event, debug):
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 hook stdin-receiver
37
+ voicemode claude hooks receiver
38
38
 
39
39
  # Testing with defaults
40
- voicemode hook stdin-receiver --debug
40
+ voicemode claude hooks receiver --debug
41
41
 
42
42
  # Testing with specific values
43
- voicemode hook stdin-receiver --tool-name Task --action start --subagent-type mama-bear
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
- @hook.command('receiver', hidden=True)
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 receiver_deprecated(tool_name, action, subagent_type, debug):
198
- """[DEPRECATED] Use stdin-receiver instead."""
199
- # Map old action to event
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(stdin_receiver,
201
+ ctx.invoke(receiver,
205
202
  tool_name=tool_name,
206
- action=action if action != 'complete' else 'end',
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.tools.statistics import track_voice_interaction
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,
@@ -218,36 +218,3 @@ async def voice_statistics_recent(limit: int = 10) -> str:
218
218
  logger.error(f"Error showing recent statistics: {e}")
219
219
  return f"Error showing recent statistics: {str(e)}"
220
220
 
221
-
222
- # Integration function for conversation tools
223
- def track_voice_interaction(message: str,
224
- response: str,
225
- timing_str: Optional[str] = None,
226
- transport: Optional[str] = None,
227
- voice_provider: Optional[str] = None,
228
- voice_name: Optional[str] = None,
229
- model: Optional[str] = None,
230
- success: bool = True,
231
- error_message: Optional[str] = None) -> None:
232
- """
233
- Track a voice interaction for statistics.
234
-
235
- This function should be called from conversation tools to record metrics.
236
- """
237
- try:
238
- track_conversation(
239
- message=message,
240
- response=response,
241
- timing_str=timing_str,
242
- transport=transport,
243
- voice_provider=voice_provider,
244
- voice_name=voice_name,
245
- model=model,
246
- success=success,
247
- error_message=error_message
248
- )
249
- logger.debug(f"Tracked voice interaction: {len(message)} chars, success={success}")
250
-
251
- except Exception as e:
252
- logger.error(f"Error tracking voice interaction: {e}")
253
- # Don't raise the error - statistics tracking shouldn't break the main flow