arizuko › concepts › slack pane
slack pane
Voice was a modality every platform shares. The Slack pane is the opposite case: an affordance only one platform offers, which the agent can light up when it’s there. Slack ships a dedicated sidebar UI for installed agent apps — the user clicks the AI icon and gets a split pane with the bot. It’s richer than a DM: the bot can set a title, suggest follow-up prompts, show a typing indicator, and know which channel the user is currently viewing. Where a platform has no pane, the same tool calls quietly no-op — the agent doesn’t branch on platform.
what it is
The pane is a special Slack thread with a fixed thread_ts opened by Slack on the user’s click. Slack delivers two extra events to the app: assistant_thread_started when the user opens the pane, and assistant_thread_context_changed when the user navigates to a different workspace channel while the pane is open. Outbound, the app can call assistant.threads.setStatus, setTitle, and setSuggestedPrompts.
why it matters
A DM is just a message stream. The pane adds affordances:
- Title — the pane history shows what the conversation was about, not just “chat with bot”.
- Suggested prompts — clickable starter buttons at the bottom of the pane. The agent stages them with
pane_set_promptsafter a reply so the next click is fast. - Typing indicator —
setStatus("thinking…")while the agent runs. - Pane context — the bot can read which channel the user was looking at when they clicked the AI icon and reference it.
how it works
Per pane, slakd stores a row in pane_sessions keyed by (team_id, user_id, thread_ts) with the pane DM channel and the optional context_jid the user is viewing. When assistant_thread_started arrives, slakd:
- Upserts the
pane_sessionsrow. - Sets the pane title from
ARIZUKO_ASSISTANT_NAME(falls back to the instance name) viabot.paneTitle()atslakd/bot.go:413. - Stages default suggested prompts from the bot’s compiled starter list; the agent overrides them per pane with
pane_set_promptsMCP calls. - Synthesises an inbound with
verb="pane_open"so the route table can match on it.
On every agent reply in a pane, slakd posts via chat.postMessage with thread_ts set to the pane’s thread, then optionally calls setSuggestedPrompts with whatever the agent staged via pane_set_prompts.
MCP tools
pane_set_prompts(jid, prompts)— stage 3-4 follow-up buttons that appear after the next reply lands.pane_set_title(jid, title)— override the pane title for the current conversation.
Both are no-ops on platforms without a pane (Discord, Telegram, etc).
how operators enable it
Slack app config (api.slack.com/apps):
- Agents & AI Apps — toggle on.
- OAuth scopes — add
assistant:write(keepchat:write). - Event Subscriptions — subscribe to
assistant_thread_startedandassistant_thread_context_changed. Keepmessage.imfor inbound pane messages.
Full walkthrough in deploy on Slack.
go deeper
Spec: specs/7/D. The pane_sessions schema: pane_sessions. The MCP tool reference: pane_set_prompts, pane_set_title.