Concepts 导读
小纸条消息 lifecycle refactor:先把底下那条暗线看见
小纸条消息 lifecycle refactor 这页在补地图,不是在发操作说明。看完你应该能指出它埋在系统哪一层、为什么会牵动后面的动作,以及最容易把哪几件事想反。原文最响的一记鼓点,其实是:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, previ…。
先听这页的人话版
Message lifecycle refactor
这一页不是在堆术语,它像把“小纸条消息 lifecycle refactor”这台小机器搬到桌上,当着你的面拆开给你看。你先不用全记住,先抓住它到底在忙什么:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, preview 一边说一边…。
如果把这页当成“给普通人看的版本”,你最应该带走的是:它到底在教你一件什么事、什么时候要这样做、以及哪里最容易踩坑。
第 1 站
Start Here
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, preview 一边说一边送ing, and outbound deliv…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, preview 一边说一边送ing, and outbound deliv…。
This page is the target design for replacing scattered channel turn, reply dispatch, preview streaming, and outbound delivery helpers with one durable message lifecycle.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The short version:。
The short version:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:commit, fail.
commit, fail.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dispatch, platform ack, fail.
dispatch, platform ack, fail.
这一串条目别硬背,把它当成“Start Here”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:The core primitives should be **receive**…、A reply is only a relation on an outbound…、A turn is an inbound-processing convenien…、Sending must be context based: begin, ren…。
- The core primitives should be **receive** and **send**, not **reply**.
- A reply is only a relation on an outbound message.
- A turn is an inbound-processing convenience, not the owner of delivery.
- Sending must be context based:
begin, render, preview or stream, final send, - Receiving must be context based too: normalize, dedupe, route, record,
- The public plugin SDK should collapse to one small channel-message surface.
第 2 站
Problems
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The current 消息通道 stack grew from several valid local needs: recordInboundSessionAndDispatchReply, reply payload helpers…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The current 消息通道 stack grew from several valid local needs:。
The current channel stack grew from several valid local needs:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:recordInboundSessionAndDispatchReply, reply payload helpers, reply chunking, reply references, and outbound runtime hel…。
recordInboundSessionAndDispatchReply, reply payload helpers, reply chunking, reply references, and outbound runtime helpers.
这一串条目别硬背,把它当成“Problems”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Simple inbound adapters use runtime.消息通道.…、Rich adapters use runtime.消息通道.turn.runPr…、Legacy helpers use dispatchInboundReplyWi…、Preview 一边说一边送ing lives in 消息通道-specific…。
- Simple inbound adapters use
runtime.channel.turn.run. - Rich adapters use
runtime.channel.turn.runPrepared. - Legacy helpers use
dispatchInboundReplyWithBase, - Preview streaming lives in channel-specific dispatchers.
- Final delivery durability is being added around existing reply payload paths.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:That shape fixes local bugs, but it leaves OpenClaw with too many public concepts and too many places where delivery se…。
That shape fixes local bugs, but it leaves OpenClaw with too many public concepts and too many places where delivery semantics can drift.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The reliability issue that exposed this is:。
The reliability issue that exposed this is:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“Telegram polling update acked”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> assistant final text exists”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> process restarts before sendMessage succeeds”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
Telegram polling update acked
-> assistant final text exists
-> process restarts before sendMessage succeeds
-> final response is lost
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The target invariant is broader than Telegram: once core decides a visible outbound 小纸条消息 should exist, the intent must…。
The target invariant is broader than Telegram: once core decides a visible outbound message should exist, the intent must be durable before the platform send is attempted, and the platform receipt must be committed after success. That gives OpenClaw at-least-once recovery. Exactly-once behavior exists only for adapters that can prove native idempotency or reconcile an unknown-after-send attempt against platform state before replay.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:That is the end state for this refactor, not a description of every current path. During migration, existing outbound h…。
That is the end state for this refactor, not a description of every current path. During migration, existing outbound helpers can still fall through to a direct send when best-effort queue writes fail. The refactor is complete only when durable final sends fail closed or explicitly opt out with a documented non-durable policy.
第 3 站
Goals
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:declares replay-safe behavior. semantics. edit, append, or completed block delivery. 门口的小门卫 failures do not re-enter sh…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:declares replay-safe behavior.
declares replay-safe behavior.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:semantics.
semantics.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:edit, append, or completed block delivery.
edit, append, or completed block delivery.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:门口的小门卫 failures do not re-enter shared bot-enabled rooms as fresh prompts.
gateway failures do not re-enter shared bot-enabled rooms as fresh prompts.
这一串条目别硬背,把它当成“Goals”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:One core lifecycle for all 消息通道 小纸条消息 rec…、Durable final sends by default in the new…、Shared preview, edit, 一边说一边送, finalizatio…、A small 新本领插件 SDK surface that third-part…。
- One core lifecycle for all channel message receive and send paths.
- Durable final sends by default in the new message lifecycle after an adapter
- Shared preview, edit, stream, finalization, retry, recovery, and receipt
- A small plugin SDK surface that third-party plugins can learn and maintain.
- Compatibility for existing
channel.turncallers during migration. - Clear extension points for new channel capabilities.
- No platform-specific branches in core.
- No token-delta channel messages. Channel streaming remains message preview,
- Structured OpenClaw-origin metadata for operational/system output so visible
第 4 站
Non goals
这一节主要在解释“Non goals”到底是干什么的,以及你什么时候会遇到它。
这一节主要在解释“Non goals”到底是干什么的,以及你什么时候会遇到它。
如果你是第一次接触 OpenClaw,这一节最值得看的不是术语本身,而是它背后的使用场景和限制。
真正动手时,先看它有没有默认值、有没有必须打开的选项、以及会不会影响安全边界。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Feishu cards, QQ voice, or Teams activities.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Feishu cards, QQ voice, or Teams activities.
Feishu cards, QQ voice, or Teams activities.
这一串条目别硬背,把它当成“Non goals”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Do not remove runtime.消息通道.turn.* in the…、Do not force every 消息通道 into the same nat…、Do not teach core Telegram topics, Slack…、Do not publish all internal migration hel…。
- Do not remove
runtime.channel.turn.*in the first phase. - Do not force every channel into the same native transport behavior.
- Do not teach core Telegram topics, Slack native streams, Matrix redactions,
- Do not publish all internal migration helpers as stable SDK API.
- Do not make retries replay completed non-idempotent platform operations.
第 5 站
Reference 聪明脑袋模型
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Vercel Chat has a good public mental 聪明脑袋模型: 一边说一边送, startTyping, and history fetches OpenClaw should borrow the vocabu…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Vercel Chat has a good public mental 聪明脑袋模型:。
Vercel Chat has a good public mental model:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:一边说一边送, startTyping, and history fetches。
stream, startTyping, and history fetches
这一串条目别硬背,把它当成“Reference model”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Chat、Thread、消息通道、小纸条消息。
ChatThreadChannelMessage- adapter methods such as
postMessage,editMessage,deleteMessage, - a state adapter for dedupe, locks, queues, and persistence
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:OpenClaw should borrow the vocabulary, not copy the surface.
OpenClaw should borrow the vocabulary, not copy the surface.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:What OpenClaw needs beyond that 聪明脑袋模型:。
What OpenClaw needs beyond that model:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:duplicate suppression.
duplicate suppression.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:third-party 新本领插件s should see one coherent 小纸条消息 对话接口.
third-party plugins should see one coherent message API.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:progress, approvals, media directives, silent replies, and 大家一起的房间 mention history.
progress, approvals, media directives, silent replies, and group mention history.
这一串条目别硬背,把它当成“Reference model”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Durable outbound send intents before dire…、Explicit send contexts with begin, commit…、Receive contexts that know platform ack p…、Receipts that survive restart and can dri…。
- Durable outbound send intents before direct transport calls.
- Explicit send contexts with begin, commit, and fail.
- Receive contexts that know platform ack policy.
- Receipts that survive restart and can drive edits, deletes, recovery, and
- A smaller public SDK. Bundled plugins can use internal runtime helpers, but
- Agent-specific behavior: sessions, transcripts, block streaming, tool
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:thread.post() style promises are not enough for OpenClaw. They hide the transaction boundary that decides whether a sen…。
thread.post() style promises are not enough for OpenClaw. They hide the transaction boundary that decides whether a send is recoverable.
第 6 站
Core 聪明脑袋模型
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new domain should live under an internal core namespace such as src/消息通道s/小纸条消息/*. It has four concepts: receive ow…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new domain should live under an internal core namespace such as src/消息通道s/小纸条消息/*.
The new domain should live under an internal core namespace such as src/channels/message/*.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:It has four concepts:。
It has four concepts:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“core.messages.receive(...)”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“core.messages.send(...)”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“core.messages.live(...)”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
core.messages.receive(...)
core.messages.send(...)
core.messages.live(...)
core.messages.state(...)
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:receive owns inbound lifecycle.
receive owns inbound lifecycle.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:send owns outbound lifecycle.
send owns outbound lifecycle.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:live owns preview, edit, progress, and 一边说一边送 state.
live owns preview, edit, progress, and stream state.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:state owns durable intent storage, receipts, idempotency, recovery, locks, and dedupe.
state owns durable intent storage, receipts, idempotency, recovery, locks, and dedupe.
第 7 站
小纸条消息
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:A normalized 小纸条消息 is platform-neutral:。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:A normalized 小纸条消息 is platform-neutral:。
A normalized message is platform-neutral:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type ChannelMessage = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“id”挂牌子,告诉系统它该指向“string;”。
- 这里在给“channel”挂牌子,告诉系统它该指向“string;”。
type ChannelMessage = {
id: string;
channel: string;
accountId?: string;
direction: "inbound" | "outbound";
target: MessageTarget;
sender?: MessageActor;
body?: MessageBody;
attachments?: MessageAttachment[];
relation?: MessageRelation;
origin?: MessageOrigin;
timestamp?: number;
raw?: unknown;
};
第 8 站
Target
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The target describes where the 小纸条消息 lives:。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The target describes where the 小纸条消息 lives:。
The target describes where the message lives:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageTarget = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“kind”挂牌子,告诉系统它该指向“direct | group | channel | thread;”。
- 这里在给“id”挂牌子,告诉系统它该指向“string;”。
type MessageTarget = {
kind: "direct" | "group" | "channel" | "thread";
id: string;
label?: string;
spaceId?: string;
parentId?: string;
threadId?: string;
nativeChannelId?: string;
};
第 9 站
Relation
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Reply is a relation, not an 对话接口 root: This lets the same send path handle normal replies, cron notifications, approval…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Reply is a relation, not an 对话接口 root:。
Reply is a relation, not an API root:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageRelation =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“| {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“kind”挂牌子,告诉系统它该指向“reply;”。
type MessageRelation =
| {
kind: "reply";
inboundMessageId?: string;
replyToId?: string;
threadId?: string;
quote?: MessageQuote;
}
| {
kind: "followup";
sessionKey?: string;
previousMessageId?: string;
}
| {
kind: "broadcast";
reason?: string;
}
| {
kind: "system";
reason:
| "approval"
| "task"
| "hook"
| "cron"
| "subagent"
| "message_tool"
| "cli"
| "control_ui"
| "automation"
| "error";
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This lets the same send path handle normal replies, cron notifications, approval prompts, task completions, 小纸条消息-工具小帮手…。
This lets the same send path handle normal replies, cron notifications, approval prompts, task completions, message-tool sends, CLI or Control UI sends, subagent results, and automation sends.
第 10 站
Origin
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Origin describes who produced a 小纸条消息 and how OpenClaw should treat echoes of that 小纸条消息. It is separate from relation:…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Origin describes who produced a 小纸条消息 and how OpenClaw should treat echoes of that 小纸条消息. It is separate from relation:…。
Origin describes who produced a message and how OpenClaw should treat echoes of that message. It is separate from relation: a message can be a reply to a user and still be OpenClaw-originated operational output.
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageOrigin =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“| {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“source”挂牌子,告诉系统它该指向“openclaw;”。
type MessageOrigin =
| {
source: "openclaw";
schemaVersion: 1;
kind: "gateway_failure";
code: "agent_failed_before_reply" | "missing_api_key" | "model_login_expired";
echoPolicy: "drop_bot_room_echo";
}
| {
source: "user" | "external_bot" | "platform" | "unknown";
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Core owns the meaning of OpenClaw-originated output. 消息通道s own how that origin is encoded into their transport.
Core owns the meaning of OpenClaw-originated output. Channels own how that origin is encoded into their transport.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The first required use is 门口的小门卫 failure output. Humans should still see 小纸条消息s such as "机器人朋友 failed before reply" or…。
The first required use is gateway failure output. Humans should still see messages such as "Agent failed before reply" or "Missing API key", but tagged OpenClaw operational output must not be accepted as bot-authored input in shared rooms when allowBots is enabled.
第 11 站
Receipt
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receipts are first-class: Receipts are the bridge from durable intent to future edit, delete, preview finalization, dup…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receipts are first-class:。
Receipts are first-class:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageReceipt = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“primaryPlatformMessageId?”挂牌子,告诉系统它该指向“string;”。
- 这里在给“platformMessageIds”挂牌子,告诉系统它该指向“string[];”。
type MessageReceipt = {
primaryPlatformMessageId?: string;
platformMessageIds: string[];
parts: MessageReceiptPart[];
threadId?: string;
replyToId?: string;
editToken?: string;
deleteToken?: string;
url?: string;
sentAt: number;
raw?: unknown;
};
type MessageReceiptPart = {
platformMessageId: string;
kind: "text" | "media" | "voice" | "card" | "preview" | "unknown";
index: number;
threadId?: string;
replyToId?: string;
editToken?: string;
deleteToken?: string;
url?: string;
raw?: unknown;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receipts are the bridge from durable intent to future edit, delete, preview finalization, duplicate suppression, and re…。
Receipts are the bridge from durable intent to future edit, delete, preview finalization, duplicate suppression, and recovery.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:A receipt can describe one platform 小纸条消息 or a multi-part delivery. Chunked text, media plus text, voice plus text, and…。
A receipt can describe one platform message or a multi-part delivery. Chunked text, media plus text, voice plus text, and card fallbacks must preserve all platform ids while still exposing a primary id for threading and later edits.
第 12 站
Receive context
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receiving should not be a bare helper call. The core needs a context that knows dedupe, routing, session recording, and…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receiving should not be a bare helper call. The core needs a context that knows dedupe, routing, session recording, and…。
Receiving should not be a bare helper call. The core needs a context that knows dedupe, routing, session recording, and platform ack policy.
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageReceiveContext = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“id”挂牌子,告诉系统它该指向“string;”。
- 这里在给“channel”挂牌子,告诉系统它该指向“string;”。
type MessageReceiveContext = {
id: string;
channel: string;
accountId?: string;
input: ChannelMessage;
ack: ReceiveAckController;
route: MessageRouteController;
session: MessageSessionController;
log: MessageLifecycleLogger;
dedupe(): Promise
ReceiveDedupeResult
;
resolve(): Promise
ResolvedInboundMessage
;
record(resolved: ResolvedInboundMessage): Promise
RecordResult
;
dispatch(recorded: RecordResult): Promise
DispatchResult
;
commit(result: DispatchResult): Promise<void>;
fail(error: unknown): Promise<void>;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receive flow:。
Receive flow:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“platform event”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> begin receive context”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> normalize”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
platform event
-> begin receive context
-> normalize
-> classify
-> dedupe and self-echo gate
-> route and authorize
-> record inbound session metadata
-> dispatch agent run
-> durable outbound sends happen through send context
-> commit receive
-> ack platform when policy allows
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Ack is not one thing. The receive contract must keep these signals separate:。
Ack is not one thing. The receive contract must keep these signals separate:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the event envelope. Some platforms require this before dispatch.
the event envelope. Some platforms require this before dispatch.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:again. This must not advance past work that cannot be recovered.
again. This must not advance past work that cannot be recovered.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dedupe and route a redelivery.
dedupe and route a redelivery.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:durability boundary.
durability boundary.
这一串条目别硬背,把它当成“Receive context”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:**Transport ack:** tells the platform 小铃铛…、**Polling offset ack:** advances a cursor…、**Inbound record ack:** confirms OpenClaw…、**User-visible receipt:** optional read/s…。
- **Transport ack:** tells the platform webhook or socket that OpenClaw accepted
- **Polling offset ack:** advances a cursor so the same event is not fetched
- **Inbound record ack:** confirms OpenClaw persisted enough inbound metadata to
- **User-visible receipt:** optional read/status/typing behavior; never a
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:ReceiveAckPolicy controls transport or polling acknowledgement only. It must not be reused for read receipts or status…。
ReceiveAckPolicy controls transport or polling acknowledgement only. It must not be reused for read receipts or status reactions.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Before bot authorization, receive must apply the shared OpenClaw echo policy when the 消息通道 can decode 小纸条消息 origin meta…。
Before bot authorization, receive must apply the shared OpenClaw echo policy when the channel can decode message origin metadata:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这里在给“function shouldDropOpenClawEcho(params”挂牌子,告诉系统它该指向“{”。
- 这里在给“origin?”挂牌子,告诉系统它该指向“MessageOrigin;”。
- 这里在给“isBotAuthor”挂牌子,告诉系统它该指向“boolean;”。
function shouldDropOpenClawEcho(params: {
origin?: MessageOrigin;
isBotAuthor: boolean;
isRoomish: boolean;
}): boolean {
return (
params.isBotAuthor &&
params.isRoomish &&
params.origin?.source === "openclaw" &&
params.origin.kind === "gateway_failure" &&
params.origin.echoPolicy === "drop_bot_room_echo"
);
}
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This drop is tag-based, not text-based. A bot-authored room 小纸条消息 with the same visible 门口的小门卫-failure text but without…。
This drop is tag-based, not text-based. A bot-authored room message with the same visible gateway-failure text but without OpenClaw origin metadata still goes through normal allowBots authorization.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Ack policy is explicit:。
Ack policy is explicit:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type ReceiveAckPolicy =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“| { kind”挂牌子,告诉系统它该指向“immediate; reason: webhook-timeout | platform-contract }”。
- 这里在给“| { kind”挂牌子,告诉系统它该指向“after-record }”。
type ReceiveAckPolicy =
| { kind: "immediate"; reason: "webhook-timeout" | "platform-contract" }
| { kind: "after-record" }
| { kind: "after-durable-send" }
| { kind: "manual" };
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Telegram polling now uses the receive-context ack policy for its persisted restart watermark. The tracker still observe…。
Telegram polling now uses the receive-context ack policy for its persisted restart watermark. The tracker still observes grammY updates as they enter the middleware chain, but OpenClaw persists only the safe completed update id after successful dispatch, leaving failed or lower pending updates replayable after a restart. Telegram's upstream getUpdates fetch offset is still controlled by the polling library, so the remaining deeper cut is a fully durable polling source if we need platform-level redelivery beyond OpenClaw's restart watermark. Webhook platforms may need immediate HTTP ack, but they still need inbound dedupe and durable outbound send intents because webhooks can redeliver.
第 13 站
Send context
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Sending is also context based: Preferred orchestration: The helper expands to: The intent must exist before transport I…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Sending is also context based:。
Sending is also context based:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageSendContext = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“id”挂牌子,告诉系统它该指向“string;”。
- 这里在给“channel”挂牌子,告诉系统它该指向“string;”。
type MessageSendContext = {
id: string;
channel: string;
accountId?: string;
message: ChannelMessage;
intent: DurableSendIntent;
attempt: number;
signal: AbortSignal;
previousReceipt?: MessageReceipt;
preview?: LiveMessageState;
log: MessageLifecycleLogger;
render(): Promise
RenderedMessageBatch
;
previewUpdate(rendered: RenderedMessageBatch): Promise
LiveMessageState
;
send(rendered: RenderedMessageBatch): Promise
MessageReceipt
;
edit(receipt: MessageReceipt, rendered: RenderedMessageBatch): Promise
MessageReceipt
;
delete(receipt: MessageReceipt): Promise<void>;
commit(receipt: MessageReceipt): Promise<void>;
fail(error: unknown): Promise<void>;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Preferred orchestration:。
Preferred orchestration:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“await core.messages.withSendContext(message, async (ctx) => {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“const rendered = await ctx.render();”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“if (ctx.preview?.canFinalizeInPlace) {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
await core.messages.withSendContext(message, async (ctx) => {
const rendered = await ctx.render();
if (ctx.preview?.canFinalizeInPlace) {
return await ctx.edit(ctx.preview.receipt, rendered);
}
return await ctx.send(rendered);
});
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The helper expands to:。
The helper expands to:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“begin durable intent”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> render”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> optional preview/edit/stream work”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
begin durable intent
-> render
-> optional preview/edit/stream work
-> mark sending
-> final platform send or final edit
-> mark committing with raw receipt
-> commit receipt
-> ack durable intent
-> fail durable intent on classified failure
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The intent must exist before transport I/O. A restart after begin but before commit is recoverable.
The intent must exist before transport I/O. A restart after begin but before commit is recoverable.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The dangerous boundary is after platform success and before receipt commit. If a process dies there, OpenClaw cannot kn…。
The dangerous boundary is after platform success and before receipt commit. If a process dies there, OpenClaw cannot know whether the platform message exists unless the adapter provides native idempotency or a receipt reconciliation path. Those attempts must resume in unknown_after_send, not blindly replay. Channels without reconciliation may choose at-least-once replay only if duplicate visible messages are an acceptable, documented tradeoff for that channel and relation. The current SDK reconciliation bridge requires the adapter to declare reconcileUnknownSend, then asks durableFinal.reconcileUnknownSend to classify an unknown entry as sent, not_sent, or unresolved; only not_sent permits replay, and unresolved entries stay terminal or retry only the reconciliation check.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Durability policy must be explicit:。
Durability policy must be explicit:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageDurabilityPolicy = "required" | "best_effort" | "disabled";”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
type MessageDurabilityPolicy = "required" | "best_effort" | "disabled";
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:required means core must fail closed when it cannot write the durable intent. best_effort can fall through when persist…。
required means core must fail closed when it cannot write the durable intent. best_effort can fall through when persistence is unavailable. disabled keeps the old direct send behavior. During migration, legacy wrappers and public compatibility helpers default to disabled; they must not infer required from the fact that a channel has a generic outbound adapter.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Send contexts also own 消息通道-local post-send effects. A migration is not safe if durable delivery bypasses local behavio…。
Send contexts also own channel-local post-send effects. A migration is not safe if durable delivery bypasses local behavior that was previously attached to the channel's direct send path. Examples include self-echo suppression caches, thread participation markers, native edit anchors, model-signature rendering, and platform-specific duplicate guards. Those effects must either move into the send adapter, the render adapter, or a named send-context hook before that channel can enable durable generic final delivery.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Send helpers must return receipts all the way back to their caller. Durable wrappers cannot swallow 小纸条消息 ids or replac…。
Send helpers must return receipts all the way back to their caller. Durable wrappers cannot swallow message ids or replace a channel delivery result with undefined; buffered dispatchers use those ids for thread anchors, later edits, preview finalization, and duplicate suppression.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Fallback sends operate on batches, not single payloads. Silent-reply rewrites, media fallback, card fallback, and chunk…。
Fallback sends operate on batches, not single payloads. Silent-reply rewrites, media fallback, card fallback, and chunk projection can all produce more than one deliverable message, so a send context must either deliver the whole projected batch or explicitly document why only one payload is valid.
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type RenderedMessageBatch = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“units”挂牌子,告诉系统它该指向“RenderedMessageUnit[];”。
- 这里在给“atomicity”挂牌子,告诉系统它该指向“all_or_retry_remaining | best_effort_parts;”。
type RenderedMessageBatch = {
units: RenderedMessageUnit[];
atomicity: "all_or_retry_remaining" | "best_effort_parts";
idempotencyKey: string;
};
type RenderedMessageUnit = {
index: number;
kind: "text" | "media" | "voice" | "card" | "preview" | "unknown";
payload: unknown;
required: boolean;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:When such a fallback is durable, the whole projected batch must be represented by one durable send intent or another at…。
When such a fallback is durable, the whole projected batch must be represented by one durable send intent or another atomic batch plan. Recording each payload one-by-one is not enough: a crash between payloads can leave a partial visible fallback with no durable record for the remaining payloads. Recovery must know which units already have receipts and either replay only missing units or mark the batch unknown_after_send until the adapter reconciles it.
第 14 站
Live context
这一节主要在解释“Live context”到底是干什么的,以及你什么时候会遇到它。
这一节主要在解释“Live context”到底是干什么的,以及你什么时候会遇到它。
如果你是第一次接触 OpenClaw,这一节最值得看的不是术语本身,而是它背后的使用场景和限制。
真正动手时,先看它有没有默认值、有没有必须打开的选项、以及会不会影响安全边界。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Preview, edit, progress, and 一边说一边送 behavior should be one opt-in lifecycle. Live state is durable enough to recover or…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Preview, edit, progress, and 一边说一边送 behavior should be one opt-in lifecycle.
Preview, edit, progress, and stream behavior should be one opt-in lifecycle.
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageLiveAdapter = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“begin?(ctx”挂牌子,告诉系统它该指向“MessageSendContext): Promise”。
- 这一行“LiveMessageState”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
type MessageLiveAdapter = {
begin?(ctx: MessageSendContext): Promise
LiveMessageState
;
update?(
ctx: MessageSendContext,
state: LiveMessageState,
update: LiveMessageUpdate,
): Promise
LiveMessageState
;
finalize?(
ctx: MessageSendContext,
state: LiveMessageState,
final: RenderedMessageBatch,
): Promise
MessageReceipt
;
cancel?(
ctx: MessageSendContext,
state: LiveMessageState,
reason: LiveCancelReason,
): Promise<void>;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Live state is durable enough to recover or suppress duplicates:。
Live state is durable enough to recover or suppress duplicates:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type LiveMessageState = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“mode”挂牌子,告诉系统它该指向“partial | block | progress | native;”。
- 这里在给“receipt?”挂牌子,告诉系统它该指向“MessageReceipt;”。
type LiveMessageState = {
mode: "partial" | "block" | "progress" | "native";
receipt?: MessageReceipt;
visibleSince?: number;
canFinalizeInPlace: boolean;
lastRenderedHash?: string;
staleAfterMs?: number;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This should cover current behavior:。
This should cover current behavior:
这一串条目别硬背,把它当成“Live context”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Telegram send plus edit preview, with fre…、Discord send plus edit preview, cancel on…、Slack native 一边说一边送 or draft preview depe…、Mattermost draft post finalization.
- Telegram send plus edit preview, with fresh final after stale preview age.
- Discord send plus edit preview, cancel on media/error/explicit reply.
- Slack native stream or draft preview depending on thread shape.
- Mattermost draft post finalization.
- Matrix draft event finalization or redaction on mismatch.
- Teams native progress stream.
- QQ Bot stream or accumulated fallback.
第 15 站
Adapter surface
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The public SDK target should be one subpath: Target shape: Send adapter: Receive adapter: Before preflight authorizatio…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The public SDK target should be one subpath:。
The public SDK target should be one subpath:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Target shape:。
Target shape:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type ChannelMessageAdapter = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“receive?”挂牌子,告诉系统它该指向“MessageReceiveAdapter;”。
- 这里在给“send”挂牌子,告诉系统它该指向“MessageSendAdapter;”。
type ChannelMessageAdapter = {
receive?: MessageReceiveAdapter;
send: MessageSendAdapter;
live?: MessageLiveAdapter;
origin?: MessageOriginAdapter;
render?: MessageRenderAdapter;
capabilities: MessageCapabilities;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Send adapter:。
Send adapter:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageSendAdapter = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“send(ctx”挂牌子,告诉系统它该指向“MessageSendContext rendered: RenderedMessageBatch): Promise”。
- 这一行“MessageReceipt”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
type MessageSendAdapter = {
send(ctx: MessageSendContext, rendered: RenderedMessageBatch): Promise
MessageReceipt
;
edit?(
ctx: MessageSendContext,
receipt: MessageReceipt,
rendered: RenderedMessageBatch,
): Promise
MessageReceipt
;
delete?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
classifyError?(ctx: MessageSendContext, error: unknown): DeliveryFailureKind;
reconcileUnknownSend?(ctx: MessageSendContext): Promise
MessageReceipt
;
afterSendSuccess?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
afterCommit?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receive adapter:。
Receive adapter:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageReceiveAdapter”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“TRaw”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“= {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
type MessageReceiveAdapter
TRaw
= {
normalize(raw: TRaw, ctx: MessageNormalizeContext): Promise
ChannelMessage
;
classify?(message: ChannelMessage): Promise
MessageEventClass
;
preflight?(message: ChannelMessage, event: MessageEventClass): Promise
MessagePreflightResult
;
ackPolicy?(message: ChannelMessage, event: MessageEventClass): ReceiveAckPolicy;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Before preflight authorization, core must run the shared OpenClaw echo predicate whenever origin.decode returns OpenCla…。
Before preflight authorization, core must run the shared OpenClaw echo predicate whenever origin.decode returns OpenClaw-origin metadata. The receive adapter supplies platform facts such as bot author and room shape; core owns the drop decision and ordering so channels do not reimplement text filters.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Origin adapter:。
Origin adapter:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageOriginAdapter”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“TRaw”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“= {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
type MessageOriginAdapter
TRaw
= {
encode?(origin: MessageOrigin): TNative | undefined;
decode?(raw: TRaw): MessageOrigin | undefined;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Core sets 小纸条消息Origin. 消息通道s only translate it to and from native transport metadata. Slack maps this to chat.post小纸条消息…。
Core sets MessageOrigin. Channels only translate it to and from native transport metadata. Slack maps this to chat.postMessage({ metadata }) and inbound message.metadata; Matrix can map it to extra event content; channels without native metadata can use a receipt/outbound registry when that is the best available approximation.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Capabilities:。
Capabilities:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type MessageCapabilities = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“text”挂牌子,告诉系统它该指向“{ maxLength?: number; chunking?: boolean };”。
- 这里在给“attachments?”挂牌子,告诉系统它该指向“{”。
type MessageCapabilities = {
text: { maxLength?: number; chunking?: boolean };
attachments?: {
upload: boolean;
remoteUrl: boolean;
voice?: boolean;
};
threads?: {
reply: boolean;
topic?: boolean;
nativeThread?: boolean;
};
live?: {
edit: boolean;
delete: boolean;
nativeStream?: boolean;
progress?: boolean;
};
delivery?: {
idempotencyKey?: boolean;
retryAfter?: boolean;
receiptRequired?: boolean;
};
};
第 16 站
Public SDK reduction
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new public surface should absorb or deprecate these conceptual areas: Compatibility subpaths can remain as wrappers…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new public surface should absorb or deprecate these conceptual areas:。
The new public surface should absorb or deprecate these conceptual areas:
这一串条目别硬背,把它当成“Public SDK reduction”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:reply-runtime、reply-dispatch-runtime、reply-reference、reply-chunking。
reply-runtimereply-dispatch-runtimereply-referencereply-chunkingreply-payloadinbound-reply-dispatchchannel-reply-pipeline- most public uses of
outbound-runtime - ad hoc draft stream lifecycle helpers
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Compatibility subpaths can remain as wrappers, but new third-party 新本领插件s should not need them.
Compatibility subpaths can remain as wrappers, but new third-party plugins should not need them.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Bundled 新本领插件s may keep internal helper imports through reserved runtime subpaths while migrating. Public docs should s…。
Bundled plugins may keep internal helper imports through reserved runtime subpaths while migrating. Public docs should steer plugin authors to plugin-sdk/channel-message once it exists.
第 17 站
Relationship to 消息通道 turn
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:runtime.消息通道.turn.* should stay during migration. It should become a compatibility adapter: 消息通道.turn.runPrepared shoul…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:runtime.消息通道.turn.* should stay during migration.
runtime.channel.turn.* should stay during migration.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:It should become a compatibility adapter:。
It should become a compatibility adapter:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“channel.turn.run”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> messages.receive context”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> session dispatch”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
channel.turn.run
-> messages.receive context
-> session dispatch
-> messages.send context for visible output
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道.turn.runPrepared should also remain initially:。
channel.turn.runPrepared should also remain initially:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“channel-owned dispatcher”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> messages.receive record/finalize bridge”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> messages.live for preview/progress”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
channel-owned dispatcher
-> messages.receive record/finalize bridge
-> messages.live for preview/progress
-> messages.send for final delivery
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:After all bundled 新本领插件s and known third-party compatibility paths are bridged, 消息通道.turn can be deprecated. It should…。
After all bundled plugins and known third-party compatibility paths are bridged, channel.turn can be deprecated. It should not be removed until there is a published SDK migration path and contract tests proving old plugins still work or fail with a clear version error.
第 18 站
Compatibility guardrails
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:During migration, generic durable delivery is opt-in for any 消息通道 whose existing delivery callback has side effects bey…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:During migration, generic durable delivery is opt-in for any 消息通道 whose existing delivery callback has side effects bey…。
During migration, generic durable delivery is opt-in for any channel whose existing delivery callback has side effects beyond "send this payload".
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Legacy entry points are non-durable by default:。
Legacy entry points are non-durable by default:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:delivery callback unless that 消息通道 explicitly supplies an audited durable policy/options object.
delivery callback unless that channel explicitly supplies an audited durable policy/options object.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:explicitly calls the send context.
explicitly calls the send context.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dispatchInboundReplyWithBase, and direct-DM helpers never inject generic durable delivery before the caller-provided de…。
dispatchInboundReplyWithBase, and direct-DM helpers never inject generic durable delivery before the caller-provided deliver or reply callback.
这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:消息通道.turn.run and dispatchAssembled消息通道Tu…、消息通道.turn.runPrepared stays 消息通道-owned un…、Public compatibility helpers such as reco…。
channel.turn.runanddispatchAssembledChannelTurnuse the channel'schannel.turn.runPreparedstays channel-owned until the prepared dispatcher- Public compatibility helpers such as
recordInboundSessionAndDispatchReply,
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:For migration bridge types, durable: undefined means "not durable". The durable path is enabled only by an explicit pol…。
For migration bridge types, durable: undefined means "not durable". The durable path is enabled only by an explicit policy/options value. durable: false can remain as a compatibility spelling, but implementation should not require every unmigrated channel to add it.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Current bridge code must keep the durability decision explicit:。
Current bridge code must keep the durability decision explicit:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:handled_no_send are terminal; unsupported and not_applicable may fall back to 消息通道-owned delivery; failed propagates th…。
handled_no_send are terminal; unsupported and not_applicable may fall back to channel-owned delivery; failed propagates the send failure.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:silent delivery, reply target preservation, native quote preservation, and 小纸条消息-sending hooks. Missing parity should c…。
silent delivery, reply target preservation, native quote preservation, and message-sending hooks. Missing parity should choose channel-owned delivery, not a generic send that changes user-visible behavior.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:pendingFinalDelivery* session fields can carry the intent id during the transition; the end state is a 小纸条消息SendIntent…。
pendingFinalDelivery* session fields can carry the intent id during the transition; the end state is a MessageSendIntent store instead of frozen reply text plus ad hoc context fields.
这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Durable final delivery returns a discrimi…、Generic durable final delivery is gated b…、Queue-backed durable sends expose a deliv…。
- Durable final delivery returns a discriminated status.
handled_visibleand - Generic durable final delivery is gated by adapter capabilities such as
- Queue-backed durable sends expose a delivery intent reference. Existing
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Do not enable the generic durable path for a 消息通道 until all of these are true:。
Do not enable the generic durable path for a channel until all of these are true:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the old direct path.
the old direct path.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:ids.
ids.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:as outside the durable guarantee.
as outside the durable guarantee.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:replayable intent or batch plan.
replayable intent or batch plan.
这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:The generic send adapter executes the sam…、Local post-send side effects are preserve…、The adapter returns receipts or delivery…、Prepared dispatcher paths either call the…。
- The generic send adapter executes the same rendering and transport behavior as
- Local post-send side effects are preserved through the send context.
- The adapter returns receipts or delivery results with all platform message
- Prepared dispatcher paths either call the new send context or stay documented
- Fallback delivery handles every projected payload, not only the first one.
- Durable fallback delivery records the whole projected payload array as one
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Concrete migration hazards to preserve:。
Concrete migration hazards to preserve:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:successful send. Durable final sends must still populate that cache, otherwise OpenClaw can re-ingest its own final rep…。
successful send. Durable final sends must still populate that cache, otherwise OpenClaw can re-ingest its own final replies as inbound user messages.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:after 大家一起的房间 replies. Generic durable delivery must not bypass those effects; either move them into Tlon render/send/f…。
after group replies. Generic durable delivery must not bypass those effects; either move them into Tlon render/send/finalize adapters or keep Tlon on the channel-owned path.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:behavior. They are not covered by an assembled-turn durable guarantee until their prepared dispatchers explicitly route…。
behavior. They are not covered by an assembled-turn durable guarantee until their prepared dispatchers explicitly route finals through the send context.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:array. A single-payload shortcut can drop additional fallback payloads after projection.
array. A single-payload shortcut can drop additional fallback payloads after projection.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:have reply-token handling, media proxying, sent-小纸条消息 caches, loading/status cleanup, or callback-only targets. They st…。
have reply-token handling, media proxying, sent-message caches, loading/status cleanup, or callback-only targets. They stay on channel-owned delivery until those semantics are represented by the send adapter and verified by tests.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:target. Generic outbound must not guess from OriginatingTo or To and skip that callback.
target. Generic outbound must not guess from OriginatingTo or To and skip that callback.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:bot-authored room echoes must be dropped before allowBots authorization. 消息通道s must not implement this with visible-tex…。
bot-authored room echoes must be dropped before allowBots authorization. Channels must not implement this with visible-text prefix filters except as a short emergency stopgap; the durable contract is structured origin metadata.
这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:i小纸条消息 monitor delivery records sent 小纸条消…、Tlon appends an optional 聪明脑袋模型 signature…、Discord and other prepared dispatchers al…、Telegram silent fallback delivery must de…。
- iMessage monitor delivery records sent messages in an echo cache after a
- Tlon appends an optional model signature and records participated threads
- Discord and other prepared dispatchers already own direct delivery and preview
- Telegram silent fallback delivery must deliver the full projected payload
- LINE, Zalo, Nostr, and other existing assembled/helper paths may
- Direct-DM helpers can have a reply callback that is the only correct transport
- OpenClaw gateway failure output must stay visible to humans, but tagged
第 19 站
Internal storage
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The durable queue should store 小纸条消息 send intents, not reply payloads. Recovery loop: The queue should keep enough iden…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The durable queue should store 小纸条消息 send intents, not reply payloads.
The durable queue should store message send intents, not reply payloads.
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type DurableSendIntent = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这里在给“id”挂牌子,告诉系统它该指向“string;”。
- 这里在给“idempotencyKey”挂牌子,告诉系统它该指向“string;”。
type DurableSendIntent = {
id: string;
idempotencyKey: string;
channel: string;
accountId?: string;
message: ChannelMessage;
batch?: RenderedMessageBatch;
liveState?: LiveMessageState;
status:
| "pending"
| "sending"
| "committing"
| "unknown_after_send"
| "sent"
| "failed"
| "cancelled";
attempt: number;
nextAttemptAt?: number;
receipt?: MessageReceipt;
partialReceipt?: MessageReceipt;
failure?: DeliveryFailure;
createdAt: number;
updatedAt: number;
};
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Recovery loop:。
Recovery loop:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“load pending or sending intents”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> acquire idempotency lock”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“-> skip if receipt already committed”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
load pending or sending intents
-> acquire idempotency lock
-> skip if receipt already committed
-> reconstruct send context
-> render if needed
-> reconcile unknown_after_send if needed
-> call adapter send/edit/finalize
-> commit receipt, mark unknown_after_send, or schedule retry
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The queue should keep enough identity to replay through the same account, thread, target, formatting policy, and media…。
The queue should keep enough identity to replay through the same account, thread, target, formatting policy, and media rules after restart.
第 20 站
Failure classes
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道 adapters classify transport failures into closed categories: Core policy: the 消息通道 declares that safe. already exi…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道 adapters classify transport failures into closed categories:。
Channel adapters classify transport failures into closed categories:
这段像放在桌上的操作卡,谁来照着做,现场就会动起来。
- 这一行“type DeliveryFailureKind =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“| "transient"”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
- 这一行“| "rate_limit"”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
type DeliveryFailureKind =
| "transient"
| "rate_limit"
| "auth"
| "permission"
| "not_found"
| "invalid_payload"
| "conflict"
| "cancelled"
| "unknown";
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Core policy:。
Core policy:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the 消息通道 declares that safe.
the channel declares that safe.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:already exists.
already exists.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:commit becomes unknown_after_send unless the adapter can prove the platform operation did not happen.
commit becomes unknown_after_send unless the adapter can prove the platform operation did not happen.
这一串条目别硬背,把它当成“Failure classes”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Retry transient and rate_limit.、Do not retry invalid_payload unless a ren…、Do not retry auth or permission until 设置说…、For not_found, let live finalization fall…。
- Retry
transientandrate_limit. - Do not retry
invalid_payloadunless a render fallback exists. - Do not retry
authorpermissionuntil configuration changes. - For
not_found, let live finalization fall back from edit to fresh send when - For
conflict, use receipt/idempotency rules to decide whether the message - Any error after the adapter may have completed platform I/O but before receipt
第 21 站
消息通道 mapping
这一节主要在解释“消息通道 mapping”到底是干什么的,以及你什么时候会遇到它。
这一节主要在解释“消息通道 mapping”到底是干什么的,以及你什么时候会遇到它。
如果你是第一次接触 OpenClaw,这一节最值得看的不是术语本身,而是它背后的使用场景和限制。
真正动手时,先看它有没有默认值、有没有必须打开的选项、以及会不会影响安全边界。
这一小段像旁白,在提醒我们镜头已经切到下一站。
这段是在把几种选项排成表格,左边像标签,右边像说明。手机上可以横向滑动原文表格。
| Channel | Target migration |
|---|---|
| Telegram | Receive ack policy plus durable final sends. Live adapter owns send plus edit preview, stale preview final send, topics, quote-reply preview skip, media fallback, and retry-after handling. |
| Discord | Send adapter wraps existing durable payload delivery. Live adapter owns draft edit, progress draft, media/error preview cancel, reply target preservation, and message id receipts. Audit bot-authored gateway-failure echoes in shared rooms; use an outbound registry or other native equivalent if Discord cannot carry origin metadata on normal messages. |
| Slack | Send adapter handles normal chat posts. Live adapter chooses native stream when thread shape supports it, otherwise draft preview. Receipts preserve thread timestamps. Origin adapter maps OpenClaw gateway failures to Slack chat.postMessage.metadata and drops tagged bot-room echoes before allowBots authorization. |
| Send adapter owns text/media send with durable final intents. Receive adapter handles group mention and sender identity. Live can stay absent until WhatsApp has an editable transport. | |
| Matrix | Live adapter owns draft event edits, finalization, redaction, encrypted media constraints, and reply-target mismatch fallback. Receive adapter owns encrypted event hydration and dedupe. Origin adapter should encode OpenClaw gateway-failure origin into Matrix event content and drop configured-bot room echoes before allowBots handling. |
| Mattermost | Live adapter owns one draft post, progress/tool folding, finalization in place, and fresh-send fallback. |
| Microsoft Teams | Live adapter owns native progress and block stream behavior. Send adapter owns activities and attachment/card receipts. |
| Feishu | Render adapter owns text/card/raw rendering. Live adapter owns streaming cards and duplicate final suppression. Send adapter owns comments, topic sessions, media, and voice suppression. |
| QQ Bot | Live adapter owns C2C streaming, accumulator timeout, and fallback final send. Render adapter owns media tags and text-as-voice. |
| Signal | Simple receive plus send adapter. No live adapter unless signal-cli adds reliable edit support. |
| iMessage | Simple receive plus send adapter. iMessage send must preserve monitor echo-cache population before durable finals can bypass monitor delivery. |
| Google Chat | Simple receive plus send adapter with thread relation mapped to spaces and thread ids. Audit allowBots=true room behavior for tagged OpenClaw gateway-failure echoes. |
| LINE | Simple receive plus send adapter with reply-token constraints modeled as target/relation capability. |
| Nextcloud Talk | SDK receive bridge plus send adapter. |
| IRC | Simple receive plus send adapter, no durable edit receipts. |
| Nostr | Receive plus send adapter for encrypted DMs; receipts are event ids. |
| QA Channel | Contract-test adapter for receive, send, live, retry, and recovery behavior. |
| Synology Chat | Simple receive plus send adapter. |
| Tlon | Send adapter must preserve model-signature rendering and participated-thread tracking before generic durable final delivery is enabled. |
| Twitch | Simple receive plus send adapter with rate-limit classification. |
| Zalo | Simple receive plus send adapter. |
| Zalo Personal | Simple receive plus send adapter. |
第 22 站
Phase 1: Internal 小纸条消息 Domain
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:origins, receipts, capabilities, durable intents, receive context, send context, live context, and failure classes. cur…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:origins, receipts, capabilities, durable intents, receive context, send context, live context, and failure classes.
origins, receipts, capabilities, durable intents, receive context, send context, live context, and failure classes.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:current reply delivery, then move that field to 消息通道小纸条消息 and rendered 小纸条消息 types as the refactor replaces reply paylo…。
current reply delivery, then move that field to ChannelMessage and rendered message types as the refactor replaces reply payloads.
这一串条目别硬背,把它当成“Phase 1: Internal Message Domain”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Add src/消息通道s/小纸条消息/* types for 小纸条消息s, t…、Add origin?: 小纸条消息Origin to the migration…、Keep this internal until adapters and tes…、Add pure unit tests for state transitions…。
- Add
src/channels/message/*types for messages, targets, relations, - Add
origin?: MessageOriginto the migration bridge payload type used by - Keep this internal until adapters and tests prove the shape.
- Add pure unit tests for state transitions and serialization.
第 23 站
Phase 2: Durable Send Core
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息 send intents. only one reply payload. cannot be written in the new 小纸条消息 lifecycle, after the adapter declares re…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息 send intents.
message send intents.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:only one reply payload.
only one reply payload.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:cannot be written in the new 小纸条消息 lifecycle, after the adapter declares replay safety. Existing 消息通道-turn and SDK comp…。
cannot be written in the new message lifecycle, after the adapter declares replay safety. Existing channel-turn and SDK compatibility paths remain direct-send by default during this phase.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:of treating durable send as a terminal side effect.
of treating durable send as a terminal side effect.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:chunked sends preserve OpenClaw operational provenance.
chunked sends preserve OpenClaw operational provenance.
这一串条目别硬背,把它当成“Phase 2: Durable Send Core”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Move the existing outbound queue from rep…、Let a durable send intent carry a project…、Preserve the current queue recovery behav…、Make deliverOutboundPayloads call 小纸条消息s.…。
- Move the existing outbound queue from reply-payload durability to durable
- Let a durable send intent carry a projected payload array or batch plan, not
- Preserve the current queue recovery behavior through compatibility conversion.
- Make
deliverOutboundPayloadscallmessages.send. - Make final-send durability the default and fail closed when the durable intent
- Record receipts consistently.
- Return receipts and delivery results to the original dispatcher caller instead
- Persist message origin through durable send intents so recovery, replay, and
第 24 站
Phase 3: 消息通道 Turn Bridge
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.receive and 小纸条消息s.send. only when its adapter explicitly opts in with a replay-safe durability policy. native e…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.receive and 小纸条消息s.send.
messages.receive and messages.send.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:only when its adapter explicitly opts in with a replay-safe durability policy.
only when its adapter explicitly opts in with a replay-safe durability policy.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:native edits and cannot replay safely yet, but do not rely on false markers to protect unmigrated 消息通道s.
native edits and cannot replay safely yet, but do not rely on false markers to protect unmigrated channels.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the 消息通道 mapping proves the generic send path preserves the old 消息通道 delivery semantics.
the channel mapping proves the generic send path preserves the old channel delivery semantics.
这一串条目别硬背,把它当成“Phase 3: Channel Turn Bridge”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Reimplement 消息通道.turn.run and dispatchAss…、Keep current fact types stable.、Keep legacy behavior by default. An assem…、Keep durable: false as a compatibility es…。
- Reimplement
channel.turn.runanddispatchAssembledChannelTurnon top of - Keep current fact types stable.
- Keep legacy behavior by default. An assembled-turn channel becomes durable
- Keep
durable: falseas a compatibility escape hatch for paths that finalize - Default assembled-turn durability only in the new message lifecycle, after
第 25 站
Phase 4: Prepared Dispatcher Bridge
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:they already have durable-final work or simpler send paths. the send context. Documentation and changelog entries must…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:they already have durable-final work or simpler send paths.
they already have durable-final work or simpler send paths.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the send context. Documentation and changelog entries must say "assembled 消息通道 turns" or name the migrated 消息通道 paths r…。
the send context. Documentation and changelog entries must say "assembled channel turns" or name the migrated channel paths rather than claiming all automatic final replies.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:public compatibility helpers behavior-preserving. They may expose an explicit send-context opt-in later, but must not a…。
public compatibility helpers behavior-preserving. They may expose an explicit send-context opt-in later, but must not automatically attempt generic durable delivery before the caller-owned delivery callback.
这一串条目别硬背,把它当成“Phase 4: Prepared Dispatcher Bridge”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Replace deliverDurableInboundReplyPayload…、Keep the old helper as a wrapper.、Port Telegram, WhatsApp, Slack, Signal, i…、Treat every prepared dispatcher as uncove…。
- Replace
deliverDurableInboundReplyPayloadwith a send-context bridge. - Keep the old helper as a wrapper.
- Port Telegram, WhatsApp, Slack, Signal, iMessage, and Discord first because
- Treat every prepared dispatcher as uncovered until it explicitly opts in to
- Keep
recordInboundSessionAndDispatchReply, direct-DM helpers, and similar
第 26 站
Phase 5: Unified Live Lifecycle
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:parity tests.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:parity tests.
parity tests.
这一串条目别硬背,把它当成“Phase 5: Unified Live Lifecycle”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Build 小纸条消息s.live with two proof adapters:、Telegram for send plus edit plus stale fi…、Matrix for draft finalization plus redact…、Then migrate Discord, Slack, Mattermost,…。
- Build
messages.livewith two proof adapters: - Telegram for send plus edit plus stale final send.
- Matrix for draft finalization plus redaction fallback.
- Then migrate Discord, Slack, Mattermost, Teams, QQ Bot, and Feishu.
- Delete duplicated preview finalization code only after each channel has
第 27 站
Phase 6: Public SDK
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:新本领插件 SDK docs. shouldDropOpenClawEcho predicate in the 消息通道-小纸条消息 SDK surface. migrated.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:新本领插件 SDK docs.
plugin SDK docs.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:shouldDropOpenClawEcho predicate in the 消息通道-小纸条消息 SDK surface.
shouldDropOpenClawEcho predicate in the channel-message SDK surface.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:migrated.
migrated.
这一串条目别硬背,把它当成“Phase 6: Public SDK”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Add openclaw/新本领插件-sdk/消息通道-小纸条消息.、Document it as the preferred 消息通道 新本领插件 对…、Update package exports, entrypoint invent…、Include 小纸条消息Origin, origin encode/decode…。
- Add
openclaw/plugin-sdk/channel-message. - Document it as the preferred channel plugin API.
- Update package exports, entrypoint inventory, generated API baselines, and
- Include
MessageOrigin, origin encode/decode hooks, and the shared - Keep compatibility wrappers for old subpaths.
- Mark reply-named SDK helpers as deprecated in docs after bundled plugins are
第 28 站
Phase 7: All Senders
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Move all non-reply outbound producers onto 小纸条消息s.send: This is where the 聪明脑袋模型 stops being "机器人朋友 replies" and become…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Move all non-reply outbound producers onto 小纸条消息s.send:。
Move all non-reply outbound producers onto messages.send:
这一串条目别硬背,把它当成“Phase 7: All Senders”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:cron and heartbeat notifications、task completions、hook results、approval prompts and approval results。
- cron and heartbeat notifications
- task completions
- hook results
- approval prompts and approval results
- message tool sends
- subagent completion announcements
- explicit CLI or Control UI sends
- automation/broadcast paths
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This is where the 聪明脑袋模型 stops being "机器人朋友 replies" and becomes "OpenClaw sends 小纸条消息s".
This is where the model stops being "agent replies" and becomes "OpenClaw sends messages".
第 29 站
Phase 8: Deprecate Turn
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:and third-party contracts have a stable replacement.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:and third-party contracts have a stable replacement.
and third-party contracts have a stable replacement.
这一串条目别硬背,把它当成“Phase 8: Deprecate Turn”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Keep 消息通道.turn as a wrapper for at least…、Publish migration notes.、Run 新本领插件 SDK compatibility tests against…、Remove or hide old internal helpers only…。
- Keep
channel.turnas a wrapper for at least one compatibility window. - Publish migration notes.
- Run plugin SDK compatibility tests against old imports.
- Remove or hide old internal helpers only after no bundled plugin needs them
第 30 站
Test plan
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Unit tests: supports reconciliation. serialization, and recovery. Integration tests: explicitly opts in. and do not gen…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Unit tests:。
Unit tests:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:supports reconciliation.
supports reconciliation.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:serialization, and recovery.
serialization, and recovery.
这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Durable send intent serialization and rec…、Idempotency key reuse and duplicate suppr…、Receipt commit and replay skip.、unknown_after_send recovery that reconcil…。
- Durable send intent serialization and recovery.
- Idempotency key reuse and duplicate suppression.
- Receipt commit and replay skip.
unknown_after_sendrecovery that reconciles before replay when an adapter- Failure classification policy.
- Receive ack policy sequencing.
- Relation mapping for reply, followup, system, and broadcast sends.
- Gateway-failure origin factory and
shouldDropOpenClawEchopredicate. - Origin preservation through payload normalization, chunking, durable queue
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Integration tests:。
Integration tests:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:explicitly opts in.
explicitly opts in.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:and do not generic-send before those callbacks.
and do not generic-send before those callbacks.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:restart and cannot leave the later payloads unrecorded after an early crash.
restart and cannot leave the later payloads unrecorded after an early crash.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dispatcher.
dispatcher.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:is disabled or unavailable.
is disabled or unavailable.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:requires normal delivery.
requires normal delivery.
这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:消息通道.turn.run simple adapter still record…、Legacy assembled-event delivery does not…、消息通道.turn.runPrepared bridge still record…、Public compatibility helpers call caller-…。
channel.turn.runsimple adapter still records and sends.- Legacy assembled-event delivery does not become durable unless the channel
channel.turn.runPreparedbridge still records and finalizes.- Public compatibility helpers call caller-owned delivery callbacks by default
- Durable fallback delivery replays the whole projected payload array after
- Durable assembled-event delivery returns platform message ids to the buffered
- Custom delivery hooks still return platform message ids when durable delivery
- Final reply survives restart between assistant completion and platform send.
- Preview draft finalizes in place when allowed.
- Preview draft is cancelled or redacted when media/error/reply-target mismatch
- Block streaming and preview streaming do not both deliver the same text.
- Media streamed early is not duplicated in final delivery.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道 tests:。
Channel tests:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:completed watermark.
completed watermark.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the persisted safe-completed offset 聪明脑袋模型.
the persisted safe-completed offset model.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:atomically, not one single-payload durable intent per loop iteration.
atomically, not one single-payload durable intent per loop iteration.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:or changelog claim Discord final-reply durability.
or changelog claim Discord final-reply durability.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:generic durable send until their adapter parity tests exist.
generic durable send until their adapter parity tests exist.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:migrated to a complete 小纸条消息 target and replay-safe send adapter.
migrated to a complete message target and replay-safe send adapter.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:bot-room echoes drop before allowBots, and untagged bot 小纸条消息s with the same visible text still follow normal bot autho…。
bot-room echoes drop before allowBots, and untagged bot messages with the same visible text still follow normal bot authorization.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:accounts drop before allowBots handling.
accounts drop before allowBots handling.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:allowBots modes before claiming generic protection there.
allowBots modes before claiming generic protection there.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:thread tracking.
thread tracking.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Synology Chat, Tlon, Twitch, Zalo, and Zalo Personal simple durable final sends.
Synology Chat, Tlon, Twitch, Zalo, and Zalo Personal simple durable final sends.
这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Telegram topic reply with polling ack del…、Telegram polling recovery for accepted-bu…、Telegram stale preview sends fresh final…、Telegram silent fallback sends every proj…。
- Telegram topic reply with polling ack delayed until the receive context's safe
- Telegram polling recovery for accepted-but-not-delivered updates covered by
- Telegram stale preview sends fresh final and cleans up preview.
- Telegram silent fallback sends every projected fallback payload.
- Telegram silent fallback durability records the full projected fallback array
- Discord preview cancel on media/error/explicit reply.
- Discord prepared dispatcher finals route through the send context before docs
- iMessage durable final sends populate the monitor sent-message echo cache.
- LINE, Zalo, and Nostr legacy delivery paths are not bypassed by
- Direct-DM/Nostr callback delivery remains authoritative unless explicitly
- Slack tagged OpenClaw gateway failure messages stay visible outbound, tagged
- Slack native stream fallback to draft preview in top-level DMs.
- Matrix preview finalization and redaction fallback.
- Matrix tagged OpenClaw gateway-failure room echoes from configured bot
- Discord and Google Chat shared-room gateway-failure cascade audits cover
- Mattermost draft finalization and fresh-send fallback.
- Teams native progress finalization.
- Feishu duplicate final suppression.
- QQ Bot accumulator timeout fallback.
- Tlon durable final sends preserve model-signature rendering and participated
- WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk,
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Validation:。
Validation:
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:public SDK/export changes.
public SDK/export changes.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:simple send-only 消息通道 before removing compatibility wrappers.
simple send-only channel before removing compatibility wrappers.
这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Targeted Vitest files during development.、pnpm check:changed in Testbox for the ful…、Broader pnpm check in Testbox before land…、Live or qa-消息通道 smoke for at least one ed…。
- Targeted Vitest files during development.
pnpm check:changedin Testbox for the full changed surface.- Broader
pnpm checkin Testbox before landing the complete refactor or after - Live or qa-channel smoke for at least one edit-capable channel and one
第 31 站
Open questions
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。
你理解的是能力边界,不只是功能名字。
如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:fully durable polling source that can control platform-level redelivery, not only OpenClaw's persisted restart watermar…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:fully durable polling source that can control platform-level redelivery, not only OpenClaw's persisted restart watermar…。
fully durable polling source that can control platform-level redelivery, not only OpenClaw's persisted restart watermark.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:as the final send intent or in a sibling live-state store.
as the final send intent or in a sibling live-state store.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:新本领插件-sdk/消息通道-小纸条消息 ships.
plugin-sdk/channel-message ships.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:provide normalize/send/live hooks through define消息通道小纸条消息Adapter.
provide normalize/send/live hooks through defineChannelMessageAdapter.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:state.
state.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:should be 聪明脑袋模型ed as send-context hooks, adapter-owned finalize steps, or receipt subscribers.
should be modeled as send-context hooks, adapter-owned finalize steps, or receipt subscribers.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:registries, and which cannot offer reliable cross-bot echo suppression.
registries, and which cannot offer reliable cross-bot echo suppression.
这一串条目别硬背,把它当成“Open questions”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Whether Telegram should eventually replac…、Whether durable live preview state should…、How long compatibility wrappers stay docu…、Whether third-party 新本领插件s should impleme…。
- Whether Telegram should eventually replace the grammY runner source with a
- Whether durable live preview state should be stored in the same queue record
- How long compatibility wrappers stay documented after
- Whether third-party plugins should implement receive adapters directly or only
- Which receipt fields are safe to expose in public SDK versus internal runtime
- Whether side effects such as self-echo caches and participated-thread markers
- Which channels have native origin metadata, which need persisted outbound
第 32 站
Acceptance criteria
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.send. documented compatibility wrapper. finalization. the final response or duplicating already committed sends;…。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.send.
messages.send.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:documented compatibility wrapper.
documented compatibility wrapper.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:finalization.
finalization.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the final response or duplicating already committed sends; sends whose platform outcome is unknown are reconciled befor…。
the final response or duplicating already committed sends; sends whose platform outcome is unknown are reconciled before replay or documented as at-least-once for that adapter.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:unless a caller explicitly selected a documented non-durable mode.
unless a caller explicitly selected a documented non-durable mode.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道-owned delivery; generic durable send is explicit opt-in only.
channel-owned delivery; generic durable send is explicit opt-in only.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:primary id for threading/edit convenience.
primary id for threading/edit convenience.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:delivery callbacks.
delivery callbacks.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:path explicitly uses the send context.
path explicitly uses the send context.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:intent or batch plan.
intent or batch plan.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:bot-authored room echoes are dropped before bot authorization on 消息通道s that declare support for the origin contract.
bot-authored room echoes are dropped before bot authorization on channels that declare support for the origin contract.
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:policy, migration, and test coverage.
policy, migration, and test coverage.
这一串条目别硬背,把它当成“Acceptance criteria”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Every bundled 小纸条消息 消息通道 sends final visi…、Every inbound 小纸条消息 消息通道 enters through 小…、Every preview/edit/一边说一边送 消息通道 uses 小纸条消息…、消息通道.turn is only a wrapper.
- Every bundled message channel sends final visible output through
- Every inbound message channel enters through
messages.receiveor a - Every preview/edit/stream channel uses
messages.livefor draft state and channel.turnis only a wrapper.- Reply-named SDK helpers are compatibility exports, not the recommended path.
- Durable recovery can replay pending final sends after restart without losing
- Durable final sends fail closed when the durable intent cannot be written,
- Legacy channel-turn and SDK compatibility helpers default to direct
- Receipts preserve all platform message ids for multi-part deliveries and a
- Durable wrappers preserve channel-local side effects before replacing direct
- Prepared dispatchers are not counted as durable until their final delivery
- Fallback delivery handles every projected payload.
- Durable fallback delivery records every projected payload in one replayable
- OpenClaw-originated gateway failure output is visible to humans but tagged
- The docs explain send, receive, live, state, receipts, relations, failure
第 33 站
Related
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。
这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。
你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:---。
这一串条目别硬背,把它当成“Related”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:小纸条消息s、一边说一边送ing and chunking、Progress drafts、Retry policy。
如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:---。
---
AdSense 连接验证已经放在页面头部;广告单元等站点审批通过后再启用。
google-adsense-account: ca-pub-3833673520933536