79 lines
3.2 KiB
Markdown
79 lines
3.2 KiB
Markdown
# Slack Platform Feature Inventory
|
|
|
|
## What Existed Before Our Work (on main)
|
|
|
|
The Slack platform was added in commit `eaec71f` with basic functionality:
|
|
|
|
- **Message handling**: Direct messages only (`*slackevents.MessageEvent`)
|
|
- **File attachments**: Image and audio download via `downloadSlackFile()`
|
|
- **Threading**: Reply contexts capture channel + timestamp for threaded replies
|
|
- **Socket Mode**: Connection via `app_token` + `bot_token`
|
|
- **Session keys**: Format `slack:channel:user`
|
|
- **Methods**: `New()`, `Start()`, `Reply()`, `Send()`, `Stop()`, `ReconstructReplyCtx()`
|
|
|
|
## What We Added (feat/multi-workspace branch)
|
|
|
|
### 1. App Mention Support
|
|
- Handle `@bot` mentions in channels (`AppMentionEvent`)
|
|
- `stripAppMentionText()` helper to extract clean message text
|
|
- Commits: `ef37f6f`, `abc46cf`, `33cf135`
|
|
|
|
### 2. Slash Command Support
|
|
- Handle `socketmode.EventTypeSlashCommand` events
|
|
- Converts Slack `/command` to engine command format
|
|
- Enables native `/btw`, `/new`, `/stop`, etc. from Slack
|
|
- Commits: `81c6aec`, `2bd8518`
|
|
|
|
### 3. Multi-Workspace / Shared Sessions
|
|
- `share_session_in_channel` config option
|
|
- Session key can be channel-only (`slack:channel`) or user-scoped (`slack:channel:user`)
|
|
- `ResolveChannelName()` via `ChannelNameResolver` interface
|
|
- Channel name caching with `sync.RWMutex`
|
|
- Commits: `647398f`, `62def03`
|
|
|
|
### 4. Typing Indicator (Emoji Reactions)
|
|
- `StartTyping()` adds progressive emoji reactions to user's message
|
|
- Timeline: immediately eyes, after 2min clock, then every 5min random emoji
|
|
- All reactions cleaned up when agent completes
|
|
- Commit: `231883c`
|
|
|
|
### 5. Security
|
|
- `allow_from` config option with `core.CheckAllowFrom()` validation
|
|
- Token redaction in error messages
|
|
- Old message filtering via `core.IsOldMessage()`
|
|
- Commits: `ae13e23`, `90f0e22`
|
|
|
|
### 6. Slack mrkdwn Formatting
|
|
- System prompt instructs agent to use Slack's mrkdwn format (not standard Markdown)
|
|
- `*bold*` instead of `**bold**`, no `## headings`, etc.
|
|
- Commit: `b4a1144`
|
|
|
|
## Uncommitted Work (stashed)
|
|
|
|
### Context % Fix
|
|
- SDK reports garbage `input_tokens` (single digits like 3, 22)
|
|
- When SDK tokens < 100, falls back to agent's self-reported `[ctx: ~XX%]`
|
|
- Previously: self-reported value was always stripped and replaced with broken SDK value
|
|
|
|
### --continue on First Connection (hasConnectedOnce)
|
|
- On first session creation after engine startup, always uses `--continue`
|
|
- Picks up most recent CLI session regardless of what's stored in session manager
|
|
- Bridges direct CLI usage and cc-connect sessions
|
|
- `hasConnectedOnce` atomic.Bool prevents subsequent connections from using --continue
|
|
|
|
## Current Configuration Options
|
|
|
|
| Option | Required | Description |
|
|
|--------|----------|-------------|
|
|
| `bot_token` | Yes | Slack bot OAuth token |
|
|
| `app_token` | Yes | Slack app-level token for Socket Mode |
|
|
| `allow_from` | No | User allowlist |
|
|
| `share_session_in_channel` | No | Share session across all users in channel |
|
|
|
|
## Architecture Compliance
|
|
|
|
All Slack-specific code lives in `platform/slack/`. Core uses interface-based capability checks:
|
|
- `ChannelNameResolver` for channel name lookup
|
|
- `StartTyping()` via `TypingIndicator` interface (if implemented)
|
|
- No hardcoded "slack" references in core/
|