hermes-agent/tests/gateway
Teknium 38b1c7dce5 refactor(gateway): simplify auto-resume + extend to crash recovery
Follow-up on top of @kyan12's PR #20888 — same feature, cleaner shape,
wider coverage.

Changes:
- Drop the synthetic '[System note: ...]' in the internal MessageEvent.
  The existing _is_resume_pending branch in _handle_message_with_agent
  (run.py ~L13738) already injects a reason-aware recovery system note
  on the next turn.  With kyan's text in place the model saw two stacked
  system notes.  Now the event text is empty and the existing injection
  path owns the wording.
- Drop SessionStore.list_resume_pending() as a new public method.  The
  filter is 8 lines inline in _schedule_resume_pending_sessions() —
  one caller, no other pluggability need.
- Add 'restart_interrupted' to the auto-resume reason set.  That's the
  reason SessionStore.suspend_recently_active() stamps on sessions
  recovered from a crash/OOM/SIGKILL (no .clean_shutdown marker).
  Previously those sessions had to wait for a real user message to
  auto-resume; now they continue automatically at startup like
  drain-timeout interruptions do.
- Reasons live in a _AUTO_RESUME_REASONS frozenset at class scope so
  future reasons (e.g. 'manual_resume_request') can be opted in with
  one line.

Test coverage added:
- drain-timeout + crash-recovery both scheduled
- stale entries skipped (outside freshness window)
- suspended entries skipped (suspended > resume_pending)
- originless entries skipped (no routing target)
- disallowed reasons skipped (graceful forward-compat)

E2E verified end-to-end with a real on-disk SessionStore: 2 eligible
sessions scheduled, 2 ineligible skipped, empty-text internal events
delivered to the adapter.

Co-authored-by: Kevin Yan <kevyan1998@gmail.com>
2026-05-07 05:05:34 -07:00
..
__init__.py
…
_plugin_adapter_loader.py
…
conftest.py
…
feishu_helpers.py
…
restart_test_helpers.py
…
test_7100_transient_failure_transcript.py
…
test_agent_cache.py
…
test_allowlist_startup_check.py
…
test_api_server.py test(api_server): _run_agent result now carries session_id for #16938 2026-05-05 06:01:03 -07:00
test_api_server_bind_guard.py
…
test_api_server_jobs.py
…
test_api_server_multimodal.py
…
test_api_server_normalize.py
…
test_api_server_runs.py
…
test_api_server_toolset.py
…
test_approve_deny_commands.py
…
test_auth_fallback.py
…
test_auto_continue.py
…
test_background_command.py
…
test_background_process_notifications.py
…
test_base_topic_sessions.py
…
test_bluebubbles.py
…
test_busy_session_ack.py
…
test_busy_session_auth_bypass.py
…
test_cancel_background_drain.py
…
test_channel_directory.py
…
test_clean_shutdown_marker.py
…
test_command_bypass_active_session.py
…
test_complete_path_at_filter.py
…
test_compress_command.py
…
test_compress_focus.py
…
test_compress_plugin_engine.py
…
test_config.py feat(gateway): per-platform gateway_restart_notification flag 2026-05-06 13:39:43 -07:00
test_config_cwd_bridge.py
…
test_config_env_bridge_authority.py
…
test_debug_command.py
…
test_delivery.py
…
test_dingtalk.py
…
test_discord_allowed_channels.py
…
test_discord_allowed_mentions.py
…
test_discord_attachment_download.py
…
test_discord_bot_auth_bypass.py
…
test_discord_bot_filter.py
…
test_discord_channel_controls.py
…
test_discord_channel_prompts.py
…
test_discord_channel_skills.py
…
test_discord_component_auth.py
…
test_discord_connect.py fix(discord): narrow rate-limit catch and move sync state under gateway/ 2026-05-06 18:12:35 -07:00
test_discord_document_handling.py
…
test_discord_free_response.py
…
test_discord_imports.py
…
test_discord_media_metadata.py
…
test_discord_model_picker.py
…
test_discord_opus.py
…
test_discord_race_polish.py
…
test_discord_reactions.py
…
test_discord_reply_mode.py fix(gateway): load reply_to_mode from config.yaml for Discord and Telegram 2026-05-05 04:58:23 -07:00
test_discord_send.py
…
test_discord_slash_auth.py
…
test_discord_slash_commands.py
…
test_discord_system_messages.py
…
test_discord_thread_persistence.py fix(gateway): ensure deterministic thread eviction in helpers 2026-05-05 10:13:55 -07:00
test_display_config.py feat(gateway): opt-in cleanup of temporary progress bubbles (#21186) 2026-05-07 05:04:37 -07:00
test_dm_topics.py
…
test_document_cache.py
…
test_duplicate_reply_suppression.py
…
test_email.py
…
test_ephemeral_reply.py
…
test_extract_local_files.py
…
test_fallback_eviction.py
…
test_fast_command.py
…
test_feishu.py fix(feishu): keep topic replies in threads 2026-05-06 10:52:51 -07:00
test_feishu_approval_buttons.py
…
test_feishu_bot_admission.py
…
test_feishu_bot_auth_bypass.py
…
test_feishu_comment.py
…
test_feishu_comment_rules.py
…
test_feishu_onboard.py
…
test_fresh_reset_skill_injection.py
…
test_gateway_command_help.py
…
test_gateway_inactivity_timeout.py
…
test_gateway_shutdown.py
…
test_goal_verdict_send.py
…
test_home_target_env_var.py
…
test_homeassistant.py
…
test_hooks.py
…
test_insights_unicode_flags.py
…
test_internal_event_bypass_pairing.py
…
test_interrupt_key_match.py
…
test_irc_adapter.py
…
test_keep_typing_timeout.py
…
test_matrix.py
…
test_matrix_exec_approval.py
…
test_matrix_mention.py
…
test_matrix_voice.py
…
test_mattermost.py
…
test_media_download_retry.py
…
test_media_extraction.py
…
test_message_deduplicator.py
…
test_mirror.py
…
test_model_command_custom_providers.py
…
test_model_switch_persistence.py
…
test_native_image_buffer_isolation.py
…
test_notice_delivery.py
…
test_pairing.py
…
test_pending_drain_no_recursion.py
…
test_pending_drain_race.py
…
test_pending_event_none.py
…
test_pii_redaction.py
…
test_platform_base.py fix(gateway): also tolerate malformed env vars in custom human-delay mode 2026-05-05 06:11:38 -07:00
test_platform_connected_checkers.py
…
test_platform_http_client_limits.py
…
test_platform_reconnect.py
…
test_platform_registry.py
…
test_plugin_platform_interface.py
…
test_post_delivery_callback_chaining.py feat(gateway): opt-in cleanup of temporary progress bubbles (#21186) 2026-05-07 05:04:37 -07:00
test_pre_gateway_dispatch.py
…
test_proxy_mode.py
…
test_qqbot.py
…
test_queue_consumption.py
…
test_reasoning_command.py
…
test_reload_skills_command.py
…
test_reload_skills_discord_resync.py
…
test_reply_to_injection.py
…
test_restart_drain.py feat(gateway): also gate pre-restart "Gateway restarting" notification 2026-05-06 13:39:43 -07:00
test_restart_notification.py feat(gateway): per-platform gateway_restart_notification flag 2026-05-06 13:39:43 -07:00
test_restart_redelivery_dedup.py
…
test_restart_resume_pending.py refactor(gateway): simplify auto-resume + extend to crash recovery 2026-05-07 05:05:34 -07:00
test_resume_command.py
…
test_retry_replacement.py
…
test_retry_response.py
…
test_run_cleanup_progress.py feat(gateway): opt-in cleanup of temporary progress bubbles (#21186) 2026-05-07 05:04:37 -07:00
test_run_progress_interrupt.py
…
test_run_progress_topics.py fix(feishu): keep topic replies in threads 2026-05-06 10:52:51 -07:00
test_runner_fatal_adapter.py
…
test_runner_startup_failures.py
…
test_running_agent_session_toggles.py
…
test_runtime_footer.py
…
test_safe_adapter_disconnect.py
…
test_send_image_file.py
…
test_send_multiple_images.py
…
test_send_retry.py
…
test_session.py
…
test_session_boundary_hooks.py
…
test_session_boundary_security_state.py
…
test_session_dm_thread_seeding.py
…
test_session_env.py
…
test_session_hygiene.py
…
test_session_info.py
…
test_session_list_allowed_sources.py
…
test_session_model_override_routing.py
…
test_session_model_reset.py
…
test_session_race_guard.py
…
test_session_reset_notify.py
…
test_session_split_brain_11016.py
…
test_session_state_cleanup.py
…
test_session_store_prune.py
…
test_setup_feishu.py
…
test_shared_group_sender_prefix.py
…
test_shutdown_cache_cleanup.py
…
test_shutdown_memory_provider_messages.py
…
test_signal.py
…
test_signal_format.py
…
test_signal_rate_limit.py
…
test_slack.py
…
test_slack_approval_buttons.py
…
test_slack_channel_skills.py
…
test_slack_mention.py
…
test_sms.py
…
test_sse_agent_cancel.py
…
test_ssl_certs.py
…
test_status.py
…
test_status_command.py
…
test_steer_command.py
…
test_step_callback_compat.py
…
test_sticker_cache.py
…
test_stream_consumer.py
…
test_stream_consumer_fresh_final.py
…
test_stt_config.py
…
test_stuck_loop.py
…
test_teams.py fix(tests): patch TypingActivityInput after mock on Python <3.12 2026-05-04 20:59:18 -07:00
test_telegram_approval_buttons.py
…
test_telegram_caption_merge.py
…
test_telegram_conflict.py
…
test_telegram_documents.py fix: route Telegram image documents through photo handling 2026-05-07 04:51:46 -07:00
test_telegram_format.py
…
test_telegram_group_gating.py
…
test_telegram_mention_boundaries.py
…
test_telegram_network.py fix(gateway): keep DoH-confirmed Telegram IPs that match system DNS (#14520) 2026-05-05 04:42:59 -07:00
test_telegram_network_reconnect.py
…
test_telegram_photo_interrupts.py
…
test_telegram_reactions.py
…
test_telegram_reply_mode.py fix(gateway): load reply_to_mode from config.yaml for Discord and Telegram 2026-05-05 04:58:23 -07:00
test_telegram_text_batching.py
…
test_telegram_thread_fallback.py refactor(telegram): make typing thread-id resolver symmetric with send 2026-05-05 13:28:08 -07:00
test_telegram_topic_mode.py
…
test_telegram_webhook_secret.py
…
test_text_batching.py
…
test_title_command.py
…
test_transcript_offset.py
…
test_tts_media_routing.py
…
test_unauthorized_dm_behavior.py
…
test_unavailable_skill_hint.py
…
test_unknown_command.py
…
test_update_command.py
…
test_update_streaming.py fix(gateway): preserve pending update prompts across restarts 2026-05-05 03:59:39 -07:00
test_usage_command.py
…
test_verbose_command.py
…
test_vision_memory_leak.py
…
test_voice_command.py
…
test_voice_mode_platform_isolation.py
…
test_weak_credential_guard.py
…
test_webhook_adapter.py
…
test_webhook_deliver_only.py
…
test_webhook_dynamic_routes.py
…
test_webhook_integration.py
…
test_webhook_signature_rate_limit.py
…
test_wecom.py
…
test_wecom_callback.py
…
test_weixin.py
…
test_whatsapp_connect.py
…
test_whatsapp_formatting.py
…
test_whatsapp_group_gating.py
…
test_whatsapp_reply_prefix.py
…
test_ws_auth_retry.py
…
test_yolo_command.py
…