Custom Slack apps currently can’t reliably (a) read Slack threads or (b) send messages on the user’s behalf (user identity).
Current behavior
- No supported path for reading thread history for a given channel/thread
- No supported path for posting as the user (vs bot)
Expected behavior
- If a user installs a custom Slack app, core can read thread context (configurable scope)
- core can send a message either as bot or as the user (explicit mode), depending on what the user authorized
Suggested implementation notes
- Support both posting modes:
- Bot token mode: chat.postMessage as the app
- User token mode: chat.postMessage with a user token (or Slack Connect where applicable)
- OAuth + scopes:
- Reading: channels:history, groups:history, im:history, mpim:history (depending on target), plus channels:read/groups:read
- Thread expansion: use conversations.replies for thread_ts
- Posting: chat:write (bot), chat:write:user (if using user token), plus users:read if needed
- Store token type and workspace metadata; enforce least-privilege and clear UX copy for what’s being authorized
- Add API surface to fetch a thread by (channel_id, thread_ts) and return messages in chronological order
Acceptance criteria
- Given (channel_id, thread_ts), core fetches the full thread messages reliably.
- core can post to a channel in bot mode.
- If user token authorized, core can post in user mode (and fails with a clear error when not authorized).
- Unit/integration tests cover: missing scopes, revoked token, and thread with > 100 replies (pagination).
Custom Slack apps currently can’t reliably (a) read Slack threads or (b) send messages on the user’s behalf (user identity).
Current behavior
Expected behavior
Suggested implementation notes
Acceptance criteria