Skip to content

sentioxyz/slack-adapter

 
 

Repository files navigation

@openacp/slack-adapter

Slack messaging platform adapter plugin for OpenACP.

Installation

openacp plugin install @openacp/slack-adapter

Configuration

Add to your ~/.openacp/config.json:

{
  "channels": {
    "slack": {
      "enabled": true,
      "adapter": "@openacp/slack-adapter",
      "botToken": "xoxb-...",
      "appToken": "xapp-...",
      "signingSecret": "...",
      "channelPrefix": "openacp",
      "notificationChannelId": "C...",
      "allowedUserIds": [],
      "autoCreateSession": true,
      "outputMode": "medium"
    }
  }
}
Field Description
botToken Bot User OAuth Token (xoxb-…)
appToken App-Level Token (xapp-…) for Socket Mode
signingSecret Signing Secret from Basic Information
channelPrefix Prefix for session channel names. Default: openacp
notificationChannelId Optional. Channel ID for system notifications
allowedUserIds Optional. Restrict access to specific Slack user IDs
autoCreateSession Create a startup session on boot. Default: true
outputMode Default verbosity: "low", "medium", or "high". Default: "medium"
attachmentInlineMaxBytes Text files ≤ this size (bytes) are inlined into the prompt; larger ones are saved as files. Default: 16384
readThreadHistory Walk the full thread for attachments from every message, not just the triggering one. Default: true
subscribedChannels Optional. Channels to watch: [{ "channelId": "C...", "trigger": "mention" | "all" }]. Invite the bot to each. Default: []

Output Mode

The adapter renders agent activity in real time using Slack threads:

  • Low 🔇 — minimal indicator only (🔧 Processing...✅ Done)
  • Medium 📊 — tool names + running count in the main message; tool cards in thread
  • High 🔍 — full detail: tool input/output, diffs, viewer links, thinking in thread

Change the mode on the fly with /outputmode low|medium|high, or open an interactive modal with /outputmode. Requires the slash command to be registered in the Slack app settings — see the setup guide.

Channel Subscription

Beyond the per-session channels the bot creates, you can point it at existing channels. Invite the bot to the channel and list it under subscribedChannels:

"subscribedChannels": [
  { "channelId": "C0123ABCD", "trigger": "mention" }
]
  • trigger: "mention" (default) — the bot starts a session only when a top-level message @mentions it.
  • trigger: "all" — every top-level message starts a session.

Each top-level trigger opens a thread; the agent works and replies inside that thread, and any reply in the thread continues the same session (with full context). Tool-permission requests appear as buttons in the thread. The bot never archives a subscribed channel.

Attachments

The bot reads files and forwarded/shared messages from the thread, not just the message body:

  • Text (.txt, .log, .json, .csv, code) — small files are inlined into the prompt; larger ones are attached as files.
  • Forwarded messages — their text is inlined with attribution.
  • Binaries (images, PDFs, …) — surfaced as localhost download links served by the adapter, which injects the bot token. The agent (same host) downloads them only if it needs the bytes.

Requires the files:read scope (file downloads) plus the relevant history scopes (channels:history, groups:history, im:history, mpim:history) for reading thread replies.

Processing indicator

While the agent works on a message, the bot adds a reaction (default 👀 eyes) to it and removes the reaction when the turn completes. Configure with processingReaction (emoji name without colons, e.g. "hourglass"); set it to "" to disable. Requires the reactions:write scope — existing installs without it keep working, the indicator just logs a warning until the app is reinstalled with the updated manifest.

In bot-owned threads the bot also skips replies that @mention someone else without mentioning the bot (including @here/@channel/user-group-only mentions). Skipped replies are not lost: the next processed message prepends them as context ("gap backfill"). Gap backfill is disabled when readThreadHistory: false, since it relies on walking the thread.

Development

npm install
npm run build
npm test

# Install locally for testing
openacp plugin install /path/to/slack-plugin

License

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • TypeScript 100.0%