02 命令执行与消息发送链路
模块目标
理解 openclaw message ... 从 CLI 参数到实际向通道发送消息的完整链路。
步骤一:实现拆解(执行链路)
- 命令入口注册:
src/cli/program/register.message.ts - 命令处理函数:
src/commands/message.ts - 动作调度:
src/infra/outbound/message-action-runner.ts - 发送执行:
src/infra/outbound/deliver.ts - 通道适配器发送:
src/channels/plugins/*
步骤二:细粒度讲解(小白版)
register.message.ts负责把一个大命令拆成小命令
send,poll,react,read,edit,delete等- 每个子命令都走统一 helper,参数风格一致
commands/message.ts只做“入口协调”
- 解析
action - 构造 outbound 依赖(把 CLI 依赖转成发送依赖)
- 调
runMessageAction(...) - 根据
--json输出不同格式
message-action-runner.ts是核心编排层
- 选择 channel(自动或显式)
- 解析 target(用户、群组、channel id)
- 处理 threadId 自动推断
- 分发到
send/poll/broadcast/... - 支持跨上下文装饰(例如来源标记)
deliver.ts是发送执行引擎
- 使用通道 outbound adapter(插件化)
- 做文本分块(不同平台有不同长度限制)
- 发送失败时支持 best-effort 处理
- 写入发送队列,成功后 ack,失败标记 fail(便于恢复)
- 通道发送是“插件合同”
- 每个 channel 插件实现
sendText/sendMedia等能力 - 核心层不需要知道 Discord/Telegram/Signal 的内部细节