hermes-agent/tests/gateway
kshitijk4poor af973e4071 refactor(gateway): migrate Mattermost adapter to bundled plugin
Second migration of an existing built-in platform adapter after Discord
(PR #30591) — follows the same shape established by IRC / Teams / LINE /
Google Chat / SimpleX and the playbook in
`references/platform-plugin-migration.md`. Advances the umbrella refactor
in #3823.

Matches Discord's parity bar — adapter under `plugins/platforms/mattermost/`
with the standard `__init__.py` / `adapter.py` / `plugin.yaml` shell,
`register(ctx)` entry point, **no back-compat shim** at the old import
path, and full parity for all five hooks Discord uses plus the
`apply_yaml_config_fn` hook (mattermost is the second consumer of #25443
after Discord):

* `standalone_sender_fn` — out-of-process cron delivery via Mattermost
  REST API. Picks up the thread_id + media_files capabilities the
  legacy `_send_mattermost` lacked (parity with Discord's `_standalone_send`).
* `setup_fn` — interactive `hermes setup gateway` wizard.
* `apply_yaml_config_fn` — translates `config.yaml` `mattermost:` keys
  (`require_mention`, `free_response_channels`, `allowed_channels`) into
  `MATTERMOST_*` env vars (replaces the hardcoded block in
  `gateway/config.py`).
* `is_connected` — declares connection state from `MATTERMOST_TOKEN` +
  `MATTERMOST_URL`.
* `check_fn` — verifies aiohttp is installed and both required env vars
  are set.
* plus `allowed_users_env`, `allow_all_env`, `cron_deliver_env_var`,
  `max_message_length` (4000 — Mattermost practical limit), `emoji`,
  `required_env`, `install_hint`.

Files
-----
* `gateway/platforms/mattermost.py` (873 LOC) →
  `plugins/platforms/mattermost/adapter.py` (git rename, R071) +
  appended `register()` block, hook helpers, and `_standalone_send`
  with media upload + thread_id support.
* New `plugins/platforms/mattermost/{__init__.py, plugin.yaml}` with
  `requires_env` / `optional_env` declarations covering MATTERMOST_URL,
  MATTERMOST_TOKEN, MATTERMOST_ALLOWED_USERS, MATTERMOST_ALLOW_ALL_USERS,
  MATTERMOST_HOME_CHANNEL, MATTERMOST_REPLY_MODE,
  MATTERMOST_REQUIRE_MENTION, MATTERMOST_FREE_RESPONSE_CHANNELS,
  MATTERMOST_ALLOWED_CHANNELS.
* `gateway/config.py`: delete 17-LOC `mattermost_cfg` YAML→env bridge
  (moved into plugin's `_apply_yaml_config`).
* `gateway/run.py::_create_adapter`: delete `Platform.MATTERMOST elif` —
  replaced by the existing generic plugin-registry-first dispatch.
* `tools/send_message_tool.py`: delete `_send_mattermost` (22 LOC) +
  `Platform.MATTERMOST elif` in `_send_to_platform` — the `else` branch
  already routes plugin platforms through `_send_via_adapter`, which
  hits the registry's `standalone_sender_fn`.
* `hermes_cli/setup.py`: delete `_setup_mattermost` (44 LOC) — replaced
  by the plugin's `interactive_setup`.
* `hermes_cli/gateway.py`: delete `_PLATFORMS["mattermost"]` dict entry
  (3 LOC) — plugin's `setup_fn` is dispatched via the plugin path in
  `_configure_platform`.
* Consumer rewrite: 5 test files (test_mattermost.py,
  test_media_download_retry.py, test_send_multiple_images.py,
  test_stream_consumer.py, test_ws_auth_retry.py) get
  `gateway.platforms.mattermost` → `plugins.platforms.mattermost.adapter`
  with the bulk-rewrite recipe from the platform-plugin-migration playbook.
  Single `mock.patch` string in test_stream_consumer.py also repointed.
* `tests/tools/test_send_message_missing_platforms.py`: thin
  `(token, extra, chat_id, message)` compat shim around the plugin's
  `_standalone_send(pconfig, …)` so existing test bodies continue to
  work without rewriting every signature.

Validation
----------
* Plugin discovery: mattermost registers from `plugins/platforms/mattermost/`
  alongside discord / teams / irc / line / google_chat / simplex.
  All 9 hooks present (setup_fn, standalone_sender_fn,
  apply_yaml_config_fn, is_connected, check_fn, allowed_users_env,
  allow_all_env, cron_deliver_env_var, max_message_length=4000).
* Mattermost-touching tests: 62/62 pass
  (`test_mattermost.py` + `test_send_message_missing_platforms.py`).
* Targeted selectors (mattermost or platform_registry or stream_consumer
  or ws_auth_retry or media_download_retry or send_multiple_images or
  send_message_tool or platform_connected): 433/433 pass.
* Full sweep (`scripts/run_tests.sh tests/gateway/ tests/cron/
  tests/tools/test_send_message_tool.py tests/tools/test_send_message_missing_platforms.py
  tests/integration/`): **6220/6220 pass in 47.8s, 0 failures**.
* Lint: ruff clean on all touched files.
* Git identity verified: kshitijk4poor.
* Rename detection: R071 (similarity dropped from a hypothetical R09x
  by the ~320-line appended register block — ~36% growth over the
  873-LoC base, vs Discord's 5101 LoC base which kept R091).

Closes part of #3823.
2026-05-24 18:05:33 -07:00
..
platforms feat(state.db): persist platform_message_id; restore yuanbao exact-id recall 2026-05-20 13:00:57 -07:00
__init__.py
…
_plugin_adapter_loader.py
…
conftest.py test: use subprocesses for each test file (#29016) 2026-05-21 16:40:04 +05:30
feishu_helpers.py
…
restart_test_helpers.py
…
test_7100_transient_failure_transcript.py
…
test_active_session_text_merge.py gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
test_agent_cache.py
…
test_allowed_channels_widening.py fix(tests): catch up 25 stale tests after recent merges (#28626) 2026-05-19 01:28:32 -07:00
test_allowlist_startup_check.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_api_server.py fix(state): restrict sensitive store file permissions 2026-05-24 04:55:18 -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 ci(tests): add pytest-timeout 60s hard cap to break suite-teardown deadlock (#28861) 2026-05-19 17:27:24 -07:00
test_api_server_toolset.py
…
test_approve_deny_commands.py fix(tests): catch up 25 stale tests after recent merges (#28626) 2026-05-19 01:28:32 -07:00
test_auth_fallback.py fix(provider): make config.yaml model.provider the single source of truth (#31222) 2026-05-23 18:18:41 -07:00
test_auto_continue.py
…
test_background_command.py test(gateway): include direct_messages_topic_id in telegram DM metadata assertions 2026-05-17 12:44:48 -07:00
test_background_process_notifications.py fix(gateway): route background-process notifications into Telegram DM topics 2026-05-18 22:03:12 -07:00
test_base_topic_sessions.py gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
test_bluebubbles.py fix(debug): redact BlueBubbles webhook secrets 2026-05-24 15:43:48 -07:00
test_bundles_command.py feat(skills): add skill bundles — alias /<name> loads multiple skills (#28373) 2026-05-18 21:38:05 -07:00
test_busy_session_ack.py gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07: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 gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
test_complete_path_at_filter.py
…
test_compress_command.py fix(compress): abort instead of dropping messages when summary LLM fails (#28102) 2026-05-18 10:19:40 -07:00
test_compress_focus.py
…
test_compress_plugin_engine.py
…
test_config.py Revert "feat(telegram): support quick-command-only menus" 2026-05-18 23:59:57 -07:00
test_config_cwd_bridge.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_config_env_bridge_authority.py gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
test_debug_command.py
…
test_delivery.py
…
test_destructive_slash_confirm.py
…
test_dingtalk.py fix(dingtalk): finalize open streaming cards before disconnect 2026-05-23 20:48:56 -07:00
test_discord_allowed_channels.py
…
test_discord_allowed_mentions.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_attachment_download.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_bot_auth_bypass.py fix(tests): align CI tests with recent security hardening (#31470) 2026-05-24 06:54:16 -07:00
test_discord_bot_filter.py
…
test_discord_channel_controls.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_channel_prompts.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_channel_skills.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_clarify_buttons.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_component_auth.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_connect.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_document_handling.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_free_response.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_imports.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_lazy_install_views.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_media_metadata.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_model_picker.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_opus.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_race_polish.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_reactions.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_reply_mode.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_roles_dm_scope.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_send.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_slash_auth.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_slash_commands.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_discord_system_messages.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_discord_thread_persistence.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_display_config.py
…
test_dm_topics.py test: use subprocesses for each test file (#29016) 2026-05-21 16:40:04 +05:30
test_document_cache.py
…
test_duplicate_reply_suppression.py
…
test_email.py
…
test_ephemeral_reply.py
…
test_extract_local_files.py feat(gateway): deliverable mode — ship artifacts as native uploads from any agent surface (#27813) 2026-05-18 02:14:43 -07:00
test_fallback_eviction.py
…
test_fast_command.py test(fast-command): stub _load_gateway_runtime_config too 2026-05-23 02:40:33 -07:00
test_feishu.py fix(feishu): validate verification token before reflecting url_verification challenge 2026-05-24 04:51:19 -07:00
test_feishu_approval_buttons.py fix(tests): align CI tests with recent security hardening (#31470) 2026-05-24 06:54:16 -07:00
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 ci(tests): add pytest-timeout 60s hard cap to break suite-teardown deadlock (#28861) 2026-05-19 17:27:24 -07:00
test_gateway_shutdown.py
…
test_goal_max_turns_config.py
…
test_goal_status_notice.py
…
test_goal_verdict_send.py
…
test_google_chat.py fix(google_chat): harden oauth credential persistence with atomic private writes (#24788) 2026-05-24 17:58:52 -07:00
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 gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
test_irc_adapter.py
…
test_kanban_notifier.py
…
test_keep_typing_timeout.py
…
test_line_plugin.py
…
test_load_transcript_db_only.py test(gateway): pin DEFAULT_DB_PATH in fixtures to prevent real state.db writes 2026-05-20 13:00:57 -07:00
test_loop_exception_handler.py fix(gateway): swallow transient Telegram TimedOut at loop level 2026-05-24 15:03:27 -07:00
test_matrix.py fix(matrix,gateway): Matrix E2EE installs full dep set; plugins respect is_connected 2026-05-24 15:16:03 -07:00
test_matrix_exec_approval.py
…
test_matrix_mention.py
…
test_matrix_voice.py
…
test_mattermost.py refactor(gateway): migrate Mattermost adapter to bundled plugin 2026-05-24 18:05:33 -07:00
test_media_download_retry.py refactor(gateway): migrate Mattermost adapter to bundled plugin 2026-05-24 18:05:33 -07:00
test_media_extraction.py
…
test_memory_monitor.py Port from cline/cline#10343: periodic gateway memory logging (#27102) 2026-05-16 12:55:23 -07:00
test_message_deduplicator.py
…
test_mirror.py refactor(gateway): drop _append_to_jsonl from mirror 2026-05-20 13:00:57 -07:00
test_model_command_custom_providers.py
…
test_model_switch_persistence.py
…
test_msgraph_webhook.py fix(tests): align CI tests with recent security hardening (#31470) 2026-05-24 06:54:16 -07:00
test_native_image_buffer_isolation.py
…
test_notice_delivery.py
…
test_ntfy_plugin.py ntfy: tighten robustness, dedupe auth/truncation, add docs 2026-05-23 16:13:01 -07:00
test_pairing.py fix(gateway): preserve WhatsApp pairing approvals across JID/LID alias flips 2026-05-23 01:46:34 -07:00
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 unsafe gateway media path delivery 2026-05-23 01:40:35 -07:00
test_platform_connected_checkers.py Harden msgraph webhook auth requirements (#30169) 2026-05-24 04:25:20 -07:00
test_platform_http_client_limits.py
…
test_platform_reconnect.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_platform_registry.py fix(gateway): seed plugin extras before is_connected gate (#31703) 2026-05-24 15:44:26 -07:00
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): authorize approval button interactions by session owner (#30737) 2026-05-24 04:25:12 -07:00
test_queue_consumption.py
…
test_reasoning_command.py
…
test_reload_skills_command.py
…
test_reload_skills_discord_resync.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_replay_entry_fields.py
…
test_reply_to_injection.py
…
test_restart_drain.py gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
test_restart_notification.py
…
test_restart_redelivery_dedup.py
…
test_restart_resume_pending.py ci(tests): add pytest-timeout 60s hard cap to break suite-teardown deadlock (#28861) 2026-05-19 17:27:24 -07:00
test_resume_command.py feat: support numbered resume selection in cli and gateway 2026-05-24 16:22:48 -07:00
test_retry_replacement.py refactor(yuanbao): drop dead branch A1 message_id loop + pin missing fixture 2026-05-20 13:00:57 -07:00
test_retry_response.py
…
test_run_cleanup_progress.py
…
test_run_progress_interrupt.py
…
test_run_progress_topics.py test(gateway): regression for plugin-transformed response after streaming 2026-05-24 04:31:13 -07:00
test_runner_fatal_adapter.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_runner_startup_failures.py test: keep tirith checks hermetic 2026-05-23 02:20:14 -07:00
test_running_agent_session_toggles.py
…
test_runtime_config_env_expansion.py fix(gateway): enforce env variable template expansion on runtime config loaders 2026-05-23 02:27:08 -07:00
test_runtime_env_reload_config_authority.py
…
test_runtime_footer.py
…
test_safe_adapter_disconnect.py
…
test_send_image_file.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_send_multiple_images.py refactor(gateway): migrate Mattermost adapter to bundled plugin 2026-05-24 18:05:33 -07:00
test_send_retry.py
…
test_send_voice_reply_notify.py fix(gateway): mark final voice reply as notify-worthy so Telegram delivers it audibly 2026-05-18 22:25:15 -07:00
test_session.py test(gateway): pin DEFAULT_DB_PATH in fixtures to prevent real state.db writes 2026-05-20 13:00:57 -07:00
test_session_boundary_hooks.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_session_boundary_security_state.py
…
test_session_dm_thread_seeding.py test(gateway): pin DEFAULT_DB_PATH in fixtures to prevent real state.db writes 2026-05-20 13:00:57 -07:00
test_session_env.py
…
test_session_hygiene.py fix(compress): abort instead of dropping messages when summary LLM fails (#28102) 2026-05-18 10:19:40 -07:00
test_session_info.py
…
test_session_list_allowed_sources.py
…
test_session_model_override_routing.py fix(gateway): honor key_env in auth-failure fallback resolution 2026-05-23 02:25:53 -07:00
test_session_model_reset.py
…
test_session_race_guard.py
…
test_session_reset_notify.py fix(session): persist auto-reset state across gateway restarts 2026-05-15 01:25:42 -07:00
test_session_split_brain_11016.py gateway: debounce queued text follow-ups 2026-05-24 01:31:45 -07:00
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_forensics.py
…
test_shutdown_memory_provider_messages.py
…
test_signal.py fix(signal): read groupV2.id in envelope, fall back to legacy groupInfo (#27051) 2026-05-16 11:53:57 -07:00
test_signal_format.py
…
test_signal_rate_limit.py
…
test_simplex_plugin.py feat(gateway): add SimpleX Chat platform plugin 2026-05-15 01:41:30 -07:00
test_slack.py
…
test_slack_approval_buttons.py
…
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_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 refactor(gateway): migrate Mattermost adapter to bundled plugin 2026-05-24 18:05:33 -07:00
test_stream_consumer_draft.py fix(telegram): default streaming transport to edit 2026-05-18 21:51:39 -07:00
test_stream_consumer_fresh_final.py
…
test_stream_consumer_thread_routing.py
…
test_stt_config.py feat(telegram): skip-STT audio path + 2GB cap via local Bot API server 2026-05-18 22:59:40 -07:00
test_stuck_loop.py
…
test_teams.py test(gateway): accept trust_env in fake aiohttp ClientSession lambdas 2026-05-17 12:44:48 -07:00
test_teams_pipeline_runtime_wiring.py
…
test_telegram_approval_buttons.py fix(tests): catch up 25 stale tests after recent merges (#28626) 2026-05-19 01:28:32 -07:00
test_telegram_audio_vs_voice.py fix(gateway): route Telegram audio file attachments away from STT pipeline (#24870) 2026-05-18 21:53:57 -07:00
test_telegram_callback_auth_fail_closed.py fix(telegram): fail-closed auth fallback when TELEGRAM_ALLOWED_USERS is empty 2026-05-18 22:08:08 -07:00
test_telegram_caption_merge.py
…
test_telegram_channel_posts.py test+release: stub auth in channel_posts fixture; map @brndnsvr 2026-05-18 22:51:35 -07:00
test_telegram_clarify_buttons.py fix(telegram): render full clarify choice text in message body, use short button labels 2026-05-18 21:49:19 -07:00
test_telegram_conflict.py fix(test+release): update conflict retry count for MAX=5; map @CryptoByz 2026-05-18 22:01:31 -07:00
test_telegram_documents.py test+release: stub auth in test_telegram_documents fixture; map @kiranvk-2011 2026-05-18 22:37:28 -07:00
test_telegram_format.py fix(tests): catch up 25 stale tests after recent merges (#28626) 2026-05-19 01:28:32 -07:00
test_telegram_forum_commands.py test+release: fix test fixture for forum_commands; map @chromalinx 2026-05-18 22:34:48 -07:00
test_telegram_group_gating.py fix(telegram): preserve observed group slash commands 2026-05-23 16:26:28 -07:00
test_telegram_max_doc_bytes.py feat(telegram): skip-STT audio path + 2GB cap via local Bot API server 2026-05-18 22:59:40 -07:00
test_telegram_mention_boundaries.py
…
test_telegram_model_picker.py
…
test_telegram_network.py test+release: align stale sticky-IP test for #24511; map @falconexe 2026-05-18 22:14:45 -07:00
test_telegram_network_reconnect.py
…
test_telegram_noise_filter.py Quiet noisy Telegram gateway errors 2026-05-18 22:53:01 -07:00
test_telegram_photo_interrupts.py
…
test_telegram_progress_edit_transient.py fix(telegram): preserve can_edit after transient network errors in progress edits (#27828) 2026-05-18 21:59:40 -07:00
test_telegram_reactions.py
…
test_telegram_reply_mode.py fix(telegram): respect reply_to_mode for DM topic reply fallback 2026-05-18 21:52:39 -07:00
test_telegram_reply_quote.py
…
test_telegram_send_path_health.py fix(telegram): gate send() on send-path health after reconnect storms (#31165) 2026-05-24 15:27:41 -07:00
test_telegram_slash_confirm.py fix(telegram): escape send_slash_confirm preview with format_message 2026-05-18 22:28:21 -07:00
test_telegram_status_update.py feat(telegram): edit status messages in place instead of appending (#30864) 2026-05-23 02:42:10 -07:00
test_telegram_text_batch_perf.py
…
test_telegram_text_batching.py
…
test_telegram_thread_fallback.py fix(telegram): preserve new DM topic lanes 2026-05-24 15:28:40 -07:00
test_telegram_topic_mode.py test(telegram): add brand-new-topic regression for #31086 2026-05-24 15:28:40 -07:00
test_telegram_webhook_secret.py
…
test_text_batching.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_title_command.py
…
test_transcript_offset.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_tts_media_routing.py Fix unsafe gateway media path delivery 2026-05-23 01:40:35 -07:00
test_unauthorized_dm_behavior.py fix(gateway): allow chat-scoped telegram auth without sender user_id 2026-05-18 22:43:14 -07:00
test_unavailable_skill_hint.py
…
test_unknown_command.py
…
test_update_command.py
…
test_update_streaming.py fix(gateway): avoid zsh status variable in update wrapper 2026-05-16 23:11:43 -07:00
test_usage_command.py
…
test_verbose_command.py
…
test_vision_memory_leak.py
…
test_voice_command.py refactor(gateway): migrate Discord adapter to bundled plugin (full Teams parity) 2026-05-22 14:21:41 -07:00
test_voice_mode_platform_isolation.py
…
test_weak_credential_guard.py
…
test_webhook_adapter.py fix(webhook): use 403 not 500 for missing-secret rejection 2026-05-24 04:47:45 -07:00
test_webhook_deliver_only.py
…
test_webhook_dynamic_routes.py fix(webhook): enforce INSECURE_NO_AUTH safety rail on dynamic route reloads 2026-05-23 02:39:12 -07:00
test_webhook_integration.py
…
test_webhook_signature_rate_limit.py
…
test_wecom.py fix(wecom): guard flush task against cancel-delivery race to prevent message loss 2026-05-24 01:33:40 -07:00
test_wecom_callback.py fix(wecom-callback): retry send with fresh token on errcode 40001/42001 2026-05-24 01:30:47 -07:00
test_weixin.py
…
test_whatsapp_connect.py fix(gateway): keep running when platforms fail; add per-platform circuit breaker + /platform (#26600) 2026-05-15 14:32:14 -07:00
test_whatsapp_formatting.py
…
test_whatsapp_group_gating.py
…
test_whatsapp_reply_prefix.py
…
test_ws_auth_retry.py refactor(gateway): migrate Mattermost adapter to bundled plugin 2026-05-24 18:05:33 -07:00
test_yolo_command.py
…