hermes-agent/tests
emozilla 984e6cb5b8 feat(whatsapp): add WhatsApp Business Cloud API adapter
Add an official, production-grade WhatsApp integration via Meta's
Business Cloud API as a complement to the existing Baileys bridge.
No bridge subprocess, no QR codes, no account-ban risk — at the cost
of a Meta Business account and a public HTTPS webhook URL.

Setup is fully wizard-driven: 'hermes whatsapp-cloud' walks through
every credential with paste-time validation (catches the #1 trap of
pasting a phone number into the Phone Number ID field), generates a
verify token, and ends with copy-paste instructions for the
cloudflared / Meta-dashboard / Business Manager pieces that can't be
automated. The wizard also points users at Meta's Business Manager
for setting the bot's display name and profile picture.

Feature set:

- Inbound: text, images (with native-vision routing), voice notes
  (STT), documents (small text inlined, larger cached), reply context.
- Outbound: text with WhatsApp-flavored markdown conversion, images,
  videos, documents, opus voice notes via ffmpeg with MP3 fallback.
- Native interactive buttons for clarify, dangerous-command approval,
  and slash-command confirmation flows — matches the Telegram /
  Discord UX, graceful degrades to plain text.
- Read receipts (blue double-checkmarks) and typing indicator,
  using Meta's combined endpoint so they fire in a single API call.
- Webhook security: X-Hub-Signature-256 HMAC verification (raw body,
  constant-time), wamid deduplication, group-shaped-message refusal
  (groups deferred to v2 — Baileys still covers them).
- Full integration with the gateway's session, cron, display-tier,
  prompt-hint, and auth-allowlist systems. Cloud and Baileys can run
  side-by-side against different phone numbers.

Also wires STT (speech-to-text) through Nous's managed audio gateway
for Nous subscribers — previously the default stt.provider=local
required a separate faster-whisper install. New subscribers now get
voice-note transcription out of the box.

Docs: 418-line user guide at website/docs/user-guide/messaging/
whatsapp-cloud.md, sidebar entry, environment-variables reference,
ADDING_A_PLATFORM.md updated with the optional interactive-UX
contract for future adapter authors.

Tests: 100 dedicated tests for the adapter, 32 for the setup wizard,
20 for the Nous subscription STT wiring, plus regression coverage
across display_config, prompt_builder, and the cron scheduler.

Known limitations (deferred until clear demand signal):
- Group chats — use the Baileys bridge if you need them.
- Message templates for 24-hour-window outside-conversation sends —
  reactive chat is unaffected; cron / delegate_task with gaps > 24h
  will fail with a clear error. The agent's system prompt warns the
  model about this so it knows to mention it when scheduling delayed
  messages.
2026-05-23 01:07:01 -04:00
..
acp
…
acp_adapter
…
agent feat(whatsapp): add WhatsApp Business Cloud API adapter 2026-05-23 01:07:01 -04:00
cli
…
cron feat(whatsapp): add WhatsApp Business Cloud API adapter 2026-05-23 01:07:01 -04:00
e2e
…
fakes
…
gateway feat(whatsapp): add WhatsApp Business Cloud API adapter 2026-05-23 01:07:01 -04:00
hermes_cli feat(whatsapp): add WhatsApp Business Cloud API adapter 2026-05-23 01:07:01 -04:00
hermes_state
…
honcho_plugin
…
integration
…
openviking_plugin
…
plugins test: use subprocesses for each test file (#29016) 2026-05-21 16:40:04 +05:30
providers fix(custom): pass custom provider extra body 2026-05-21 07:48:53 -07:00
run_agent chore: trim verbose comments/docstrings, add AUTHOR_MAP entry 2026-05-21 12:49:21 +05:30
scripts
…
skills
…
stress
…
tools test(computer_use): end-to-end regression for capture routing (#24015) 2026-05-21 17:38:19 -07:00
tui_gateway
…
website
…
__init__.py
…
conftest.py test: use subprocesses for each test file (#29016) 2026-05-21 16:40:04 +05:30
run_interrupt_test.py
…
test_account_usage.py
…
test_atomic_replace_symlinks.py
…
test_base_url_hostname.py
…
test_batch_runner_checkpoint.py
…
test_bitwarden_secrets.py feat(secrets): Bitwarden Secrets Manager integration with lazy bws install (#30035) 2026-05-21 14:10:34 -07:00
test_cli_file_drop.py
…
test_cli_manual_compress.py
…
test_cli_skin_integration.py
…
test_ctx_halving_fix.py
…
test_empty_model_fallback.py
…
test_evidence_store.py
…
test_gateway_streaming_nested_config.py
…
test_get_tool_definitions_cache_isolation.py
…
test_hermes_bootstrap.py
…
test_hermes_constants.py
…
test_hermes_home_profile_warning.py
…
test_hermes_logging.py
…
test_hermes_state.py
…
test_hermes_state_wal_fallback.py
…
test_honcho_client_config.py
…
test_install_sh_browser_install.py
…
test_install_sh_pythonpath_sanitization.py
…
test_install_sh_setup_wizard_tty_probe.py
…
test_install_sh_symlink_stomp.py
…
test_install_sh_termux_network_prereqs.py
…
test_ipv4_preference.py
…
test_lazy_session_regressions.py
…
test_lint_config.py
…
test_live_system_guard_self_test.py
…
test_mcp_serve.py
…
test_mini_swe_runner.py
…
test_minimax_model_validation.py
…
test_minimax_oauth.py
…
test_minisweagent_path.py
…
test_model_picker_scroll.py
…
test_model_tools.py
…
test_model_tools_async_bridge.py
…
test_ollama_num_ctx.py
…
test_package_json_lazy_deps.py
…
test_packaging_metadata.py
…
test_plugin_skills.py
…
test_process_loop_event_loop_warning.py
…
test_project_metadata.py
…
test_retry_utils.py
…
test_run_tests_parallel.py test: use subprocesses for each test file (#29016) 2026-05-21 16:40:04 +05:30
test_sanitize_tool_error.py
…
test_sql_injection.py
…
test_subprocess_home_isolation.py
…
test_termux_all_extra_compat.py
…
test_timezone.py
…
test_toolset_distributions.py
…
test_toolsets.py
…
test_trajectory_compressor.py
…
test_trajectory_compressor_async.py
…
test_transform_llm_output_hook.py
…
test_transform_tool_result_hook.py
…
test_tui_gateway_server.py feat(tui): mouse_tracking DEC mode presets (salvage of #26681) (#30084) 2026-05-21 20:25:52 -05:00
test_utils_truthy_values.py
…
test_yuanbao_integration.py
…
test_yuanbao_markdown.py
…
test_yuanbao_pipeline.py
…
test_yuanbao_proto.py
…