hermes-bsd/tests/hermes_cli
Teknium 4d7fc0f37c feat(gateway,cli): confirm /reload-mcp to warn about prompt cache invalidation
Reloading MCP servers rebuilds the tool set for the active session, which
invalidates the provider prompt cache (tool schemas are baked into the
system prompt). The next message re-sends full input tokens — can be
expensive on long-context or high-reasoning models.

To surface that cost, /reload-mcp now routes through a new slash-confirm
primitive with three options: Approve Once / Always Approve / Cancel.
'Always Approve' persists approvals.mcp_reload_confirm: false so future
reloads run silently.

Coverage:

* Classic CLI (cli.py) — interactive numbered prompt.
* TUI (tui_gateway + Ink ops.ts) — text warning on first call; `now` /
  `always` args skip the gate; `always` also persists the opt-out.
* Messenger gateway — button UI on Telegram (inline keyboard), Discord
  (discord.ui.View), Slack (Block Kit actions); text fallback on every
  other platform via /approve /always /cancel replies intercepted in
  gateway/run.py _handle_message.
* Config key: approvals.mcp_reload_confirm (default true).
* Auto-reload paths (CLI file watcher, TUI config-sync mtime poll) pass
  confirm=true so they do NOT prompt.

Implementation:

* tools/slash_confirm.py — module-level pending-state store used by all
  adapters and by the CLI prompt. Thread-safe register/resolve/clear.
* gateway/platforms/base.py — send_slash_confirm hook (default 'Not
  supported' → text fallback).
* gateway/run.py — _request_slash_confirm helper + text intercept in
  _handle_message (yields to in-progress tool-exec approvals so
  dangerous-command /approve still unblocks the tool thread first).

Tests:

* tests/tools/test_slash_confirm.py — primitive lifecycle + async
  resolution + double-click atomicity (16 tests).
* tests/hermes_cli/test_mcp_reload_confirm_gate.py — default-config
  shape + deep-merge preserves user opt-out (5 tests).

Targeted runs (hermetic): 89 passed (slash-confirm, config gate,
existing agent cache, existing telegram approval buttons).
2026-04-29 21:56:47 -07:00
..
__init__.py
test_ai_gateway_models.py
test_anthropic_model_flow_stale_oauth.py fix: re-auth on stale OAuth token; read Claude Code credentials from macOS Keychain 2026-04-24 07:14:00 -07:00
test_anthropic_oauth_flow.py
test_anthropic_provider_persistence.py
test_api_key_providers.py test(cli): cover minimax-oauth resolution, refresh, menu wiring 2026-04-29 09:53:42 -07:00
test_apply_model_switch_result_context.py fix(cli): /model picker honors provider-specific context caps (#16030) 2026-04-26 05:43:31 -07:00
test_arcee_provider.py feat(providers): add tencent-tokenhub provider support 2026-04-28 03:45:52 -07:00
test_argparse_flag_propagation.py
test_at_context_completion_filter.py
test_atomic_json_write.py
test_atomic_yaml_write.py
test_auth_codex_provider.py fix(model): let Codex setup reuse or reauthenticate 2026-04-24 04:53:32 -07:00
test_auth_commands.py fix(ci): recover 38 failing tests on main (#17642) 2026-04-29 20:05:32 -07:00
test_auth_nous_provider.py fix: validate nous auth status against runtime credentials 2026-04-24 05:20:05 -07:00
test_auth_provider_gate.py
test_auth_qwen_provider.py
test_auth_ssl_macos.py fix(auth): honor SSL CA env vars across httpx + requests callsites 2026-04-24 03:00:33 -07:00
test_aux_config.py
test_azure_detect.py feat(azure-foundry): auto-detect transport, models, context length 2026-04-25 18:48:43 -07:00
test_backup.py feat(claw-migrate): harden OpenClaw import with plan-first apply, redaction, and pre-migration backup (#16911) 2026-04-28 01:50:23 -07:00
test_banner.py feat(banner): hyperlink startup banner title to latest GitHub release (#14945) 2026-04-23 23:28:34 -07:00
test_banner_git_state.py
test_banner_skills.py
test_bedrock_model_picker.py test(bedrock): add model picker and region routing tests 2026-04-28 03:53:11 -07:00
test_chat_skills_flag.py
test_claw.py feat(claw-migrate): harden OpenClaw import with plan-first apply, redaction, and pre-migration backup (#16911) 2026-04-28 01:50:23 -07:00
test_clear_stale_base_url.py
test_cmd_update.py fix(docker): materialize bundled TUI Ink package (#16690) 2026-04-28 15:11:47 -05:00
test_coalesce_session_args.py
test_codex_cli_model_picker.py
test_codex_models.py fix(model): let Codex setup reuse or reauthenticate 2026-04-24 04:53:32 -07:00
test_commands.py feat(slack): register every gateway command as a native slash (Discord/Telegram parity) (#16164) 2026-04-26 11:38:32 -07:00
test_completion.py
test_config.py fix(cli): prevent .env sanitizer from splitting GLM_API_KEY by LM_API_KEY suffix 2026-04-28 22:22:45 -07:00
test_config_drift.py
test_config_env_expansion.py
test_config_env_refs.py
test_config_validation.py fix(config): accept fallback_model list (chain) in validator + save 2026-04-28 01:40:25 -07:00
test_container_aware_cli.py
test_copilot_auth.py
test_copilot_catalog_oauth_fallback.py fix(copilot): require successful exchange when walking credential_pool catalog tokens 2026-04-28 01:18:09 -07:00
test_copilot_context.py fix(copilot): wire live /models max_prompt_tokens into context-window resolver 2026-04-24 05:09:08 -07:00
test_copilot_in_model_list.py fix(model): repair Discord Copilot /model flow 2026-04-24 03:33:29 -07:00
test_copilot_token_exchange.py fix(copilot): exchange raw GitHub token for Copilot API JWT 2026-04-24 05:09:08 -07:00
test_cron.py
test_custom_provider_context_length.py fix(context): honor custom_providers context_length on /model switch + bump probe tier to 256K (#15844) 2026-04-25 18:47:53 -07:00
test_custom_provider_model_switch.py fix(model): avoid persisting key_env-resolved secrets to providers entry (#16372) 2026-04-26 21:52:12 -07:00
test_debug.py fix(debug): distinguish empty-log from missing-log in report placeholder 2026-04-22 15:27:54 -05:00
test_deprecated_cwd_warning.py
test_detect_api_mode_for_url.py
test_determine_api_mode_hostname.py
test_dingtalk_auth.py
test_doctor.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_doctor_command_install.py
test_env_loader.py
test_env_sanitize_on_load.py
test_fallback_cmd.py feat(cli): add 'hermes fallback' command to manage fallback providers (#16052) 2026-04-26 06:19:04 -07:00
test_gateway.py fix(gateway): recover stale pid and planned restart state 2026-04-22 16:33:46 -07:00
test_gateway_linger.py
test_gateway_runtime_health.py
test_gateway_service.py [verified] fix(gateway): accept user systemd private socket during preflight 2026-04-29 04:57:01 -07:00
test_gateway_wsl.py
test_gemini_free_tier_setup_block.py feat(gemini): block free-tier keys at setup + surface guidance on 429 (#15100) 2026-04-24 04:46:17 -07:00
test_gemini_provider.py
test_gmi_provider.py fix(providers/gmi): post-salvage review fixes 2026-04-27 11:17:59 -07:00
test_hooks_cli.py
test_ignore_user_config_flags.py refactor(cli): derive relaunch flag table from argparse introspection 2026-04-29 20:33:29 -07:00
test_image_gen_picker.py fix(image-gen): persist plugin provider on reconfigure 2026-04-23 01:56:09 -07:00
test_launcher.py
test_logs.py
test_managed_installs.py
test_mcp_config.py
test_mcp_reload_confirm_gate.py feat(gateway,cli): confirm /reload-mcp to warn about prompt cache invalidation 2026-04-29 21:56:47 -07:00
test_mcp_tools_config.py
test_memory_reset.py
test_model_catalog.py feat(models): remote model catalog manifest for OpenRouter + Nous Portal (#16033) 2026-04-26 05:46:43 -07:00
test_model_normalize.py fix(model-normalize): pass DeepSeek V-series IDs through instead of folding to deepseek-chat 2026-04-24 05:24:54 -07:00
test_model_picker_viewport.py
test_model_provider_persistence.py feat(agent): add lmstudio integration 2026-04-28 12:27:36 -07:00
test_model_switch_context_display.py fix(context): honor custom_providers context_length on /model switch + bump probe tier to 256K (#15844) 2026-04-25 18:47:53 -07:00
test_model_switch_copilot_api_mode.py
test_model_switch_custom_providers.py feat(agent): add lmstudio integration 2026-04-28 12:27:36 -07:00
test_model_switch_opencode_anthropic.py fix(opencode): derive api_mode from target model, not stale config default (#15106) 2026-04-24 04:58:46 -07:00
test_model_switch_variant_tags.py
test_model_validation.py feat(agent): add lmstudio integration 2026-04-28 12:27:36 -07:00
test_models.py fix(tui): resolve startup model aliases statically 2026-04-25 14:13:02 -05:00
test_models_dev_preferred_merge.py feat(/model): merge models.dev entries for lesser-loved providers (#14221) 2026-04-22 17:33:42 -07:00
test_non_ascii_credential.py
test_nous_hermes_non_agentic.py
test_nous_subscription.py fix(cli): coerce use_gateway config flags in tool routing 2026-04-26 19:02:55 -07:00
test_ollama_cloud_auth.py fix(opencode): derive api_mode from target model, not stale config default (#15106) 2026-04-24 04:58:46 -07:00
test_ollama_cloud_provider.py
test_opencode_go_in_model_list.py feat(/model): merge models.dev entries for lesser-loved providers (#14221) 2026-04-22 17:33:42 -07:00
test_opencode_go_validation_fallback.py
test_overlay_slug_resolution.py fix(model_picker): detect mapped-provider auth-store credentials 2026-04-24 05:20:05 -07:00
test_path_completion.py
test_placeholder_usage.py
test_plugin_cli_registration.py
test_plugin_scanner_recursion.py
test_plugins.py refactor(spotify): convert to built-in bundled plugin under plugins/spotify (#15174) 2026-04-24 07:06:11 -07:00
test_plugins_cmd.py
test_profile_export_credentials.py
test_profiles.py fix(cli): exclude profiles/ from profile create --clone-all 2026-04-29 14:21:35 -07:00
test_provider_config_validation.py fix(config): add request_timeout_seconds and stale_timeout_seconds to provider _KNOWN_KEYS 2026-04-28 01:28:25 -07:00
test_pty_bridge.py feat(web): add /api/pty WebSocket bridge to embed TUI in dashboard 2026-04-24 10:51:49 -04:00
test_reasoning_effort_menu.py
test_redact_config_bridge.py feat(security): make secret redaction off by default (#16794) 2026-04-27 21:24:08 -07:00
test_regression_16767.py test(cli): regression coverage for user-provider routing fix (#16767) 2026-04-28 01:47:20 -07:00
test_relaunch.py remove relaunch_chat 2026-04-29 20:33:29 -07:00
test_resolve_last_session.py fix(cli): tighten MRU lookup and session DB cleanup 2026-04-27 08:52:12 -07:00
test_runtime_provider_resolution.py test(cli): cover minimax-oauth resolution, refresh, menu wiring 2026-04-29 09:53:42 -07:00
test_session_browse.py fix(sessions): /save lands under $HERMES_HOME, widen browse+TUI picker, force-refresh ollama-cloud on setup (#16296) 2026-04-26 18:49:48 -07:00
test_sessions_delete.py test(sessions): wire sessions_dir through auto-prune + file-cleanup regression tests 2026-04-26 18:31:07 -07:00
test_set_config_value.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_setup.py feat(cli): preserve --tui and other flags across internal relaunches 2026-04-29 20:33:29 -07:00
test_setup_agent_settings.py
test_setup_hermes_script.py
test_setup_matrix_e2ee.py
test_setup_model_provider.py
test_setup_noninteractive.py feat(setup): auto-reconfigure on existing installs (#15879) 2026-04-25 22:02:02 -07:00
test_setup_ollama_cloud_force_refresh.py fix(sessions): /save lands under $HERMES_HOME, widen browse+TUI picker, force-refresh ollama-cloud on setup (#16296) 2026-04-26 18:49:48 -07:00
test_setup_openclaw_migration.py
test_setup_prompt_menus.py
test_setup_reconfigure.py feat(setup): auto-reconfigure on existing installs (#15879) 2026-04-25 22:02:02 -07:00
test_skills_config.py fix(tests): resolve 17 persistent CI test failures (#15084) 2026-04-24 03:46:46 -07:00
test_skills_hub.py feat(skills): install skills from a direct HTTP(S) URL (#16323) 2026-04-26 20:57:10 -07:00
test_skills_install_flags.py
test_skills_skip_confirm.py
test_skills_subparser.py
test_skin_engine.py fix(tui): restore macOS copy behavior and theme polish (#17131) 2026-04-28 18:47:14 -05:00
test_spotify_auth.py feat(spotify): interactive setup wizard + docs page (#15130) 2026-04-24 05:30:05 -07:00
test_status.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_status_model_provider.py feat(agent): add lmstudio integration 2026-04-28 12:27:36 -07:00
test_subparser_routing_fallback.py
test_subprocess_timeouts.py
test_suppress_eio_on_interrupt.py fix(cli): suppress OSError EIO on interrupt shutdown 2026-04-25 18:25:13 -07:00
test_tencent_tokenhub_provider.py feat(providers): add tencent-tokenhub provider support 2026-04-28 03:45:52 -07:00
test_terminal_menu_fallbacks.py
test_timeouts.py
test_tips.py
test_tool_token_estimation.py
test_tools_config.py fix: honor agent.disabled_toolsets in gateway sessions 2026-04-28 01:23:16 -07:00
test_tools_disable_enable.py
test_tui_npm_install.py fix(tui): mouse + keyboard text selection in the composer (#16732) 2026-04-27 16:43:48 -07:00
test_tui_resume_flow.py fix(tui): honor launch toolsets (#17623) 2026-04-29 16:55:27 -07:00
test_update_autostash.py fix(ci): recover 38 failing tests on main (#17642) 2026-04-29 20:05:32 -07:00
test_update_check.py
test_update_config_clears_custom_fields.py
test_update_gateway_restart.py fix(gateway): drain-aware hermes update + faster still-working pings (#14736) 2026-04-23 14:01:57 -07:00
test_update_hangup_protection.py
test_update_stale_dashboard.py fix(update,test): clarify wmic comment; switch tests to monkeypatch sys.platform 2026-04-29 06:34:13 -07:00
test_user_providers_model_switch.py fix(model_switch): dedup /model picker rows when custom provider endpoint matches a built-in (#16970) (#17511) 2026-04-29 08:11:05 -07:00
test_voice_wrapper.py feat(tui): match CLI's voice slash + VAD-continuous recording model 2026-04-23 16:18:15 -07:00
test_web_server.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_web_server_host_header.py
test_web_ui_build.py fix(cli): check hermes_cli/web_dist/ not web/dist/ for build staleness 2026-04-26 18:43:57 -07:00
test_webhook_cli.py
test_xiaomi_provider.py feat(providers): add tencent-tokenhub provider support 2026-04-28 03:45:52 -07:00