- whatsapp/telegram/matrix _is_connected now read tokens via
hermes_cli.gateway.get_env_value (not os.getenv) so setup-status callers that
patch get_env_value — and the connected-platforms check — observe the same
value (matches the discord/slack plugin pattern). whatsapp keys off
WHATSAPP_ENABLED instead of returning unconditional True (was making it always
show 'configured' in hermes setup). matrix/telegram gain explicit is_connected
so _platform_status reflects real config, not mere SDK presence.
- _all_platforms() hides matrix on Windows for registry-discovered plugins too
(python-olm has no Windows wheel), not just the legacy _PLATFORMS list.
- setup_gateway tests stub _configure_platform + keep checklist pre-selection so
migrated plugins' interactive_setup wizards don't read real stdin.
- hermes_logging COMPONENT_PREFIXES['gateway'] now includes plugins.platforms
so migrated adapters' logs route to gateway.log + match
'hermes logs --component gateway'.
- Generalize the _enabled_explicit marker (was slack-only) to every platform
with an explicit enabled key, and make _enable_from_env read (not pop) it,
so the registry-driven plugin-enable pass honors an explicit enabled:false
for telegram/matrix/etc. instead of re-enabling on token/SDK presence.
- Telegram gets an is_connected (token check) so the enable gate doesn't flip
it on merely because python-telegram-bot is importable.
- Test updates: windows-native npm-scan path -> plugins/platforms/whatsapp,
webhook-secret source path -> plugin adapter, logging component tests use
expanded gateway prefixes, connected-checker invariant accepts registry
is_connected/validate_config.
- Sweep test imports gateway.platforms.{telegram,feishu,matrix,dingtalk,whatsapp}
(+ telegram_network / feishu satellites) -> plugins.platforms.<x>.adapter
across ~68 test files; both 'from X import' and 'from gateway.platforms import X'
forms.
- _is_platform_connected now forces discover_plugins() before the registry
lookup so get_connected_platforms() works on directly-constructed GatewayConfig
(fixes dingtalk-recognised tests after its checker moved to the plugin).
- telegram _apply_yaml_config no longer re-emits generic shared-config keys
(reply_prefix etc.) that _merge_platform_map already merges with top-level
precedence, while still passing through telegram-specific extras (base_url).
- prompt_choice lives in hermes_cli.setup, not cli_output — fixed the import in
feishu/dingtalk interactive_setup and the test patch target.
- test_setup_feishu rewritten to drive interactive_setup via the plugin.
WIP toward #41112 — the last and largest gateway channel. Telegram adapter +
telegram_network satellite relocated to plugins/platforms/telegram/ with the
network import rewritten to the new package path. register() exposes the
platform with standalone_sender_fn (delegates to the retained _send_telegram
REST sender), apply_yaml_config_fn (full telegram: YAML→env + extra bridge),
setup_fn (delegates to the managed-bot QR wizard via lazy import), and a
_build_adapter that applies the notification-mode resolution that used to live
in gateway/run.py's factory branch. Core touchpoints stripped: run.py factory
branch (was the leading if), config.py 90-line telegram_cfg bridge, gateway.py
static dict + setup-map entry. send_message_tool keeps _send_telegram (the
plugin delegates to it) with its TelegramAdapter imports repointed to the
plugin path. Generic Platform.TELEGRAM references in core (auth maps, bridged
config-loop special-cases, source-platform behavior checks) intentionally
remain — same 'left generic in core' policy as the merged migrations.