@agentunion/fastaun-browser 0.5.4 → 0.5.8
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 +177 -67
- package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/216/245/345/205/245/344/270/216/346/274/224/347/244/272/346/214/207/345/215/227.md +290 -0
- package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/346/236/266/346/236/204/344/270/216/350/257/246/347/273/206/345/256/236/347/216/260/350/256/241/345/210/222-codex.md +994 -0
- package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/350/277/220/347/273/264/344/270/216/345/217/221/345/270/203/346/214/207/345/215/227.md +144 -0
- package/_packed_docs/CHANGELOG.md +177 -67
- package/_packed_docs/INDEX.md +124 -65
- package/_packed_docs/KITE_DOCS_GUIDE.md +65 -30
- package/_packed_docs/agent.md/SCHEMA.md +83 -58
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +1 -1
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +1 -1
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +1 -1
- package/_packed_docs/audit/AUN/346/234/215/345/212/241Go/345/214/226/351/207/215/346/236/204/347/262/276/347/273/206/345/214/226/346/272/220/347/240/201/345/256/241/346/237/245-20260718.md +366 -0
- package/_packed_docs/aun/345/205/254/347/275/221/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +234 -0
- package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1095 -0
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1199 -0
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
- package/_packed_docs/group-message-rpc-alignment-gaps.md +741 -0
- package/_packed_docs/message-online-push-alignment.md +572 -0
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +58 -20
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +219 -247
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +14 -14
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +3 -3
- package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +165 -421
- package/_packed_docs/protocol/README.md +1 -0
- package/_packed_docs/protocol/aun-docs-guide.md +7 -4
- package/_packed_docs/protocol/index.md +25 -19
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +63 -18
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +22 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +93 -84
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -2
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +73 -34
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +3 -3
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +21 -9
- package/_packed_docs/sdk/09-group-rpc-manual.md +319 -285
- package/_packed_docs/sdk/09-message-rpc-manual.md +144 -103
- package/_packed_docs/sdk/09-payload-reference.md +1 -1
- package/_packed_docs/sdk/09-storage-rpc-manual.md +14 -3
- package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +34 -23
- package/_packed_docs/sdk/CHANGELOG-0.5.6.md +73 -0
- package/_packed_docs/sdk/INDEX.md +45 -37
- package/_packed_docs/sdk/README.md +11 -9
- package/_packed_docs//345/217/221/345/270/203/346/212/245/345/221/212-0.5.6.md +260 -0
- package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/344/273/243/347/240/201/345/256/241/346/237/245/351/227/256/351/242/230/346/270/205/345/215/225.md +229 -0
- package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/346/224/271/351/200/240/346/226/271/346/241/210.md +750 -0
- package/dist/agent-md-schema.d.ts +14 -0
- package/dist/agent-md-schema.d.ts.map +1 -0
- package/dist/agent-md-schema.js +103 -0
- package/dist/agent-md-schema.js.map +1 -0
- package/dist/agent-md.d.ts +11 -5
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +295 -53
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +7 -7
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +46 -18
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +2 -0
- package/dist/aid.d.ts.map +1 -1
- package/dist/aid.js +29 -7
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +31 -11
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +29920 -19719
- package/dist/cert-utils.d.ts +1 -0
- package/dist/cert-utils.d.ts.map +1 -1
- package/dist/cert-utils.js +36 -16
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +106 -11
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +1925 -374
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts.map +1 -1
- package/dist/client/group-state.js +27 -24
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.d.ts +15 -1
- package/dist/client/lifecycle.d.ts.map +1 -1
- package/dist/client/lifecycle.js +477 -132
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/mention-mode.d.ts +7 -0
- package/dist/client/mention-mode.d.ts.map +1 -0
- package/dist/client/mention-mode.js +184 -0
- package/dist/client/mention-mode.js.map +1 -0
- package/dist/client/peers.d.ts +1 -1
- package/dist/client/peers.d.ts.map +1 -1
- package/dist/client/peers.js +26 -3
- package/dist/client/peers.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +34 -2
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +503 -99
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/runtime.d.ts +1 -3
- package/dist/client/runtime.d.ts.map +1 -1
- package/dist/client/runtime.js +4 -7
- package/dist/client/runtime.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +43 -2
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +931 -138
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +46 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +785 -304
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -1
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +26 -1
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +142 -60
- package/dist/facades.js.map +1 -1
- package/dist/group-id.d.ts.map +1 -1
- package/dist/group-id.js +2 -17
- package/dist/group-id.js.map +1 -1
- package/dist/group-index.d.ts +6 -1
- package/dist/group-index.d.ts.map +1 -1
- package/dist/group-index.js +44 -25
- package/dist/group-index.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +10 -5
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.d.ts +0 -12
- package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.js +0 -60
- package/dist/keystore/indexeddb-identity-store.js.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +9 -5
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +3 -1
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +47 -2
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +28 -3
- package/dist/register-flow.js.map +1 -1
- package/dist/seq-tracker.d.ts +28 -8
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +224 -61
- package/dist/seq-tracker.js.map +1 -1
- package/dist/storage/vfs.d.ts +1 -0
- package/dist/storage/vfs.d.ts.map +1 -1
- package/dist/storage/vfs.js +26 -2
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.js +399 -11
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +12 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +226 -102
- package/dist/transport.js.map +1 -1
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +3 -4
- package/dist/v2/session/session.js.map +1 -1
- package/dist/v2/state/commitment.d.ts.map +1 -1
- package/dist/v2/state/commitment.js +1 -2
- package/dist/v2/state/commitment.js.map +1 -1
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +8 -14
- package/dist/validators.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -9
- package/dist/group-resources.d.ts +0 -98
- package/dist/group-resources.d.ts.map +0 -1
- package/dist/group-resources.js +0 -635
- package/dist/group-resources.js.map +0 -1
- package/dist/keystore/indexeddb.d.ts +0 -179
- package/dist/keystore/indexeddb.d.ts.map +0 -1
- package/dist/keystore/indexeddb.js +0 -2031
- package/dist/keystore/indexeddb.js.map +0 -1
- package/dist/namespaces/auth.d.ts +0 -98
- package/dist/namespaces/auth.d.ts.map +0 -1
- package/dist/namespaces/auth.js +0 -992
- package/dist/namespaces/auth.js.map +0 -1
- package/dist/namespaces/custody.d.ts +0 -51
- package/dist/namespaces/custody.d.ts.map +0 -1
- package/dist/namespaces/custody.js +0 -302
- package/dist/namespaces/custody.js.map +0 -1
- package/dist/namespaces/meta.d.ts +0 -109
- package/dist/namespaces/meta.d.ts.map +0 -1
- package/dist/namespaces/meta.js +0 -549
- package/dist/namespaces/meta.js.map +0 -1
|
@@ -23,21 +23,22 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
23
23
|
| [message.thought.put](#messagethoughtput) | 写入某个 P2P 上下文的思考内容 |
|
|
24
24
|
| [message.thought.get](#messagethoughtget) | 读取某个 P2P 上下文的思考内容 |
|
|
25
25
|
| [message.pull](#messagepull) | 增量拉取消息 |
|
|
26
|
+
| [message.history](#messagehistory) | 向前只读翻页历史消息 |
|
|
26
27
|
| [message.ack](#messageack) | 确认送达 |
|
|
27
28
|
| [message.recall](#messagerecall) | 撤回消息 |
|
|
28
29
|
| [message.query_online](#messagequery_online) | 批量查询在线状态 |
|
|
29
30
|
|
|
30
|
-
### E2EE V2 辅助方法(SDK 内部使用)
|
|
31
|
-
|
|
32
|
-
> 以下方法由 SDK E2EE 层自动调用,应用层通常无需直接使用。
|
|
33
|
-
|
|
34
|
-
| 方法 | 说明 |
|
|
35
|
-
|------|------|
|
|
36
|
-
| message.v2.put_peer_pk | 注册/更新当前设备的 P2P SPK(`peer_device_prekey`) |
|
|
37
|
-
| message.v2.bootstrap | 拉取对端活跃设备、设备 IK/SPK、audit recipients 与 wrap 策略 |
|
|
38
|
-
| message.v2.group_bootstrap | Group 服务内部批量拉取成员设备 V2 公钥 |
|
|
39
|
-
|
|
40
|
-
> 旧 `message.e2ee.*` prekey/replay guard RPC 只属于 legacy E2EE 信封兼容路径;当前 SDK 主路径不再直接使用它们。新实现应使用 V2 多设备 wrap,详见 [05-E2EE加密通信](05-E2EE加密通信.md) 和 [E2EE_V2消息通信时序图](E2EE_V2消息通信时序图.md)。
|
|
31
|
+
### E2EE V2 辅助方法(SDK 内部使用)
|
|
32
|
+
|
|
33
|
+
> 以下方法由 SDK E2EE 层自动调用,应用层通常无需直接使用。
|
|
34
|
+
|
|
35
|
+
| 方法 | 说明 |
|
|
36
|
+
|------|------|
|
|
37
|
+
| message.v2.put_peer_pk | 注册/更新当前设备的 P2P SPK(`peer_device_prekey`) |
|
|
38
|
+
| message.v2.bootstrap | 拉取对端活跃设备、设备 IK/SPK、audit recipients 与 wrap 策略 |
|
|
39
|
+
| message.v2.group_bootstrap | Group 服务内部批量拉取成员设备 V2 公钥 |
|
|
40
|
+
|
|
41
|
+
> 旧 `message.e2ee.*` prekey/replay guard RPC 只属于 legacy E2EE 信封兼容路径;当前 SDK 主路径不再直接使用它们。新实现应使用 V2 多设备 wrap,详见 [05-E2EE加密通信](05-E2EE加密通信.md) 和 [E2EE_V2消息通信时序图](E2EE_V2消息通信时序图.md)。
|
|
41
42
|
|
|
42
43
|
## 事件索引
|
|
43
44
|
|
|
@@ -75,11 +76,11 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
75
76
|
|------|------|------|--------|------|
|
|
76
77
|
| `to` | string | 是 | — | 接收方 AID |
|
|
77
78
|
| `payload` | object | 是 | — | 消息内容(任意 JSON 对象) |
|
|
78
|
-
| `type` | string | 否 | — | 信封/封装类型,普通业务消息无需填写;SDK V2 加密发送时自动使用 `e2ee.p2p_encrypted` |
|
|
79
|
+
| `type` | string | 否 | — | 信封/封装类型,普通业务消息无需填写;SDK V2 加密发送时自动使用 `e2ee.p2p_encrypted` |
|
|
79
80
|
| `encrypted` | boolean | 否 | `false` | 底层 RPC 的 E2EE 标记。Python SDK 便捷层通常使用 `encrypt` 入参并由 SDK 自动填充此字段 |
|
|
80
81
|
| `message_id` | string | 否 | — | 幂等键(客户端提供或服务端生成 UUID) |
|
|
81
82
|
| `timestamp` | integer | 否 | — | 客户端时间戳(毫秒)。**服务端忽略此字段,始终使用服务端时间** |
|
|
82
|
-
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
83
|
+
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
83
84
|
|
|
84
85
|
> 连接级 `delivery_mode` 在 `auth.connect` 阶段声明,结构见 `02-WebSocket协议.md`。Python SDK 的 P2P 消息发送会沿用当前连接的 `delivery_mode`,应用层发送时无需重复指定。
|
|
85
86
|
> `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
|
|
@@ -97,17 +98,17 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
97
98
|
"message_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
98
99
|
"seq": 42,
|
|
99
100
|
"timestamp": 1234567890000,
|
|
100
|
-
"status": "delivered",
|
|
101
|
-
"delivery_mode": "fanout",
|
|
102
|
-
"envelope": {
|
|
103
|
-
"from": "alice.agentid.pub",
|
|
104
|
-
"to": "bob.agentid.pub",
|
|
105
|
-
"type": "text",
|
|
106
|
-
"timestamp": 1234567890000,
|
|
107
|
-
"encrypted": false,
|
|
108
|
-
"payload_type": "text"
|
|
109
|
-
},
|
|
110
|
-
"payload": {"type": "text", "text": "Hello!"}
|
|
101
|
+
"status": "delivered",
|
|
102
|
+
"delivery_mode": "fanout",
|
|
103
|
+
"envelope": {
|
|
104
|
+
"from": "alice.agentid.pub",
|
|
105
|
+
"to": "bob.agentid.pub",
|
|
106
|
+
"type": "text",
|
|
107
|
+
"timestamp": 1234567890000,
|
|
108
|
+
"encrypted": false,
|
|
109
|
+
"payload_type": "text"
|
|
110
|
+
},
|
|
111
|
+
"payload": {"type": "text", "text": "Hello!"}
|
|
111
112
|
},
|
|
112
113
|
"id": 1
|
|
113
114
|
}
|
|
@@ -118,11 +119,11 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
118
119
|
| `message_id` | string | 消息 ID |
|
|
119
120
|
| `seq` | integer | 接收方收件箱序号 |
|
|
120
121
|
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
121
|
-
| `status` | string | `"sent"` / `"delivered"` / `"duplicate"` |
|
|
122
|
-
| `delivery_mode` | string | 最终生效的连接级投递语义:`fanout` 或 `queue` |
|
|
123
|
-
| `envelope` | object | SDK 回填的发送结果信封,包含发送方、接收方、业务类型、时间戳、加密标志、protected headers 等可转发元数据 |
|
|
124
|
-
| `payload` | object | SDK 回填的应用层业务 payload;裸 RPC 或内部 `_skip_send_result_envelope` 路径可能没有该字段 |
|
|
125
|
-
| `cross_domain` | boolean | 仅跨域投递时出现,当前值为 `true` |
|
|
122
|
+
| `status` | string | `"sent"` / `"delivered"` / `"duplicate"` |
|
|
123
|
+
| `delivery_mode` | string | 最终生效的连接级投递语义:`fanout` 或 `queue` |
|
|
124
|
+
| `envelope` | object | SDK 回填的发送结果信封,包含发送方、接收方、业务类型、时间戳、加密标志、protected headers 等可转发元数据 |
|
|
125
|
+
| `payload` | object | SDK 回填的应用层业务 payload;裸 RPC 或内部 `_skip_send_result_envelope` 路径可能没有该字段 |
|
|
126
|
+
| `cross_domain` | boolean | 仅跨域投递时出现,当前值为 `true` |
|
|
126
127
|
| `target_issuer` | string | 仅跨域投递时出现,表示目标 issuer |
|
|
127
128
|
|
|
128
129
|
> **duplicate 响应**:当 `message_id` 重复时,若服务端仍缓存首次结果,返回完整首次响应并附加 `"status": "duplicate"`;若缓存已过期,仅返回 `message_id`、`timestamp`、`status`,**不含** `seq` 和 `delivery_mode`。客户端收到 `"duplicate"` 状态时应视为幂等成功,无需重试。
|
|
@@ -153,22 +154,22 @@ result = await client.call("message.send", {
|
|
|
153
154
|
|
|
154
155
|
写入当前发送者针对一个上下文的思考内容。它不是普通消息:不广播、不进 `message.pull`、不占用收件箱 `seq`,只通过 `message.thought.get` 主动读取。
|
|
155
156
|
|
|
156
|
-
SDK 调用时必须走 P2P E2EE。应用层传入明文 `payload`,SDK 会加密成 V2 `e2ee.p2p_encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,至少必须自行完成 V2 envelope、`sender_signature` 和 AAD 生成;`client_signature` 按 Gateway 连接级身份语义携带。
|
|
157
|
+
SDK 调用时必须走 P2P E2EE。应用层传入明文 `payload`,SDK 会加密成 V2 `e2ee.p2p_encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,至少必须自行完成 V2 envelope、`sender_signature` 和 AAD 生成;`client_signature` 按 Gateway 连接级身份语义携带。
|
|
157
158
|
|
|
158
|
-
存储键为 `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` 控制,当前默认值为 100;同一个 head 下可追加多条 thought item。
|
|
159
|
+
存储键为 `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` 控制,当前默认值为 100;同一个 head 下可追加多条 thought item。
|
|
159
160
|
|
|
160
161
|
### 参数
|
|
161
162
|
|
|
162
163
|
| 参数 | 类型 | 必填 | 说明 |
|
|
163
164
|
|------|------|------|------|
|
|
164
|
-
| `to` | string | 是 | P2P 会话另一方 AID,不能是群 `group_aid` |
|
|
165
|
+
| `to` | string | 是 | P2P 会话另一方 AID,不能是群 `group_aid` |
|
|
165
166
|
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
166
167
|
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
167
168
|
| `payload` | object | 是 | SDK 加密前的思考内容;推荐格式见 [09-payload-reference](09-payload-reference.md#thought思考内容) |
|
|
168
169
|
| `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
|
|
169
170
|
| `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `mt-*` |
|
|
170
171
|
| `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
|
|
171
|
-
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
172
|
+
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
172
173
|
|
|
173
174
|
### SDK 调用示例
|
|
174
175
|
|
|
@@ -187,9 +188,9 @@ await client.call("message.thought.put", {
|
|
|
187
188
|
"to": "bob.agentid.pub",
|
|
188
189
|
"context": {"type": "run", "id": "run-xxx"},
|
|
189
190
|
"thought_id": "mt-...",
|
|
190
|
-
"type": "e2ee.p2p_encrypted",
|
|
191
|
-
"encrypted": true,
|
|
192
|
-
"payload": {"type": "e2ee.p2p_encrypted", "version": "v2", "...": "..."},
|
|
191
|
+
"type": "e2ee.p2p_encrypted",
|
|
192
|
+
"encrypted": true,
|
|
193
|
+
"payload": {"type": "e2ee.p2p_encrypted", "version": "v2", "...": "..."},
|
|
193
194
|
"client_signature": { "...": "..." }
|
|
194
195
|
}
|
|
195
196
|
```
|
|
@@ -263,7 +264,7 @@ result = await client.call("message.thought.get", {
|
|
|
263
264
|
"to": "alice.agentid.pub",
|
|
264
265
|
"payload": {"type": "thought", "text": "需要补一个边界条件"},
|
|
265
266
|
"created_at": 1234567890000,
|
|
266
|
-
"e2ee": {"version": "v2", "wrap_protocol": "3DH"}
|
|
267
|
+
"e2ee": {"version": "v2", "wrap_protocol": "3DH"}
|
|
267
268
|
}
|
|
268
269
|
],
|
|
269
270
|
"updated_at": 1234567890000
|
|
@@ -299,11 +300,11 @@ result = await client.call("message.thought.get", {
|
|
|
299
300
|
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
300
301
|
|------|------|------|--------|------|
|
|
301
302
|
| `after_seq` | integer | 否 | 0 | 拉取 seq > after_seq 的消息 |
|
|
302
|
-
| `limit` | integer | 否 | 50 | 单次返回上限(最大 50;`pull_max_limit` 配置只能在 1-50 内进一步收紧) |
|
|
303
|
+
| `limit` | integer | 否 | 50 | 单次返回上限(最大 50;`pull_max_limit` 配置只能在 1-50 内进一步收紧) |
|
|
303
304
|
| `device_id` | string | 否 | 当前连接实例 | 多实例消费上下文中的设备标识 |
|
|
304
|
-
| `slot_id` | string | 否 | 当前连接实例 | 同一设备下的消费槽位;可用 `/`、`:`、空格表达共享隔离键,如 `evolclaw cli` |
|
|
305
|
-
|
|
306
|
-
> 四个 SDK 都会自动为 `message.pull` 注入当前实例的 `device_id` / `slot_id`。显式传入 `slot_id` 时按 `slotIsolationKey` 比较,`evolclaw cli` 与 `evolclaw daemon` 视为同一隔离键;不同隔离键会在发出 RPC 前被拒绝。
|
|
305
|
+
| `slot_id` | string | 否 | 当前连接实例 | 同一设备下的消费槽位;可用 `/`、`:`、空格表达共享隔离键,如 `evolclaw cli` |
|
|
306
|
+
|
|
307
|
+
> 四个 SDK 都会自动为 `message.pull` 注入当前实例的 `device_id` / `slot_id`。显式传入 `slot_id` 时按 `slotIsolationKey` 比较,`evolclaw cli` 与 `evolclaw daemon` 视为同一隔离键;不同隔离键会在发出 RPC 前被拒绝。
|
|
307
308
|
|
|
308
309
|
### 响应
|
|
309
310
|
|
|
@@ -343,6 +344,14 @@ result = await client.call("message.thought.get", {
|
|
|
343
344
|
| `ephemeral_earliest_available_seq` | integer\|null | 临时缓冲中可用的最小 seq |
|
|
344
345
|
| `ephemeral_dropped_count` | integer | 已被淘汰的临时消息数 |
|
|
345
346
|
|
|
347
|
+
`message.pull` 是公开的 Forward Pull。实时 A/T/H 最新页同步由 SDK 内部自动完成,不提供需要应用传入的模式参数。Forward 页通过结构校验后,本地 A 按原始页最大 seq 推进。页内缺号视为服务端永久空号;单条解密失败通过 `message.undecryptable` 报告,不阻塞后续水位。Forward 仍支持 Piggy ACK:存在待提交 ACK 时,即使当前页非满页也会再拉一页并携带 ACK,空页后停止。
|
|
348
|
+
|
|
349
|
+
`message.pull` 与 `message.history` 进入当前 `AUNClient` 的客户端级 Pull Gate。该 Gate 与 Group Message、Group Event Pull 共享,始终 single-inflight;相同请求 key 折叠并共享结果,不同 key 按前台 FIFO(Tail/History)优先于后台 FIFO(Forward/Gap Fill/Group Event)排队。不同 `AUNClient` 实例之间不共享 Gate,应用层无需自行实现并发控制。
|
|
350
|
+
|
|
351
|
+
解密当前消息时若缺少 sender IK,SDK 会把同发送端请求 single-flight 合并,最多同步等待 3 秒执行 bootstrap;获取成功立即重试当前消息,失败或超时才进入 pending。该补救不改变 Forward 按原始页推进 A 的规则。
|
|
352
|
+
|
|
353
|
+
SDK 只保证单个实时拉取响应页内按 seq 升序、同 seq 最多发布一次。A/T/H 是扫描水位,不记录应用是否已经收到回调;跨 Push、SDK 自动最新页同步和 Forward 页允许重复和乱序。全局去重与排序由应用业务仓库负责,不是 SDK 交付契约;应用必须按 `(namespace, message_id)` 幂等并按 `seq` 排序。SDK 进程内折叠仅作 best-effort 优化。History 只返回结果,不参与实时发布。
|
|
354
|
+
|
|
346
355
|
### 示例
|
|
347
356
|
|
|
348
357
|
```python
|
|
@@ -353,6 +362,36 @@ for msg in result["messages"]:
|
|
|
353
362
|
|
|
354
363
|
---
|
|
355
364
|
|
|
365
|
+
## message.history
|
|
366
|
+
|
|
367
|
+
向 seq 更小的方向只读翻页。History 不读取或修改实时 A/T/H,不推进 ACK,也不触发 `message.received`。
|
|
368
|
+
|
|
369
|
+
### 参数
|
|
370
|
+
|
|
371
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
372
|
+
|------|------|------|--------|------|
|
|
373
|
+
| `before_seq` | integer | 是 | — | 排他上界,只返回 `seq < before_seq` 的消息 |
|
|
374
|
+
| `limit` | integer | 否 | 50 | 单页上限,最大 50 |
|
|
375
|
+
|
|
376
|
+
### 响应
|
|
377
|
+
|
|
378
|
+
| 字段 | 类型 | 说明 |
|
|
379
|
+
|------|------|------|
|
|
380
|
+
| `messages` | array | 页内按 seq 升序;解密失败项以结构化错误返回 |
|
|
381
|
+
| `window_start_seq` | integer\|null | 本页最小边界;空页为 `null` |
|
|
382
|
+
| `next_before_seq` | integer\|null | 下一页直接使用的排他上界 |
|
|
383
|
+
| `has_older` | boolean | 是否仍有更早的可见消息 |
|
|
384
|
+
| `retention_floor_seq` | integer | 已实际删除、不可恢复的 seq 下界 |
|
|
385
|
+
| `earliest_available_seq` | integer\|null | 当前最早可拉取边界 |
|
|
386
|
+
|
|
387
|
+
```python
|
|
388
|
+
page = await client.message.history(before_seq=101, limit=50)
|
|
389
|
+
while page.get("has_older"):
|
|
390
|
+
page = await client.message.history(before_seq=page["next_before_seq"], limit=50)
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
356
395
|
## message.ack
|
|
357
396
|
|
|
358
397
|
确认已收到消息。推进接收方的 ack_seq 游标。
|
|
@@ -378,9 +417,9 @@ for msg in result["messages"]:
|
|
|
378
417
|
|------|------|------|--------|------|
|
|
379
418
|
| `seq` | integer | 是 | — | 确认 seq ≤ 此值的所有消息 |
|
|
380
419
|
| `device_id` | string | 否 | 当前连接实例 | 多实例消费上下文中的设备标识 |
|
|
381
|
-
| `slot_id` | string | 否 | 当前连接实例 | 同一设备下的消费槽位;可用 `/`、`:`、空格表达共享隔离键,如 `evolclaw cli` |
|
|
382
|
-
|
|
383
|
-
> 四个 SDK 都会自动为 `message.ack` 注入当前实例的 `device_id` / `slot_id`。显式传入 `slot_id` 时按 `slotIsolationKey` 比较,`evolclaw cli` 与 `evolclaw daemon` 视为同一隔离键;不同隔离键会在发出 RPC 前被拒绝。
|
|
420
|
+
| `slot_id` | string | 否 | 当前连接实例 | 同一设备下的消费槽位;可用 `/`、`:`、空格表达共享隔离键,如 `evolclaw cli` |
|
|
421
|
+
|
|
422
|
+
> 四个 SDK 都会自动为 `message.ack` 注入当前实例的 `device_id` / `slot_id`。显式传入 `slot_id` 时按 `slotIsolationKey` 比较,`evolclaw cli` 与 `evolclaw daemon` 视为同一隔离键;不同隔离键会在发出 RPC 前被拒绝。
|
|
384
423
|
|
|
385
424
|
### 响应
|
|
386
425
|
|
|
@@ -520,41 +559,43 @@ result = await client.call("message.ack", {"seq": 150})
|
|
|
520
559
|
|
|
521
560
|
收到新消息时推送。
|
|
522
561
|
|
|
562
|
+
**实时推送优化**(0.5.6+):当客户端在 `auth.connect` 时声明 `inline_realtime_payload_v1: true` 能力后,Gateway 会在事件中直接内联完整的消息载荷(`payload`、`envelope` 等),无需额外调用 `message.pull`。SDK 自动声明此能力,应用层无需关注。对于离线消息和历史消息,仍需通过 `message.pull` 拉取。
|
|
563
|
+
|
|
523
564
|
### Payload
|
|
524
565
|
|
|
525
|
-
```json
|
|
526
|
-
{
|
|
527
|
-
"envelope": {
|
|
528
|
-
"from": "alice.agentid.pub",
|
|
529
|
-
"to": "bob.agentid.pub",
|
|
530
|
-
"type": "text",
|
|
531
|
-
"timestamp": 1234567890000,
|
|
532
|
-
"encrypted": false
|
|
533
|
-
},
|
|
534
|
-
"message_id": "uuid-1",
|
|
535
|
-
"from": "alice.agentid.pub",
|
|
536
|
-
"to": "bob.agentid.pub",
|
|
566
|
+
```json
|
|
567
|
+
{
|
|
568
|
+
"envelope": {
|
|
569
|
+
"from": "alice.agentid.pub",
|
|
570
|
+
"to": "bob.agentid.pub",
|
|
571
|
+
"type": "text",
|
|
572
|
+
"timestamp": 1234567890000,
|
|
573
|
+
"encrypted": false
|
|
574
|
+
},
|
|
575
|
+
"message_id": "uuid-1",
|
|
576
|
+
"from": "alice.agentid.pub",
|
|
577
|
+
"to": "bob.agentid.pub",
|
|
537
578
|
"seq": 42,
|
|
538
579
|
"timestamp": 1234567890000,
|
|
539
580
|
"payload": {"type": "text", "text": "Hello!"},
|
|
540
|
-
"delivery_mode": "queue",
|
|
541
|
-
"encrypted": false,
|
|
542
|
-
"proximity": {
|
|
543
|
-
"same_device": false,
|
|
544
|
-
"same_egress_ip": true,
|
|
545
|
-
"same_network": true,
|
|
546
|
-
"basis": "egress_ip",
|
|
547
|
-
"asserted_by": "gateway"
|
|
548
|
-
},
|
|
549
|
-
"same_device": false,
|
|
550
|
-
"same_egress_ip": true,
|
|
551
|
-
"same_network": true
|
|
552
|
-
}
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `from_aid` / `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.5.x 当前仍保留顶层 `message_id` / `from` / `to` / `seq` / `timestamp` 等兼容别名;新代码应优先通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。`envelope.agent_md.sender` / `envelope.agent_md.group` 是 agent.md 云端版本提示,SDK 会自动观察并写入本地 `remote_etag`。Gateway 可能附加 `proximity` 及 `same_device` / `same_egress_ip` / `same_network`,表示由 Gateway 基于连接上下文判断的近端关系提示,不参与 E2EE AAD 或业务鉴权。
|
|
556
|
-
|
|
557
|
-
### 订阅
|
|
581
|
+
"delivery_mode": "queue",
|
|
582
|
+
"encrypted": false,
|
|
583
|
+
"proximity": {
|
|
584
|
+
"same_device": false,
|
|
585
|
+
"same_egress_ip": true,
|
|
586
|
+
"same_network": true,
|
|
587
|
+
"basis": "egress_ip",
|
|
588
|
+
"asserted_by": "gateway"
|
|
589
|
+
},
|
|
590
|
+
"same_device": false,
|
|
591
|
+
"same_egress_ip": true,
|
|
592
|
+
"same_network": true
|
|
593
|
+
}
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `from_aid` / `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.5.x 当前仍保留顶层 `message_id` / `from` / `to` / `seq` / `timestamp` 等兼容别名;新代码应优先通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。`envelope.agent_md.sender` / `envelope.agent_md.group` 是 agent.md 云端版本提示,SDK 会自动观察并写入本地 `remote_etag`。Gateway 可能附加 `proximity` 及 `same_device` / `same_egress_ip` / `same_network`,表示由 Gateway 基于连接上下文判断的近端关系提示,不参与 E2EE AAD 或业务鉴权。
|
|
597
|
+
|
|
598
|
+
### 订阅
|
|
558
599
|
|
|
559
600
|
```python
|
|
560
601
|
client.on("message.received", lambda msg: print(msg["payload"]))
|
|
@@ -568,35 +609,35 @@ client.on("message.received", lambda msg: print(msg["payload"]))
|
|
|
568
609
|
|
|
569
610
|
### Payload
|
|
570
611
|
|
|
571
|
-
```json
|
|
572
|
-
{
|
|
573
|
-
"envelope": {
|
|
574
|
-
"from": "alice.agentid.pub",
|
|
575
|
-
"to": "bob.agentid.pub",
|
|
576
|
-
"type": "message.recalled",
|
|
577
|
-
"kind": "message.recalled",
|
|
578
|
-
"timestamp": 1234567890000
|
|
579
|
-
},
|
|
580
|
-
"message_id": "recall-uuid",
|
|
581
|
-
"tombstone_message_id": "recall-uuid",
|
|
582
|
-
"from": "alice.agentid.pub",
|
|
583
|
-
"to": "bob.agentid.pub",
|
|
584
|
-
"message_ids": ["uuid-1", "uuid-2"],
|
|
585
|
-
"timestamp": 1234567890000
|
|
586
|
-
}
|
|
587
|
-
```
|
|
588
|
-
|
|
589
|
-
SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示撤回 tombstone / 通知自身的信封,不是被撤回原消息的信封;被撤回的原消息继续通过 `message_ids` 表达。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.5.x 当前仍保留顶层 `message_id` / `from` / `to` / `seq` / `timestamp` 等兼容别名;新代码应优先读取 `envelope` 和 `message_ids`。
|
|
590
|
-
|
|
591
|
-
| 字段 | 类型 | 说明 |
|
|
592
|
-
|------|------|------|
|
|
593
|
-
| `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `from`、`to`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
|
|
594
|
-
| `message_id` | string | 撤回 tombstone / 通知自身的 message_id |
|
|
595
|
-
| `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
|
|
596
|
-
| `from` | string | 发送方(撤回者)AID |
|
|
597
|
-
| `to` | string | 接收方 AID |
|
|
598
|
-
| `message_ids` | array | 被撤回的消息 ID 列表 |
|
|
599
|
-
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
612
|
+
```json
|
|
613
|
+
{
|
|
614
|
+
"envelope": {
|
|
615
|
+
"from": "alice.agentid.pub",
|
|
616
|
+
"to": "bob.agentid.pub",
|
|
617
|
+
"type": "message.recalled",
|
|
618
|
+
"kind": "message.recalled",
|
|
619
|
+
"timestamp": 1234567890000
|
|
620
|
+
},
|
|
621
|
+
"message_id": "recall-uuid",
|
|
622
|
+
"tombstone_message_id": "recall-uuid",
|
|
623
|
+
"from": "alice.agentid.pub",
|
|
624
|
+
"to": "bob.agentid.pub",
|
|
625
|
+
"message_ids": ["uuid-1", "uuid-2"],
|
|
626
|
+
"timestamp": 1234567890000
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示撤回 tombstone / 通知自身的信封,不是被撤回原消息的信封;被撤回的原消息继续通过 `message_ids` 表达。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.5.x 当前仍保留顶层 `message_id` / `from` / `to` / `seq` / `timestamp` 等兼容别名;新代码应优先读取 `envelope` 和 `message_ids`。
|
|
631
|
+
|
|
632
|
+
| 字段 | 类型 | 说明 |
|
|
633
|
+
|------|------|------|
|
|
634
|
+
| `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `from`、`to`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
|
|
635
|
+
| `message_id` | string | 撤回 tombstone / 通知自身的 message_id |
|
|
636
|
+
| `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
|
|
637
|
+
| `from` | string | 发送方(撤回者)AID |
|
|
638
|
+
| `to` | string | 接收方 AID |
|
|
639
|
+
| `message_ids` | array | 被撤回的消息 ID 列表 |
|
|
640
|
+
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
600
641
|
|
|
601
642
|
### 订阅
|
|
602
643
|
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
| `from` / `sender_aid` | 服务端生成的消息信封 | 发送方身份 |
|
|
45
45
|
| `message_id` / `seq` / `timestamp` / `created_at` | 服务端生成或发送参数 | 当前消息 ID、序号和服务端时间 |
|
|
46
46
|
| `encrypted` / `delivery_mode` | 发送参数或连接上下文 | 加密和 P2P 投递语义 |
|
|
47
|
-
| `
|
|
47
|
+
| `mention_mode` | 群消息信封和 SDK 注入的群消息 payload | 群消息应用层提及过滤模式标签:`disabled` / `mention-only`;由群设置决定,不作为 `group.send` 单次入参。SDK 从服务端消息元数据复制到对象 payload |
|
|
48
48
|
| `type` / `message_type` | 发送参数或消息信封 | 信封/封装类型,如 `e2ee.p2p_encrypted` / `e2ee.group_encrypted` |
|
|
49
49
|
| `dispatch` / `duty_state` / `message_dispatch` | `group.send` 响应和群消息事件 | 群消息运行时分发状态和值班分发结果 |
|
|
50
50
|
|
|
@@ -647,9 +647,20 @@ for obj in result["items"]:
|
|
|
647
647
|
| `version` | integer | 版本号 |
|
|
648
648
|
| `etag` | string | 实体标签 |
|
|
649
649
|
|
|
650
|
-
`url` 是推荐使用的干净链接。访问时 storage 服务实时鉴权:public 文件直接通过,private 文件需 `?t=` token 或 `Authorization: Bearer <AID JWT>` 头证明 owner 身份。鉴权通过后 storage 302 到 blob 后端完成实际下载,这一步对客户端完全透明。
|
|
651
|
-
|
|
652
|
-
|
|
650
|
+
`url` 是推荐使用的干净链接。访问时 storage 服务实时鉴权:public 文件直接通过,private 文件需 `?t=` token 或 `Authorization: Bearer <AID JWT>` 头证明 owner 身份。鉴权通过后 storage 302 到 blob 后端完成实际下载,这一步对客户端完全透明。
|
|
651
|
+
|
|
652
|
+
### 数据面 HTTP 下载流程
|
|
653
|
+
|
|
654
|
+
1. 通过控制面 RPC `storage.create_download_ticket` 获取短 TTL 的下载票据,不把长期对象 URL 当作最终下载地址。
|
|
655
|
+
2. 优先使用返回的 `url` / `download_url`,完整保留查询参数。URL 已包含 `?t=` 时,该值就是资源域签发的能力凭据,按原样请求即可,不要替换为 AID access token。
|
|
656
|
+
3. 只有目标端点明确要求 `Authorization: Bearer <AID JWT>` 时,才在发起请求前读取当前 token:Python 使用 `get_access_token()`,TypeScript / JavaScript 使用 `getAccessToken()`,Go 使用 `GetAccessToken()`。不得长期保存 `authenticate()` 首次返回的 token,也不得跨多次请求缓存 getter 的返回值。
|
|
657
|
+
4. getter 只读后台刷新任务维护的缓存,不主动刷新。返回空值时先完成身份加载和认证/连接,不发送空 Bearer。跨 issuer 下载必须使用资源所在域签发的 `?t=` 票据,不能把调用方所在域的 AID JWT 发给远端 storage。
|
|
658
|
+
5. Bearer 请求收到 401/403 时,重新读取一次 getter;仅当 token 已变化时最多重试一次。token 未变化时保留真实鉴权/授权错误,不得无限重试。票据过期则重新调用 `create_download_ticket`,不能靠刷新 AID token 延长票据。
|
|
659
|
+
6. 跟随 302 时不得把 AID Bearer 转发到不同 origin 的 blob backend;下载完成后校验 `size_bytes` / `sha256`。
|
|
660
|
+
|
|
661
|
+
SDK Storage VFS 会编排 ticket、HTTP GET 和完整性校验。应用只有在绕过 VFS、自行执行 HTTP 请求时,才需要直接处理上述凭据生命周期。
|
|
662
|
+
|
|
663
|
+
---
|
|
653
664
|
|
|
654
665
|
## 事件
|
|
655
666
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
| 端点 | 协议 | 说明 |
|
|
17
17
|
|------|------|------|
|
|
18
|
-
| `/push/{stream_id}` | WebSocket |
|
|
18
|
+
| `/push/{stream_id}` | WebSocket | 推流。使用 `Authorization: Bearer {push_token}` 或 `X-Stream-Token`;不接受 query token |
|
|
19
19
|
| `/pull/{stream_id}` | HTTP SSE | 拉流。推荐使用 `Authorization: Bearer {pull_token}`,可跨域 |
|
|
20
20
|
| `/health` | HTTP GET | 健康检查 |
|
|
21
21
|
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
| 字段 | 类型 | 说明 |
|
|
39
39
|
|------|------|------|
|
|
40
40
|
| `stream_id` | string | 流唯一 ID(16 位 hex) |
|
|
41
|
-
| `push_url` | string | 推流 WebSocket URL
|
|
42
|
-
| `pull_url` | string | 拉流 HTTP SSE URL
|
|
41
|
+
| `push_url` | string | 推流 WebSocket URL(不含凭据) |
|
|
42
|
+
| `pull_url` | string | 拉流 HTTP SSE URL(不含凭据) |
|
|
43
43
|
| `push_token` | string | 推流凭证 |
|
|
44
44
|
| `pull_token` | string | 拉流凭证,便于通过 message.send 单独传递 |
|
|
45
45
|
| `push_headers` | object | 推流 Authorization header(`{"Authorization": "Bearer {push_token}"}`) |
|
|
@@ -54,8 +54,8 @@ result = await client.call("stream.create", {
|
|
|
54
54
|
})
|
|
55
55
|
# result = {
|
|
56
56
|
# "stream_id": "4d5067f203cf42ba",
|
|
57
|
-
# "push_url": "wss://stream.aid.com:9490/push/4d5067f203cf42ba
|
|
58
|
-
# "pull_url": "https://stream.aid.com:9490/pull/4d5067f203cf42ba
|
|
57
|
+
# "push_url": "wss://stream.aid.com:9490/push/4d5067f203cf42ba",
|
|
58
|
+
# "pull_url": "https://stream.aid.com:9490/pull/4d5067f203cf42ba",
|
|
59
59
|
# "push_token": "ec80...",
|
|
60
60
|
# "pull_token": "c438953be0ca887b...",
|
|
61
61
|
# "push_headers": {"Authorization": "Bearer ec80..."},
|
|
@@ -63,7 +63,7 @@ result = await client.call("stream.create", {
|
|
|
63
63
|
# }
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
>
|
|
66
|
+
> `push_url` / `pull_url` 不携带凭据。客户端必须使用返回的 `push_headers` / `pull_headers`,或把对应 token 放入 `Authorization: Bearer ...` / `X-Stream-Token` Header。
|
|
67
67
|
|
|
68
68
|
### 错误
|
|
69
69
|
|
|
@@ -169,7 +169,7 @@ for s in result["streams"]:
|
|
|
169
169
|
|
|
170
170
|
## 数据面:推流 WebSocket
|
|
171
171
|
|
|
172
|
-
连接 `stream.create` 返回的 `push_url`,通过 WebSocket 发送 JSON
|
|
172
|
+
连接 `stream.create` 返回的 `push_url`,通过 WebSocket 发送 JSON 帧。使用 `Authorization: Bearer` 或 `X-Stream-Token` 请求头传递 token;query string 不接受凭据。
|
|
173
173
|
|
|
174
174
|
### 帧格式
|
|
175
175
|
|
|
@@ -210,7 +210,7 @@ WebSocket 断开后,服务端保留流状态最多 120 秒。重连后继续
|
|
|
210
210
|
|
|
211
211
|
连接 `stream.create` 返回的 `pull_url`,接收标准 SSE 流。
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
使用 `Authorization: Bearer` 或 `X-Stream-Token` 请求头传递 pull token;若提供拉流方 AID,使用 `X-Stream-AID` 请求头;query 参数不接受凭据或身份。
|
|
214
214
|
|
|
215
215
|
### SSE 格式
|
|
216
216
|
|
|
@@ -9,11 +9,12 @@ AUN SDK 文档位于 `docs/sdk/`,索引文件 `docs/sdk/INDEX.md` 分三层:
|
|
|
9
9
|
- `AIDStore`:注册、加载、列举、解析和证书运维。
|
|
10
10
|
- `AID`:不可变身份值对象,负责签名、验签和 agent.md 签验。
|
|
11
11
|
- `AUNClient`:认证、连接、状态机、事件和 RPC。
|
|
12
|
+
- `PushFacade`:Python SDK 的当前安装推送登记、注销和 Push Server 批次 ACK。
|
|
12
13
|
- `ServiceProxyClient`:Python SDK 的 Service Proxy provider 侧客户端,负责 Gateway 控制面注册和 proxy-server 数据面隧道注册。
|
|
13
14
|
|
|
14
|
-
业务 RPC 的底层参数见 `09-*-rpc-manual.md
|
|
15
|
+
业务 RPC 的底层参数见 `09-*-rpc-manual.md`。Agent.md Schema、签名和上传前校验见 `../agent.md/SCHEMA.md` 与 `04-连接与认证.md`。A/T/H、SDK 内部自动最新页同步、Forward 调度和每个 AUNClient 一个 Pull Gate(始终 single-inflight、相同 key 折叠、不同 key 排队、前台 FIFO 优先)见 `03-核心概念.md`;`message.history` / `group.history` 与 Piggy ACK 见 Message/Group RPC Manual。Storage、Collab、Group FS、Service Proxy 等具备高层门面的能力以对应专项文档为准。
|
|
15
16
|
|
|
16
|
-
Storage 的 SDK VFS、控制面/数据面分离、direct backend
|
|
17
|
+
Storage 的 SDK VFS、控制面/数据面分离、direct backend 上传下载、ticket / AID Bearer 边界、当前 access token getter、类 Linux 权限、mount/symlink 和服务端分层见 `AUN Storage架构设计.md`。
|
|
17
18
|
Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI、`cp/mv` 语义、群自有区角色 ACL 授权/撤销/查询与 `group_aid` 签名、`parents` 语义、JS string 差异和 memberdata 服务端映射见 `09-group-rpc-manual.md`。Collab 的 `gc`、`reflog`、`revert`、`clone` 及版本化文档/标签语义见 `09-collab-rpc-manual.md`。
|
|
18
19
|
|
|
19
20
|
## 渐进式查阅流程
|
|
@@ -27,15 +28,17 @@ Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI
|
|
|
27
28
|
常见主题:
|
|
28
29
|
|
|
29
30
|
- 身份与认证:AIDStore / AID / 注册 / 加载 / 证书
|
|
30
|
-
- 连接与状态:AUNClient / 九态状态机 / Gateway / 重连
|
|
31
|
+
- 连接与状态:AUNClient / 九态状态机 / Gateway / 重连 / 当前 access token getter / connect-disconnect-close 并发与取消
|
|
31
32
|
- E2EE:默认加密、ProtectedHeaders、P2P / Group V2
|
|
32
33
|
- RPC 与事件:`client.call()`、`client.on()`、`client.notify()`、RPC 手册
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
34
|
+
- 离线推送:Python `connect()` 的 `push_notify_aid/push_token`、`client.push.register/unregister`、Push Server ACK
|
|
35
|
+
- 消息同步:A/T/H、Tail、Forward、History、页内唯一有序发布、应用层跨页幂等排序、每个 AUNClient 一个 Pull Gate(P2P Message/Group Message/Group Event Pull 共享,始终单飞、相同 key 折叠、不同 key 排队、前台 FIFO 优先)、缺 sender IK 有界同步 bootstrap、永久页内 Gap、坏密文推进
|
|
36
|
+
- Storage:SDK VFS、direct backend 数据面、下载 ticket / AID Bearer 边界、`storage.*` low-level RPC、类 Linux 权限、mount/symlink、Storage Service 分层
|
|
37
|
+
- Group RPC:群提及过滤 `mention_mode`、`group_aid` / `group_id` 兼容、`group.index` 签名索引、`_meta.group_indexes`、`check/get/updateGroupIndex`、`expected_index_etag` CAS(见 `09-group-rpc-manual.md`、`06-API手册.md`)
|
|
38
|
+
- 群文件系统:`group.fs.*`、`client.group.fs.*`、`aun group fs`、`cp/mv` 上传下载、群自有区角色 ACL 与 `group_aid` 签名、`parents`、JS string 差异和 memberdata 服务端映射(见 `09-group-rpc-manual.md`)
|
|
36
39
|
- 协作(collab):`collab.*` 版本化文档、乐观锁 CAS commit、三方合并、标签、GC、reflog、revert(见 `09-collab-rpc-manual.md`)
|
|
37
40
|
- Service Proxy:`ServiceProxyClient`、`proxy.register_services`、proxy-server `register_services`
|
|
38
|
-
- agent.md
|
|
41
|
+
- agent.md:Schema/frontmatter、尾部签名、4 KiB/2048 字节限制、`AIDStore.register()` 默认自动上传、上传前完整校验、`agent_md_validation_v1`、`uploader_aid` / `uploaderAid`、`AIDStore.upload_agent_md()` / `download_agent_md()` / `check_agent_md()`、Gateway `_meta.agent_md_etags` 被动观察、`requester` / `peer` / `group` 角色
|
|
39
42
|
- 错误处理:Result、异常、错误码、重试
|
|
40
43
|
|
|
41
44
|
### Step 3:读 Layer 3 摘要
|
|
@@ -46,15 +49,17 @@ Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI
|
|
|
46
49
|
|
|
47
50
|
| 编号 | 文档 | 定位 |
|
|
48
51
|
|------|------|------|
|
|
52
|
+
| - | [CHANGELOG-0.5.6](CHANGELOG-0.5.6.md) | **0.5.6 版本更新日志**:首次签名者回源、下载提交前验签、消息窗口、显式 change-seed 与语言能力边界 |
|
|
49
53
|
| 01 | [快速开始](01-快速开始.md) | 安装、三主体模型、最小示例 |
|
|
50
|
-
| 02 | [WebSocket协议](02-WebSocket协议.md) |
|
|
51
|
-
| 03 | [核心概念](03-核心概念.md) | AID
|
|
52
|
-
| 04 | [连接与认证](04-连接与认证.md) | AIDStore
|
|
53
|
-
| 05 | [E2EE加密通信](05-E2EE加密通信.md) | E2EE V2、ProtectedHeaders、agent.md 版本提示、recipient wrap |
|
|
54
|
-
| 06 | [API手册](06-API手册.md) | AIDStore / AID / AUNClient /
|
|
54
|
+
| 02 | [WebSocket协议](02-WebSocket协议.md) | 握手流程、Capabilities 能力声明、各层大小限制、消息格式、裸 WebSocket |
|
|
55
|
+
| 03 | [核心概念](03-核心概念.md) | AID、A/T/H、Pull Gate、状态机、E2EE |
|
|
56
|
+
| 04 | [连接与认证](04-连接与认证.md) | AIDStore、默认 agent.md 自动上传、连接生命周期并发/取消、当前 access token getter、网关发现、事件、agent.md 校验和自动观察 |
|
|
57
|
+
| 05 | [E2EE加密通信](05-E2EE加密通信.md) | E2EE V2、ProtectedHeaders、agent.md 版本提示、recipient wrap |
|
|
58
|
+
| 06 | [API手册](06-API手册.md) | AIDStore / Agent.md 校验签名 / AID / AUNClient 生命周期并发 / 四 SDK access token getter / 群组高层身份编排 / History 门面 / 事件 / RPC |
|
|
55
59
|
| 07 | [错误处理](07-错误处理.md) | Result、异常、错误码、重试 |
|
|
56
|
-
| 08 | [最佳实践](08-最佳实践.md) |
|
|
57
|
-
| - | [
|
|
60
|
+
| 08 | [最佳实践](08-最佳实践.md) | 幂等、消息同步/History、AUNClient 级 Pull Gate(始终单飞)、测试数据 |
|
|
61
|
+
| - | [Storage RPC 手册](09-storage-rpc-manual.md) | Storage RPC、数据面 HTTP 下载流程、ticket / AID Bearer 边界、跨 issuer 下载 |
|
|
62
|
+
| - | [AUN Storage架构设计](<../aun-fs/AUN Storage架构设计.md>) | Storage SDK VFS、控制面/数据面分离、类 Linux 权限、mount/symlink、服务端分层 |
|
|
58
63
|
| 09 | `09-*-rpc-manual.md` | 各服务 RPC 参数和响应 |
|
|
59
64
|
| 09 | [Service Proxy RPC手册](09-proxy-rpc-manual.md) | `proxy.*` 控制面和 proxy-server 数据面注册 |
|
|
60
65
|
| 09 | [AID托管API手册](09-custody-api-manual.md) | 可选 custody HTTP 服务 |
|
|
@@ -63,18 +68,24 @@ Group FS 的 `group.fs.*` RPC、`client.group.fs.*` 门面、`aun group fs` CLI
|
|
|
63
68
|
|
|
64
69
|
| 场景 | 推荐路径 |
|
|
65
70
|
|------|----------|
|
|
71
|
+
| 了解最新版本特性和改进 | [CHANGELOG-0.5.6](CHANGELOG-0.5.6.md) |
|
|
66
72
|
| 首次使用 SDK | [01-快速开始](01-快速开始.md) |
|
|
67
73
|
| 理解新构造入口 | [01-快速开始](01-快速开始.md)、[06-API手册](06-API手册.md) |
|
|
68
|
-
| 注册或加载 AID | [04-连接与认证](04-连接与认证.md) |
|
|
69
|
-
|
|
|
74
|
+
| 注册或加载 AID | [04-连接与认证](04-连接与认证.md) |
|
|
75
|
+
| 自行发起 HTTP 数据面请求并获取当前 access token | [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)、[Storage RPC 手册:数据面 HTTP 下载流程](09-storage-rpc-manual.md#数据面-http-下载流程) |
|
|
76
|
+
| 发布、下载、检查或排查 agent.md(含 Schema/签名/大小限制)及远端 ETag | [../agent.md/SCHEMA.md](../agent.md/SCHEMA.md)、[04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)、[../agent.md/远程agent.md缓存与etag透传方案.md](../agent.md/远程agent.md缓存与etag透传方案.md) |
|
|
70
77
|
| 状态机和重连 | [03-核心概念](03-核心概念.md)、[04-连接与认证](04-连接与认证.md) |
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
| 查
|
|
77
|
-
|
|
|
78
|
+
| 查 Capabilities 能力声明、实时推送优化 | [02-WebSocket协议](02-WebSocket协议.md)、[CHANGELOG-0.5.6](CHANGELOG-0.5.6.md) |
|
|
79
|
+
| 登记、更新或注销 `push_notify_aid` | [04-连接与认证](04-连接与认证.md)、[06-API手册](06-API手册.md)、`docs/protocol/15-离线推送通知协议.md` |
|
|
80
|
+
| 查方法签名、群组高层 facade 和 `aid_store` / `aidStore` | [06-API手册](06-API手册.md) |
|
|
81
|
+
| 查消息或群组 RPC、群提及过滤 `mention_mode` | 对应 `09-*-rpc-manual.md`;`mention_mode` 详见 [09-group-rpc-manual.md](09-group-rpc-manual.md) |
|
|
82
|
+
| 查 A/T/H、SDK 自动最新页同步与 AUNClient 级 Pull Gate | [03-核心概念.md](03-核心概念.md)、[08-最佳实践.md](08-最佳实践.md)、[09-message-rpc-manual.md](09-message-rpc-manual.md)、[09-group-rpc-manual.md](09-group-rpc-manual.md) |
|
|
83
|
+
| 查 History、Forward、Pull Gate、Group 成员可见性 floor 与 Piggy ACK | [09-message-rpc-manual.md](09-message-rpc-manual.md)、[09-group-rpc-manual.md](09-group-rpc-manual.md) |
|
|
84
|
+
| 查群组标识 `group_aid` / `group_id` 兼容规范 | [09-group-rpc-manual.md](09-group-rpc-manual.md) |
|
|
85
|
+
| 查 group.index 签名索引、版本观察、不同步判断、CAS 更新和 facade | [03-核心概念.md](03-核心概念.md)、[06-API手册.md](06-API手册.md)、[09-group-rpc-manual.md](09-group-rpc-manual.md)、[08-最佳实践.md](08-最佳实践.md) |
|
|
86
|
+
| 查群文件系统 RPC / SDK / CLI 入口、群自有区角色 ACL 授权/撤销/查询、`parents` 和 JS string 差异 | [09-group-rpc-manual.md](09-group-rpc-manual.md)、[06-API手册](06-API手册.md) |
|
|
87
|
+
| 查 Storage 架构、SDK VFS、权限模型和 mount/symlink | [AUN Storage架构设计.md](<../aun-fs/AUN Storage架构设计.md>) |
|
|
88
|
+
| 查 Storage RPC 参数、数据面 HTTP 下载流程和 ticket / AID Bearer 边界 | [09-storage-rpc-manual.md](09-storage-rpc-manual.md) |
|
|
78
89
|
| 查协作(版本化文档/乐观锁/标签/GC/reflog/revert)RPC | [09-collab-rpc-manual.md](09-collab-rpc-manual.md) |
|
|
79
90
|
| 查 notify 在线轻量通知 / 跨域 federation | [Notify通知方案.md](Notify通知方案.md) |
|
|
80
91
|
| 查 Service Proxy 服务注册和路由 | [06-API手册](06-API手册.md)、[09-proxy-rpc-manual.md](09-proxy-rpc-manual.md) |
|