hermes-agent/tests/gateway
Juraj Bednar 0c2e81df00 feat(simplex): groups, native attachments, text batching, auto-accept
Salvage of PR #27978 cherry-picked onto current main, resolving conflicts
with main's intervening SimpleX plugin fixes (resp-envelope normalization,
health-monitor reconnect-churn fix, bare-form DM addressing).

What's new:
- Group support via SIMPLEX_GROUP_ALLOWED (comma-separated IDs or '*');
  inbound items surface chat_id=group:<id> + chat_type=group. Disabled by
  default so a bot in a group doesn't process every member's traffic.
- Inbound files/voice via rcvFileDescrReady (immediate /freceive) deferred
  through _pending_file_transfers, replayed on rcvFileComplete. Voice notes
  -> MessageType.VOICE.
- Native outbound media: send_image (PNG/JPEG + inline thumbnail), send_voice
  (msgContent.type=voice), send_video, send_document. All addressed by numeric
  ID via /_send ... json [...].
- MEDIA:<path> tags in agent replies stripped and dispatched as voice/document.
- Text-burst batching (HERMES_SIMPLEX_TEXT_BATCH_DELAY, default 0.8s).
- Auto-accept contact requests (SIMPLEX_AUTO_ACCEPT, default true).
- Group send path uses structured /_send #<id> json form (the bracket
  #[<id>] form is parsed as display-name lookup and silently drops).

plugin.yaml bumped to 1.1.0; docs updated. All inside plugins/platforms/simplex/
- no core edits.

Co-authored-by: Juraj Bednar <juraj@bednar.io>
2026-06-08 21:03:45 -07:00
..
platforms
__init__.py
_plugin_adapter_loader.py
conftest.py
feishu_helpers.py
restart_test_helpers.py fix(gateway): clean service restart notifications 2026-05-31 21:05:53 -07:00
test_7100_transient_failure_transcript.py
test_42039_duplicate_user_message.py fix(gateway): prevent duplicate user messages in state.db 2026-06-08 11:29:53 -07:00
test_active_session_text_merge.py fix(gateway): plain text while busy interrupts by default again (#40590) 2026-06-06 09:00:10 -07:00
test_agent_cache.py fix(honcho): harden self-hosted setup paths 2026-05-29 22:29:48 -07:00
test_allowed_channels_widening.py
test_allowlist_startup_check.py
test_api_server.py fix(api_server): report hermes version on /health and /health/detailed (#40620) 2026-06-07 18:38:54 -07:00
test_api_server_bind_guard.py
test_api_server_jobs.py hardening(api-server): scan cron prompts on REST create/update for parity with the agent tool 2026-06-07 10:04:57 -07:00
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_auto_voice_reply_format.py fix(gateway): use OGG for Telegram auto TTS 2026-06-07 18:05:58 -07:00
test_background_command.py fix(gateway): route /background result media by type 2026-06-02 16:55:25 -07:00
test_background_process_notifications.py
test_base_topic_sessions.py
test_bluebubbles.py feat(bluebubbles): support group mention gating 2026-06-01 18:52:05 -07:00
test_bundles_command.py
test_busy_session_ack.py fix: preserve telegram queue fifo during grace window 2026-06-03 20:30:59 +08:00
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_compression_concurrent_sessions.py test(gateway): de-flake concurrent-compression lock test with a barrier 2026-06-08 06:32:23 -07:00
test_compression_session_id_persistence.py test(gateway): add compression session_id rotation integration tests (#34089) 2026-06-07 22:39:51 -07:00
test_config.py feat(sessions): add optional max session cap 2026-06-08 15:12:12 -07:00
test_config_cwd_bridge.py
test_config_driven_access_policy.py fix(gateway): don't treat dm_policy: pairing as open access on own-policy adapters 2026-06-04 06:31:28 -07:00
test_config_env_bridge_authority.py
test_debug_command.py
test_delivery.py
test_delivery_silence_filter.py fix(gateway): drop outbound silence-narration messages pre-send 2026-05-29 19:06:05 -07:00
test_destructive_slash_confirm.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_clarify_buttons.py test(discord): align clarify/model-picker tests with fail-closed component auth (#41338) 2026-06-07 08:27:40 -07:00
test_discord_component_auth.py fix(discord): fail closed for component button auth when no allowlist set 2026-06-07 06:21:37 -07:00
test_discord_connect.py
test_discord_document_handling.py
test_discord_free_response.py
test_discord_imports.py
test_discord_lazy_install_views.py
test_discord_media_metadata.py
test_discord_model_picker.py test(discord): align clarify/model-picker tests with fail-closed component auth (#41338) 2026-06-07 08:27:40 -07:00
test_discord_opus.py
test_discord_race_polish.py
test_discord_reactions.py
test_discord_reply_mode.py
test_discord_roles_dm_scope.py
test_discord_send.py
test_discord_slash_auth.py
test_discord_slash_commands.py
test_discord_system_messages.py
test_discord_thread_persistence.py
test_discord_voice_mixer.py feat(discord): voice-channel mixer — ambient idle bed + verbal acks that overlap TTS (#39659) 2026-06-05 03:10:40 -07:00
test_display_config.py
test_dm_topics.py
test_document_cache.py refactor(telegram): generalize observed-media caching into a reusable primitive 2026-06-01 20:18:41 -07:00
test_duplicate_reply_suppression.py
test_email.py
test_empty_model_recovery.py fix(gateway): recover model on post-interrupt turn; gate fallback status (#35381) 2026-05-30 07:28:06 -07:00
test_ephemeral_reply.py fix(gateway): stop system tips from auto-uploading local files 2026-05-30 18:58:46 -07:00
test_extract_local_files.py test: update extract_local_files Windows-path test for new matching behavior 2026-05-30 07:38:03 -07:00
test_fallback_eviction.py
test_fast_command.py
test_feishu.py feat(gateway): handle Feishu meeting invitations 2026-06-04 06:15:23 -07:00
test_feishu_approval_buttons.py fix(feishu): fail closed for update prompt card actions 2026-06-07 06:21:37 -07:00
test_feishu_bot_admission.py
test_feishu_bot_auth_bypass.py
test_feishu_comment.py
test_feishu_comment_rules.py
test_feishu_meeting_invite.py refactor(feishu): slim meeting-invite parser; add AUTHOR_MAP entry 2026-06-04 06:15:23 -07:00
test_feishu_onboard.py
test_fresh_reset_skill_injection.py
test_gateway_command_help.py
test_gateway_inactivity_timeout.py
test_gateway_shutdown.py fix(gateway): clean service restart notifications 2026-05-31 21:05:53 -07:00
test_goal_max_turns_config.py
test_goal_status_notice.py
test_goal_verdict_send.py
test_google_chat.py revert: keep Google Chat OAuth secret + active_provider profile-scoped (#39398) 2026-06-04 16:54:40 -07:00
test_home_target_env_var.py
test_homeassistant.py refactor(gateway): migrate Home Assistant adapter to bundled plugin 2026-06-06 11:46:24 -07:00
test_hooks.py
test_insights_unicode_flags.py
test_internal_event_bypass_pairing.py
test_interrupt_key_match.py
test_irc_adapter.py
test_kanban_notifier.py
test_kanban_notifier_watcher_dispatch_gate.py feat(kanban): gate notifier watcher on dispatch_in_gateway 2026-06-01 20:30:24 -07:00
test_kanban_watchers_mixin.py refactor(gateway): extract kanban watcher loops into GatewayKanbanWatchersMixin (god-file Phase 3) 2026-06-07 23:14:18 -07:00
test_keep_typing_timeout.py
test_line_plugin.py fix(line): map inbound message types to the correct MessageType 2026-06-04 21:55:20 -07:00
test_load_transcript_db_only.py
test_loop_exception_handler.py
test_matrix.py fix(matrix): make bang-command resolution robust + fix dead skill-command branch 2026-06-03 17:19:27 +05:30
test_matrix_approval_reaction_fail_closed.py fix(matrix): fail-closed approval reaction auth when MATRIX_ALLOWED_USERS is empty 2026-05-29 03:58:45 -07:00
test_matrix_exec_approval.py
test_matrix_mention.py
test_matrix_voice.py
test_mattermost.py
test_max_concurrent_sessions.py feat(sessions): add optional max session cap 2026-06-08 15:12:12 -07:00
test_max_tokens_propagation.py test(gateway): regression tests for max_tokens propagation chain (#20741) 2026-06-05 09:10:26 -07:00
test_mcp_reload_refreshes_cached_agents.py
test_media_download_retry.py
test_media_extraction.py fix(gateway): restrict auto-appended media to producer tools 2026-06-01 00:00:26 -07:00
test_memory_monitor.py
test_message_deduplicator.py
test_mirror.py
test_model_command_custom_providers.py
test_model_command_flat_string_config.py
test_model_switch_persistence.py
test_msgraph_webhook.py
test_native_image_buffer_isolation.py
test_notice_delivery.py
test_notice_rendering.py feat(credits): usage-aware credits — in-session notices, /usage view, dev readout (#40011) 2026-06-06 13:18:18 +05:30
test_ntfy_plugin.py test(ntfy): cover echo-tag filter; tag standalone send path 2026-05-29 13:17:46 -07:00
test_pairing.py
test_pending_drain_no_recursion.py
test_pending_drain_race.py
test_pending_event_none.py
test_per_platform_streaming_defaults.py feat(streaming): per-platform streaming defaults (Telegram on, Discord off) + dashboard toggles (#37303) 2026-06-02 05:52:54 -07:00
test_pii_redaction.py
test_planned_stop_watcher.py fix(gateway): only fire planned-stop watcher for self-targeting markers + fix Windows consume (#34749) 2026-05-29 17:36:58 +00:00
test_platform_base.py fix(gateway): deliver $HOME deliverables on root-run gateways 2026-06-04 07:50:22 -07:00
test_platform_connected_checkers.py
test_platform_http_client_limits.py
test_platform_reconnect.py fix(gateway): retry startup auto-resume when a failed platform reconnects 2026-06-04 05:56:45 -07:00
test_platform_reconnect_fd_leak.py polish(gateway): address Copilot review comments on fd-leak fix 2026-06-02 17:27:44 -07:00
test_platform_registry.py
test_plugin_platform_interface.py
test_post_delivery_callback_chaining.py
test_pre_gateway_dispatch.py
test_proxy_mode.py
test_qqbot.py fix(qqbot): stop 100% CPU spin when WebSocket is closed but not None (#31193, #31771) (#40574) 2026-06-06 18:44:44 -07:00
test_queue_consumption.py fix(gateway): use FIFO queue for busy_input_mode pending messages 2026-06-03 20:25:17 +08:00
test_reasoning_command.py
test_reload_skills_command.py
test_reload_skills_discord_resync.py
test_replay_entry_fields.py
test_reply_to_injection.py
test_restart_drain.py fix(gateway): plain text while busy interrupts by default again (#40590) 2026-06-06 09:00:10 -07:00
test_restart_notification.py test(gateway): repoint slash-command mocks after mixin extraction 2026-06-08 01:25:35 -07:00
test_restart_redelivery_dedup.py
test_restart_resume_pending.py fix(gateway): retry startup auto-resume when a failed platform reconnects 2026-06-04 05:56:45 -07:00
test_resume_command.py
test_retry_replacement.py
test_retry_response.py
test_run_cleanup_progress.py
test_run_progress_interrupt.py
test_run_progress_topics.py fix(gateway): stop terminal progress from posting the full command to messaging chats 2026-06-08 15:53:00 -07:00
test_run_tool_media_re.py test: use raw docstring in test_run_tool_media_re to silence escape warning 2026-05-30 07:38:03 -07:00
test_runner_fatal_adapter.py
test_runner_startup_failures.py fix(gateway): abort --replace when old PID survives SIGKILL 2026-06-07 23:57:32 -07:00
test_running_agent_session_toggles.py
test_runtime_config_env_expansion.py fix(config): align prefill messages key handling 2026-06-03 23:51:44 -06:00
test_runtime_env_reload_config_authority.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_send_voice_reply_notify.py
test_session.py fix(gateway): isolate DM sessions on user_id when chat_id is absent (#41764) 2026-06-07 22:07:07 -07:00
test_session_api.py fix(api-server): bind request session context for tools 2026-06-08 20:52:08 -07:00
test_session_boundary_hooks.py feat(observability): observer-grade telemetry hooks + NeMo-Relay plugin 2026-06-03 06:36:46 -07:00
test_session_boundary_security_state.py
test_session_dm_thread_seeding.py
test_session_env.py fix(api-server): bind request session context for tools 2026-06-08 20:52:08 -07:00
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_override_thread_recovery.py fix(gateway): keep /model + /reasoning overrides on topic recovery & compression splits 2026-06-07 22:10:32 -07:00
test_session_race_guard.py
test_session_reset_notify.py
test_session_split_brain_11016.py
test_session_state_cleanup.py fix(gateway): clear zombie agent slot when session_reset races in-flight run 2026-06-04 07:50:45 -07:00
test_session_store_prune.py
test_setup_feishu.py
test_shared_group_sender_prefix.py
test_shutdown_cache_cleanup.py feat(sessions): add optional max session cap 2026-06-08 15:12:12 -07:00
test_shutdown_forensics.py
test_shutdown_memory_provider_messages.py
test_signal.py Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
test_signal_format.py
test_signal_rate_limit.py
test_simplex_plugin.py feat(simplex): groups, native attachments, text batching, auto-accept 2026-06-08 21:03:45 -07:00
test_slack.py Add Hermes desktop app (#20059) 2026-05-31 17:46:56 -05:00
test_slack_approval_buttons.py fix(slack): re-check gateway auth on approval and slash-confirm buttons 2026-06-07 06:21:37 -07:00
test_slack_channel_session_scope.py fix(slack): align thread_ts check with is_thread_reply invariant (Copilot #15464) 2026-06-07 21:19:59 -07:00
test_slack_channel_skills.py
test_slack_mention.py
test_slash_access.py
test_slash_access_dispatch.py
test_sms.py
test_sse_agent_cancel.py
test_ssl_cert_detection.py fix: harden gateway startup and turn persistence 2026-06-07 02:15:23 -07:00
test_ssl_certs.py
test_status.py fix(gateway): tolerate non-UTF-8 status/pid files in gateway status reads 2026-06-04 22:05:23 -07:00
test_status_command.py fix(gateway): name what the /status token number actually is 2026-05-29 19:14:37 -07:00
test_steer_command.py
test_step_callback_compat.py
test_sticker_cache.py
test_stop_thread_sibling.py fix(gateway): /stop can interrupt a sibling participant's run in a per-user thread (#35959) 2026-05-31 09:29:03 -07:00
test_stream_consumer.py
test_stream_consumer_draft.py
test_stream_consumer_fresh_final.py fix(gateway): scope final-delivery flags to turn-final segment (#29346) 2026-06-01 17:31:32 -07:00
test_stream_consumer_thread_routing.py
test_stream_events.py feat(gateway): structured stream-event protocol + Telegram draft formatting parity (#37250) 2026-06-02 00:33:50 -07:00
test_stt_config.py fix(gateway): transcribe voice messages during active agent runs 2026-06-08 15:16:20 +05:30
test_stuck_loop.py
test_subagent_protection_30170.py
test_teams.py
test_teams_pipeline_runtime_wiring.py
test_telegram_approval_buttons.py
test_telegram_audio_vs_voice.py
test_telegram_callback_auth_fail_closed.py
test_telegram_caption_merge.py
test_telegram_channel_posts.py
test_telegram_clarify_buttons.py
test_telegram_conflict.py fix(telegram): use get_running_loop in polling-conflict retry reschedule (#41716) 2026-06-07 22:10:03 -07:00
test_telegram_documents.py
test_telegram_format.py fix(telegram): improve MarkdownV2 edit fallback and fix _strip_mdv2 bold handling 2026-06-08 15:53:16 -07:00
test_telegram_forum_commands.py
test_telegram_group_gating.py refactor(telegram): generalize observed-media caching into a reusable primitive 2026-06-01 20:18:41 -07:00
test_telegram_max_doc_bytes.py
test_telegram_mention_boundaries.py
test_telegram_model_picker.py feat(model-picker): group multi-endpoint providers under one row (#35227) 2026-05-30 01:41:33 -07:00
test_telegram_network.py
test_telegram_network_reconnect.py
test_telegram_noise_filter.py
test_telegram_photo_interrupts.py
test_telegram_progress_edit_transient.py
test_telegram_reactions.py
test_telegram_reply_mode.py
test_telegram_reply_quote.py
test_telegram_send_draft_format.py feat(gateway): structured stream-event protocol + Telegram draft formatting parity (#37250) 2026-06-02 00:33:50 -07:00
test_telegram_send_path_health.py
test_telegram_slash_confirm.py
test_telegram_status_update.py
test_telegram_text_batch_perf.py
test_telegram_text_batching.py
test_telegram_thread_fallback.py fix(gateway): clean service restart notifications 2026-05-31 21:05:53 -07:00
test_telegram_topic_mode.py
test_telegram_webhook_secret.py
test_text_batching.py
test_title_command.py
test_tool_response_drop_recovery.py fix(gateway): recover extract-stripped tool responses on all platforms (#29346) 2026-06-01 17:31:32 -07:00
test_transcript_offset.py
test_tts_media_routing.py
test_unauthorized_dm_behavior.py fix(simplex): accept display name in SIMPLEX_ALLOWED_USERS 2026-06-07 04:53:22 -07:00
test_unavailable_skill_hint.py
test_undo_rewind_session.py feat(gateway): bring /undo [N] to messaging platforms (parity with CLI/TUI) (#36699) 2026-06-01 02:04:14 -07:00
test_unknown_command.py
test_update_command.py test(gateway): repoint slash-command mocks after mixin extraction 2026-06-08 01:25:35 -07:00
test_update_streaming.py fix(gateway): keep pending /update completion notifications until the target platform reconnects 2026-06-04 06:56:28 -07:00
test_usage_command.py test(gateway): repoint slash-command mocks after mixin extraction 2026-06-08 01:25:35 -07:00
test_verbose_command.py
test_version_command.py Include git SHA in /version output via banner label helper. 2026-06-05 18:05:05 -07:00
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 fix(gateway): honor WECOM_ALLOWED_USERS in env-only WeCom DM allowlist 2026-06-01 19:20:36 -07:00
test_wecom_callback.py
test_weixin.py fix(weixin): add rate-limit circuit breaker 2026-06-07 22:10:17 -07:00
test_weixin_typing.py fix(weixin): refresh typing ticket on expiry to prevent stuck indicator (#38085) 2026-06-07 21:50:57 -07:00
test_whatsapp_connect.py
test_whatsapp_formatting.py
test_whatsapp_group_gating.py
test_whatsapp_reply_prefix.py
test_whatsapp_text_batching.py fix(gateway): config.yaml path for WhatsApp/Weixin text-batch delays 2026-05-30 07:33:15 -07:00
test_ws_auth_retry.py
test_yolo_command.py