@agentunion/fastaun 0.5.33 → 0.5.35
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 +59 -2
- package/README.md +28 -26
- package/_packed_docs/CHANGELOG.md +59 -2
- package/_packed_docs/INDEX.md +26 -12
- package/_packed_docs/KITE_DOCS_GUIDE.md +17 -11
- package/_packed_docs/agent.md/SCHEMA.md +1 -1
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +2 -2
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +58 -8
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +17 -17
- package/_packed_docs/protocol/echo-probe-gateway.md +99 -0
- package/_packed_docs/protocol/echo-probe-sdk.md +91 -0
- package/_packed_docs/sdk/0.5.33-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +464 -316
- package/_packed_docs/sdk/0.5.33-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +499 -304
- package/_packed_docs/sdk/0.5.34-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +133 -0
- package/_packed_docs/sdk/0.5.34-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +107 -0
- package/_packed_docs/sdk/0.5.35-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +189 -0
- package/_packed_docs/sdk/0.5.35-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +204 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +16 -13
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +13 -1
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +19 -9
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +87 -20
- package/_packed_docs/sdk/09-collab-rpc-manual.md +48 -30
- package/_packed_docs/sdk/09-custody-api-manual.md +3 -3
- package/_packed_docs/sdk/09-group-rpc-manual.md +60 -13
- package/_packed_docs/sdk/09-message-rpc-manual.md +22 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -1
- package/_packed_docs/sdk/09-payload-reference.md +9 -8
- package/_packed_docs/sdk/09-proxy-rpc-manual.md +20 -14
- package/_packed_docs/sdk/09-storage-rpc-manual.md +1698 -1659
- package/_packed_docs/sdk/09-stream-rpc-manual.md +33 -20
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +19 -17
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +125 -30
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/274/200/345/217/221/347/247/273/346/244/215/346/214/207/345/215/227.md +109 -33
- package/_packed_docs/sdk/INDEX.md +30 -18
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +1 -1
- package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +5 -5
- package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +5 -5
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +9 -9
- package/_packed_docs/sdk/README.md +11 -6
- package/_packed_docs//346/266/210/346/201/257/345/274/271/346/200/247/350/241/245/346/213/211/351/200/232/351/201/223/345/256/236/346/226/275/350/256/241/345/210/222.md +400 -0
- package/_packed_docs//346/266/210/346/201/257/345/274/271/346/200/247/350/241/245/346/213/211/351/200/232/351/201/223/346/226/271/346/241/210.md +485 -0
- package/dist/auth.js +39 -45
- package/dist/auth.js.map +1 -1
- package/dist/client/control-messages.js +2 -2
- package/dist/client/control-messages.js.map +1 -1
- package/dist/client/delivery.d.ts +12 -1
- package/dist/client/delivery.js +281 -46
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/lifecycle.js +13 -1
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-budget.d.ts +21 -0
- package/dist/client/rpc-budget.js +82 -0
- package/dist/client/rpc-budget.js.map +1 -0
- package/dist/client/rpc-pipeline.d.ts +5 -0
- package/dist/client/rpc-pipeline.js +227 -63
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/sync-channels.d.ts +90 -0
- package/dist/client/sync-channels.js +508 -0
- package/dist/client/sync-channels.js.map +1 -0
- package/dist/client/v2-e2ee.d.ts +5 -1
- package/dist/client/v2-e2ee.js +420 -303
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +17 -0
- package/dist/client.js +373 -50
- package/dist/client.js.map +1 -1
- package/dist/events.d.ts +1 -0
- package/dist/events.js +5 -0
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mail-client.d.ts +101 -0
- package/dist/mail-client.js +369 -0
- package/dist/mail-client.js.map +1 -0
- package/dist/pubsub/binding.js +23 -3
- package/dist/pubsub/binding.js.map +1 -1
- package/dist/pubsub/channel.d.ts +15 -3
- package/dist/pubsub/channel.js +114 -7
- package/dist/pubsub/channel.js.map +1 -1
- package/dist/pubsub/client.d.ts +17 -2
- package/dist/pubsub/client.js +205 -40
- package/dist/pubsub/client.js.map +1 -1
- package/dist/pubsub/credentials.d.ts +3 -0
- package/dist/pubsub/credentials.js +57 -20
- package/dist/pubsub/credentials.js.map +1 -1
- package/dist/pubsub/index.d.ts +5 -2
- package/dist/pubsub/index.js +70 -54
- package/dist/pubsub/index.js.map +1 -1
- package/dist/pubsub/service.d.ts +9 -0
- package/dist/pubsub/service.js +266 -20
- package/dist/pubsub/service.js.map +1 -1
- package/dist/pubsub/types.d.ts +13 -1
- package/dist/storage/lowlevel.d.ts +3 -1
- package/dist/storage/lowlevel.js +13 -0
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/types.d.ts +10 -0
- package/dist/storage/types.js.map +1 -1
- package/dist/storage/vfs.d.ts +3 -1
- package/dist/storage/vfs.js +2 -2
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +55 -5
- package/dist/tools/cross-sdk-agent.js +88 -21
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +16 -0
- package/dist/transport.js +129 -7
- package/dist/transport.js.map +1 -1
- package/dist/udp-standby.d.ts +89 -0
- package/dist/udp-standby.js +487 -0
- package/dist/udp-standby.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
- package/scripts/patch-imapflow-external.mjs +69 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# AUN SDK - API 手册
|
|
2
2
|
|
|
3
|
+
本手册对照四 SDK 0.5.34 的公开接口;历史版本专题中的接口以其标注版本为准。
|
|
4
|
+
|
|
3
5
|
---
|
|
4
6
|
|
|
5
7
|
## 目录
|
|
@@ -8,11 +10,13 @@
|
|
|
8
10
|
- [AID](#aid)
|
|
9
11
|
- [AUNClient](#aunclient)
|
|
10
12
|
- [业务门面](#业务门面)
|
|
13
|
+
- [EventService 事件发布订阅](#eventservice-事件发布订阅)
|
|
11
14
|
- [事件](#事件)
|
|
12
15
|
- [ServiceProxyClient](#serviceproxyclient)
|
|
13
16
|
- [E2EE 高级 API](#e2ee-高级-api)
|
|
14
17
|
- [RPC 方法参考](#rpc-方法参考)
|
|
15
18
|
- [Stream 使用指南](#stream-使用指南)
|
|
19
|
+
- [AID 空闲 UDP 待机(测试能力)](#aid-空闲-udp-待机测试能力)
|
|
16
20
|
|
|
17
21
|
> **多语言命名约定**:Python 使用 `snake_case`(如 `aun_path`、`download_agent_md`),TS/JS 使用 `camelCase`(如 `aunPath`、`downloadAgentMd`),Go 使用 `PascalCase` 公开方法(如 `Load`、`Register`)。本手册表格中各列对应各语言的实际命名。
|
|
18
22
|
|
|
@@ -64,7 +68,7 @@ store := aun.NewAIDStore(aunPath, encryptionSeed, aun.AIDStoreOptions{
|
|
|
64
68
|
| Python | TS/JS | Go | 说明 |
|
|
65
69
|
|--------|-------|----|------|
|
|
66
70
|
| `load(aid)` | `load(aid)` | `Load(aid)` | 从本地加载 AID |
|
|
67
|
-
| `register(aid)` | `register(aid)` | `Register(ctx, aid[, opts])` |
|
|
71
|
+
| `register(aid, *, type, owner=None, exttype=None)` | `register(aid, {type, owner?, exttype?})` | `Register(ctx, aid[, opts])` | 注册并落盘证书和私钥;`type` 必填,非 human 类型还需 `owner`;Go 两参数旧调用仍可用,显式选项使用 `AIDStoreRegisterOptions` |
|
|
68
72
|
| `list()` | `list()` | `List()` | 列出本地 AID |
|
|
69
73
|
| `exists(aid)` | `exists(aid)` | `Exists(ctx, aid)` | 远端存在性检查 |
|
|
70
74
|
| `resolve(aid, opts=None)` | `resolve(aid, opts?)` | `Resolve(ctx, aid, opts...)` | 解析身份及名片,返回结构化 `agent_md.frontmatter`;可按需复用 ownership 共识校验并缓存 owner.md,完整输入输出见下节 |
|
|
@@ -137,10 +141,10 @@ Python 兼容 `forceRefresh`、`skipAgentMd`、`timeoutMs`、`ownershipTtlMs`
|
|
|
137
141
|
| `tags` | string[] | 标签 |
|
|
138
142
|
| `owner` | string | 名片声明的 owner;普通主体需结合 2.1 共识状态判断;Group/Org 属于专属生命周期 |
|
|
139
143
|
| `ownership` | object | 普通主体的声明容器,当前核心字段为 `statement` |
|
|
140
|
-
| `entity_cert_fingerprint` | string | Group/Org
|
|
144
|
+
| `entity_cert_fingerprint` | string | 历史 Group/Org 名片的实体证书 `sha256:<hex>` 指纹;现代 ownership.statement 格式不再要求此字段 |
|
|
141
145
|
| 其它键 | 任意解析值 | 如 visibility、skills 或应用自定义字段,存在时原样返回 |
|
|
142
146
|
|
|
143
|
-
当前发布 Schema 要求 `aid/name/type/version`;读取接口兼容历史名片,因此类型声明中的标准字段可缺省,不补默认值,裸 Markdown 正文返回 `{}`。`ownership.statement` 保留六字段:`version=2`(整数)、`declaration_id`(小写 UUIDv4)、`owner_aid`、`sub_aid`、`relation_version`(正整数)和 `declared_at`(Unix 秒)。普通主体的 owner 与 statement 同时存在或同时缺省;human 禁止通用 ownership
|
|
147
|
+
当前发布 Schema 要求 `aid/name/type/version`;读取接口兼容历史名片,因此类型声明中的标准字段可缺省,不补默认值,裸 Markdown 正文返回 `{}`。`ownership.statement` 保留六字段:`version=2`(整数)、`declaration_id`(小写 UUIDv4)、`owner_aid`、`sub_aid`、`relation_version`(正整数)和 `declared_at`(Unix 秒)。普通主体的 owner 与 statement 同时存在或同时缺省;human 禁止通用 ownership,现代 Group/Org 同样使用与 owner.md 配对的声明,历史无 ownership 实体名片继续兼容。
|
|
144
148
|
|
|
145
149
|
字段定义与签名规则以 [当前协议 §1.3、§2](../protocol/Ownership协议定义2.1.md) 为准;[agent.md/SCHEMA.md](../agent.md/SCHEMA.md) 是 legacy Ownership 2.0。`frontmatter.owner` 和已有 `agent_md.verification.ownership_status` 都不替代下面的 2.1 共识结果。
|
|
146
150
|
|
|
@@ -172,7 +176,7 @@ Python 兼容 `forceRefresh`、`skipAgentMd`、`timeoutMs`、`ownershipTtlMs`
|
|
|
172
176
|
| `single_sided` | 只有一方声明或待确认材料,关系尚未成立 |
|
|
173
177
|
| `invalid` | 声明、签名或身份绑定等材料无效 |
|
|
174
178
|
| `unavailable` | 网络、证书、服务能力、权威性或读取一致性不足,当前无法确认 |
|
|
175
|
-
| `not_applicable` | Group/Org
|
|
179
|
+
| `not_applicable` | NS 对缺少 ownership 的历史 Group/Org 保留该标记;现代实体声明参与双文件共识,SDK 以实际返回 status 为准 |
|
|
176
180
|
|
|
177
181
|
`owner_md` 包含 `owner_aid: string`、`bucket: "default"`、`path: "sub_aids/{aid}/owner.md"`、`exists: bool`、`content: string`(完整原文,含签名)、`sha256: string`、`observed_at: integer`(Storage 观察时间,Unix 秒)。确认不存在时 exists=false、content/sha256 为空串;存在快照不表示整体共识成功,须检查 status。
|
|
178
182
|
|
|
@@ -204,7 +208,7 @@ if result.Ok && result.Data.AgentMD != nil {
|
|
|
204
208
|
|
|
205
209
|
### 通用 sign / verify
|
|
206
210
|
|
|
207
|
-
`format="raw"` 为默认,保留 detached Base64 签名/验签;`format="document"` 处理任意 UTF-8 文本文档的连续尾签,不要求 YAML 或 agent.md 业务字段。sign 返回 `signed` 全文、本次 `signature` 和实际 `signatures` 列表;verify 返回 `valid`、`status`、首块前 `payload` 及逐块 `signatures`。普通 agent.md
|
|
211
|
+
`format="raw"` 为默认,保留 detached Base64 签名/验签;`format="document"` 处理任意 UTF-8 文本文档的连续尾签,不要求 YAML 或 agent.md 业务字段。sign 返回 `signed` 全文、本次 `signature` 和实际 `signatures` 列表;verify 返回 `valid`、`status`、首块前 `payload` 及逐块 `signatures`。普通 agent.md、owner.md 与现代 Group/Org agent.md 主签均不输出且业务不接受 signer_aid;历史实体主签格式另按兼容规则验证,主签身份、Schema、资源及授权由调用者另验,SDK 文件流程和服务端均复用各自唯一同构签验 core。
|
|
208
212
|
|
|
209
213
|
`input_type="text"` 默认把输入视作内容;显式 `input_type="file"` 才读取文件;raw 按原始字节处理,包括非 UTF-8 文件,document 必须严格 UTF-8,raw/document 字符串均严格校验 Unicode 并编码为 UTF-8,无效 Unicode 拒绝。不识别 `file://` 或自动猜路径,缺失文件报错。`in_place=True` 仅适用于 file + document,签名成功后才写回;TS/JS 使用 `inputType/inPlace`,Go 使用 `InputType/Format/Tag/Append/InPlace`。浏览器 File/Blob 只读,FileSystemFileHandle 可原地写,不接受裸本地路径。
|
|
210
214
|
|
|
@@ -270,11 +274,11 @@ AID 由 `AIDStore.load()` 返回,应用层不直接构造。
|
|
|
270
274
|
|
|
271
275
|
| Python | TS/JS | Go | 说明 |
|
|
272
276
|
|--------|-------|----|------|
|
|
273
|
-
| `aid` | `aid` | `
|
|
274
|
-
| `cert_pem` | `certPem` | `
|
|
275
|
-
| `public_key` | `publicKey` | `PublicKey
|
|
276
|
-
| `cert_fingerprint` | `certFingerprint` | `CertFingerprint
|
|
277
|
-
| `aun_path` | `aunPath` | `
|
|
277
|
+
| `aid` | `aid` | `Aid` 字段 | AID 字符串 |
|
|
278
|
+
| `cert_pem` | `certPem` | `CertPem` 字段 | 证书 PEM |
|
|
279
|
+
| `public_key` | `publicKey` | `PublicKey` 字段 | 公钥 |
|
|
280
|
+
| `cert_fingerprint` | `certFingerprint` | `CertFingerprint` 字段 | 证书指纹 |
|
|
281
|
+
| `aun_path` | `aunPath` | `AunPath` 字段 | 所属数据目录 |
|
|
278
282
|
| `device_id` | `deviceId` | `DeviceID` | 设备 ID |
|
|
279
283
|
| `slot_id` | `slotId` | `SlotID` | 实例槽位 ID;允许 `/`、`:`、空格作为共享隔离键分隔符 |
|
|
280
284
|
| `verify_ssl` | `verifySsl` | `VerifySSL` | 是否校验 TLS 证书 |
|
|
@@ -461,7 +465,7 @@ headers = client.get_protected_headers()
|
|
|
461
465
|
- agent.md 上传、下载和检查入口都在 `AIDStore`;`AUNClient` 不再暴露上传入口。
|
|
462
466
|
- 普通主体目标 AID 须有本地签名材料并使用自身 token;Group/Org 用实体主签、当前 owner token 上传,可选 owner 附签,不能以附签替换资源授权。agent.md 与 owner.md 统一调用 Store document 签验 core,再验证业务 Schema。
|
|
463
467
|
- 实体上传默认使用名片当前 owner;显式指定上传者分别使用 Python `uploader_aid`、TS/JS `options.uploaderAid`、Go `AIDStoreUploadAgentMDOptions.UploaderAID`。追加 owner 附签分别使用 `co_signer_aid`、`options.coSignerAid`、`AIDStoreUploadAgentMDOptions.CoSignerAID`,值必须为当前 owner;Go 通过 `UploadAgentMDWithOptions` 传入选项。
|
|
464
|
-
- SDK 全部 NS GET/HEAD/PUT 携带 `X-AUN-Signature-Format: multi-v1`;GET 同时发送 `Accept: text/markdown`;实体 fresh GET 另带 `X-AUN-Ownership-Check: 1` 与 `Cache-Control: no-cache` 以绕 LRU
|
|
468
|
+
- SDK 全部 NS GET/HEAD/PUT 携带 `X-AUN-Signature-Format: multi-v1`;GET 同时发送 `Accept: text/markdown`;实体 fresh GET 另带 `X-AUN-Ownership-Check: 1` 与 `Cache-Control: no-cache` 以绕 LRU 全块验证;现代实体参与双文件共识,NS 对缺少 ownership 的历史实体保留 not_applicable 标记;不主动发送 `If-None-Match` / `If-Modified-Since`。如果服务端异常返回 304,本地有内容则复用;无内容时再发一次无条件 GET。
|
|
465
469
|
- SDK 会自动从 Gateway `_meta.agent_md_etags` 和信封 `agent_md` 观察远端版本;`requester`、`peer`、`group` 是标准角色键,`receiver`、`target`、`to`、`sender`、`from` 是兼容别名。
|
|
466
470
|
- `Accept: text/markdown` 与 agent.md 的 YAML frontmatter + Markdown 格式兼容;agent.md 仍是 Markdown 媒体类型上的结构化约定。
|
|
467
471
|
|
|
@@ -471,6 +475,44 @@ headers = client.get_protected_headers()
|
|
|
471
475
|
|
|
472
476
|
除 `client.call(method, params)` 外,四语言 SDK 提供高层门面(Facade),封装常用操作并简化参数。普通应用优先用门面,只有需要精确控制底层参数时再直调 RPC。
|
|
473
477
|
|
|
478
|
+
### EventService 事件发布订阅
|
|
479
|
+
|
|
480
|
+
Python / TS / JS 使用 `client.EventService` 属性,Go 使用 `client.EventService()`。以下均为该门面的方法,不是 Gateway `pubsub.*` RPC;跨 AID 请求由 SDK 通过 E2EE P2P 消息承载。
|
|
481
|
+
|
|
482
|
+
| 操作 | Python | TypeScript / JavaScript | Go |
|
|
483
|
+
|------|--------|-------------------------|----|
|
|
484
|
+
| 启动本地 Bus | `await start(bus_aid, catalog=..., allowlist=...)` | `await start(busAid, {catalog, allowlist})` | `Start(ctx, busAid, EventServiceStartOptions{...})` |
|
|
485
|
+
| 按角色授权 | `await authorize(bus_aid, role, auth_mode, events, credential=None)` | `await authorize(busAid, role, authMode, events, credential?)` | `Authorize(ctx, busAid, role, authMode, events, grant)` |
|
|
486
|
+
| 发布对象 | `await publish(bus_aid, event_name, data, **options)` | `await publish(busAid, eventName, data, options?)` | `Publish(ctx, busAid, eventName, data, options...)` |
|
|
487
|
+
| 等待发布结果 | `await wait_published(bus_aid, event_id)` | `await waitPublished(busAid, eventId)` | `WaitPublished(ctx, busAid, eventID)` |
|
|
488
|
+
| 订阅/取消订阅 | `await subscribe(bus_aid, events)` / `unsubscribe(...)` | `await subscribe(busAid, events)` / `unsubscribe(...)` | `Subscribe(ctx, busAid, events)` / `Unsubscribe(...)` |
|
|
489
|
+
| 接收事件 | `on_event(bus_aid, handler)` / `await next_event(bus_aid, timeout=None)` | `onEvent(busAid, handler)` / `await nextEvent(busAid, timeout?)` | `OnEvent(busAid, handler)` / `NextEvent(ctx, busAid)` |
|
|
490
|
+
| 事件定义目录 | `await catalog(bus_aid, **params)` | `await catalog(busAid, params?)` | `Catalog(ctx, busAid, params)` |
|
|
491
|
+
| 发布/订阅目录 | `await publications(bus_aid, **params)` / `subscriptions(...)` | `await publications(busAid, params?)` / `subscriptions(...)` | `Publications(ctx, busAid, params)` / `Subscriptions(...)` |
|
|
492
|
+
| 宿主管理 | `update_config` / `stats` / `issue_grant` / `revoke_grant` | `updateConfig` / `stats` / `issueGrant` / `revokeGrant` | `UpdateConfig` / `Stats` / `IssueGrant` / `RevokeGrant` |
|
|
493
|
+
| 生命周期 | `renew` / `drain` / `close` | `renew` / `drain` / `close` | `Renew` / `Drain` / `Close` |
|
|
494
|
+
|
|
495
|
+
`start` 要求 `bus_aid == client.aid`;接入远端 Bus 直接按 `pub` / `sub` 分别 `authorize`,授权成功自动加载获准的事件定义目录。同一 client 可在同一 Bus 上同时绑定 `bus`、`pub`、`sub`,Bus 自发自订仍需相应权限。管理方法仅本地 Bus 宿主可用。`renew`、`drain`、`close` 覆盖该 Bus 相关角色;Go `Close(busAid)` 不接收 context,异步方法的具体参数及返回见[应用集成指南](AUN事件发布订阅应用集成指南.md)。
|
|
496
|
+
|
|
497
|
+
`publish` 的 `data` 必须是 JSON 对象,成功返回 `event_id` 字符串(Go 另返回 error),表示已持久化并入队。选项分别为 Python `schema_version` / `ttl_seconds` / `reply_mode` / `event_id`,TS/JS `schemaVersion` / `ttlSeconds` / `replyMode` / `eventId`,Go `PubSubPublishOptions`。`wait_published` / `waitPublished` / `WaitPublished` 返回所选阶段结果:默认 `none` 为 AUN 已接受发送,`accepted` 为 Bus 已受理,均不证明订阅方业务完成。后台完成通知分别使用 `on_publish` / `onPublish` / `OnPublish`;Go handler 接收 `(eventID, result, error)`,Python / TS / JS handler 接收含 `event_id` 与 `result` 或 `error` 的对象。
|
|
498
|
+
|
|
499
|
+
默认持久化覆盖 Bus 事件目录、白名单、有效授权和订阅,以及客户端授权材料、目录、订阅意图、待发布记录和过期失败结果。Python / TS(Node.js)/ Go 复用身份目录的 SQLite `aun.db`,浏览器 JS 使用 IndexedDB;自定义 Bus 存储与 Python / Go 的 `state_path` / `StatePath` 边界见[持久化说明](AUN事件发布订阅应用集成指南.md#7-持久化统计与故障定位)。启动加载旧目录后按事件合并本次配置,未提交的事件保留,同名条目以本次配置为准;后续注册、订阅与配置修改写回持久层。
|
|
500
|
+
|
|
501
|
+
待发布消息先落库再入队;达到所选回复模式的成功阶段后删除本地正文,关闭或未确认成功时保留。重启重新接入对应角色后按原 `event_id`、原 `expires_at` 恢复,过期后记录 `EXPIRED`,不延长 TTL。成功结果仅有界保留在运行期,过期失败结果也受容量限制。Bus 已受理后的 fanout、服务端 volatile 收件箱及历史事件不在此持久恢复范围内。
|
|
502
|
+
|
|
503
|
+
#### publications / subscriptions 查询
|
|
504
|
+
|
|
505
|
+
查询的可选参数为 `event_name`、`limit`(默认 50,范围 1–200)、`page_token`;TS/JS 和 Go 的查询 map 也使用这些 snake_case 字段。`role` 只在本地选择查询端:`publications` 可选 `bus` / `pub`,`subscriptions` 可选 `bus` / `sub`;省略优先本地 Bus,否则使用对应客户端角色,不发送到网络。
|
|
506
|
+
|
|
507
|
+
Bus 宿主可查询全局;Pub 仅查看自身 AID、当前发布权限内的汇总,Sub 仅查看当前设备租约实际生效的订阅。`authorize` 成功本身不建立订阅。查询返回 `{service_aid, since, as_of, items, next_page_token}`,时间均为 Unix 毫秒,末页 token 为 null:
|
|
508
|
+
|
|
509
|
+
| 查询 | `items` 字段 |
|
|
510
|
+
|------|---------------|
|
|
511
|
+
| `publications` | `publisher_aid`、`event_name`、`published`、`first_published_at`、`last_published_at` |
|
|
512
|
+
| `subscriptions` | `subscriber_aid`、`event_name`、`device_id`、`slot_id`、`expires_at` |
|
|
513
|
+
|
|
514
|
+
发布汇总只计 Bus 首次受理,不计拒绝与去重,TTL 到期不删除汇总,Bus 重启清零;订阅目录只返回当前有效关系,不包含凭证或租约令牌。每页是实时视图,不冻结快照;分页 token 有效 60 秒并绑定操作、查询范围及当前 Bus 运行实例,完整回包最多 64 KiB。事件定义仍通过 `catalog` 查询。完整流程和参数见[应用集成指南](AUN事件发布订阅应用集成指南.md),内部契约见[开发移植指南](AUN事件发布订阅开发移植指南.md)。
|
|
515
|
+
|
|
474
516
|
### Ownership、凭证与组织专题
|
|
475
517
|
|
|
476
518
|
| 领域 | 当前入口 | 详细指南 |
|
|
@@ -478,7 +520,7 @@ headers = client.get_protected_headers()
|
|
|
478
520
|
| Ownership 2.1 | 七个关系业务Facade:`bindOwneraid`、`bindSubaid`、`releaseSubaid`、`transferSubaid`、`acceptOwnershipRequest`、`rejectOwnershipRequest`、`checkOwnershipConsensus`;无参数任务管理Facade `resetOwnershipTask()`(Python `reset_ownership_task()`、Go `ResetOwnershipTask(ctx)`),批量清理当前AID发起的未完成任务,返回`{reset_operation_ids:[],skipped_operation_ids:[]}`(其余为TS/JS命名) | [应用集成](Ownership2.1-SDK应用集成指南.md#4-七个-facade-的参数角色与结果)、[开发与移植](Ownership2.1-SDK开发与移植指南.md) |
|
|
479
521
|
| Credential/Org | Python/TS/JS:`client.credential`、`client.org`;Go:`client.Credential()`、`client.Org()`;普通与语义凭证共用 credential 入口,无 semantic 子层;包含签验、包/请求、消息证据及额度协调工具 | [应用集成](凭证与组织服务SDK应用集成指南.md)、[开发与移植](凭证与组织服务SDK开发与移植指南.md) |
|
|
480
522
|
|
|
481
|
-
Ownership 2.1
|
|
523
|
+
Ownership 2.1 关系须检查当前双文件共识;现代 Group/Org 同样发布配对声明并查询共识,但创建、绑定、转让和解散仍使用专属生命周期,普通 bind/release/transfer 关系管理 Facade 返回 `not_applicable`。Credential/Org 的本地验签不代替当前状态和请求授权检查。
|
|
482
524
|
|
|
483
525
|
sub-first 绑定在 sub 同意后 Stage 暂存 `agent.md`;NS 的 `pending/unlocked` 对公共共识映射为 `single_sided`,不授予 owner 权限,Storage 名片副本待 fresh 验收清除 pending 后同步。owner-first 绑定先 fresh 确认无锁并条件发布 `owner.md`,sub fresh 验证后同意并直接条件提交 `agent.md`,不走 Stage 或 bind.accept/owner.ready 往返。已有 owner 锁时只能由当前 owner 发起解绑或转移;拒绝清理与 reset 的原件/CAS 边界见 [应用指南 §6.1](Ownership2.1-SDK应用集成指南.md#61-绑定按发起方分流)。普通消息建议连接前订阅,READY 后补订阅也会触发任务恢复。
|
|
484
526
|
|
|
@@ -860,7 +902,7 @@ await client.push.unregister()
|
|
|
860
902
|
|
|
861
903
|
## ServiceProxyClient
|
|
862
904
|
|
|
863
|
-
Service Proxy 用于 provider 通过 AUN 身份暴露本地 HTTP / WebSocket
|
|
905
|
+
Service Proxy 用于 provider 通过 AUN 身份暴露本地 HTTP / WebSocket 服务。Python、TypeScript、JavaScript 和 Go 均提供 `ServiceProxyClient` 封装;浏览器 JavaScript 需通过可承载 Authorization Bearer 的自定义 WebSocket factory 建立隧道。公开入口与控制面字段见 [09-proxy-rpc-manual.md](09-proxy-rpc-manual.md)。
|
|
864
906
|
|
|
865
907
|
```python
|
|
866
908
|
from aun_core.service_proxy import ServiceProxyClient
|
|
@@ -895,6 +937,8 @@ proxy-server 连接地址不能由应用外部传入或配置。`ServiceProxyCli
|
|
|
895
937
|
| `serve_once()` | 处理有限数量的 proxy-server 转发请求 |
|
|
896
938
|
| `serve_forever(connection_mode="persistent")` | 持续提供 Service Proxy 服务;支持 persistent / on_demand |
|
|
897
939
|
|
|
940
|
+
四端构造与生命周期命名:Python `ServiceProxyClient(provider_aid=..., aun_client=client)`;TS/JS `new ServiceProxyClient({providerAid, aunClient})`;Go `NewServiceProxyClient(ServiceProxyClientOptions{ProviderAID: ..., AUNClient: client})`。对应方法分别使用 `register_service` / `registerService` / `RegisterService`、`connect_once` / `connectOnce` / `ConnectOnce`、`serve_once` / `serveOnce` / `ServeOnce`、`serve_forever` / `serveForever` / `ServeForever`。浏览器 JS 的 `webSocketFactory` 必须能发送隧道的 Authorization Bearer 请求头,原生浏览器 WebSocket 不满足该条件。
|
|
941
|
+
|
|
898
942
|
自动注册顺序:
|
|
899
943
|
|
|
900
944
|
- `connect_once()`、`serve_once()`、`serve_forever()` 在存在 `aun_client.call()` 时,会先向 Gateway 调用 `proxy.register_services`。
|
|
@@ -1046,13 +1090,11 @@ JavaScript 浏览器 SDK 的 Worker 是网络隔离增强:`new Worker()` 同
|
|
|
1046
1090
|
|
|
1047
1091
|
| API | 说明 |
|
|
1048
1092
|
|-----|------|
|
|
1049
|
-
| `
|
|
1050
|
-
|
|
|
1051
|
-
| `
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
| `client.group_e2ee.decrypt(...)` | 群消息解密 |
|
|
1055
|
-
| `client.group_e2ee.current_epoch(group_id)` | 查询当前群 epoch |
|
|
1093
|
+
| Python | `aun_core.v2.e2ee.encrypt_p2p.encrypt_p2p_message`、`encrypt_group.encrypt_group_message`、`decrypt.decrypt_message` |
|
|
1094
|
+
| TypeScript / JavaScript | 根入口导出的 `encryptP2PMessage`、`encryptGroupMessage`、`decryptMessage` |
|
|
1095
|
+
| Go | `v2/e2ee.EncryptP2PMessage`、`EncryptGroupMessage`、`DecryptMessage` |
|
|
1096
|
+
|
|
1097
|
+
这些是低层 E2EE 函数,需要调用方提供对应的密钥和目标上下文;普通 `message.send` / `group.send` 由 SDK 自动管理加密,不应改用低层函数替代。
|
|
1056
1098
|
|
|
1057
1099
|
---
|
|
1058
1100
|
|
|
@@ -1096,3 +1138,28 @@ info = await client.call("stream.get_info", {"stream_id": stream["stream_id"]})
|
|
|
1096
1138
|
await client.call("stream.close", {"stream_id": stream["stream_id"]})
|
|
1097
1139
|
```
|
|
1098
1140
|
|
|
1141
|
+
## AID 空闲 UDP 待机(测试能力)
|
|
1142
|
+
|
|
1143
|
+
Python、TypeScript/Node.js 与 Go SDK 支持独立 AID 实例的 UDP 待机,浏览器 JS 与本期暂不移植 UDP 的 Rust SDK 保持 WebSocket。具有待机控制器的主长连接通过 `auth.connect.capabilities.udp_standby_v1=true` 声明能力;Gateway 默认关闭,响应 `capabilities.udp_standby_v1` 表达当前实际可用性,只有 `negotiated_capabilities.udp_standby_v1` 与 `udp_standby.enabled` 均严格为布尔 `true` 才启用,缺失、`false` 或字符串 `"true"` 保持 WS;短连接和辅助连接不声明。客户端初次上线仍建立 WS 并正常认证、检查和补拉,通过双向空闲与在途任务门禁后才释放 WS。Node 使用内置 `node:dgram`,无需新增运行依赖。原定 Ubuntu Docker 单域 11 场景已分轮通过,新增动态心跳与 human 准入仍待增量实机验证,容量未验。
|
|
1144
|
+
|
|
1145
|
+
准备阶段通过 `AIDStore.resolve(...)` 的 `agent_md.frontmatter.type` 识别自身 AgentMD 类型;已知 `human` 保持 WS,未知沿用原准入,不以注册意图替代本次 AgentMD 结果。UDP 心跳不查询 AgentMD。
|
|
1146
|
+
|
|
1147
|
+
`HEARTBEAT_ACK` 正文固定为 `lease_remaining_ms:uint32 + pending_generation:uint64 + reason_mask:uint32 + heartbeat_interval_ms:uint32`,共 20 字节,其他报文结构不变。Gateway 每次收到有效 HEARTBEAT 都返回当前周期 T 并按 4T 续租,SDK 按 T 的 ±20% 抖动安排下一次心跳;动态配置更新不追溯缩短已发租约。SDK 连续 3 次响应超时后恢复 WS;默认 T=25 秒、单次等待 5 秒,服务端正常窗口 100 秒,授权、票据或目录期限可更早到达。正常切换不产生应用离线回调,任一有效 WS/UDP 在线即保持应用在线;未新增切换完成回调或公开字段。
|
|
1148
|
+
|
|
1149
|
+
应用仅在确定不依赖瞬时通知时,显式选择可恢复事件;以下示例改变服务端事件过滤,不适用于需要全事件的应用:
|
|
1150
|
+
|
|
1151
|
+
```python
|
|
1152
|
+
await client.connect()
|
|
1153
|
+
await client.call("event.subscribe", {
|
|
1154
|
+
"events": ["message.received", "group.message_created"],
|
|
1155
|
+
})
|
|
1156
|
+
```
|
|
1157
|
+
|
|
1158
|
+
TypeScript 使用 `client.call()`,Go 使用 `client.Call(ctx, ...)` 调用同一 RPC。`event.subscribe` / `event.unsubscribe` 的 `subscribed` 返回完整过滤集合;默认全事件、queue、流式和非白名单事件会话继续保持 WS,SDK 不自动缩窄已有订阅。TypeScript/Node 可通过 `connect({udp_standby: false})` 禁止本次连接声明该能力;不要将该选项直接套用到其他 SDK。
|
|
1159
|
+
|
|
1160
|
+
进入待机后,`call`、消息发送、认证刷新等真实网络需求会立即恢复 WS,多个并发调用共享恢复过程,各自保留原 deadline 与取消语义;缓存命中的本地读取不唤醒。服务端消息提示也通过恢复 WS 后的原 Pull/ACK 流程处理。WAKE_ACK 不代表业务消费,UDP 不发送正文、不延长消息 TTL、不重放已经发出的写请求。
|
|
1161
|
+
|
|
1162
|
+
为支持连续待机,SDK 使用 `gateway.standby.prepare` 返回的 `event_subscriptions` 权威快照,在恢复 `auth.connect.options.event_subscriptions` 中提交;Gateway 从新会话首次事件路由起应用该过滤。未传字段仍为原全事件语义,显式 `[]` 为无事件。应用不需要每次唤醒后手工重新订阅,也不应自行重放待机票据或认证签名。
|
|
1163
|
+
|
|
1164
|
+
`disconnect()` / `close()` 停止本实例的待机与自动恢复,不影响同主机其他 AID。UDP 验证失败、连续无应答、租约/票据到期或 Gateway 故障时回 WS 并遵守冷却与原重连限制;UDP 不能唤醒已退出的进程。协议、事件白名单、错误原因和部署方式见 [Gateway 连接模式 §3.10](../../../docs/AUN文档/AUN协议/03-Gateway-连接模式.md#310-aid-空闲-udp-待机测试能力),状态机与验收边界见 [详细设计](../../../docs/AUN文档/AID空闲UDP待机详细设计.md)。
|
|
1165
|
+
|
|
@@ -6,7 +6,15 @@
|
|
|
6
6
|
>
|
|
7
7
|
> **授权 = 协作根写 ACL**:谁能 `commit` = 谁对 `collab_root` 有写权限。普通 AID storage 可继续用 `storage.set_acl/remove_acl` 管理写授权;群 `memberdata` 协作根必须用 `collab.set_acl/remove_acl` 按 `collab_root` 授权,SDK/CLI 不得拼接真实 `group_data` 路径。
|
|
8
8
|
>
|
|
9
|
-
> SDK
|
|
9
|
+
> Python / TypeScript / Browser SDK 通过 `client.collab` 访问(`CollabClient`);Go 使用 `client.Collab()`,标签入口为 `.Tag()`。每个命令映射一条 `collab.*` RPC。
|
|
10
|
+
|
|
11
|
+
## SDK 返回差异
|
|
12
|
+
|
|
13
|
+
下文定义服务端原始 RPC 字段。Python / TypeScript / Browser 保留原始结果;Go 0.5.34 的类型化返回尚有以下差异,需要完整字段时使用原始 `client.Call()`:
|
|
14
|
+
|
|
15
|
+
- GC 不保留 `reachable` / `freed_bytes`;Reflog 不保留 `seq` / `metadata`,且其 `RequesterAID` / `CreatedAt` 不能接收当前 `requester` / `timestamp` 字段。
|
|
16
|
+
- Tag Create 不保留 `bump` / `changed`;Revert 不保留 `no_change`;Tag Restore 不保留 `partial`,`new_snapshot_version: null` 解析为空字符串。
|
|
17
|
+
- Tag Diff 的 `added` / `removed` 实际为文档名字符串数组,Go 类型仍按对象数组解析,非空时会返回解码错误;Tag Rm 的 `removed: true` 转为整数 `1`,且不保留 `version`。
|
|
10
18
|
|
|
11
19
|
## 方法索引
|
|
12
20
|
|
|
@@ -74,11 +82,11 @@
|
|
|
74
82
|
|
|
75
83
|
### 乐观锁(commit)
|
|
76
84
|
|
|
77
|
-
1. `put_object
|
|
85
|
+
1. `put_object` 写入候选版本文件;上传失败直接返回错误。
|
|
78
86
|
2. 同一事务:`atomic_repoint(<doc>@current, new_target, expected_version=onto)` + 台账追加。
|
|
79
|
-
3. CAS 成功 → version+1;CAS 失败 →
|
|
87
|
+
3. CAS 成功 → version+1;CAS 失败 → 返回 JSON-RPC `-32009`,`error.data` 包含 `current_version`、`current_target`、`hint`,并清理候选文件。
|
|
80
88
|
|
|
81
|
-
`onto` 来源:`collab.show` 响应的 `version`
|
|
89
|
+
`onto` 来源:`collab.show` 响应的 `version` 字段;冲突时由 SDK 的 `CollabConflictError` 取得当前版本,合并后再提交。失败请求不保证保留候选正文,调用方应保留自己的草稿。
|
|
82
90
|
|
|
83
91
|
### 数据不变量
|
|
84
92
|
|
|
@@ -126,7 +134,7 @@ docs = await client.collab.ls_files("alice.aid.pub:/projects/myapp")
|
|
|
126
134
|
|------|------|------|------|
|
|
127
135
|
| `collab_root` | string | 是 | 协作根 `<aid>:<path>` |
|
|
128
136
|
| `doc` | string | 是 | 文档名 |
|
|
129
|
-
| `source` | string | 是 |
|
|
137
|
+
| `source` | string | 是 | Base64 编码的正文或可读的 `<aid>:<path>`;SDK 不读取本地文件路径 |
|
|
130
138
|
|
|
131
139
|
### 响应
|
|
132
140
|
|
|
@@ -153,11 +161,11 @@ docs = await client.collab.ls_files("alice.aid.pub:/projects/myapp")
|
|
|
153
161
|
|
|
154
162
|
| 字段 | 类型 | 说明 |
|
|
155
163
|
|------|------|------|
|
|
156
|
-
| `content` | string | base64
|
|
164
|
+
| `content` | string | base64 编码的所读版本内容 |
|
|
157
165
|
| `version` | integer | 当前或指定版本号(**commit 的 onto 来源**) |
|
|
158
|
-
| `author` | string |
|
|
159
|
-
| `anchor` | string |
|
|
160
|
-
| `current_target` | string |
|
|
166
|
+
| `author` | string | 所读版本作者 AID |
|
|
167
|
+
| `anchor` | string | 台账锚点,当前和历史版本均返回 |
|
|
168
|
+
| `current_target` | string | 所读版本文件绝对路径,当前和历史版本均返回 |
|
|
161
169
|
|
|
162
170
|
---
|
|
163
171
|
|
|
@@ -171,8 +179,9 @@ docs = await client.collab.ls_files("alice.aid.pub:/projects/myapp")
|
|
|
171
179
|
|------|------|------|------|
|
|
172
180
|
| `collab_root` | string | 是 | 协作根 `<aid>:<path>` |
|
|
173
181
|
| `doc` | string | 是 | 文档名 |
|
|
174
|
-
| `source` | string | 是 |
|
|
182
|
+
| `source` | string | 是 | Base64 编码的新正文或可读的 `<aid>:<path>`;不是本地文件路径 |
|
|
175
183
|
| `onto` | integer | 是 | 基线版本号(来自 `collab.show` 的 `version`) |
|
|
184
|
+
| `message` | string | 否 | 台账说明,默认空字符串 |
|
|
176
185
|
|
|
177
186
|
### 响应
|
|
178
187
|
|
|
@@ -184,23 +193,27 @@ docs = await client.collab.ls_files("alice.aid.pub:/projects/myapp")
|
|
|
184
193
|
| `version` | integer | 新版本号(onto+1) |
|
|
185
194
|
| `current_target` | string | 新版本文件绝对路径 |
|
|
186
195
|
|
|
187
|
-
|
|
196
|
+
**撞版本失败**:JSON-RPC `-32009` 的 `error.data` 字段如下;四个 SDK 映射为 `CollabConflictError`,不是成功响应中的 `ok:false`。
|
|
188
197
|
|
|
189
198
|
| 字段 | 类型 | 说明 |
|
|
190
199
|
|------|------|------|
|
|
191
|
-
| `ok` | boolean | `false` |
|
|
192
200
|
| `current_version` | integer | 当前权威版本号(**merge 后 commit 用此作新 onto**) |
|
|
193
201
|
| `current_target` | string | 当前权威版本文件绝对路径 |
|
|
194
|
-
| `hint` | string |
|
|
202
|
+
| `hint` | string | 合并并重新提交的提示语,不是可执行命令 |
|
|
195
203
|
|
|
196
204
|
### 示例
|
|
197
205
|
|
|
198
206
|
```python
|
|
207
|
+
from aun_core.collab.errors import CollabConflictError
|
|
208
|
+
import base64
|
|
209
|
+
source = base64.b64encode(draft_bytes).decode()
|
|
199
210
|
cur = await client.collab.show(root, "design.md")
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
211
|
+
try:
|
|
212
|
+
res = await client.collab.commit(root, "design.md", source, cur["version"])
|
|
213
|
+
except CollabConflictError as conflict:
|
|
214
|
+
merged = await client.collab.merge(root, "design.md", source, cur["version"])
|
|
215
|
+
if not merged["conflicts"]:
|
|
216
|
+
res = await client.collab.commit(root, "design.md", merged["content"], conflict.current_version)
|
|
204
217
|
```
|
|
205
218
|
|
|
206
219
|
---
|
|
@@ -215,7 +228,7 @@ if not res["ok"]:
|
|
|
215
228
|
|------|------|------|------|
|
|
216
229
|
| `collab_root` | string | 是 | 协作根 `<aid>:<path>` |
|
|
217
230
|
| `doc` | string | 是 | 文档名 |
|
|
218
|
-
| `source` | string | 是 |
|
|
231
|
+
| `source` | string | 是 | 草稿内容(ours):Base64 正文或可读的 `<aid>:<path>` |
|
|
219
232
|
| `onto` | integer | 是 | 共同祖先版本号 |
|
|
220
233
|
|
|
221
234
|
### 响应
|
|
@@ -225,7 +238,7 @@ if not res["ok"]:
|
|
|
225
238
|
| `content` | string | base64 编码的合并结果 |
|
|
226
239
|
| `conflicts` | boolean | 是否含冲突标记(`<<<<<<<` / `=======` / `>>>>>>>`) |
|
|
227
240
|
|
|
228
|
-
|
|
241
|
+
merge 只计算并返回正文,不修改草稿或当前版本。`conflicts=true` 时需编辑消解冲突;提交时将合并正文编码后传给 `commit`。
|
|
229
242
|
|
|
230
243
|
---
|
|
231
244
|
|
|
@@ -256,8 +269,8 @@ if not res["ok"]:
|
|
|
256
269
|
|------|------|------|------|
|
|
257
270
|
| `collab_root` | string | 是 | 协作根 `<aid>:<path>` |
|
|
258
271
|
| `doc` | string | 是 | 文档名 |
|
|
259
|
-
| `from` | integer | 是 |
|
|
260
|
-
| `to` | integer | 是 |
|
|
272
|
+
| `from` | integer | 是 | 起始版本号;Python 形参 `v_from`,TS/Browser/Go 为 `fromVersion` |
|
|
273
|
+
| `to` | integer | 是 | 目标版本号;Python 形参 `v_to`,TS/Browser/Go 为 `toVersion` |
|
|
261
274
|
|
|
262
275
|
### 响应
|
|
263
276
|
|
|
@@ -342,7 +355,7 @@ if not res["ok"]:
|
|
|
342
355
|
|
|
343
356
|
### 响应
|
|
344
357
|
|
|
345
|
-
返回日志数组,每项包含 `seq`、`action`、`requester`、`doc`、`version`、`
|
|
358
|
+
返回日志数组,每项包含 `seq`、`action`、`requester`、`doc`、`version`、`base_version`、`target`、`status`、`error_code`、`error_msg`、`metadata`、`timestamp` 等字段。
|
|
346
359
|
|
|
347
360
|
---
|
|
348
361
|
|
|
@@ -441,13 +454,13 @@ if not res["ok"]:
|
|
|
441
454
|
|
|
442
455
|
### 响应
|
|
443
456
|
|
|
444
|
-
|
|
457
|
+
返回 `added`、`removed`、`changed` 三个文档名字符串数组。
|
|
445
458
|
|
|
446
459
|
---
|
|
447
460
|
|
|
448
461
|
## collab.tag.restore
|
|
449
462
|
|
|
450
|
-
回滚到某标签。**forward-only**:不回退 version 计数器,而是对每个文档以标签中的旧内容写一个新版本(vN+1
|
|
463
|
+
回滚到某标签。**forward-only**:不回退 version 计数器,而是对每个文档以标签中的旧内容写一个新版本(vN+1),完成后尝试创建新标签;部分失败或无变化时不保证产生新标签。
|
|
451
464
|
|
|
452
465
|
### 参数
|
|
453
466
|
|
|
@@ -462,14 +475,16 @@ if not res["ok"]:
|
|
|
462
475
|
| 字段 | 类型 | 说明 |
|
|
463
476
|
|------|------|------|
|
|
464
477
|
| `restored_from` | string | 回滚来源标签版本 |
|
|
465
|
-
| `new_snapshot_version` | string |
|
|
478
|
+
| `new_snapshot_version` | string / null | 回滚后创建的新标签版本;部分失败或无变化时可为 `null`,历史字段名保留 |
|
|
466
479
|
| `warnings` | array | 回滚过程中的告警(如某文档被他人并发提交而跳过) |
|
|
480
|
+
| `restored_docs` | array | 已恢复的文档 |
|
|
481
|
+
| `partial` | boolean | 可选;部分失败时为 `true`,RPC 本身仍可成功返回 |
|
|
467
482
|
|
|
468
483
|
---
|
|
469
484
|
|
|
470
485
|
## collab.tag.rm
|
|
471
486
|
|
|
472
|
-
|
|
487
|
+
删除单个标签;当前活动标签不能删除。
|
|
473
488
|
|
|
474
489
|
### 参数
|
|
475
490
|
|
|
@@ -482,7 +497,8 @@ if not res["ok"]:
|
|
|
482
497
|
|
|
483
498
|
| 字段 | 类型 | 说明 |
|
|
484
499
|
|------|------|------|
|
|
485
|
-
| `
|
|
500
|
+
| `removed` | boolean | 是否删除 |
|
|
501
|
+
| `version` | string | 标签版本 |
|
|
486
502
|
|
|
487
503
|
---
|
|
488
504
|
|
|
@@ -537,7 +553,7 @@ if not res["ok"]:
|
|
|
537
553
|
|
|
538
554
|
| 字段 | 类型 | 说明 |
|
|
539
555
|
|------|------|------|
|
|
540
|
-
| `
|
|
556
|
+
| `removed` | integer | 删除的注册表条目数 |
|
|
541
557
|
|
|
542
558
|
---
|
|
543
559
|
|
|
@@ -577,5 +593,7 @@ if not res["ok"]:
|
|
|
577
593
|
| -32002 | 服务暂不可用(数据库未连接) |
|
|
578
594
|
| -32004 | 权限拒绝(requester 对 collab_root 无写权限) |
|
|
579
595
|
| -32008 | 协作文档 / 版本 / 标签不存在 |
|
|
580
|
-
| -32009 |
|
|
581
|
-
| -
|
|
596
|
+
| -32009 | 版本冲突;commit 的 `error.data` 包含当前版本与合并提示,tag create 时也可能表示标签头已移动 |
|
|
597
|
+
| -32010 | 无变化可创建标签 |
|
|
598
|
+
| -32602 | 参数校验失败 |
|
|
599
|
+
| -32000 | 其它服务错误,如源内容读取失败 |
|
|
@@ -20,7 +20,7 @@ SDK 使用约束:
|
|
|
20
20
|
|
|
21
21
|
- `custody_url` 不作为 `AUNClient` 构造配置参数传入。
|
|
22
22
|
- Python SDK 不在 `AUNClient` 上挂载 custody namespace;需要时使用独立 custody 辅助客户端或直接按本手册 HTTP API 调用。
|
|
23
|
-
-
|
|
23
|
+
- 各 SDK 均不把 custody 作为 AUNClient 核心会话能力;如需调用,请使用独立 custody 辅助客户端(若 SDK 提供)或直接按本手册 HTTP API 调用。
|
|
24
24
|
- 可通过 `https://{aid}/.well-known/aun-custody` 自动发现官方托管服务地址,并缓存发现结果。
|
|
25
25
|
|
|
26
26
|
## 手机号验证码备份/恢复时序
|
|
@@ -96,8 +96,8 @@ SDK 方法:
|
|
|
96
96
|
| 语言 | 发起复制 | 上传复制材料 | 领取复制材料 |
|
|
97
97
|
|------|----------|--------------|--------------|
|
|
98
98
|
| Python | 独立 custody 辅助客户端或 HTTP API | 独立 custody 辅助客户端或 HTTP API | 独立 custody 辅助客户端或 HTTP API |
|
|
99
|
-
| JS/TS |
|
|
100
|
-
| Go |
|
|
99
|
+
| JS/TS | 独立 custody 辅助客户端(若 SDK 提供)或 HTTP API | 独立 custody 辅助客户端(若 SDK 提供)或 HTTP API | 独立 custody 辅助客户端(若 SDK 提供)或 HTTP API |
|
|
100
|
+
| Go | 独立 custody 辅助客户端(若 SDK 提供)或 HTTP API | 独立 custody 辅助客户端(若 SDK 提供)或 HTTP API | 独立 custody 辅助客户端(若 SDK 提供)或 HTTP API |
|
|
101
101
|
|
|
102
102
|
复制请求:
|
|
103
103
|
|
|
@@ -129,6 +129,8 @@
|
|
|
129
129
|
| [group.fs.lstat](#groupfslstat) | 查看链接本身 |
|
|
130
130
|
| [group.fs.df](#groupfsdf) | 查看用量 |
|
|
131
131
|
| [group.fs.create_download_ticket](#groupfscreate_download_ticket) | 创建下载票据 |
|
|
132
|
+
| [group.fs.set_visibility](#groupfsset_visibility) | 设置节点可见性 |
|
|
133
|
+
| [group.fs.namespace_ready](#groupfsnamespace_ready) | 初始化群文件命名空间 |
|
|
132
134
|
| [group.fs.set_acl](#groupfsset_acl) | 授予群自有区角色写 ACL |
|
|
133
135
|
| [group.fs.remove_acl](#groupfsremove_acl) | 撤销群自有区角色写 ACL |
|
|
134
136
|
| [group.fs.get_acl](#groupfsget_acl) | 查询群自有区角色 ACL |
|
|
@@ -167,19 +169,19 @@ SDK 发起 `group.*` 调用时会把传入的 `group_id` / `groupId` / `group_ai
|
|
|
167
169
|
|
|
168
170
|
## 群组生命周期
|
|
169
171
|
|
|
170
|
-
群 owner
|
|
172
|
+
群 owner 由本节专属生命周期建立、转移和解除;SDK 发布配对的 `owner.md`/`agent.md` 声明,并通过 Ownership 2.1 关系版本、owner 锁和双文件共识确认归属,不调用普通 bind/release/transfer Facade 或普通主体 P2P 审批流程。创建时群公私钥及证书归初始 owner 持有;解散解除有效 owner 授权;专属转移必须 rekey,旧材料失效,新材料归新 owner。Group 服务从不保存群私钥。
|
|
171
173
|
|
|
172
|
-
### 群 agent.md
|
|
174
|
+
### 群 agent.md 的实体主签与 owner 上传
|
|
173
175
|
|
|
174
|
-
|
|
176
|
+
现代 SDK 群名片 aid 为 group_aid、type=group、owner 为当前群主,携带与 owner.md 配对的 ownership.statement;不再要求旧 entity_cert_fingerprint,主签不含 signer_aid,也不使用 ownership_proof/ownership_release。实体私钥主签,当前 owner token 上传,无需群登录,可选 owner 附签,存在时必须全块验证。SDK 先写 owner.md,再发布实体声明并确认共识;仍校验当前 owner/rekey 证书代际,完整多签与 CAS 见 [协议 §2.5](../protocol/Ownership协议定义2.1.md#25-grouporg-名片的实体主签与-owner-上传)。
|
|
175
177
|
|
|
176
178
|
管理员的 group.update、group.index 或文件权限不授予现代群名片上传权。NS 新鲜校验当前 owner、生命周期及群当前证书;Group 旧群证书单签、群身份上传始终兼容,仍执行权威检查与文件 CAS,不据此开放 Org。转移完成后新 owner 用新群材料主签并以本人 token 上传;解散后禁止发布。普通 Ownership Facade 对群目标返回 not_applicable。
|
|
177
179
|
|
|
178
|
-
新 SDK 群名片全部 NS GET/HEAD/PUT 含 fresh 携带 X-AUN-Signature-Format: multi-v1,返回完整多签及对应 ETag;旧客户端按首签投影读取,多块投影不改完整存储,单块保持原文。实体 fresh GET 还必须同时携带 X-AUN-Ownership-Check: 1 和 Cache-Control: no-cache,Check
|
|
180
|
+
新 SDK 群名片全部 NS GET/HEAD/PUT 含 fresh 携带 X-AUN-Signature-Format: multi-v1,返回完整多签及对应 ETag;旧客户端按首签投影读取,多块投影不改完整存储,单块保持原文。实体 fresh GET 还必须同时携带 X-AUN-Ownership-Check: 1 和 Cache-Control: no-cache,Check 头触发 NS 绕 LRU 全块新鲜验证;现代群声明参与双文件共识,缺少 ownership 的历史群仍返回 not_applicable 及实体校验元数据。真正 missing 为 404 且带权威头,无 ETag,依赖失败为 503。verified 下载全块验证历史证书和原文,历史验签不能作为当前授权;上传仍校验当前生命周期和证书,实体代际冲突 409、ETag 冲突 412。
|
|
179
181
|
|
|
180
182
|
### group.create
|
|
181
183
|
|
|
182
|
-
创建群组。调用者自动成为 owner
|
|
184
|
+
创建群组。调用者自动成为 owner,无需额外调用普通 Ownership 绑定 Facade;SDK 生命周期流程同步完成配对声明和共识确认。支持创建命名群(传入 `group_name` + `public_key`)。owner 本地生成、持有群私钥,服务端只接收公钥;证书导入 owner 本地后按本节 owner 规则发布群名片。新建群主标识以 `group_aid` 为准;`group_id` 仅作为兼容字段保留。
|
|
183
185
|
|
|
184
186
|
四种 SDK 的高层建群接口均支持崩溃恢复。命名群在 RPC 前持久化群密钥,并按 `group_name + public_key` 重放已提交结果;匿名群在 RPC 前持久化群密钥和创建上下文,重试会取回同一数字群并继续 `group_aid` 证书绑定与 `agent.md` 上传。群记录、群主成员、成员索引、入群设置、首个 `group.changed` 事件及匿名创建映射由服务端在同一数据库事务提交;证书服务和存储服务不参与该数据库事务,由 SDK pending 状态和服务端幂等重放恢复。
|
|
185
187
|
|
|
@@ -239,7 +241,7 @@ SDK 发起 `group.*` 调用时会把传入的 `group_id` / `groupId` / `group_ai
|
|
|
239
241
|
|
|
240
242
|
### group.bind_aid
|
|
241
243
|
|
|
242
|
-
为已有普通群绑定命名 AID
|
|
244
|
+
为已有普通群绑定命名 AID(升级为命名群)。仅群主可操作。这是群身份生命周期操作,不调用普通 Ownership 绑定 Facade;绑定后身份材料由当前 owner 持有,SDK 生命周期流程完成配对声明及共识确认。
|
|
243
245
|
|
|
244
246
|
**参数**:
|
|
245
247
|
|
|
@@ -619,7 +621,7 @@ SDK 发起 `group.*` 调用时会把传入的 `group_id` / `groupId` / `group_ai
|
|
|
619
621
|
|
|
620
622
|
### group.bind_group_aid
|
|
621
623
|
|
|
622
|
-
为匿名群绑定群身份(group_aid)。需要 owner
|
|
624
|
+
为匿名群绑定群身份(group_aid)。需要 owner 权限。这是专属群身份绑定,不调用普通 Ownership 绑定 Facade;成功后当前 owner 持有群身份材料,以实体私钥主签、本人 token 上传群名片,SDK 完成配对 owner.md 声明与共识确认。
|
|
623
625
|
|
|
624
626
|
**幂等保证**:
|
|
625
627
|
- 已绑定且公钥匹配:返回已绑定的 group_aid 和证书
|
|
@@ -1444,6 +1446,27 @@ result = await client.call("group.thought.get", {
|
|
|
1444
1446
|
| `limit` | integer | 否 | 50 | Python V2 Forward 最大 200;其余模式保留原限制,`pull_max_limit` 配置可进一步收紧 |
|
|
1445
1447
|
| `device_id` | string | 否 | — | 设备 ID(多设备模式) |
|
|
1446
1448
|
|
|
1449
|
+
#### 存储范围与字节分页
|
|
1450
|
+
|
|
1451
|
+
群消息 Pull(含底层 `group.v2.pull`)、`group.history` 及 `group.pull_events` 支持可选字节上限;Forward Pull 通过存储范围选择持久或临时数据:
|
|
1452
|
+
|
|
1453
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
1454
|
+
| --- | --- | --- | --- |
|
|
1455
|
+
| `storage_scope` | string | `all` | `all` 保持既有来源;`persistent` 只读取持久消息/事件;`volatile` 返回临时来源专用页 |
|
|
1456
|
+
| `max_page_bytes` | integer | 原服务配置 | 显式范围 `1024..786432`,按单次 RPC `result` 的 JSON 编码字节截页,与条数上限同时执行 |
|
|
1457
|
+
|
|
1458
|
+
`persistent` 不读取 volatile mailbox;`volatile` 沿用原消息类别、设备、slot 与 TTL 过滤,没有临时数据时返回空页。临时页不返回持久消息/事件 coverage、head 或 server ACK,也不接受 `ack_up_to_seq`、`before_seq` 或 `window_mode`。群消息与群事件仍使用独立游标,History 保持只读。
|
|
1459
|
+
|
|
1460
|
+
首条记录超过预算时,`error.data.code="OVERSIZED_MESSAGE"`,并附带 `required_page_bytes`、`max_page_bytes` 及可用的记录标识;该失败页不推进游标或 ACK。后台 SDK 通过 `sync.error` 报告并停止该流自动续页,其它流继续;显式前台调用返回原错误。
|
|
1461
|
+
|
|
1462
|
+
弹性历史请求使用 `persistent`,主辅合计初始编码预留 1 MiB,本地按页上限的 8 倍预留至消费结束、初始总额 8 MiB;实时临时页独立走主连接。群成员可见性、入群下界及 ACK 提交规则沿用原契约。
|
|
1463
|
+
|
|
1464
|
+
SDK 遵从 `max_aux_channels` 支持 0..N 条辅助连接(当前协议测试到 2);本轮 Gateway 对同一 AID+设备跨 slot 最多授权 1 条,开关关闭或压力回收时为 0。连接数量不是 Pull 总并发上限:同 namespace 串行,不同 namespace 可在策略和预算允许时并行。
|
|
1465
|
+
|
|
1466
|
+
普通持久 Forward 带 `max_page_bytes` 时,`group.pull`、`group.v2.pull`、`group.pull_events` 可返回 `pending_count_lower_bound`(0—100);Group 当前 `all` 也只含持久来源。它只取本次既有读取、可见且去重候选中最终未返回的数量,包含字节截页移出的行,不新增查询、COUNT、扫描或读取 limit。缺省或 0 都不证明追平;续页、游标与 ACK 继续遵守原分页契约。force、Tail、History、control、sdk_control、volatile 不返回此提示。`limit+1` 通常只能证明还有 1 条,V2 原读取可能只能证明 0,不能保证识别所有单流大积压。
|
|
1467
|
+
|
|
1468
|
+
普通短连接和 `history_sync` 补拉辅助连接均不触发或接收群 unread hint;群提示由主长连接接收。短连接显式调用 Pull 不受影响。
|
|
1469
|
+
|
|
1447
1470
|
**响应**:
|
|
1448
1471
|
|
|
1449
1472
|
```json
|
|
@@ -1581,7 +1604,7 @@ SDK 只保证单个实时拉取响应页内按 seq 升序、同 seq 最多发布
|
|
|
1581
1604
|
- `group.fs.set_acl` / `group.fs.remove_acl` / `group.fs.get_acl` / `group.fs.list_acl` 只能由当前 group `owner/admin` 调用。当前支持 `grantee_aid="role:admin"` 与 `grantee_aid="role:member"`;`role:member` 只能授予具体业务目录的 `rw` 权限,不能授予根目录或 `.group/`,也不能获得删除、移动、重命名权限。成员升降级、退群、踢出不会联动授权或撤销目录 ACL。
|
|
1582
1605
|
- `memberdata/{member_ref}` 写入默认只允许该成员本人;SDK 只传 group path,不拼接真实 storage 路径。
|
|
1583
1606
|
- 上传控制面会透传 `parents` 到 storage:默认 `parents=true` 时可递归创建父目录,显式 `parents=false` 时父目录必须已存在。
|
|
1584
|
-
- JavaScript
|
|
1607
|
+
- JavaScript SDK 的 `cp(string, group)` 默认把 string 当 UTF-8 文本内容上传;本地路径需显式传 `sourceType: "path"`、`localPath: true` 或使用 `local:` 前缀。Python、TypeScript 和 Go 默认把 string 当本地路径。
|
|
1585
1608
|
|
|
1586
1609
|
### SDK 默认读缓存
|
|
1587
1610
|
|
|
@@ -1591,7 +1614,7 @@ SDK 只保证单个实时拉取响应页内按 seq 升序、同 seq 最多发布
|
|
|
1591
1614
|
|
|
1592
1615
|
### group.fs.ls
|
|
1593
1616
|
|
|
1594
|
-
列出目录。参数:`path` 必填;可选 `page`、`size
|
|
1617
|
+
列出目录。参数:`path` 必填;可选 `page`、`size`(也接受 `limit` 作为 `size` 别名)。当前 Group 服务将 `page` 规范化为至少 1、`size` 限制在 1..1000,并向 Storage 传递这两个分页参数;`marker`、`long`、`recursive` 不属于当前 RPC 的生效参数。响应返回 group view `items`,节点 `path` 仍为 group path。
|
|
1595
1618
|
|
|
1596
1619
|
### group.fs.find
|
|
1597
1620
|
|
|
@@ -1663,19 +1686,27 @@ Group FS 的读缓存保存符合策略的已验证正文,不把下载票据
|
|
|
1663
1686
|
|
|
1664
1687
|
### group.fs.create_upload_session
|
|
1665
1688
|
|
|
1666
|
-
创建上传会话。参数同 `check_upload`。响应透传 Storage session 字段并增加 Group FS
|
|
1689
|
+
创建上传会话。参数同 `check_upload`。响应透传 Storage session 字段并增加 Group FS 路径视图,通常包含 `upload_url`、可选 `session_id`、可选 `headers`、`content_type`、`size_bytes` 等。四个 SDK 的 Group FS 门面会按实际字节识别 MIME,并在 session、HTTP PUT 与 complete 中保持 `Content-Type` 一致;若 session 返回 headers,SDK 保留其它 header 并替换其中的 Content-Type,避免 OSS 签名不一致导致 403。
|
|
1667
1690
|
|
|
1668
1691
|
### group.fs.complete_upload
|
|
1669
1692
|
|
|
1670
1693
|
完成上传。参数包含 `path`、`sha256`、`size_bytes`、可选 `session_id`、`skip_blob`、`metadata`、`expected_version`。响应为 group view NodeView。
|
|
1671
1694
|
|
|
1695
|
+
### group.fs.set_visibility
|
|
1696
|
+
|
|
1697
|
+
设置群自有区节点可见性。参数:`path` 必填;`visibility` 必填,为 `public` 或 `private`(也可用兼容布尔参数 `is_public`);可选 `expected_version`。`memberdata` 及其子路径的可见性由成员自挂载流程管理,不能通过此 RPC 修改。成功响应为 NodeView,并包含最终 `visibility`。
|
|
1698
|
+
|
|
1699
|
+
### group.fs.namespace_ready
|
|
1700
|
+
|
|
1701
|
+
初始化或检查群文件命名空间。参数:`group_id` 必填;可选 `folder_ids` 对已有 Storage 文件夹 ID 做绑定。调用者须为群身份、owner 或 admin。成功响应包含 `namespace_ready=true`、`baseline_paths`、`items`、`baseline_role_acls_synced`、`own_area_ready` 和 `memberdata_ready`;命名群的基线目录为 `.group`、`announce`、`public`、`archive`、`memberdata`,普通群至少返回 `memberdata`。该调用会触发缺失基线目录/ACL 的 best-effort 初始化。
|
|
1702
|
+
|
|
1672
1703
|
### group.fs.mount
|
|
1673
1704
|
|
|
1674
|
-
|
|
1705
|
+
挂载成员数据区。`path` 必须是 `/memberdata/{member_ref}`(可使用带 group AID 的 group path);可选 `readonly`(默认 `true`)、`require_approval`(默认 `false`)、`source_bucket`、`expires_at`、`volume_id`。未提供 `volume_id` 时从成员 AID 和其群数据根目录挂载;提供 `volume_id` 时挂载指定 volume。
|
|
1675
1706
|
|
|
1676
1707
|
### group.fs.umount
|
|
1677
1708
|
|
|
1678
|
-
|
|
1709
|
+
卸载成员数据区。`path` 必须是 `/memberdata/{member_ref}`(可使用带 group AID 的 group path);对成员数据区卸载不删除成员源数据。
|
|
1679
1710
|
|
|
1680
1711
|
## 在线状态
|
|
1681
1712
|
|
|
@@ -1716,7 +1747,9 @@ Group FS 的读缓存保存符合策略的已验证正文,不把下载票据
|
|
|
1716
1747
|
|
|
1717
1748
|
### group.pull_events
|
|
1718
1749
|
|
|
1719
|
-
|
|
1750
|
+
`storage_scope`、`max_page_bytes` 及超页错误沿用[群 Pull 的存储与字节分页规则](#存储范围与字节分页)。
|
|
1751
|
+
|
|
1752
|
+
增量拉取群事件,支持多设备独立游标;`pending_count_lower_bound` 沿用上述普通持久字节限页规则。SDK 将其作为后台 Pull 放入当前 `AUNClient` 的客户端级 Pull Gate;该 Gate 与 P2P Message、Group Message Pull 共享,同一 namespace 单飞,客户端最多 4 个不同 namespace 并行。Group Event 使用 `group_event:{群标识}`,与同群消息 namespace 独立;相同完整请求 key 折叠并共享结果,可运行的不同 key 按后台 FIFO 调度并让前台请求优先。Group Event 使用独立的 Forward Cursor,不修改消息 A/T/H;不同 `AUNClient` 实例之间不共享 Gate。应用层无需自行实现并发控制。
|
|
1720
1753
|
|
|
1721
1754
|
**参数**:
|
|
1722
1755
|
|
|
@@ -2006,6 +2039,20 @@ SDK 交付给应用层的群事件信封字段统一放在 `envelope`。0.5.x
|
|
|
2006
2039
|
| `suspended` | 群组暂停 |
|
|
2007
2040
|
| `resumed` | 群组恢复 |
|
|
2008
2041
|
| `dissolved` | 群组解散 |
|
|
2042
|
+
| `fs_set_visibility` | 文件节点可见性变更 |
|
|
2043
|
+
| `fs_set_acl` | 文件节点 ACL 授予 |
|
|
2044
|
+
| `fs_remove_acl` | 文件节点 ACL 撤销 |
|
|
2045
|
+
| `fs_mkdir` | 创建目录 |
|
|
2046
|
+
| `fs_rm` | 删除节点 |
|
|
2047
|
+
| `fs_cp` | 远程复制节点 |
|
|
2048
|
+
| `fs_mv` | 远程移动节点 |
|
|
2049
|
+
| `fs_upload_completed` | 上传完成 |
|
|
2050
|
+
| `fs_mount` | 挂载成员数据区 |
|
|
2051
|
+
| `fs_umount` | 卸载成员数据区 |
|
|
2052
|
+
| `fs_namespace_ready` | 文件命名空间初始化完成 |
|
|
2053
|
+
| `fs_confirmed` | 文件 ACL 操作确认 |
|
|
2054
|
+
| `fs_mount_confirmed` | 挂载操作确认 |
|
|
2055
|
+
| `fs_mount_unavailable` | 挂载 volume 不可用 |
|
|
2009
2056
|
|
|
2010
2057
|
**订阅**:
|
|
2011
2058
|
|