# Slack EBA Adapter ## Structure Slack is migrated into `src/langbot/pkg/platform/adapters/slack/` with the standard EBA adapter layout: - `adapter.py` owns lifecycle, listener dispatch, unified webhook handling, outbound send/reply, and event caches. - `event_converter.py` maps Slack `im` and `app_mention` channel events to `message.received`. - `message_converter.py` maps common `MessageChain` components to Slack text fallback and maps inbound Slack text/image payloads back to EBA components. - `api_impl.py` provides cache-backed common read APIs. - `platform_api.py` declares safe Slack-specific API actions. - `manifest.yaml` declares `slack-eba`. The legacy `src/langbot/pkg/platform/sources/slack.py` adapter is kept unchanged. ## Configuration | Field | Required | Notes | |-------|----------|-------| | `webhook_url` | No | Generated by LangBot. Paste it into Slack Event Subscriptions. | | `bot_token` | Yes | Slack bot token, usually `xoxb-...`. | | `signing_secret` | Yes | Slack app signing secret. | ## Events | Event | Notes | |-------|-------| | `message.received` | Emitted for private `im` messages and channel `app_mention` events. Channel messages are mapped to group chats. | | `platform.specific` | Reserved for Slack event types that are not converted into common message events. | ## Common APIs Required: - `send_message` - `reply_message` Optional: - `get_message` - `get_user_info` - `get_friend_list` - `get_group_info` - `get_group_list` - `get_group_member_list` - `get_group_member_info` - `call_platform_api` Cache-backed APIs are only available after the relevant inbound event has been observed. ## Platform APIs | Action | Notes | |--------|-------| | `get_mode` | Returns webhook mode and configured bot account id. | | `auth_test` | Calls Slack `auth.test` with the configured bot token. | ## Known Limits - Slack file/image outbound is currently represented as text fallback because the existing Slack SDK wrapper only exposes `chat_postMessage`. - Inbound channel coverage follows the legacy adapter behavior: only `app_mention` events are treated as group messages. - Real live testing requires a public callback URL configured in Slack Event Subscriptions. ## Verification Local mocked unit coverage validates manifest parity, event conversion, legacy listener compatibility, cache-backed APIs, send/reply routing, and declared platform APIs. Plugin E2E evidence was captured on June 2, 2026 against `dev.rockchin.top` with Slack private DM input and `EBAEventProbe` through the standalone runtime. Evidence file: `/home/wgc/LangBotxg/LangBotEbaTest/data/temp/slack_eba_plugin_probe.jsonl`. Observed: - Real Slack private text produced `MessageReceived` with `adapter_name=slack-eba`, `Source + Plain`, private chat type, and filled `bot_uuid`. - Safe common APIs passed: `get_message`, `get_user_info`, `get_friend_list`. - Outbound component fallback sweep passed through `send_message`: plain/at/face, image, quote, file, and forward. - Declared Slack platform APIs passed: `get_mode`, `auth_test`. Still pending: - Channel `app_mention` plugin E2E. - Real inbound Slack file/image UI evidence. Live probe scaffold: `tests/e2e/live_slack_eba_probe.py`.