惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
G
Google Developers Blog
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
腾讯CDC
博客园_首页
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
WordPress大学
WordPress大学
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
博客园 - 叶小钗

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
docs: align Slack docs for socket mode and troubleshootin...
bek91 · 2026-05-14 · via Recent Commits to openclaw:main

@@ -23,17 +23,17 @@ Production-ready for DMs and channels via Slack app integrations. Default mode i

23232424

Both transports are production-ready and reach feature parity for messaging, slash commands, App Home, and interactivity. Pick by deployment shape, not features.

252526-

| Concern | Socket Mode (default) | HTTP Request URLs |

27-

| ---------------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- |

28-

| Public Gateway URL | Not required | Required (DNS, TLS, reverse proxy or tunnel) |

29-

| Outbound network | Outbound WSS to `wss-primary.slack.com` must be reachable | No outbound WS; inbound HTTPS only |

30-

| Tokens needed | Bot token (`xoxb-...`) + App-Level Token (`xapp-...`) with `connections:write` | Bot token (`xoxb-...`) + Signing Secret |

31-

| Dev laptop / behind firewall | Works as-is | Needs a public tunnel (ngrok, Cloudflare Tunnel, Tailscale Funnel) or staging Gateway |

32-

| Horizontal scaling | One Socket Mode session per app per host; multiple Gateways need separate Slack apps | Stateless POST handler; multiple Gateway replicas can share one app behind a load balancer |

33-

| Multi-account on one Gateway | Supported; each account opens its own WS | Supported; each account needs a unique `webhookPath` (default `/slack/events`) so registrations do not collide |

34-

| Slash command transport | Delivered over the WS connection; `slash_commands[].url` is ignored | Slack POSTs to `slash_commands[].url`; field is required for the command to dispatch |

35-

| Request signing | Not used (auth is the App-Level Token) | Slack signs every request; OpenClaw verifies with `signingSecret` |

36-

| Recovery on connection drop | Slack SDK auto-reconnects; the gateway's pong-timeout transport tuning applies | No persistent connection to drop; retries are per-request from Slack |

26+

| Concern | Socket Mode (default) | HTTP Request URLs |

27+

| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |

28+

| Public Gateway URL | Not required | Required (DNS, TLS, reverse proxy or tunnel) |

29+

| Outbound network | Outbound WSS to `wss-primary.slack.com` must be reachable | No outbound WS; inbound HTTPS only |

30+

| Tokens needed | Bot token (`xoxb-...`) + App-Level Token (`xapp-...`) with `connections:write` | Bot token (`xoxb-...`) + Signing Secret |

31+

| Dev laptop / behind firewall | Works as-is | Needs a public tunnel (ngrok, Cloudflare Tunnel, Tailscale Funnel) or staging Gateway |

32+

| Horizontal scaling | One Socket Mode session per app per host; multiple Gateways need separate Slack apps | Stateless POST handler; multiple Gateway replicas can share one app behind a load balancer |

33+

| Multi-account on one Gateway | Supported; each account opens its own WS | Supported; each account needs a unique `webhookPath` (default `/slack/events`) so registrations do not collide |

34+

| Slash command transport | Delivered over the WS connection; `slash_commands[].url` is ignored | Slack POSTs to `slash_commands[].url`; field is required for the command to dispatch |

35+

| Request signing | Not used (auth is the App-Level Token) | Slack signs every request; OpenClaw verifies with `signingSecret` |

36+

| Recovery on connection drop | Slack SDK auto-reconnect is enabled; OpenClaw also restarts failed Socket Mode sessions with bounded backoff. Pong-timeout transport tuning applies. | No persistent connection to drop; retries are per-request from Slack |

37373838

<Note>

3939

**Pick Socket Mode** for single-Gateway hosts, dev laptops, and on-prem networks that can reach `*.slack.com` outbound but cannot accept inbound HTTPS.

@@ -462,6 +462,13 @@ OpenClaw sets the Slack SDK client pong timeout to 15 seconds by default for Soc

462462463463

Use this only for Socket Mode workspaces that log Slack websocket pong/server-ping timeouts or run on hosts with known event-loop starvation. `clientPingTimeout` is the pong wait after the SDK sends a client ping; `serverPingTimeout` is the wait for Slack server pings. App messages and events remain application state, not transport liveness signals.

464464465+

Notes:

466+467+

- `socketMode` is ignored in HTTP Request URL mode.

468+

- Base `channels.slack.socketMode` settings apply to all Slack accounts unless overridden. Per-account overrides use `channels.slack.accounts.<accountId>.socketMode`; because this is an object override, include every socket tuning field you want for that account.

469+

- Only `clientPingTimeout` has an OpenClaw default (`15000`). `serverPingTimeout` and `pingPongLoggingEnabled` are passed to the Slack SDK only when configured.

470+

- Socket Mode restart backoff starts around 2 seconds and caps around 30 seconds. Consecutive recoverable start/start-wait failures stop after 12 attempts; after a successful connection, later recoverable disconnects start a fresh retry cycle. Non-recoverable Slack auth errors such as `invalid_auth`, revoked tokens, or missing scopes fail fast instead of retrying forever.

471+465472

## Manifest and scope checklist

466473467474

The base Slack app manifest is the same for Socket Mode and HTTP Request URLs. Only the `settings` block (and the slash command `url`) differs.

@@ -931,8 +938,9 @@ Current Slack message actions include `send`, `upload-file`, `download-file`, `r

931938

- Slack route bindings accept raw peer IDs plus Slack target forms such as `channel:C12345678`, `user:U12345678`, and `<@U12345678>`.

932939

- With default `session.dmScope=main`, Slack DMs collapse to agent main session.

933940

- Channel sessions: `agent:<agentId>:slack:channel:<channelId>`.

934-

- Thread replies can create thread session suffixes (`:thread:<threadTs>`) when applicable.

935-

- In channels where OpenClaw handles top-level messages without requiring an explicit mention, non-`off` `replyToMode` routes each handled root into `agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>` so the visible Slack thread maps to one OpenClaw session from the first turn.

941+

- Ordinary top-level channel messages stay on the per-channel session, even when `replyToMode` is non-`off`.

942+

- Slack thread replies use the parent Slack `thread_ts` for session suffixes (`:thread:<threadTs>`), even when outbound reply threading is disabled with `replyToMode="off"`.

943+

- OpenClaw seeds an eligible top-level channel root into `agent:<agentId>:slack:channel:<channelId>:thread:<rootTs>` when that root is expected to start a visible Slack thread, so the root and later thread replies share one OpenClaw session. This applies to `app_mention` events, explicit bot or configured mention-pattern matches, and `requireMention: false` channels with non-`off` `replyToMode`.

936944

- `channels.slack.thread.historyScope` default is `thread`; `thread.inheritParent` default is `false`.

937945

- `channels.slack.thread.initialHistoryLimit` controls how many existing thread messages are fetched when a new thread session starts (default `20`; set `0` to disable).

938946

- `channels.slack.thread.requireExplicitMention` (default `false`): when `true`, suppress implicit thread mentions so the bot only responds to explicit `@bot` mentions inside threads, even when the bot already participated in the thread. Without this, replies in a bot-participated thread bypass `requireMention` gating.

@@ -953,7 +961,7 @@ For explicit Slack thread replies from the `message` tool, set `replyBroadcast:

953961

When a `message` tool call runs inside a Slack thread and targets the same channel, OpenClaw normally inherits the current Slack thread according to `replyToMode`. Set `topLevel: true` on `action: "send"` or `action: "upload-file"` to force a new parent-channel message instead. `threadId: null` is accepted as the same top-level opt-out.

954962955963

<Note>

956-

`replyToMode="off"` disables **all** reply threading in Slack, including explicit `[[reply_to_*]]` tags. This differs from Telegram, where explicit tags are still honored in `"off"` mode. Slack threads hide messages from the channel while Telegram replies stay visible inline.

964+

`replyToMode="off"` disables outbound Slack reply threading, including explicit `[[reply_to_*]]` tags. It does not flatten inbound Slack thread sessions: messages already posted inside a Slack thread still route to the `:thread:<threadTs>` session. This differs from Telegram, where explicit tags are still honored in `"off"` mode. Slack threads hide messages from the channel while Telegram replies stay visible inline.

957965

</Note>

958966959967

## Ack reactions

@@ -1258,6 +1266,17 @@ Primary reference: [Configuration reference - Slack](/gateway/config-channels#sl

12581266

- channel allowlist (`channels.slack.channels`) — **keys must be channel IDs** (`C12345678`), not names (`#channel-name`). Name-based keys silently fail under `groupPolicy: "allowlist"` because channel routing is ID-first by default. To find an ID: right-click the channel in Slack → **Copy link** — the `C...` value at the end of the URL is the channel ID.

12591267

- `requireMention`

12601268

- per-channel `users` allowlist

1269+

- `messages.groupChat.visibleReplies`: if it is `"message_tool"` and logs show assistant text with no `message(action=send)` call, the turn was processed but the final answer was kept private. Set it to `"automatic"` if you want normal assistant final replies posted back to Slack channels.

1270+1271+

```json5

1272+

{

1273+

messages: {

1274+

groupChat: {

1275+

visibleReplies: "automatic",

1276+

},

1277+

},

1278+

}

1279+

```

1261128012621281

Useful commands:

12631282

@@ -1274,7 +1293,8 @@ openclaw doctor

1274129312751294

- `channels.slack.dm.enabled`

12761295

- `channels.slack.dmPolicy` (or legacy `channels.slack.dm.policy`)

1277-

- pairing approvals / allowlist entries

1296+

- pairing approvals / allowlist entries (`dmPolicy: "open"` still requires `channels.slack.allowFrom: ["*"]`)

1297+

- group DMs use MPIM handling; enable `channels.slack.dm.groupEnabled` and, if configured, include the MPIM in `channels.slack.dm.groupChannels`

12781298

- Slack Assistant DM events: verbose logs mentioning `drop message_changed`

12791299

usually mean Slack sent an edited Assistant-thread event without a

12801300

recoverable human sender in message metadata

@@ -1287,12 +1307,19 @@ openclaw pairing list slack

1287130712881308

<Accordion title="Socket mode not connecting">

12891309

Validate bot + app tokens and Socket Mode enablement in Slack app settings.

1310+

The `xapp-...` App-Level Token needs `connections:write`, and the `xoxb-...`

1311+

bot token must belong to the same Slack app/workspace as the app token.

1290131212911313

If `openclaw channels status --probe --json` shows `botTokenStatus` or

12921314

`appTokenStatus: "configured_unavailable"`, the Slack account is

12931315

configured but the current runtime could not resolve the SecretRef-backed

12941316

value.

129513171318+

Logs such as `slack socket mode failed to start; retry ...` are recoverable

1319+

start failures. Missing scopes, revoked tokens, and invalid auth fail fast

1320+

instead. A `slack token mismatch ...` log means the bot token and app token

1321+

appear to belong to different Slack apps; fix the Slack app credentials.

1322+12961323

</Accordion>

1297132412981325

<Accordion title="HTTP mode not receiving events">

@@ -1302,11 +1329,16 @@ openclaw pairing list slack

13021329

- webhook path

13031330

- Slack Request URLs (Events + Interactivity + Slash Commands)

13041331

- unique `webhookPath` per HTTP account

1332+

- the public URL terminates TLS and forwards requests to the Gateway path

1333+

- the Slack app `request_url` path exactly matches `channels.slack.webhookPath` (default `/slack/events`)

1305133413061335

If `signingSecretStatus: "configured_unavailable"` appears in account

13071336

snapshots, the HTTP account is configured but the current runtime could not

13081337

resolve the SecretRef-backed signing secret.

130913381339+

A repeated `slack: webhook path ... already registered` log means two HTTP

1340+

accounts are using the same `webhookPath`; give each account a distinct path.

1341+13101342

</Accordion>

1311134313121344

<Accordion title="Native/slash commands not firing">

@@ -1315,7 +1347,14 @@ openclaw pairing list slack

13151347

- native command mode (`channels.slack.commands.native: true`) with matching slash commands registered in Slack

13161348

- or single slash command mode (`channels.slack.slashCommand.enabled: true`)

131713491318-

Also check `commands.useAccessGroups` and channel/user allowlists.

1350+

Slack does not create or remove slash commands automatically. `commands.native: "auto"` does not enable Slack native commands; use `true` and create the matching commands in the Slack app. In HTTP mode, every Slack slash command must include the Gateway URL. In Socket Mode, command payloads arrive over the websocket and Slack ignores `slash_commands[].url`.

1351+1352+

Also check `commands.useAccessGroups`, DM authorization, channel allowlists,

1353+

and per-channel `users` allowlists. Slack returns ephemeral errors for

1354+

blocked slash-command senders, including:

1355+1356+

- `This channel is not allowed.`

1357+

- `You are not authorized to use this command here.`

1319135813201359

</Accordion>

13211360

</AccordionGroup>