diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json index 2436dad33..521140dd4 100644 --- a/.openclaw-sync/source.json +++ b/.openclaw-sync/source.json @@ -1,5 +1,5 @@ { "repository": "openclaw/openclaw", - "sha": "557f4fc6894b5a160fd01c87ac9ff1f0c4ca949c", - "syncedAt": "2026-04-22T17:41:38.135Z" + "sha": "b5b03fbaee5725559c0f8aca669fb76ab0d5adeb", + "syncedAt": "2026-04-22T17:54:50.856Z" } diff --git a/docs/plugins/building-plugins.md b/docs/plugins/building-plugins.md index 3f2903c12..bf0929b3d 100644 --- a/docs/plugins/building-plugins.md +++ b/docs/plugins/building-plugins.md @@ -190,6 +190,8 @@ Hook guard semantics to keep in mind: - `before_install`: `{ block: false }` is treated as no decision. - `message_sending`: `{ cancel: true }` is terminal and stops lower-priority handlers. - `message_sending`: `{ cancel: false }` is treated as no decision. +- `message_received`: prefer the typed `threadId` field when you need inbound thread/topic routing. Keep `metadata` for channel-specific extras. +- `message_sending`: prefer typed `replyToId` / `threadId` routing fields over channel-specific metadata keys. The `/approve` command handles both exec and plugin approvals with bounded fallback: when an exec approval id is not found, OpenClaw retries the same id through plugin approvals. Plugin approval forwarding can be configured independently via `approvals.plugin` in config. diff --git a/docs/plugins/sdk-overview.md b/docs/plugins/sdk-overview.md index 54f036b4d..a49accf72 100644 --- a/docs/plugins/sdk-overview.md +++ b/docs/plugins/sdk-overview.md @@ -460,6 +460,8 @@ AI CLI backend such as `codex-cli`. - `reply_dispatch`: returning `{ handled: true, ... }` is terminal. Once any handler claims dispatch, lower-priority handlers and the default model dispatch path are skipped. - `message_sending`: returning `{ cancel: true }` is terminal. Once any handler sets it, lower-priority handlers are skipped. - `message_sending`: returning `{ cancel: false }` is treated as no decision (same as omitting `cancel`), not as an override. +- `message_received`: use the typed `threadId` field when you need inbound thread/topic routing. Keep `metadata` for channel-specific extras. +- `message_sending`: use typed `replyToId` / `threadId` routing fields before falling back to channel-specific `metadata`. ### API object fields