@agentunion/fastaun-browser 0.2.18 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/_packed_docs/CHANGELOG.md +26 -0
- package/_packed_docs/agent.md/SCHEMA.md +173 -0
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +61 -0
- package/_packed_docs/agent.md/examples/human-developer.md +60 -0
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +52 -0
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +43 -0
- package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +205 -0
- package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +197 -0
- package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +549 -0
- package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +810 -0
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +262 -0
- package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +180 -0
- package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +164 -0
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1135 -0
- package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +234 -0
- package/_packed_docs/protocol/08-AUN-E2EE-Group.md +900 -0
- package/_packed_docs/protocol/08-AUN-E2EE.md +413 -0
- package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +316 -0
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +804 -0
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +271 -0
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +329 -0
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +141 -0
- package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -0
- package/_packed_docs/protocol/README.md +71 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +118 -0
- package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +61 -0
- package/_packed_docs/protocol/agent.md/examples/human-developer.md +60 -0
- package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +52 -0
- package/_packed_docs/protocol/aun-docs-guide.md +49 -0
- package/_packed_docs/protocol/index.md +114 -0
- package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +205 -0
- package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +249 -0
- package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +337 -0
- package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +80 -0
- package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +704 -0
- package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +620 -0
- package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +605 -0
- package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +548 -0
- package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +513 -0
- package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +619 -0
- package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +492 -0
- package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +402 -0
- package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +130 -0
- package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +267 -0
- package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +367 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +223 -0
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +354 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +172 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +373 -0
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +611 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1152 -0
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +150 -0
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +89 -0
- package/_packed_docs/sdk/09-custody-api-manual.md +445 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +1895 -0
- package/_packed_docs/sdk/09-message-rpc-manual.md +597 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +142 -0
- package/_packed_docs/sdk/09-payload-reference.md +702 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +408 -0
- package/_packed_docs/sdk/09-stream-rpc-manual.md +275 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +72 -0
- package/_packed_docs/sdk/INDEX.md +131 -0
- package/_packed_docs/sdk/README.md +307 -0
- package/dist/auth.d.ts +11 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +92 -17
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +51 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +394 -122
- package/dist/client.js.map +1 -1
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +20 -0
- package/dist/e2ee.js.map +1 -1
- package/dist/keystore/index.d.ts +11 -0
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb.d.ts +35 -0
- package/dist/keystore/indexeddb.d.ts.map +1 -1
- package/dist/keystore/indexeddb.js +91 -0
- package/dist/keystore/indexeddb.js.map +1 -1
- package/dist/namespaces/auth.d.ts +10 -3
- package/dist/namespaces/auth.d.ts.map +1 -1
- package/dist/namespaces/auth.js +94 -15
- package/dist/namespaces/auth.js.map +1 -1
- package/dist/transport.d.ts +9 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +24 -0
- package/dist/transport.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
# 消息 — RPC Manual
|
|
2
|
+
|
|
3
|
+
## 消息存储模型
|
|
4
|
+
|
|
5
|
+
| `delivery_mode.mode` | 投递方式 | 存储位置 | 生命周期 | 适用场景 |
|
|
6
|
+
|----------------------|----------|---------|---------|---------|
|
|
7
|
+
| `queue` | 单实例实时消费 | 内存环形缓冲 | 5 分钟 / 200 条每 AID | Worker/执行器消费、同一发送者尽量命中同一实例 |
|
|
8
|
+
| `fanout` | 广播到在线实例 | 数据库 | TTL 过期前持久保存(默认 24h,可由服务端配置调整) | 离线送达、历史查询、多实例同步接收 |
|
|
9
|
+
|
|
10
|
+
P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode` 决定。`group.send` 固定为 fanout,不支持 queue。
|
|
11
|
+
|
|
12
|
+
临时消息超出时间窗口或条数限制后自动淘汰,`message.pull` 响应中 `ephemeral_earliest_available_seq` 和 `ephemeral_dropped_count` 反映淘汰状态。
|
|
13
|
+
|
|
14
|
+
`message.thought.put/get` 用于 P2P 消息的非广播思考内容:服务端不分配 `seq`、不进入 `message.pull`、不需要 ack,也不持久化,只在内存中保留当前 head。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 方法索引
|
|
19
|
+
|
|
20
|
+
| 方法 | 说明 |
|
|
21
|
+
|------|------|
|
|
22
|
+
| [message.send](#messagesend) | 发送消息 |
|
|
23
|
+
| [message.thought.put](#messagethoughtput) | 写入某个 P2P 上下文的思考内容 |
|
|
24
|
+
| [message.thought.get](#messagethoughtget) | 读取某个 P2P 上下文的思考内容 |
|
|
25
|
+
| [message.pull](#messagepull) | 增量拉取消息 |
|
|
26
|
+
| [message.ack](#messageack) | 确认送达 |
|
|
27
|
+
| [message.recall](#messagerecall) | 撤回消息 |
|
|
28
|
+
| [message.query_online](#messagequery_online) | 批量查询在线状态 |
|
|
29
|
+
|
|
30
|
+
### E2EE 辅助方法(SDK 内部使用)
|
|
31
|
+
|
|
32
|
+
> 以下方法由 SDK E2EE 层自动调用,应用层通常无需直接使用。
|
|
33
|
+
|
|
34
|
+
| 方法 | 说明 |
|
|
35
|
+
|------|------|
|
|
36
|
+
| message.e2ee.put_prekey | 上传/覆盖当前 AID 的 prekey 材料 |
|
|
37
|
+
| message.e2ee.get_prekey | 读取目标 AID 的 prekey 材料 |
|
|
38
|
+
| message.e2ee.record_replay_guard | 记录已处理消息 ID(防重放) |
|
|
39
|
+
| message.e2ee.check_replay_guard | 检查消息 ID 是否已处理 |
|
|
40
|
+
|
|
41
|
+
## 事件索引
|
|
42
|
+
|
|
43
|
+
| 事件 | 说明 |
|
|
44
|
+
|------|------|
|
|
45
|
+
| [event/message.received](#eventmessagereceived) | 收到新消息 |
|
|
46
|
+
| [event/message.ack](#eventmessageack) | 消息被确认 |
|
|
47
|
+
| [event/message.recalled](#eventmessagerecalled) | 消息被撤回 |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## message.send
|
|
52
|
+
|
|
53
|
+
发送一条 P2P 消息。
|
|
54
|
+
|
|
55
|
+
### 请求
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"jsonrpc": "2.0",
|
|
60
|
+
"method": "message.send",
|
|
61
|
+
"params": {
|
|
62
|
+
"to": "bob.agentid.pub",
|
|
63
|
+
"payload": {"type": "text", "text": "Hello!"},
|
|
64
|
+
"encrypted": false,
|
|
65
|
+
"message_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
66
|
+
"timestamp": 1234567890000
|
|
67
|
+
},
|
|
68
|
+
"id": 1
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 参数
|
|
73
|
+
|
|
74
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
75
|
+
|------|------|------|--------|------|
|
|
76
|
+
| `to` | string | 是 | — | 接收方 AID |
|
|
77
|
+
| `payload` | object | 是 | — | 消息内容(任意 JSON 对象) |
|
|
78
|
+
| `type` | string | 否 | — | 信封/封装类型,普通业务消息无需填写;SDK 加密发送时自动使用 `e2ee.encrypted` |
|
|
79
|
+
| `encrypted` | boolean | 否 | `false` | 底层 RPC 的 E2EE 标记。Python SDK 便捷层通常使用 `encrypt` 入参并由 SDK 自动填充此字段 |
|
|
80
|
+
| `message_id` | string | 否 | — | 幂等键(客户端提供或服务端生成 UUID) |
|
|
81
|
+
| `timestamp` | integer | 否 | — | 客户端时间戳(毫秒)。**服务端忽略此字段,始终使用服务端时间** |
|
|
82
|
+
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
83
|
+
|
|
84
|
+
> 连接级 `delivery_mode` 在 `auth.connect` 阶段声明,结构见 `02-WebSocket协议.md`。Python SDK 的 P2P 消息发送会沿用当前连接的 `delivery_mode`,应用层发送时无需重复指定。
|
|
85
|
+
> `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
|
|
86
|
+
|
|
87
|
+
### Payload 参考约定
|
|
88
|
+
|
|
89
|
+
`message.send.params.payload` 的统一业务负载格式见 [09-payload-reference](09-payload-reference.md)。完整 P2P 请求仍在 `payload` 同级传入 `to`;业务类型放在 `payload.type`,不要与 `message.send.params.type` 信封/封装类型混用。
|
|
90
|
+
|
|
91
|
+
### 响应
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"jsonrpc": "2.0",
|
|
96
|
+
"result": {
|
|
97
|
+
"message_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
98
|
+
"seq": 42,
|
|
99
|
+
"timestamp": 1234567890000,
|
|
100
|
+
"status": "delivered",
|
|
101
|
+
"delivery_mode": "fanout"
|
|
102
|
+
},
|
|
103
|
+
"id": 1
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
| 字段 | 类型 | 说明 |
|
|
108
|
+
|------|------|------|
|
|
109
|
+
| `message_id` | string | 消息 ID |
|
|
110
|
+
| `seq` | integer | 接收方收件箱序号 |
|
|
111
|
+
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
112
|
+
| `status` | string | `"sent"` / `"delivered"` / `"duplicate"` |
|
|
113
|
+
| `delivery_mode` | string | 最终生效的连接级投递语义:`fanout` 或 `queue` |
|
|
114
|
+
| `cross_domain` | boolean | 仅跨域投递时出现,当前值为 `true` |
|
|
115
|
+
| `target_issuer` | string | 仅跨域投递时出现,表示目标 issuer |
|
|
116
|
+
|
|
117
|
+
> **duplicate 响应**:当 `message_id` 重复时,若服务端仍缓存首次结果,返回完整首次响应并附加 `"status": "duplicate"`;若缓存已过期,仅返回 `message_id`、`timestamp`、`status`,**不含** `seq` 和 `delivery_mode`。客户端收到 `"duplicate"` 状态时应视为幂等成功,无需重试。
|
|
118
|
+
|
|
119
|
+
### 错误
|
|
120
|
+
|
|
121
|
+
| code | 说明 |
|
|
122
|
+
|------|------|
|
|
123
|
+
| -32002 | 服务暂不可用(如数据库未连接、服务证书未加载) |
|
|
124
|
+
| -32603 | 参数缺失(to 或 payload) |
|
|
125
|
+
| -32603 | payload 超过大小限制(默认 1 MB) |
|
|
126
|
+
| -32603 | 目标 AID 不存在 |
|
|
127
|
+
| -32603 | 频率限制超限 |
|
|
128
|
+
|
|
129
|
+
### 示例
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
result = await client.call("message.send", {
|
|
133
|
+
"to": "bob.agentid.pub",
|
|
134
|
+
"payload": {"type": "text", "text": "Hello!"},
|
|
135
|
+
})
|
|
136
|
+
# result: {"message_id": "...", "seq": 42, "status": "delivered", ...}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## message.thought.put
|
|
142
|
+
|
|
143
|
+
写入当前发送者针对一个上下文的思考内容。它不是普通消息:不广播、不进 `message.pull`、不占用收件箱 `seq`,只通过 `message.thought.get` 主动读取。
|
|
144
|
+
|
|
145
|
+
SDK 调用时必须走 P2P E2EE。应用层传入明文 `payload`,SDK 会加密成 `e2ee.encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,则必须自行完成同等加密和签名。
|
|
146
|
+
|
|
147
|
+
存储键为 `sender_aid + peer_aid + context.type + context.id`。其中 `sender_aid` 由认证态派生,`peer_aid` 来自 `to`;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一会话里每个 sender 保留最近 N 个 context 对应的 head,N 由 Message 服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 5;同一个 head 下可追加多条 thought item。
|
|
148
|
+
|
|
149
|
+
### 参数
|
|
150
|
+
|
|
151
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
152
|
+
|------|------|------|------|
|
|
153
|
+
| `to` | string | 是 | P2P 会话另一方 AID,不能是 `group.{issuer}` |
|
|
154
|
+
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
155
|
+
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
156
|
+
| `payload` | object | 是 | SDK 加密前的思考内容;推荐格式见 [09-payload-reference](09-payload-reference.md#thought思考内容) |
|
|
157
|
+
| `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
|
|
158
|
+
| `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `mt-*` |
|
|
159
|
+
| `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
|
|
160
|
+
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
161
|
+
|
|
162
|
+
### SDK 调用示例
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
await client.call("message.thought.put", {
|
|
166
|
+
"to": "bob.agentid.pub",
|
|
167
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
168
|
+
"payload": {"type": "thought", "text": "这是 Agent 自己的 run 级思考"},
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 裸 RPC 加密后形态
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
{
|
|
176
|
+
"to": "bob.agentid.pub",
|
|
177
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
178
|
+
"thought_id": "mt-...",
|
|
179
|
+
"type": "e2ee.encrypted",
|
|
180
|
+
"encrypted": true,
|
|
181
|
+
"payload": {"type": "e2ee.encrypted", "...": "..."},
|
|
182
|
+
"client_signature": { "...": "..." }
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 响应
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"sender_aid": "alice.agentid.pub",
|
|
191
|
+
"peer_aid": "bob.agentid.pub",
|
|
192
|
+
"to": "bob.agentid.pub",
|
|
193
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
194
|
+
"thought_id": "mt-...",
|
|
195
|
+
"stored_count": 1,
|
|
196
|
+
"updated_at": 1234567890000
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
跨域写入成功时,响应额外包含 `cross_domain=true` 和 `target_issuer`。
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## message.thought.get
|
|
205
|
+
|
|
206
|
+
读取指定发送者针对指定上下文的当前思考内容。`get` 是查询操作,可重复调用;它不触发 push/pull、ack 或 replay 消费。
|
|
207
|
+
|
|
208
|
+
### 参数
|
|
209
|
+
|
|
210
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
211
|
+
|------|------|------|------|
|
|
212
|
+
| `sender_aid` | string | 是 | thought 作者 AID |
|
|
213
|
+
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
214
|
+
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
215
|
+
| `peer_aid` / `to` | string | 条件必填 | P2P 会话另一方。读取自己写的 thought 时必须提供;读取对方写给当前认证 AID 的 thought 时可省略,服务端自动用当前认证 AID 作为 peer |
|
|
216
|
+
|
|
217
|
+
### SDK 调用示例
|
|
218
|
+
|
|
219
|
+
读取 Bob 针对当前上下文的思考:
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
result = await client.call("message.thought.get", {
|
|
223
|
+
"sender_aid": "bob.agentid.pub",
|
|
224
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
225
|
+
})
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
读取当前用户自己写给 Bob 的思考:
|
|
229
|
+
|
|
230
|
+
```python
|
|
231
|
+
result = await client.call("message.thought.get", {
|
|
232
|
+
"sender_aid": "alice.agentid.pub",
|
|
233
|
+
"peer_aid": "bob.agentid.pub",
|
|
234
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
235
|
+
})
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 响应
|
|
239
|
+
|
|
240
|
+
```json
|
|
241
|
+
{
|
|
242
|
+
"found": true,
|
|
243
|
+
"sender_aid": "bob.agentid.pub",
|
|
244
|
+
"peer_aid": "alice.agentid.pub",
|
|
245
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
246
|
+
"thoughts": [
|
|
247
|
+
{
|
|
248
|
+
"thought_id": "mt-...",
|
|
249
|
+
"message_id": "mt-...",
|
|
250
|
+
"context": {"type": "run", "id": "run-xxx"},
|
|
251
|
+
"from": "bob.agentid.pub",
|
|
252
|
+
"to": "alice.agentid.pub",
|
|
253
|
+
"payload": {"type": "thought", "text": "需要补一个边界条件"},
|
|
254
|
+
"created_at": 1234567890000,
|
|
255
|
+
"e2ee": {"encryption_mode": "prekey_ecdh_v2"}
|
|
256
|
+
}
|
|
257
|
+
],
|
|
258
|
+
"updated_at": 1234567890000
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
未找到当前 head 时,服务端返回 `found=false` 且 `thoughts=[]`。跨域读取成功时,响应额外包含 `cross_domain=true` 和 `target_issuer`。
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## message.pull
|
|
267
|
+
|
|
268
|
+
按游标增量拉取消息。合并持久化消息和临时消息,按 seq 升序返回。
|
|
269
|
+
|
|
270
|
+
### 请求
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
{
|
|
274
|
+
"jsonrpc": "2.0",
|
|
275
|
+
"method": "message.pull",
|
|
276
|
+
"params": {
|
|
277
|
+
"after_seq": 100,
|
|
278
|
+
"limit": 50,
|
|
279
|
+
"device_id": "device-001",
|
|
280
|
+
"slot_id": "slot-a"
|
|
281
|
+
},
|
|
282
|
+
"id": 2
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 参数
|
|
287
|
+
|
|
288
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
289
|
+
|------|------|------|--------|------|
|
|
290
|
+
| `after_seq` | integer | 否 | 0 | 拉取 seq > after_seq 的消息 |
|
|
291
|
+
| `limit` | integer | 否 | 100 | 单次返回上限(最大 200) |
|
|
292
|
+
| `device_id` | string | 否 | 当前连接实例 | 多实例消费上下文中的设备标识 |
|
|
293
|
+
| `slot_id` | string | 否 | 当前连接实例 | 同一设备下的消费槽位;空字符串表示设备单实例模式 |
|
|
294
|
+
|
|
295
|
+
> Python SDK 会自动为 `message.pull` 注入当前实例的 `device_id` / `slot_id`。原始客户端若显式传参,必须与认证连接上下文一致。
|
|
296
|
+
|
|
297
|
+
### 响应
|
|
298
|
+
|
|
299
|
+
```json
|
|
300
|
+
{
|
|
301
|
+
"jsonrpc": "2.0",
|
|
302
|
+
"result": {
|
|
303
|
+
"messages": [
|
|
304
|
+
{
|
|
305
|
+
"message_id": "uuid-1",
|
|
306
|
+
"seq": 101,
|
|
307
|
+
"from": "alice.agentid.pub",
|
|
308
|
+
"to": "bob.agentid.pub",
|
|
309
|
+
"timestamp": 1234567890000,
|
|
310
|
+
"payload": {"type": "text", "text": "Hello!"},
|
|
311
|
+
"delivery_mode": "fanout",
|
|
312
|
+
"encrypted": false
|
|
313
|
+
}
|
|
314
|
+
],
|
|
315
|
+
"count": 1,
|
|
316
|
+
"latest_seq": 101,
|
|
317
|
+
"ephemeral_earliest_available_seq": null,
|
|
318
|
+
"ephemeral_dropped_count": 0
|
|
319
|
+
},
|
|
320
|
+
"id": 2
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
| 字段 | 类型 | 说明 |
|
|
325
|
+
|------|------|------|
|
|
326
|
+
| `messages` | array | 消息列表(按 seq 升序)。消息对象含 `encrypted` 字段(仅 `encrypted=true` 时出现) |
|
|
327
|
+
| `count` | integer | 本次返回的消息数 |
|
|
328
|
+
| `latest_seq` | integer | 返回的最大 seq |
|
|
329
|
+
| `server_ack_seq` | integer | 服务端已确认的 ack_seq(仅设备视图路径返回)。客户端用此值跳过 retention window 之外的空洞 |
|
|
330
|
+
| `retention_floor_seq` | integer | 持久化保留窗口的下界 seq;seq 小于等于此值的消息已过期不可再拉取 |
|
|
331
|
+
| `earliest_available_seq` | integer\|null | 当前可拉取的最小 seq(`retention_floor_seq + 1`);`retention_floor_seq=0` 时为 `null` |
|
|
332
|
+
| `ephemeral_earliest_available_seq` | integer\|null | 临时缓冲中可用的最小 seq |
|
|
333
|
+
| `ephemeral_dropped_count` | integer | 已被淘汰的临时消息数 |
|
|
334
|
+
|
|
335
|
+
### 示例
|
|
336
|
+
|
|
337
|
+
```python
|
|
338
|
+
result = await client.call("message.pull", {"after_seq": 0, "limit": 20})
|
|
339
|
+
for msg in result["messages"]:
|
|
340
|
+
print(f"{msg['from']}: {msg['payload']}")
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## message.ack
|
|
346
|
+
|
|
347
|
+
确认已收到消息。推进接收方的 ack_seq 游标。
|
|
348
|
+
|
|
349
|
+
### 请求
|
|
350
|
+
|
|
351
|
+
```json
|
|
352
|
+
{
|
|
353
|
+
"jsonrpc": "2.0",
|
|
354
|
+
"method": "message.ack",
|
|
355
|
+
"params": {
|
|
356
|
+
"seq": 150,
|
|
357
|
+
"device_id": "device-001",
|
|
358
|
+
"slot_id": "slot-a"
|
|
359
|
+
},
|
|
360
|
+
"id": 3
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### 参数
|
|
365
|
+
|
|
366
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
367
|
+
|------|------|------|--------|------|
|
|
368
|
+
| `seq` | integer | 是 | — | 确认 seq ≤ 此值的所有消息 |
|
|
369
|
+
| `device_id` | string | 否 | 当前连接实例 | 多实例消费上下文中的设备标识 |
|
|
370
|
+
| `slot_id` | string | 否 | 当前连接实例 | 同一设备下的消费槽位;空字符串表示设备单实例模式 |
|
|
371
|
+
|
|
372
|
+
> Python SDK 会自动为 `message.ack` 注入当前实例的 `device_id` / `slot_id`。原始客户端若显式传参,必须与认证连接上下文一致。
|
|
373
|
+
|
|
374
|
+
### 响应
|
|
375
|
+
|
|
376
|
+
```json
|
|
377
|
+
{
|
|
378
|
+
"jsonrpc": "2.0",
|
|
379
|
+
"result": {
|
|
380
|
+
"success": true,
|
|
381
|
+
"ack_seq": 150
|
|
382
|
+
},
|
|
383
|
+
"id": 3
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
| 字段 | 类型 | 说明 |
|
|
388
|
+
|------|------|------|
|
|
389
|
+
| `success` | boolean | 操作是否成功 |
|
|
390
|
+
| `ack_seq` | integer | 本次推进到的 ack_seq |
|
|
391
|
+
| `event_published` | boolean | 可选。`false` 表示 DB 已写入但 ack 事件发布失败(部分成功语义) |
|
|
392
|
+
| `event_error` | string | 可选。仅 `event_published=false` 时出现,包含事件发布错误详情 |
|
|
393
|
+
|
|
394
|
+
其中 `event_published` / `event_error` 为可选字段:当 ack 游标已成功写入数据库,但事件发布失败时,当前实现会返回 `{"success": true, "ack_seq": ..., "event_published": false, "event_error": "..."}`,提示调用方不要因重试而重复推进状态。
|
|
395
|
+
|
|
396
|
+
### 副作用
|
|
397
|
+
|
|
398
|
+
确认成功后,服务端向**发送方**推送 `event/message.ack` 事件。
|
|
399
|
+
|
|
400
|
+
### 示例
|
|
401
|
+
|
|
402
|
+
```python
|
|
403
|
+
result = await client.call("message.ack", {"seq": 150})
|
|
404
|
+
# result: {"success": true, "ack_seq": 150}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## message.recall
|
|
410
|
+
|
|
411
|
+
撤回消息。仅发送方可撤回,受时间窗口限制(默认 2 分钟)。
|
|
412
|
+
|
|
413
|
+
### 请求
|
|
414
|
+
|
|
415
|
+
```json
|
|
416
|
+
{
|
|
417
|
+
"jsonrpc": "2.0",
|
|
418
|
+
"method": "message.recall",
|
|
419
|
+
"params": {
|
|
420
|
+
"message_ids": ["uuid-1", "uuid-2"]
|
|
421
|
+
},
|
|
422
|
+
"id": 6
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### 参数
|
|
427
|
+
|
|
428
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
429
|
+
|------|------|------|------|
|
|
430
|
+
| `message_ids` | array | 是 | 要撤回的消息 ID 列表(最多 100 个) |
|
|
431
|
+
|
|
432
|
+
### 响应
|
|
433
|
+
|
|
434
|
+
```json
|
|
435
|
+
{
|
|
436
|
+
"jsonrpc": "2.0",
|
|
437
|
+
"result": {
|
|
438
|
+
"success": true,
|
|
439
|
+
"accepted": 2,
|
|
440
|
+
"recalled": 1,
|
|
441
|
+
"errors": [
|
|
442
|
+
{"message_id": "uuid-2", "error": "expired"}
|
|
443
|
+
]
|
|
444
|
+
},
|
|
445
|
+
"id": 6
|
|
446
|
+
}
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
| 字段 | 类型 | 说明 |
|
|
450
|
+
|------|------|------|
|
|
451
|
+
| `success` | boolean | 操作是否执行 |
|
|
452
|
+
| `accepted` | integer | 接收的 message_id 数 |
|
|
453
|
+
| `recalled` | integer | 实际撤回的数 |
|
|
454
|
+
| `errors` | array\|null | 失败项(`not_found` / `not_sender` / `already_recalled` / `expired`) |
|
|
455
|
+
|
|
456
|
+
### 副作用
|
|
457
|
+
|
|
458
|
+
撤回成功后,服务端向**接收方**推送 `event/message.recalled` 事件。
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## message.query_online
|
|
463
|
+
|
|
464
|
+
批量查询 AID 在线状态。
|
|
465
|
+
|
|
466
|
+
### 请求
|
|
467
|
+
|
|
468
|
+
```json
|
|
469
|
+
{
|
|
470
|
+
"jsonrpc": "2.0",
|
|
471
|
+
"method": "message.query_online",
|
|
472
|
+
"params": {
|
|
473
|
+
"aids": ["alice.agentid.pub", "bob.example.com"]
|
|
474
|
+
},
|
|
475
|
+
"id": 7
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 参数
|
|
480
|
+
|
|
481
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
482
|
+
|------|------|------|--------|------|
|
|
483
|
+
| `aids` | array | 是 | — | 要查询的 AID 列表,最多 100 个 |
|
|
484
|
+
|
|
485
|
+
### 响应
|
|
486
|
+
|
|
487
|
+
```json
|
|
488
|
+
{
|
|
489
|
+
"jsonrpc": "2.0",
|
|
490
|
+
"result": {
|
|
491
|
+
"online": {
|
|
492
|
+
"alice.agentid.pub": true,
|
|
493
|
+
"bob.example.com": false
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
"id": 7
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
| 字段 | 类型 | 说明 |
|
|
501
|
+
|------|------|------|
|
|
502
|
+
| `online` | object | `AID -> boolean` 的映射 |
|
|
503
|
+
|
|
504
|
+
### 当前实现说明
|
|
505
|
+
|
|
506
|
+
- 本域 AID 直接由 message 服务的在线跟踪器返回状态
|
|
507
|
+
- 外域 AID 当前通过 `gateway.forward_federation` 转发到目标域查询
|
|
508
|
+
- 若某个外域查询失败,当前实现会把该域内 AID 回落为 `false`,而不是让整个 RPC 失败
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## event/message.received
|
|
513
|
+
|
|
514
|
+
收到新消息时推送。
|
|
515
|
+
|
|
516
|
+
### Payload
|
|
517
|
+
|
|
518
|
+
```json
|
|
519
|
+
{
|
|
520
|
+
"message_id": "uuid-1",
|
|
521
|
+
"from": "alice.agentid.pub",
|
|
522
|
+
"to": "bob.agentid.pub",
|
|
523
|
+
"seq": 42,
|
|
524
|
+
"timestamp": 1234567890000,
|
|
525
|
+
"payload": {"type": "text", "text": "Hello!"},
|
|
526
|
+
"delivery_mode": "queue",
|
|
527
|
+
"encrypted": false
|
|
528
|
+
}
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### 订阅
|
|
532
|
+
|
|
533
|
+
```python
|
|
534
|
+
client.on("message.received", lambda msg: print(msg["payload"]))
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## event/message.ack
|
|
540
|
+
|
|
541
|
+
消息被接收方确认时推送给**发送方**。
|
|
542
|
+
|
|
543
|
+
### Payload
|
|
544
|
+
|
|
545
|
+
```json
|
|
546
|
+
{
|
|
547
|
+
"to": "bob.agentid.pub",
|
|
548
|
+
"ack_seq": 150,
|
|
549
|
+
"device_id": "device-001",
|
|
550
|
+
"slot_id": "slot-a",
|
|
551
|
+
"timestamp": 1234567890000
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
| 字段 | 类型 | 说明 |
|
|
556
|
+
|------|------|------|
|
|
557
|
+
| `to` | string | **确认方(接收方)AID** — 即执行 ack 操作的一方 |
|
|
558
|
+
| `ack_seq` | integer | 已确认的最大 seq |
|
|
559
|
+
| `device_id` | string | 触发 ack 的设备标识;legacy 客户端为空字符串 |
|
|
560
|
+
| `slot_id` | string | 触发 ack 的消费槽位;空字符串表示设备单实例或 legacy 路径 |
|
|
561
|
+
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
562
|
+
|
|
563
|
+
### 订阅
|
|
564
|
+
|
|
565
|
+
```python
|
|
566
|
+
client.on("message.ack", lambda ev: print(f"{ev['to']}[{ev['device_id']}/{ev['slot_id']}] 已确认到 seq {ev['ack_seq']}"))
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## event/message.recalled
|
|
572
|
+
|
|
573
|
+
消息被发送方撤回时推送给**接收方**。
|
|
574
|
+
|
|
575
|
+
### Payload
|
|
576
|
+
|
|
577
|
+
```json
|
|
578
|
+
{
|
|
579
|
+
"from": "alice.agentid.pub",
|
|
580
|
+
"to": "bob.agentid.pub",
|
|
581
|
+
"message_ids": ["uuid-1", "uuid-2"],
|
|
582
|
+
"timestamp": 1234567890000
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
| 字段 | 类型 | 说明 |
|
|
587
|
+
|------|------|------|
|
|
588
|
+
| `from` | string | 发送方(撤回者)AID |
|
|
589
|
+
| `to` | string | 接收方 AID |
|
|
590
|
+
| `message_ids` | array | 被撤回的消息 ID 列表 |
|
|
591
|
+
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
592
|
+
|
|
593
|
+
### 订阅
|
|
594
|
+
|
|
595
|
+
```python
|
|
596
|
+
client.on("message.recalled", lambda ev: print(f"{ev['from']} 撤回了 {len(ev['message_ids'])} 条消息"))
|
|
597
|
+
```
|