emma-hermes/tests/gateway
Teknium 087e74d4d7
feat(slack): register every gateway command as a native slash (Discord/Telegram parity) (#16164)
Every command in COMMAND_REGISTRY (/btw, /stop, /model, /help, /new,
/bg, /reset, ...) is now a first-class Slack slash command instead of
a /hermes <subcommand>. Users get the same autocomplete-driven slash
picker experience Slack users expect and that Discord and Telegram
already provide.

Previously Slack registered ONE native slash (/hermes) and split on
the first word, so typing /btw in Slack's composer got 'couldn't find
an app for /btw' because the workspace manifest never declared it.

Changes
- hermes_cli/commands.py: slack_native_slashes() + slack_app_manifest()
  generate a Slack manifest from the registry (canonical names +
  aliases + plugin commands), clamped to Slack's 50-slash cap with
  /hermes reserved as the catch-all.
- gateway/platforms/slack.py: single regex matcher dispatches every
  registered slash to _handle_slash_command, which dispatches on
  command['command']. Legacy /hermes <subcommand> keeps working for
  backward compat with older workspace manifests.
- hermes_cli/slack_cli.py + hermes_cli/main.py: new 'hermes slack
  manifest' command prints/writes a full manifest (display info,
  OAuth scopes, event subs, socket mode, slash commands) ready to
  paste into 'Create from manifest' or Features → App Manifest.
- hermes_cli/setup.py: _setup_slack() now writes the manifest up-front
  and points users at the 'From an app manifest' flow; also offers
  to refresh the manifest on reconfigure for picking up new commands.
- Tests: 14 new tests covering native-slash dispatch (/btw, /stop,
  /model), legacy /hermes <sub> compat, manifest structure, and
  telegram<->slack parity (every Telegram command must also register
  as a Slack slash). Existing /hermes-registration test updated to
  assert the new regex matches /hermes, /btw, /stop, /model, /help.
- Docs: slack.md gains a 'Slash Commands' section + Option A manifest
  flow in Step 1; cli-commands.md documents 'hermes slack manifest'.

Users pick up the new slashes by running 'hermes slack manifest --write'
and pasting into Features → App Manifest → Edit in their Slack app
config, then Save (Slack prompts for reinstall if scopes changed).
2026-04-26 11:38:32 -07:00
..
__init__.py
conftest.py test(gateway): unify discord mock via shared conftest; drop duplicated mock in model_picker test 2026-04-24 03:33:29 -07:00
restart_test_helpers.py
test_agent_cache.py fixup! fix(gateway): preserve inactivity clock on interrupt-recursive cached-agent turns (#15654) 2026-04-26 08:45:44 -07:00
test_allowlist_startup_check.py
test_api_server.py fix(api-server): persist incomplete snapshot on asyncio.CancelledError too 2026-04-24 15:22:19 -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 feat(api_server): add POST /v1/runs/{run_id}/stop endpoint 2026-04-25 18:40:35 -07:00
test_api_server_toolset.py
test_approve_deny_commands.py
test_auth_fallback.py fix(gateway,cron): activate fallback_model when primary provider auth fails 2026-04-24 05:35:43 -07:00
test_auto_continue.py
test_background_command.py
test_background_process_notifications.py
test_base_topic_sessions.py
test_bluebubbles.py fix(gateway/bluebubbles): align iMessage delivery with non-editable UX 2026-04-24 16:04:37 -07:00
test_busy_session_ack.py feat(onboarding): contextual first-touch hints for /busy and /verbose (#16046) 2026-04-26 06:06:27 -07:00
test_cancel_background_drain.py
test_channel_directory.py
test_clean_shutdown_marker.py
test_command_bypass_active_session.py refactor(commands): drop /provider, /plan handler, and clean up slash registry (#15047) 2026-04-24 03:10:52 -07:00
test_complete_path_at_filter.py fix(tui): restore voice/panic handlers + scope fuzzy paths to cwd 2026-04-23 19:38:33 -05:00
test_compress_command.py fix(compress): don't reach into ContextCompressor privates from /compress (#15039) 2026-04-24 02:55:43 -07:00
test_compress_focus.py fix(compress): don't reach into ContextCompressor privates from /compress (#15039) 2026-04-24 02:55:43 -07:00
test_compress_plugin_engine.py fix(compress): don't reach into ContextCompressor privates from /compress (#15039) 2026-04-24 02:55:43 -07:00
test_config.py fix(gateway/config): coerce quoted boolean values in config parsing 2026-04-24 15:20:05 -07:00
test_config_cwd_bridge.py
test_debug_command.py
test_delivery.py
test_dingtalk.py
test_discord_allowed_channels.py fix(discord): honor wildcard '*' in ignored_channels and free_response_channels 2026-04-24 03:04:42 -07:00
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_connect.py fix(gateway/discord): read permission attrs from AppCommand, canonicalize contexts 2026-04-23 15:11:56 -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(gateway): unify discord mock via shared conftest; drop duplicated mock in model_picker test 2026-04-24 03:33:29 -07:00
test_discord_opus.py
test_discord_race_polish.py
test_discord_reactions.py
test_discord_reply_mode.py
test_discord_send.py
test_discord_slash_commands.py refactor(commands): drop /provider, /plan handler, and clean up slash registry (#15047) 2026-04-24 03:10:52 -07:00
test_discord_system_messages.py
test_discord_thread_persistence.py
test_display_config.py
test_dm_topics.py
test_document_cache.py
test_duplicate_reply_suppression.py
test_email.py
test_extract_local_files.py
test_fallback_eviction.py
test_fast_command.py
test_feishu.py
test_feishu_approval_buttons.py
test_feishu_comment.py
test_feishu_comment_rules.py
test_feishu_onboard.py
test_gateway_inactivity_timeout.py
test_gateway_shutdown.py
test_homeassistant.py
test_hooks.py
test_insights_unicode_flags.py
test_internal_event_bypass_pairing.py
test_interrupt_key_match.py
test_matrix.py fix(matrix): drop needless DeviceID import + mock put_device_id in tests 2026-04-25 07:17:03 +05:30
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_pairing.py
test_pending_drain_race.py
test_pending_event_none.py
test_pii_redaction.py
test_platform_base.py
test_platform_reconnect.py
test_pre_gateway_dispatch.py feat(plugins): add pre_gateway_dispatch hook 2026-04-24 03:02:03 -07:00
test_proxy_mode.py fix(telegram): honor no_proxy for explicit proxy setup 2026-04-24 14:31:04 -07:00
test_qqbot.py
test_queue_consumption.py
test_reasoning_command.py fix(gateway): make reasoning session-scoped by default 2026-04-25 18:01:31 -07:00
test_reply_to_injection.py
test_restart_drain.py
test_restart_notification.py
test_restart_redelivery_dedup.py
test_restart_resume_pending.py
test_resume_command.py refactor(memory): remove flush_memories entirely (#15696) 2026-04-25 08:21:14 -07:00
test_retry_replacement.py
test_retry_response.py
test_run_progress_interrupt.py fix(gateway): suppress tool-progress bubbles after interrupt (#16034) 2026-04-26 05:47:37 -07:00
test_run_progress_topics.py fix(gateway/bluebubbles): align iMessage delivery with non-editable UX 2026-04-24 16:04:37 -07:00
test_runner_fatal_adapter.py
test_runner_startup_failures.py fix(gateway): only clear locks belonging to the replaced process 2026-04-23 15:07:06 -07:00
test_running_agent_session_toggles.py refactor: drop persist_session plumbing + fix broken btw mid-turn bypass (#16075) 2026-04-26 07:15:23 -07:00
test_safe_adapter_disconnect.py
test_send_image_file.py
test_send_retry.py
test_session.py fix(gateway/bluebubbles): align iMessage delivery with non-editable UX 2026-04-24 16:04:37 -07:00
test_session_boundary_hooks.py refactor(memory): remove flush_memories entirely (#15696) 2026-04-25 08:21:14 -07:00
test_session_boundary_security_state.py refactor(memory): remove flush_memories entirely (#15696) 2026-04-25 08:21:14 -07:00
test_session_dm_thread_seeding.py
test_session_env.py
test_session_hygiene.py
test_session_info.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_session_list_allowed_sources.py
test_session_model_override_routing.py fix(gateway): make reasoning session-scoped by default 2026-04-25 18:01:31 -07:00
test_session_model_reset.py fix(gateway): make reasoning session-scoped by default 2026-04-25 18:01:31 -07:00
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_signal.py
test_slack.py feat(slack): register every gateway command as a native slash (Discord/Telegram parity) (#16164) 2026-04-26 11:38:32 -07:00
test_slack_approval_buttons.py
test_slack_mention.py
test_sms.py
test_sse_agent_cancel.py
test_ssl_certs.py
test_status.py fix(gateway): only clear locks belonging to the replaced process 2026-04-23 15:07:06 -07:00
test_status_command.py
test_steer_command.py
test_step_callback_compat.py
test_sticker_cache.py
test_stream_consumer.py
test_stt_config.py
test_stuck_loop.py
test_telegram_approval_buttons.py
test_telegram_caption_merge.py
test_telegram_conflict.py
test_telegram_documents.py
test_telegram_format.py
test_telegram_group_gating.py
test_telegram_mention_boundaries.py
test_telegram_network.py fix(telegram): honor no_proxy for explicit proxy setup 2026-04-24 14:31:04 -07:00
test_telegram_network_reconnect.py
test_telegram_photo_interrupts.py
test_telegram_reactions.py
test_telegram_reply_mode.py
test_telegram_text_batching.py
test_telegram_thread_fallback.py
test_telegram_webhook_secret.py
test_text_batching.py
test_title_command.py
test_transcript_offset.py
test_unauthorized_dm_behavior.py refactor(gateway): extract WhatsApp identity helpers into shared module 2026-04-24 07:55:55 -07:00
test_unknown_command.py
test_update_command.py
test_update_streaming.py
test_usage_command.py
test_verbose_command.py
test_voice_command.py fix(gateway): honor voice.auto_tts config in auto-TTS gate (#16007) (#16039) 2026-04-26 05:52:05 -07:00
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