Repository navigation
feat(slack): built-in Slack app over Socket Mode - #287
Merged
Merged
Conversation
adeelahmad
force-pushed
the
claude/project-thread-js668b
branch
from
October 10, 2026 20:34
660e643 to
8963caa
Compare
Slack as an adapter of the chat-channel layer (channels.py): a Socket Mode listener in the process holding the lease acknowledges every envelope and queues messages for the channel thread, which answers through bridge.py like Matterbridge and Telegram rooms. A manifest link creates the Slack app in one click; the bot and app-level tokens are sealed settings. Direct messages, mentions, threads, /lens (with clear and compact), voice clips and files are handled. Settings page, docs, changelog and threat model included. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FKrujJ1UrhR3AD5aSGcgN1
adeelahmad
force-pushed
the
claude/project-thread-js668b
branch
from
October 11, 2026 02:28
0790c19 to
3f9dd32
Compare
adeelahmad
pushed a commit
that referenced
this pull request
Oct 11, 2026
The open-room check moves from Matterbridge to Channel.outside, so Slack without a user list still makes changes ask first, as on main. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VdrxhwvmLjFsfzQZ5pRJGC
adeelahmad
added a commit
that referenced
this pull request
Oct 11, 2026
…monitoring switch as built (#351) "Ask" names the built-in Telegram bot (#293) and Slack app (#287); "Connect your agents" adds mounting the graph's files read-only over S3, WebDAV, NFS or SMB (#324, #295, #305) and copying the MCP address from the account menu (#340); "Watch it run" says one switch in the web app starts Prometheus and Grafana (#337); "Light by default" adds the cloud model presets (#334). The docs index gains the NFS and SMB pages, and "In progress" keeps only open PRs. Claude-Session: https://claude.ai/code/session_01HDx7PPUauyjMn1LZs8JAsS Co-authored-by: Adeel Ahmad <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Adeel · project thread
Builds on the chat-channel layer from #293, which is now merged.
Description
Before: the assistant reached Slack only through Matterbridge.
After: Settings › Slack has a link that creates a Slack app from Lens's manifest in one click. Install it, paste its two tokens (bot
xoxb-…and app-levelxapp-…) and turn it on. The assistant then answers:/lens <question>anywhere, answered in that channel./lens clearand/lens compactare the chat commands.It does this over Socket Mode, with no Matterbridge and no public address. Voice clips are transcribed, and files are held for the assistant to import. Namespace routing, "yes" approvals in the room, the allowed-people list and channels given to a namespace's assistant (
slack/general = pods) work as in Matterbridge and Telegram rooms.How:
app/domain/slack.pyadds aSlack(channels.Channel). The process that holds the channel's lease keeps a Socket Mode connection open. That connection acknowledges every envelope straight away (Slack wants an acknowledgement within 3 s) and queues the message.fetch()hands the queue to the channel thread, which answers in order throughbridge.handle. The connection closes when the tokens change or the lease moves. The bot token is sent only tofiles.slack.com, and redirects elsewhere are refused.websocketswas already a dependency (BSD-3).Types of changes
Checklist:
tests/api/test_slack.py,tests/fake_slack.py).docs/chat-rooms.md("Slack, built in").## Unreleasedentry.Done questions
/settings/slack,/settings/slack/test).mkdocs build --strict.make openapiwas run.🤖 Generated with Claude Code
https://claude.ai/code/session_01FKrujJ1UrhR3AD5aSGcgN1