Skip to content

feat(voice): add CLI record beep toggle - #13247

Merged
teknium1 merged 1 commit into
NousResearch:mainfrom
helix4u:feat/voice-beep-toggle
Apr 21, 2026
Merged

feat(voice): add CLI record beep toggle#13247
teknium1 merged 1 commit into
NousResearch:mainfrom
helix4u:feat/voice-beep-toggle

Conversation

@helix4u

@helix4u helix4u commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

What does this PR do?

Adds a voice.beep_enabled config toggle for CLI voice mode so users can disable the record start/stop beeps without turning voice mode off entirely.

This keeps the existing behavior by default, but removes an annoying hardcoded audio cue for users who use /voice heavily or in quieter/shared environments.

Related Issue

Fixes #

Type of Change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 🔒 Security fix
  • 📝 Documentation update
  • ✅ Tests (adding or improving test coverage)
  • ♻️ Refactor (no behavior change)
  • 🎯 New skill (bundled or hub)

Changes Made

  • Added voice.beep_enabled to DEFAULT_CONFIG and bumped _config_version in hermes_cli/config.py
  • Added HermesCLI._voice_beeps_enabled() and gated both CLI voice beeps in cli.py
  • Added regression coverage in tests/tools/test_voice_cli_integration.py
  • Updated voice config examples and docs in:
    • website/docs/user-guide/features/voice-mode.md
    • website/docs/user-guide/configuration.md
    • website/docs/guides/use-voice-mode-with-hermes.md

How to Test

  1. Enable CLI voice mode and verify the default behavior still plays beeps on record start/stop.
  2. Set voice.beep_enabled: false in ~/.hermes/config.yaml, restart the CLI, and verify /voice recording starts and stops silently.
  3. Run source venv/bin/activate && scripts/run_tests.sh tests/tools/test_voice_cli_integration.py tests/tools/test_voice_mode.py and confirm the focused voice suite passes.

Checklist

Code

  • I've read the Contributing Guide
  • My commit messages follow Conventional Commits (fix(scope):, feat(scope):, etc.)
  • I searched for existing PRs to make sure this isn't a duplicate
  • My PR contains only changes related to this fix/feature (no unrelated commits)
  • I've run pytest tests/ -q and all tests pass
  • I've added tests for my changes (required for bug fixes, strongly encouraged for features)
  • I've tested on my platform: Ubuntu 24.04

Documentation & Housekeeping

  • I've updated relevant documentation (README, docs/, docstrings) — or N/A
  • I've updated cli-config.yaml.example if I added/changed config keys — or N/A
  • I've updated CONTRIBUTING.md or AGENTS.md if I changed architecture or workflows — or N/A
  • I've considered cross-platform impact (Windows, macOS) per the compatibility guide — or N/A
  • I've updated tool descriptions/schemas if I changed tool behavior — or N/A

Screenshots / Logs

Focused test run:

source venv/bin/activate && scripts/run_tests.sh tests/tools/test_voice_cli_integration.py tests/tools/test_voice_mode.py
143 passed in 8.01s

Full suite run:

source venv/bin/activate && scripts/run_tests.sh
28 failed, 13770 passed, 39 skipped, 206 warnings in 297.70s (0:04:57)

Current unrelated full-suite failures observed during the full run:

tests/gateway/test_approve_deny_commands.py::TestBlockingApprovalE2E::test_blocking_approval_approve_once
tests/gateway/test_approve_deny_commands.py::TestBlockingApprovalE2E::test_blocking_approval_deny
tests/gateway/test_dingtalk.py::TestCardLifecycle::test_final_reply_finalizes_card
tests/gateway/test_dingtalk.py::TestCardLifecycle::test_intermediate_send_stays_streaming
tests/gateway/test_dingtalk.py::TestCardLifecycle::test_done_fires_only_when_reply_to_is_set
tests/gateway/test_dingtalk.py::TestCardLifecycle::test_edit_message_finalize_fires_done
tests/gateway/test_dingtalk.py::TestCardLifecycle::test_edit_message_finalize_false_tracks_sibling
tests/gateway/test_dingtalk.py::TestCardLifecycle::test_next_send_auto_closes_sibling_streaming_cards
tests/gateway/test_dingtalk.py::TestDingTalkAdapterAICards::test_send_uses_ai_card_if_configured
tests/gateway/test_discord_bot_filter.py::TestDiscordBotFilter::test_default_is_none
tests/agent/test_insights.py::TestGatewayFormatting::test_gateway_format_hides_cost
tests/gateway/test_api_server.py::TestAdapterInit::test_default_config
tests/hermes_cli/test_config.py::TestCustomProviderCompatibility::test_v11_upgrade_moves_custom_providers_into_providers
tests/hermes_cli/test_config.py::TestCustomProviderCompatibility::test_compatible_custom_providers_prefers_api_then_url_then_base_url
tests/hermes_cli/test_config.py::TestInterimAssistantMessageConfig::test_migrate_to_v15_adds_interim_assistant_message_gate
tests/hermes_cli/test_config.py::TestDiscordChannelPromptsConfig::test_migrate_adds_discord_channel_prompts_default
tests/hermes_cli/test_api_key_providers.py::TestHuggingFaceModels::test_model_metadata_has_context_lengths
tests/hermes_cli/test_backup.py::TestProfileRestoration::test_import_creates_profile_wrappers
tests/hermes_cli/test_provider_config_validation.py::TestNormalizeCustomProviderEntry::test_unknown_keys_logged
tests/hermes_cli/test_provider_config_validation.py::TestNormalizeCustomProviderEntry::test_camel_case_warning_logged
tests/hermes_cli/test_gemini_provider.py::TestGeminiModelCatalog::test_provider_models_exist
tests/gateway/test_internal_event_bypass_pairing.py::test_non_internal_event_without_user_triggers_pairing
tests/test_transform_tool_result_hook.py::test_transform_tool_result_integration_with_real_plugin
tests/tools/test_browser_camofox_state.py::TestCamofoxConfigDefaults::test_config_version_matches_current_schema
tests/run_agent/test_interrupt_propagation.py::TestInterruptPropagationToChild::test_interrupt_during_child_api_call_detected
tests/tools/test_registry.py::TestBuiltinDiscovery::test_matches_previous_manual_builtin_tool_set
tests/tools/test_terminal_output_transform_hook.py::test_terminal_output_transform_integration_with_real_plugin
tests/tools/test_tirith_security.py::TestDiskFailureMarker::test_cosign_missing_marker_clears_when_cosign_appears

@helix4u
helix4u marked this pull request as ready for review April 21, 2026 01:23
@teknium1
teknium1 merged commit b48ea41 into NousResearch:main Apr 21, 2026
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants