Skip to content

Joseph19820124/openab

Β 
Β 

Repository files navigation

OpenAB β€” Open Agent Broker

Stars GitHub Release License

OpenAB banner

A lightweight, secure, cloud-native ACP harness that bridges Discord, Slack, and any Agent Client Protocol-compatible coding CLI (Kiro CLI, Claude Code, Codex, Gemini, OpenCode, Copilot CLI, etc.) over stdio JSON-RPC β€” delivering the next-generation development experience.

πŸͺΌ Join our community! Come say hi on Discord β€” we'd love to have you: πŸͺΌ OpenAB β€” Official πŸŽ‰

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  Gateway WS   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  ACP stdio    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Discord    │◄─────────────►│              │──────────────►│  coding CLI  β”‚
β”‚   User       β”‚               β”‚    openab    │◄── JSON-RPC ──│  (acp mode)  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  Socket Mode  β”‚    (Rust)    β”‚               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚   Slack      │◄─────────────►│              β”‚
β”‚   User       β”‚               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Demo

openab demo

Features

  • Multi-platform β€” supports Discord and Slack, run one or both simultaneously
  • Pluggable agent backend β€” swap between Kiro CLI, Claude Code, Codex, Gemini, OpenCode, Copilot CLI via config
  • @mention trigger β€” mention the bot in an allowed channel to start a conversation
  • Thread-based multi-turn β€” auto-creates threads; no @mention needed for follow-ups
  • Edit-streaming β€” live-updates the Discord message every 1.5s as tokens arrive
  • Emoji status reactions β€” πŸ‘€β†’πŸ€”β†’πŸ”₯/πŸ‘¨β€πŸ’»/βš‘β†’πŸ‘+random mood face
  • Session pool β€” one CLI process per thread, auto-managed lifecycle
  • ACP protocol β€” JSON-RPC over stdio with tool call, thinking, and permission auto-reply support
  • Kubernetes-ready β€” Dockerfile + k8s manifests with PVC for auth persistence
  • Voice message STT β€” auto-transcribes Discord voice messages via Groq, OpenAI, or local Whisper server (docs/stt.md)

Quick Start

1. Create a Bot

Discord

See docs/discord-bot-howto.md for a detailed step-by-step guide.

Slack

See docs/slack-bot-howto.md for a detailed step-by-step guide.

2. Install with Helm (Kiro CLI β€” default)

helm repo add openab https://openabdev.github.io/openab
helm repo update

helm install openab openab/openab \
  --set agents.kiro.discord.botToken="$DISCORD_BOT_TOKEN" \
  --set-string 'agents.kiro.discord.allowedChannels[0]=YOUR_CHANNEL_ID'

# Slack
helm install openab openab/openab \
  --set agents.kiro.slack.enabled=true \
  --set agents.kiro.slack.botToken="$SLACK_BOT_TOKEN" \
  --set agents.kiro.slack.appToken="$SLACK_APP_TOKEN" \
  --set-string 'agents.kiro.slack.allowedChannels[0]=C0123456789'

3. Authenticate (first time only)

kubectl exec -it deployment/openab-kiro -- kiro-cli login --use-device-flow
kubectl rollout restart deployment/openab-kiro

4. Use

In your Discord channel:

@YourBot explain this code

The bot creates a thread. After that, just type in the thread β€” no @mention needed.

Slack: @YourBot explain this code in a channel β€” same thread-based workflow as Discord.

Other Agents

Agent CLI ACP Adapter Guide
Kiro (default) kiro-cli acp Native docs/kiro.md
Claude Code claude-agent-acp @agentclientprotocol/claude-agent-acp docs/claude-code.md
Codex codex-acp @zed-industries/codex-acp docs/codex.md
Gemini gemini --acp Native docs/gemini.md
OpenCode opencode acp Native docs/opencode.md
Copilot CLI ⚠️ copilot --acp --stdio Native docs/copilot.md
Cursor cursor-agent acp Native docs/cursor.md

πŸ”§ Running multiple agents? See docs/multi-agent.md

Local Development

cp config.toml.example config.toml
# Edit config.toml with your bot token and channel ID

export DISCORD_BOT_TOKEN="your-token"
cargo run

Configuration Reference

[discord]
bot_token = "${DISCORD_BOT_TOKEN}"   # supports env var expansion
allowed_channels = ["123456789"]      # channel ID allowlist
# allowed_users = ["987654321"]       # user ID allowlist (empty = all users)

[slack]
bot_token = "${SLACK_BOT_TOKEN}"     # Bot User OAuth Token (xoxb-...)
app_token = "${SLACK_APP_TOKEN}"     # App-Level Token (xapp-...) for Socket Mode
allowed_channels = ["C0123456789"]   # channel ID allowlist (empty = allow all)
# allowed_users = ["U0123456789"]    # user ID allowlist (empty = allow all)

[agent]
command = "kiro-cli"                  # CLI command
args = ["acp", "--trust-all-tools"]   # ACP mode args
working_dir = "/tmp"                  # agent working directory
env = {}                              # extra env vars passed to the agent

[pool]
max_sessions = 10                     # max concurrent sessions
session_ttl_hours = 24                # idle session TTL

[reactions]
enabled = true                        # enable emoji status reactions
remove_after_reply = false            # remove reactions after reply
Full reactions config
[reactions.emojis]
queued = "πŸ‘€"
thinking = "πŸ€”"
tool = "πŸ”₯"
coding = "πŸ‘¨β€πŸ’»"
web = "⚑"
done = "πŸ†—"
error = "😱"

[reactions.timing]
debounce_ms = 700
stall_soft_ms = 10000
stall_hard_ms = 30000
done_hold_ms = 1500
error_hold_ms = 2500

Kubernetes Deployment

The Docker image bundles both openab and kiro-cli in a single container.

β”Œβ”€ Kubernetes Pod ──────────────────────────────────────┐
β”‚  openab (PID 1)                                       β”‚
β”‚    └─ kiro-cli acp --trust-all-tools (child process)  β”‚
β”‚       β”œβ”€ stdin  ◄── JSON-RPC requests                 β”‚
β”‚       └─ stdout ──► JSON-RPC responses                β”‚
β”‚                                                       β”‚
β”‚  PVC (/data)                                          β”‚
β”‚    β”œβ”€ ~/.kiro/                  (settings, sessions)  β”‚
β”‚    └─ ~/.local/share/kiro-cli/  (OAuth tokens)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Build & Push

docker build -t openab:latest .
docker tag openab:latest <your-registry>/openab:latest
docker push <your-registry>/openab:latest

Deploy without Helm

kubectl create secret generic openab-secret \
  --from-literal=discord-bot-token="your-token"

kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/pvc.yaml
kubectl apply -f k8s/deployment.yaml
Manifest Purpose
k8s/deployment.yaml Single-container pod with config + data volume mounts
k8s/configmap.yaml config.toml mounted at /etc/openab/
k8s/secret.yaml DISCORD_BOT_TOKEN injected as env var
k8s/pvc.yaml Persistent storage for auth + settings

Project Structure

β”œβ”€β”€ Dockerfile          # multi-stage: rust build + debian-slim runtime with kiro-cli
β”œβ”€β”€ config.toml.example # example config with all agent backends
β”œβ”€β”€ k8s/                # Kubernetes manifests
└── src/
    β”œβ”€β”€ main.rs         # entrypoint: multi-adapter startup, cleanup, shutdown
    β”œβ”€β”€ adapter.rs      # ChatAdapter trait, AdapterRouter (platform-agnostic)
    β”œβ”€β”€ config.rs       # TOML config + ${ENV_VAR} expansion
    β”œβ”€β”€ discord.rs      # DiscordAdapter: serenity EventHandler + ChatAdapter impl
    β”œβ”€β”€ slack.rs        # SlackAdapter: Socket Mode + ChatAdapter impl
    β”œβ”€β”€ media.rs        # shared image resize/compress + STT download
    β”œβ”€β”€ format.rs       # message splitting, thread name shortening
    β”œβ”€β”€ reactions.rs    # status reaction controller (debounce, stall detection)
    └── acp/
        β”œβ”€β”€ protocol.rs # JSON-RPC types + ACP event classification
        β”œβ”€β”€ connection.rs # spawn CLI, stdio JSON-RPC communication
        └── pool.rs     # session key β†’ AcpConnection map

Inspired By

License

MIT

About

A lightweight, secure, cloud-native ACP harness that bridges Discord and any ACP-compatible coding CLI.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Rust 97.6%
  • Go Template 1.3%
  • Dockerfile 1.1%