@agentunion/fastaun-browser 0.4.11 → 0.4.13
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 +47 -0
- package/_packed_docs/CHANGELOG.md +47 -0
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +4 -2
- package/_packed_docs/sdk/09-group-rpc-manual.md +80 -37
- package/_packed_docs/sdk/09-message-rpc-manual.md +49 -26
- package/_packed_docs/sdk/09-payload-reference.md +1 -1
- package/_packed_docs/sdk/09-storage-rpc-manual.md +12 -9
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +98 -9
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +439 -33
- package/dist/client/delivery.d.ts +9 -0
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +209 -6
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +10 -4
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +67 -8
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -3
- package/dist/client.js.map +1 -1
- package/dist/service-proxy.d.ts.map +1 -1
- package/dist/service-proxy.js +17 -2
- package/dist/service-proxy.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,53 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## 0.4.13 — 2026-06-09
|
|
10
|
+
|
|
11
|
+
### 新功能
|
|
12
|
+
- **发送结果回填 envelope**:`message.send` / `group.send` / `message.thought.put` / `group.thought.put` 的返回结果新增规范化 `envelope` 字段,使发送方回执与接收端信封元数据一致;新增 `APP_SEND_ENVELOPE_METHODS` 与 `sendResultEnvelope()` / `attachSendResultEnvelope()`,rpc-pipeline 在 `postprocess` 后统一附加,V2 加密路径经 `_skipSendResultEnvelope` 标志跳过明文附加、由外层 V2 协调器在加密后补挂避免重复(四语言对齐)
|
|
13
|
+
|
|
14
|
+
### 修复
|
|
15
|
+
- **refresh_token 失效自愈**:新增需重登判定(命中 `relogin_required` 或 `missing refresh_token` / `invalid_or_expired_refresh_token` / `refresh not supported`)与清缓存逻辑;刷新失败需重登时清空本地 `access_token`/`refresh_token`/`kite_token` 并持久化,client 层 token 刷新循环检测到需重登时发布 `token.refresh_exhausted` 事件(带 `relogin_required: true`)、断连触发重连,下次 `connectSession` 因无可用 token 自动走两步登录;refresh RPC 补传 `aid`/`device_id`/`slot_id`/`access_token`/`sdk_lang`/`sdk_version`,`AuthError` 携带 `data` 透传服务端响应(四语言对齐)
|
|
16
|
+
- **token 刷新日志文案修正**:修复连续刷新失败日志拼写错误(`token refreshconsecutivefailed` → 规范文案),token 循环中 `publish`/`_handleTransportDisconnect` 补齐 `await`
|
|
17
|
+
- **protected_headers 类型归一**:V2 发送方法的 envelope 元数据归一时识别 `ProtectedHeaders` 对象(经 `toObject()` 探测)并转 dict,修复传入对象(非 dict)时 protected_headers 被丢弃的问题(四语言对齐)
|
|
18
|
+
|
|
19
|
+
### 优化
|
|
20
|
+
- **app_message_envelope 字段收窄**:envelope 键收窄为可转发元数据(`from`/`to`/`group_id`/`type`/`kind`/`version`/`timestamp`/`encrypted`/`context`/`protected_headers`/`payload_type`),移除 `message_id`/`seq`/`device_id`/`slot_id` 等本地与传输层字段,不再向应用层泄漏内部字段并剔除 `_auth`(四语言对齐)
|
|
21
|
+
- **RPC 日志 token 脱敏**:短 RPC 请求/响应 debug 日志对 `access_token`/`refresh_token`/`kite_token`/`token` 及 `_token` 结尾键递归脱敏,避免明文 token 落日志;浏览器环境受 crypto 限制只输出 `<redacted len=N>`(不含 sha256,与 Node/Go 略有差异)
|
|
22
|
+
|
|
23
|
+
### 测试
|
|
24
|
+
- `refresh 业务失败且要求重登时应清掉本地 token 缓存`
|
|
25
|
+
- `connectSession 在 refresh 失败后应继续走两步登录`
|
|
26
|
+
- `应用层消息 envelope 只保留可转发字段并归一化 headers`
|
|
27
|
+
- 更新 `publishAppEvent` 与群撤回相关用例断言 envelope 收窄、不含 `message_id`/`seq`/`device_id`/`slot_id`
|
|
28
|
+
|
|
29
|
+
### 服务端协同(本版本配套)
|
|
30
|
+
- **`auth.refresh_token` 响应结构化**:新增 `relogin_required` / `retryable` / `diagnostic` / `aid` / `refresh_count` 字段,SDK 据 `relogin_required`/`retryable` 区分"重新登录"与"退避重试",不再单纯按 `error` 字符串判断
|
|
31
|
+
- **JWT 老 SDK 兼容与即时吊销**:`AUN_JWT_LEGACY_ACCESS_TOKEN_COMPAT`(默认开)放行合法 JWT 避免迁移期重连风暴;`auth.token.revoked` 事件携带 `jti`/`expires_at`,gateway 按真实 TTL 缓存吊销
|
|
32
|
+
- **V2 P2P 写入幂等**:服务端 `v2_write_peer_message`/`v2_write_peer_wrap` 捕获唯一键冲突逐字段比对,重发相同 message_id 幂等返回、不再产生 seq 空洞;自发自收跳过重复 self-sync 推送
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 0.4.12 — 2026-06-08
|
|
37
|
+
|
|
38
|
+
### 新功能
|
|
39
|
+
- **应用层事件信封(envelope)**:`message.*` 与 `group.changed` 事件发布给应用层时注入 `envelope` 字段,聚合 `message_id`/`seq`/`from`/`to`/`group_id`/`action` 等元数据;顶层别名字段在兼容期保留,计划于 `0.5.*` 移除,请改用 `envelope.*` 访问(四语言对齐)
|
|
40
|
+
- **撤回事件携带 message_id 与自身信封**:`message.recalled` / `group.message_recalled` 通知补全 `message_id` 字段并继承原消息的信封键(四语言对齐)
|
|
41
|
+
|
|
42
|
+
### 修复
|
|
43
|
+
- **入群首个事件被旧序号阻塞**:`isSelfJoinGroupChanged` 识别自己入群后,将本地 `group_event` seq 基线对齐到 `eventSeq-1`,避免被入群前不可见事件挡住(四语言对齐)
|
|
44
|
+
- **过期 token 重连死循环**:重连前同步 `_identity` 中的 token 状态到 `_sessionParams`,过期或缺失则清空以触发两阶段重新登录,避免反复用旧 token 触发 4001(四语言对齐)
|
|
45
|
+
- **Service Proxy 持久隧道重连**:新增指数退避(上限 60s,成功后重置);`AuthError` 触发 `_authenticateForAccessToken` 重新登录后再重连(四语言对齐)
|
|
46
|
+
- **protected_headers 参数兼容**:`mergeInstanceProtectedHeaders` 同时识别 `protected_headers` 与 `headers` 别名
|
|
47
|
+
|
|
48
|
+
### 测试
|
|
49
|
+
- `自己入群首个 event_seq>1 不应被入群前不可见事件阻塞`
|
|
50
|
+
- `pull 缺失中间 event_seq 时视为永久空洞,不阻塞已拿到的群事件发布`
|
|
51
|
+
- `publishAppEvent 为群事件注入 envelope 并保留顶层兼容字段`
|
|
52
|
+
- `撤回事件发布给应用层时带撤回通知自身 envelope`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
9
56
|
## 0.4.11 — 2026-06-08
|
|
10
57
|
|
|
11
58
|
### 新功能
|
|
@@ -6,6 +6,53 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## 0.4.13 — 2026-06-09
|
|
10
|
+
|
|
11
|
+
### 新功能
|
|
12
|
+
- **发送结果回填 envelope**:`message.send` / `group.send` / `message.thought.put` / `group.thought.put` 的返回结果新增规范化 `envelope` 字段,使发送方回执与接收端信封元数据一致;新增 `APP_SEND_ENVELOPE_METHODS` 与 `sendResultEnvelope()` / `attachSendResultEnvelope()`,rpc-pipeline 在 `postprocess` 后统一附加,V2 加密路径经 `_skipSendResultEnvelope` 标志跳过明文附加、由外层 V2 协调器在加密后补挂避免重复(四语言对齐)
|
|
13
|
+
|
|
14
|
+
### 修复
|
|
15
|
+
- **refresh_token 失效自愈**:新增需重登判定(命中 `relogin_required` 或 `missing refresh_token` / `invalid_or_expired_refresh_token` / `refresh not supported`)与清缓存逻辑;刷新失败需重登时清空本地 `access_token`/`refresh_token`/`kite_token` 并持久化,client 层 token 刷新循环检测到需重登时发布 `token.refresh_exhausted` 事件(带 `relogin_required: true`)、断连触发重连,下次 `connectSession` 因无可用 token 自动走两步登录;refresh RPC 补传 `aid`/`device_id`/`slot_id`/`access_token`/`sdk_lang`/`sdk_version`,`AuthError` 携带 `data` 透传服务端响应(四语言对齐)
|
|
16
|
+
- **token 刷新日志文案修正**:修复连续刷新失败日志拼写错误(`token refreshconsecutivefailed` → 规范文案),token 循环中 `publish`/`_handleTransportDisconnect` 补齐 `await`
|
|
17
|
+
- **protected_headers 类型归一**:V2 发送方法的 envelope 元数据归一时识别 `ProtectedHeaders` 对象(经 `toObject()` 探测)并转 dict,修复传入对象(非 dict)时 protected_headers 被丢弃的问题(四语言对齐)
|
|
18
|
+
|
|
19
|
+
### 优化
|
|
20
|
+
- **app_message_envelope 字段收窄**:envelope 键收窄为可转发元数据(`from`/`to`/`group_id`/`type`/`kind`/`version`/`timestamp`/`encrypted`/`context`/`protected_headers`/`payload_type`),移除 `message_id`/`seq`/`device_id`/`slot_id` 等本地与传输层字段,不再向应用层泄漏内部字段并剔除 `_auth`(四语言对齐)
|
|
21
|
+
- **RPC 日志 token 脱敏**:短 RPC 请求/响应 debug 日志对 `access_token`/`refresh_token`/`kite_token`/`token` 及 `_token` 结尾键递归脱敏,避免明文 token 落日志;浏览器环境受 crypto 限制只输出 `<redacted len=N>`(不含 sha256,与 Node/Go 略有差异)
|
|
22
|
+
|
|
23
|
+
### 测试
|
|
24
|
+
- `refresh 业务失败且要求重登时应清掉本地 token 缓存`
|
|
25
|
+
- `connectSession 在 refresh 失败后应继续走两步登录`
|
|
26
|
+
- `应用层消息 envelope 只保留可转发字段并归一化 headers`
|
|
27
|
+
- 更新 `publishAppEvent` 与群撤回相关用例断言 envelope 收窄、不含 `message_id`/`seq`/`device_id`/`slot_id`
|
|
28
|
+
|
|
29
|
+
### 服务端协同(本版本配套)
|
|
30
|
+
- **`auth.refresh_token` 响应结构化**:新增 `relogin_required` / `retryable` / `diagnostic` / `aid` / `refresh_count` 字段,SDK 据 `relogin_required`/`retryable` 区分"重新登录"与"退避重试",不再单纯按 `error` 字符串判断
|
|
31
|
+
- **JWT 老 SDK 兼容与即时吊销**:`AUN_JWT_LEGACY_ACCESS_TOKEN_COMPAT`(默认开)放行合法 JWT 避免迁移期重连风暴;`auth.token.revoked` 事件携带 `jti`/`expires_at`,gateway 按真实 TTL 缓存吊销
|
|
32
|
+
- **V2 P2P 写入幂等**:服务端 `v2_write_peer_message`/`v2_write_peer_wrap` 捕获唯一键冲突逐字段比对,重发相同 message_id 幂等返回、不再产生 seq 空洞;自发自收跳过重复 self-sync 推送
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 0.4.12 — 2026-06-08
|
|
37
|
+
|
|
38
|
+
### 新功能
|
|
39
|
+
- **应用层事件信封(envelope)**:`message.*` 与 `group.changed` 事件发布给应用层时注入 `envelope` 字段,聚合 `message_id`/`seq`/`from`/`to`/`group_id`/`action` 等元数据;顶层别名字段在兼容期保留,计划于 `0.5.*` 移除,请改用 `envelope.*` 访问(四语言对齐)
|
|
40
|
+
- **撤回事件携带 message_id 与自身信封**:`message.recalled` / `group.message_recalled` 通知补全 `message_id` 字段并继承原消息的信封键(四语言对齐)
|
|
41
|
+
|
|
42
|
+
### 修复
|
|
43
|
+
- **入群首个事件被旧序号阻塞**:`isSelfJoinGroupChanged` 识别自己入群后,将本地 `group_event` seq 基线对齐到 `eventSeq-1`,避免被入群前不可见事件挡住(四语言对齐)
|
|
44
|
+
- **过期 token 重连死循环**:重连前同步 `_identity` 中的 token 状态到 `_sessionParams`,过期或缺失则清空以触发两阶段重新登录,避免反复用旧 token 触发 4001(四语言对齐)
|
|
45
|
+
- **Service Proxy 持久隧道重连**:新增指数退避(上限 60s,成功后重置);`AuthError` 触发 `_authenticateForAccessToken` 重新登录后再重连(四语言对齐)
|
|
46
|
+
- **protected_headers 参数兼容**:`mergeInstanceProtectedHeaders` 同时识别 `protected_headers` 与 `headers` 别名
|
|
47
|
+
|
|
48
|
+
### 测试
|
|
49
|
+
- `自己入群首个 event_seq>1 不应被入群前不可见事件阻塞`
|
|
50
|
+
- `pull 缺失中间 event_seq 时视为永久空洞,不阻塞已拿到的群事件发布`
|
|
51
|
+
- `publishAppEvent 为群事件注入 envelope 并保留顶层兼容字段`
|
|
52
|
+
- `撤回事件发布给应用层时带撤回通知自身 envelope`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
9
56
|
## 0.4.11 — 2026-06-08
|
|
10
57
|
|
|
11
58
|
### 新功能
|
|
@@ -56,14 +56,16 @@ SDK 优先使用 prekey_ecdh_v2,并默认要求前向保密:
|
|
|
56
56
|
|
|
57
57
|
`protected_headers` 会随 E2EE 信封发送,接收端可以读取,因此它提供完整性保护,不提供机密性保护。不要把访问令牌、私钥、隐私正文或其他只允许端到端可见的内容放入 `protected_headers`;这类内容应放进加密的 `payload`。
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
推荐通过 SDK 实例级 setter 设置稳定元数据,例如 `client.set_protected_headers(...)` / `client.setProtectedHeaders(...)` / `client.SetProtectedHeaders(...)`。发送方也可以在以下 SDK 调用中传入顶层 `protected_headers` 作为单次发送的高级覆盖;`headers` 仅作为兼容旧调用的别名,不推荐新代码使用:
|
|
60
60
|
|
|
61
61
|
- `message.send`
|
|
62
62
|
- `message.thought.put`
|
|
63
63
|
- `group.send`
|
|
64
64
|
- `group.thought.put`
|
|
65
65
|
|
|
66
|
-
`payload_type` 不需要应用层传入。SDK 会读取加密前 `payload.type`,自动写入 `protected_headers.payload_type`,接收端解密后会校验它与明文 `payload.type` 一致。
|
|
66
|
+
`payload_type` 不需要应用层传入。SDK 会读取加密前 `payload.type`,自动写入 `protected_headers.payload_type`,接收端解密后会校验它与明文 `payload.type` 一致。
|
|
67
|
+
|
|
68
|
+
`protected_headers` / `headers` 是 send/thought 参数的顶层字段,不放入单独的 `envelope` 入参对象,也不属于业务 `payload`。裸 WebSocket 客户端若自行发送已加密信封,需要把 protected headers 放在自构造的 E2EE 信封内并自行完成 `_auth`,服务端不会替裸 RPC 调用生成或校验明文侧的 protected headers。
|
|
67
69
|
|
|
68
70
|
示例:
|
|
69
71
|
|
|
@@ -989,7 +989,7 @@ await client.call("group.set_settings", {
|
|
|
989
989
|
| `payload` | object | 否 | 消息内容 |
|
|
990
990
|
| `type` | string | 否 | 信封/封装类型,普通业务消息无需填写;SDK 加密群消息时自动使用 `e2ee.group_encrypted` |
|
|
991
991
|
| `attachments` | array | 否 | 兼容旧接口的顶层附件元数据;推荐把业务附件放入 `payload.attachments` |
|
|
992
|
-
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers
|
|
992
|
+
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
993
993
|
|
|
994
994
|
### Payload 参考约定
|
|
995
995
|
|
|
@@ -1049,7 +1049,7 @@ SDK 调用时必须走群组 E2EE。应用层传入明文 `payload`,SDK 会加
|
|
|
1049
1049
|
| `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
|
|
1050
1050
|
| `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `gt-*` |
|
|
1051
1051
|
| `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
|
|
1052
|
-
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE
|
|
1052
|
+
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
1053
1053
|
|
|
1054
1054
|
**SDK 调用示例**:
|
|
1055
1055
|
|
|
@@ -1957,20 +1957,29 @@ CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
|
|
|
1957
1957
|
|
|
1958
1958
|
**Payload**:
|
|
1959
1959
|
|
|
1960
|
-
```json
|
|
1961
|
-
{
|
|
1962
|
-
"
|
|
1963
|
-
|
|
1964
|
-
|
|
1960
|
+
```json
|
|
1961
|
+
{
|
|
1962
|
+
"envelope": {
|
|
1963
|
+
"module_id": "group",
|
|
1964
|
+
"action": "member_added",
|
|
1965
|
+
"group_id": "g-abc123.agentid.pub",
|
|
1966
|
+
"event_seq": 42
|
|
1967
|
+
},
|
|
1968
|
+
"module_id": "group",
|
|
1969
|
+
"action": "member_added",
|
|
1970
|
+
"group_id": "g-abc123.agentid.pub",
|
|
1965
1971
|
"event_seq": 42
|
|
1966
|
-
}
|
|
1967
|
-
```
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
|
1972
|
-
|
|
1973
|
-
| `
|
|
1972
|
+
}
|
|
1973
|
+
```
|
|
1974
|
+
|
|
1975
|
+
SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.4.x 兼容期仍保留顶层 `module_id` / `action` / `group_id` / `event_seq` 等别名,下一个大版本 0.5.* 将移除这些顶层别名,请通过 `ev["envelope"]["action"]` 等路径访问。
|
|
1976
|
+
|
|
1977
|
+
| 字段 | 类型 | 说明 |
|
|
1978
|
+
|------|------|------|
|
|
1979
|
+
| `envelope` | object | 群事件信封,包含 `module_id`、`action`、`group_id`、`event_seq`、`event_type`、`actor_aid`、`created_at`、`device_id`、`slot_id` 等存在的字段 |
|
|
1980
|
+
| `module_id` | string | 固定 `"group"` |
|
|
1981
|
+
| `action` | string | 变更类型(见下表) |
|
|
1982
|
+
| `group_id` | string | 群组 ID |
|
|
1974
1983
|
| `event_seq` | integer | 可选,服务端分配的单调递增序号,用于 SDK 内部保序去重 |
|
|
1975
1984
|
| `request_id` | string | 可选,仅资源审批相关 action |
|
|
1976
1985
|
| `resource_path` | string | 可选,仅资源相关 action |
|
|
@@ -2065,37 +2074,71 @@ SDK 收到后自动解密 `payload`,解密后的明文消息直接交付用户
|
|
|
2065
2074
|
}
|
|
2066
2075
|
```
|
|
2067
2076
|
|
|
2068
|
-
SDK 收到后自动调用 `group.pull` 拉取最新消息并逐条解密后交付用户回调。
|
|
2069
|
-
|
|
2070
|
-
|
|
2077
|
+
SDK 收到后自动调用 `group.pull` 拉取最新消息并逐条解密后交付用户回调。
|
|
2078
|
+
|
|
2079
|
+
**SDK 应用层回调形态**:
|
|
2080
|
+
|
|
2081
|
+
```json
|
|
2082
|
+
{
|
|
2083
|
+
"envelope": {
|
|
2084
|
+
"group_id": "g-abc123.agentid.pub",
|
|
2085
|
+
"from": "alice.agentid.pub",
|
|
2086
|
+
"type": "text",
|
|
2087
|
+
"timestamp": 1234567890000
|
|
2088
|
+
},
|
|
2089
|
+
"group_id": "g-abc123.agentid.pub",
|
|
2090
|
+
"seq": 42,
|
|
2091
|
+
"message_id": "uuid",
|
|
2092
|
+
"sender_aid": "alice.agentid.pub",
|
|
2093
|
+
"message_type": "group.message",
|
|
2094
|
+
"dispatch_mode": "broadcast",
|
|
2095
|
+
"payload": {"type": "text", "text": "Hello"}
|
|
2096
|
+
}
|
|
2097
|
+
```
|
|
2098
|
+
|
|
2099
|
+
SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;群消息信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` / `dispatch_mode` 等别名,下一个大版本 0.5.* 将移除这些顶层别名;请通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。
|
|
2100
|
+
|
|
2101
|
+
### event/group.message_recalled
|
|
2071
2102
|
|
|
2072
2103
|
群消息撤回后推送给所有在线成员(与 pull 双 tombstone 兜底互补)。在线 push 是实时通道,双 tombstone 是离线 / 未读 / push 丢失时的可靠性兜底;两者最终一致,SDK 去重保证应用层只感知一次。
|
|
2073
2104
|
|
|
2074
2105
|
**Payload**:
|
|
2075
2106
|
|
|
2076
|
-
```json
|
|
2077
|
-
{
|
|
2078
|
-
"
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2107
|
+
```json
|
|
2108
|
+
{
|
|
2109
|
+
"envelope": {
|
|
2110
|
+
"group_id": "g-abc123.agentid.pub",
|
|
2111
|
+
"from": "alice.agentid.pub",
|
|
2112
|
+
"type": "group.message_recalled",
|
|
2113
|
+
"kind": "group.message_recalled",
|
|
2114
|
+
"timestamp": 1234567890000
|
|
2115
|
+
},
|
|
2116
|
+
"module_id": "group",
|
|
2117
|
+
"group_id": "g-abc123.agentid.pub",
|
|
2118
|
+
"seq": 43,
|
|
2119
|
+
"message_id": "grm-uuid",
|
|
2120
|
+
"tombstone_message_id": "grm-uuid",
|
|
2121
|
+
"message_ids": ["gm-aaa"],
|
|
2122
|
+
"target_message_seqs": [42],
|
|
2123
|
+
"sender_aid": "alice.agentid.pub",
|
|
2085
2124
|
"recalled_by": "alice.agentid.pub",
|
|
2086
2125
|
"recalled_at": 1234567890000,
|
|
2087
2126
|
"reason": "",
|
|
2088
2127
|
"member_aids": ["bob.agentid.pub"]
|
|
2089
|
-
}
|
|
2090
|
-
```
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
|
2095
|
-
|
|
2096
|
-
| `
|
|
2097
|
-
| `
|
|
2098
|
-
| `
|
|
2128
|
+
}
|
|
2129
|
+
```
|
|
2130
|
+
|
|
2131
|
+
SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示当前交付的撤回 tombstone / 通知自身信封,不是被撤回原消息的信封;业务侧被撤回的原消息列表继续使用 `message_ids` / `target_message_seqs`。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.4.x 兼容期仍保留顶层 `group_id` / `seq` / `message_id` / `sender_aid` 等别名,下一个大版本 0.5.* 将移除这些顶层别名。
|
|
2132
|
+
|
|
2133
|
+
| 字段 | 类型 | 说明 |
|
|
2134
|
+
|------|------|------|
|
|
2135
|
+
| `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `group_id`、`from`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
|
|
2136
|
+
| `module_id` | string | 固定 `"group"` |
|
|
2137
|
+
| `group_id` | string | 群组 ID |
|
|
2138
|
+
| `seq` | integer | 当前交付的撤回 tombstone / 通知 seq;在线 push 为 notice_seq,原 seq 占位 tombstone 为原消息 seq |
|
|
2139
|
+
| `message_id` | string | 当前交付的撤回 tombstone / 通知自己的 message_id |
|
|
2140
|
+
| `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
|
|
2141
|
+
| `message_ids` | string[] | 被撤回的**原消息 ID 列表** |
|
|
2099
2142
|
| `target_message_seqs` | integer[] | 被撤回的原消息 seq 列表 |
|
|
2100
2143
|
| `sender_aid` | string | 原消息发送方 |
|
|
2101
2144
|
| `recalled_by` | string | 撤回操作者 |
|
|
@@ -78,7 +78,7 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
78
78
|
| `encrypted` | boolean | 否 | `false` | 底层 RPC 的 E2EE 标记。Python SDK 便捷层通常使用 `encrypt` 入参并由 SDK 自动填充此字段 |
|
|
79
79
|
| `message_id` | string | 否 | — | 幂等键(客户端提供或服务端生成 UUID) |
|
|
80
80
|
| `timestamp` | integer | 否 | — | 客户端时间戳(毫秒)。**服务端忽略此字段,始终使用服务端时间** |
|
|
81
|
-
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers
|
|
81
|
+
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
82
82
|
|
|
83
83
|
> 连接级 `delivery_mode` 在 `auth.connect` 阶段声明,结构见 `02-WebSocket协议.md`。Python SDK 的 P2P 消息发送会沿用当前连接的 `delivery_mode`,应用层发送时无需重复指定。
|
|
84
84
|
> `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
|
|
@@ -156,7 +156,7 @@ SDK 调用时必须走 P2P E2EE。应用层传入明文 `payload`,SDK 会加
|
|
|
156
156
|
| `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
|
|
157
157
|
| `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `mt-*` |
|
|
158
158
|
| `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
|
|
159
|
-
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE
|
|
159
|
+
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;推荐使用 `protected_headers`,`headers` 仅作为兼容别名;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
160
160
|
|
|
161
161
|
### SDK 调用示例
|
|
162
162
|
|
|
@@ -510,20 +510,29 @@ result = await client.call("message.ack", {"seq": 150})
|
|
|
510
510
|
|
|
511
511
|
### Payload
|
|
512
512
|
|
|
513
|
-
```json
|
|
514
|
-
{
|
|
515
|
-
"
|
|
516
|
-
|
|
517
|
-
|
|
513
|
+
```json
|
|
514
|
+
{
|
|
515
|
+
"envelope": {
|
|
516
|
+
"from": "alice.agentid.pub",
|
|
517
|
+
"to": "bob.agentid.pub",
|
|
518
|
+
"type": "text",
|
|
519
|
+
"timestamp": 1234567890000,
|
|
520
|
+
"encrypted": false
|
|
521
|
+
},
|
|
522
|
+
"message_id": "uuid-1",
|
|
523
|
+
"from": "alice.agentid.pub",
|
|
524
|
+
"to": "bob.agentid.pub",
|
|
518
525
|
"seq": 42,
|
|
519
526
|
"timestamp": 1234567890000,
|
|
520
527
|
"payload": {"type": "text", "text": "Hello!"},
|
|
521
528
|
"delivery_mode": "queue",
|
|
522
529
|
"encrypted": false
|
|
523
|
-
}
|
|
524
|
-
```
|
|
525
|
-
|
|
526
|
-
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
SDK 交付给应用层的 `payload` 是明文业务 JSON 对象;信封字段统一放在 `envelope`。`envelope` 只保留可转发的归一化元数据,`from` 由 `from_aid` / `sender_aid` 归一化而来,`timestamp` 由 `created_at` / `t_server` 归一化而来。0.4.x 兼容期仍保留顶层 `message_id` / `from` / `to` / `seq` / `timestamp` 等别名,下一个大版本 0.5.* 将移除这些顶层别名;请通过 `msg["envelope"]["from"]`、`msg["envelope"]["timestamp"]` 等路径访问。
|
|
534
|
+
|
|
535
|
+
### 订阅
|
|
527
536
|
|
|
528
537
|
```python
|
|
529
538
|
client.on("message.received", lambda msg: print(msg["payload"]))
|
|
@@ -537,21 +546,35 @@ client.on("message.received", lambda msg: print(msg["payload"]))
|
|
|
537
546
|
|
|
538
547
|
### Payload
|
|
539
548
|
|
|
540
|
-
```json
|
|
541
|
-
{
|
|
542
|
-
"
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
549
|
+
```json
|
|
550
|
+
{
|
|
551
|
+
"envelope": {
|
|
552
|
+
"from": "alice.agentid.pub",
|
|
553
|
+
"to": "bob.agentid.pub",
|
|
554
|
+
"type": "message.recalled",
|
|
555
|
+
"kind": "message.recalled",
|
|
556
|
+
"timestamp": 1234567890000
|
|
557
|
+
},
|
|
558
|
+
"message_id": "recall-uuid",
|
|
559
|
+
"tombstone_message_id": "recall-uuid",
|
|
560
|
+
"from": "alice.agentid.pub",
|
|
561
|
+
"to": "bob.agentid.pub",
|
|
562
|
+
"message_ids": ["uuid-1", "uuid-2"],
|
|
563
|
+
"timestamp": 1234567890000
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
SDK 交付给应用层的撤回事件同样带 `envelope`。`envelope` 表示撤回 tombstone / 通知自身的信封,不是被撤回原消息的信封;被撤回的原消息继续通过 `message_ids` 表达。`message_id` / `seq` 继续只保留在顶层兼容字段中,不进入 `envelope`。0.4.x 兼容期仍保留顶层 `message_id` / `from` / `to` / `seq` / `timestamp` 等别名,下一个大版本 0.5.* 将移除这些顶层别名。
|
|
568
|
+
|
|
569
|
+
| 字段 | 类型 | 说明 |
|
|
570
|
+
|------|------|------|
|
|
571
|
+
| `envelope` | object | 撤回 tombstone / 通知自身信封,包含 `from`、`to`、`type`、`kind`、`timestamp`、`encrypted`、`context`、`protected_headers` 等存在的字段 |
|
|
572
|
+
| `message_id` | string | 撤回 tombstone / 通知自身的 message_id |
|
|
573
|
+
| `tombstone_message_id` | string | 兼容别名,等同于撤回 tombstone / 通知自身的 `message_id` |
|
|
574
|
+
| `from` | string | 发送方(撤回者)AID |
|
|
575
|
+
| `to` | string | 接收方 AID |
|
|
576
|
+
| `message_ids` | array | 被撤回的消息 ID 列表 |
|
|
577
|
+
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
555
578
|
|
|
556
579
|
### 订阅
|
|
557
580
|
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
| `to` | `message.send.params` | P2P 接收方 AID |
|
|
41
41
|
| `group_id` | `group.send.params` 和群消息信封 | 群组 ID |
|
|
42
42
|
| `context.type + context.id` | `message.thought.put/get.params` 和 `group.thought.put/get.params` | 思考内容 selector;必填,不要只放在 payload 内 |
|
|
43
|
-
| `protected_headers` / `headers` | `message.send` / `message.thought.put` / `group.send` / `group.thought.put` 参数 | E2EE 信封元数据,类似 HTTP headers
|
|
43
|
+
| `protected_headers` / `headers` | `message.send` / `message.thought.put` / `group.send` / `group.thought.put` 参数 | E2EE 信封元数据,类似 HTTP headers;推荐 `protected_headers`,`headers` 仅为兼容别名;SDK 验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
44
44
|
| `from` / `sender_aid` | 服务端生成的消息信封 | 发送方身份 |
|
|
45
45
|
| `message_id` / `seq` / `timestamp` / `created_at` | 服务端生成或发送参数 | 当前消息 ID、序号和服务端时间 |
|
|
46
46
|
| `encrypted` / `delivery_mode` | 发送参数或连接上下文 | 加密和 P2P 投递语义 |
|
|
@@ -534,7 +534,7 @@ for obj in result["items"]:
|
|
|
534
534
|
| `content_type` | string | 否 | MIME 类型,默认 `"application/octet-stream"` |
|
|
535
535
|
| `is_private` | boolean | 否 | 是否私有,默认 `true` |
|
|
536
536
|
| `size_bytes` | integer | 否 | 预期文件大小(用于校验) |
|
|
537
|
-
| `skip_blob` | boolean | 否 | 秒传模式,默认 `false`;为 `true` 时跳过 blob 上传,必须提供 `sha256
|
|
537
|
+
| `skip_blob` | boolean | 否 | 秒传模式,默认 `false`;为 `true` 时跳过 blob 上传,必须提供 `sha256`,且当前 owner 已拥有相同内容 |
|
|
538
538
|
| `expected_version` | integer | 否 | 乐观并发控制版本号 |
|
|
539
539
|
| `expire_in_seconds` | integer | 否 | 过期时间(秒) |
|
|
540
540
|
| `metadata` | object | 否 | 自定义元数据 |
|
|
@@ -650,22 +650,25 @@ print(f"配额: {limits['quota_used_bytes']}/{limits['quota_total_bytes']}")
|
|
|
650
650
|
|
|
651
651
|
## storage.check_upload
|
|
652
652
|
|
|
653
|
-
上传预检:一次调用同时回答"文件是否超限"和"是否可秒传"。客户端应在计算完文件 SHA-256 后、实际上传前调用。
|
|
653
|
+
上传预检:一次调用同时回答"文件是否超限"和"当前 owner 是否可秒传"。客户端应在计算完文件 SHA-256 后、实际上传前调用。
|
|
654
|
+
|
|
655
|
+
> `check_upload` / `complete_upload(skip_blob=true)` 只允许复用当前 owner 已拥有的内容,避免跨 owner 暴露全局 CAS 存在性或跳过上传克隆他人私有内容。不同 owner 上传相同内容时,仍会在完成上传后归一到同一个 CAS blob,由服务端引用计数管理物理去重。
|
|
654
656
|
|
|
655
657
|
### 参数
|
|
656
658
|
|
|
657
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
658
|
-
|------|------|------|------|
|
|
659
|
-
| `sha256` | string | 是 | 文件内容的 SHA-256 hex(64 字符) |
|
|
660
|
-
| `size_bytes` | integer | 是 | 文件大小(字节) |
|
|
659
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
660
|
+
|------|------|------|------|
|
|
661
|
+
| `sha256` | string | 是 | 文件内容的 SHA-256 hex(64 字符) |
|
|
662
|
+
| `size_bytes` | integer | 是 | 文件大小(字节) |
|
|
663
|
+
| `owner_aid` | string | 否 | 检查指定 owner 是否可秒传,默认当前用户;必须等于当前登录 AID |
|
|
661
664
|
|
|
662
665
|
### 响应
|
|
663
666
|
|
|
664
667
|
| 字段 | 类型 | 说明 |
|
|
665
668
|
|------|------|------|
|
|
666
669
|
| `within_limit` | boolean | 文件大小是否在限制内 |
|
|
667
|
-
| `exists` | boolean |
|
|
668
|
-
| `skip_upload` | boolean | 是否可跳过上传(秒传) |
|
|
670
|
+
| `exists` | boolean | 当前 owner 是否已拥有相同内容且 CAS blob 可用 |
|
|
671
|
+
| `skip_upload` | boolean | 是否可跳过上传(秒传) |
|
|
669
672
|
|
|
670
673
|
### 使用场景
|
|
671
674
|
|
|
@@ -683,7 +686,7 @@ check = await client.call("storage.check_upload", {
|
|
|
683
686
|
if not check["within_limit"]:
|
|
684
687
|
print("文件超限,无法上传")
|
|
685
688
|
elif check["skip_upload"]:
|
|
686
|
-
#
|
|
689
|
+
# 秒传:当前 owner 已拥有相同内容,跳过上传直接 complete
|
|
687
690
|
await client.call("storage.complete_upload", {
|
|
688
691
|
"object_key": "my/file.bin",
|
|
689
692
|
"sha256": sha256,
|
package/dist/auth.d.ts
CHANGED
|
@@ -159,6 +159,8 @@ export declare class AuthFlow {
|
|
|
159
159
|
addTrustedRootPem(pem: string): void;
|
|
160
160
|
private _loadTrustedRoots;
|
|
161
161
|
private _rememberTokens;
|
|
162
|
+
private _refreshFailureRequiresRelogin;
|
|
163
|
+
private _clearCachedTokens;
|
|
162
164
|
/** 验证服务端返回的 new_cert,通过后正式接受 */
|
|
163
165
|
private _validateNewCert;
|
|
164
166
|
/** 获取缓存的有效 access_token */
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAkE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|