arizuko

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. slakd sets a default and the agent replaces it.
Suggested prompts
Buttons at the bottom of the pane. slakd sets three defaults when the pane opens, and the agent replaces them with pane_set_prompts.
Pane context
The prompt of a pane turn carries <pane-context jid="..."/> with the channel the user is looking at. slakd updates 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:

  1. It sends the row to routd, which writes or updates it.
  2. It sets the pane title with bot.paneTitle(): “<assistant> — chat” when ASSISTANT_NAME is set, and “chat” otherwise.
  3. It sets default suggested prompts from the starter list in the bot. The agent replaces them per pane with pane_set_prompts calls.
  4. 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:

  1. Turn on Agents & AI Apps.
  2. Under OAuth scopes, add assistant:write and keep chat:write.
  3. Under Event Subscriptions, subscribe to assistant_thread_started and assistant_thread_context_changed. Keep message.im for 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.