arizuko › concepts › slack pane
slack pane
Slack has a sidebar for installed agent apps: the user clicks the AI icon and gets a split pane with the bot. In the pane, the bot can set a title, suggest follow-up prompts and see which channel the user is looking at. Two MCP tools control the title and the prompts. On a chat with no open pane, both tools return an error.
The pane is a Slack thread with extra events
The pane is a special Slack thread with a fixed thread_ts that Slack opens when the user clicks. Slack sends two extra events to the app. assistant_thread_started arrives when the user opens the pane. assistant_thread_context_changed arrives when the user moves to another channel while the pane is open. In the other direction, slakd calls assistant.threads.setTitle and setSuggestedPrompts. It never calls setStatus: a pane shows the busy state with the same eyes reaction as any other Slack chat.
The pane adds three things a DM lacks
- Title
- The pane history shows it.
slakdsets a default and the agent replaces it. - Suggested prompts
- Buttons at the bottom of the pane.
slakdsets three defaults when the pane opens, and the agent replaces them withpane_set_prompts. - Pane context
- The prompt of a pane turn carries
<pane-context jid="..."/>with the channel the user is looking at.slakdupdates that channel when the user moves to another one.
slakd records each pane and starts it
For each pane, slakd asks routd, the owner of the table, to store a row in pane_sessions with the key (team_id, user_id, thread_ts). The row holds the DM channel of the pane and the optional context_jid that the user is looking at. When assistant_thread_started arrives, slakd does four things:
- It sends the row to
routd, which writes or updates it. - It sets the pane title with
bot.paneTitle(): “<assistant> — chat” whenASSISTANT_NAMEis set, and “chat” otherwise. - It sets default suggested prompts from the starter list in the bot. The agent replaces them per pane with
pane_set_promptscalls. - It creates an inbound message with
verb="pane_open", so the route table can match it.
On every agent reply in a pane, slakd posts with chat.postMessage and sets thread_ts to the thread of the pane. It then applies the title and the prompts that the agent staged with the two tools, once.
Two MCP tools control the pane
pane_set_prompts(chatJid, prompts)- Stages follow-up buttons that appear after the next reply. The tool text names 3 to 4 as the visible cap.
pane_set_title(chatJid, title)- Stages a new pane title that applies after the next reply.
On a platform with no pane, such as Discord or Telegram, and on a Slack chat with no open pane, chanreg returns an unsupported error and the tool call fails. The agent sends no buttons.
Three settings in the Slack app turn the pane on
In the Slack app configuration at api.slack.com/apps:
- Turn on Agents & AI Apps.
- Under OAuth scopes, add
assistant:writeand keepchat:write. - Under Event Subscriptions, subscribe to
assistant_thread_startedandassistant_thread_context_changed. Keepmessage.imfor inbound pane messages.
deploy on Slack has the full steps.
The reference pages list the table and the tools
reference / schema has the pane_sessions table. pane_set_prompts and pane_set_title are in the MCP tool reference. slakd describes the adapter.