@agentunion/fastaun-browser 0.4.10 → 0.4.11

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/_packed_docs/CHANGELOG.md +30 -0
  3. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +2 -2
  4. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +7 -4
  5. package/_packed_docs/sdk/09-group-rpc-manual.md +141 -2
  6. package/_packed_docs/sdk/09-storage-rpc-manual.md +247 -28
  7. package/dist/bundle.js +166 -44
  8. package/dist/client/delivery.d.ts +4 -1
  9. package/dist/client/delivery.d.ts.map +1 -1
  10. package/dist/client/delivery.js +68 -15
  11. package/dist/client/delivery.js.map +1 -1
  12. package/dist/client/group-state.js +2 -2
  13. package/dist/client/group-state.js.map +1 -1
  14. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  15. package/dist/client/rpc-pipeline.js +29 -4
  16. package/dist/client/rpc-pipeline.js.map +1 -1
  17. package/dist/client/v2-e2ee.d.ts.map +1 -1
  18. package/dist/client/v2-e2ee.js +9 -2
  19. package/dist/client/v2-e2ee.js.map +1 -1
  20. package/dist/client.d.ts +1 -0
  21. package/dist/client.d.ts.map +1 -1
  22. package/dist/client.js +37 -14
  23. package/dist/client.js.map +1 -1
  24. package/dist/v2/e2ee/encrypt-p2p.js +1 -1
  25. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
  26. package/dist/v2/session/keystore.d.ts.map +1 -1
  27. package/dist/v2/session/keystore.js +8 -9
  28. package/dist/v2/session/keystore.js.map +1 -1
  29. package/dist/v2/session/session.d.ts +4 -2
  30. package/dist/v2/session/session.d.ts.map +1 -1
  31. package/dist/v2/session/session.js +20 -4
  32. package/dist/v2/session/session.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,36 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## 0.4.11 — 2026-06-08
10
+
11
+ ### 新功能
12
+ - **Storage 目录树与扩展操作**:`storage.*` 新增 15 个存储操作方法(含 `create_folder`/`rename_folder`/`move_object`/`batch_delete` 等),加入签名集合和非幂等集合(四语言+服务端对齐)
13
+ - **group.resources 树形资源系统**:新增 11 个资源管理方法,加入签名和非幂等集合;支持跨域访问票据(四语言+服务端对齐)
14
+ - **group.changed 事件保序去重**:新增 `handleGroupChangedEventSeq` 支持 event_seq 追踪和有序消息队列,空洞先到时缓存补洞;新增 `_isEventSignatureVerified()` 区分 pending 不标记已验签(四语言对齐)
15
+ - **V2 E2EE 注册并发保护**:SPK 注册改用 `_registeringPromise` 缓存并发请求,多并发调用时等待同一 Promise(四语言对齐)
16
+
17
+ ### 修复
18
+ - **IndexedDB 事务原子性**:`addSPK` 改用单事务处理原始记录和别名,避免独立事务导致一致性问题
19
+ - **SPK 销毁顺序**:`_doAutoDestroy` 中先删设备级密钥再删存储级密钥
20
+ - **sdk_version 拼写**:`sdk_vesion` → `sdk_version`
21
+ - **V2 并发冲突检测**:检查对端操作的 `inflightSet`,防止 SPK 注册与轮换并发冲突
22
+ - **storage/group.resources 签名和幂等性补全**:补全写操作方法进入签名集合与非幂等集合(四语言对齐)
23
+
24
+ ### 优化
25
+ - **群事件处理流程重构**:`group.changed` 事件分发逻辑从 `client.ts` 迁移到 `delivery.ts`,支持按 event_seq 保序发布;新增 `publishOrderedQueueItem()` / `publishOrderedGroupChanged()`
26
+ - **群组解散清理**:解散事件处理改为异步 `drainOrderedMessages`,保证 seq 追踪一致性
27
+ - **群事件自动 ack**:`handleGroupChangedEventSeq` 无需补洞时直接 ack event cursor
28
+ - **错误日志补充**:V2Session SPK 销毁异常捕获并输出日志
29
+
30
+ ### 测试
31
+ - 新增事件验签状态单元测试(pending 状态不标记已验签)
32
+ - 新增消息乱序补洞保序测试(高序号 push 先到时 SDK 内部消费和应用层发布的保序去重)
33
+ - 新增签名方法覆盖测试(storage 写操作和有副作用读操作进入非幂等集合)
34
+ - 新增 RPC 管道非幂等超时测试(storage/resources 方法按非幂等长超时 35s 发送)
35
+ - 修复 `handleGroupChangedEventSeq` 单元测试 async/await 标记和 ack cursor 验证
36
+
37
+ ---
38
+
9
39
  ## 0.4.10 — 2026-06-06
10
40
 
11
41
  ### 新功能
@@ -6,6 +6,36 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## 0.4.11 — 2026-06-08
10
+
11
+ ### 新功能
12
+ - **Storage 目录树与扩展操作**:`storage.*` 新增 15 个存储操作方法(含 `create_folder`/`rename_folder`/`move_object`/`batch_delete` 等),加入签名集合和非幂等集合(四语言+服务端对齐)
13
+ - **group.resources 树形资源系统**:新增 11 个资源管理方法,加入签名和非幂等集合;支持跨域访问票据(四语言+服务端对齐)
14
+ - **group.changed 事件保序去重**:新增 `handleGroupChangedEventSeq` 支持 event_seq 追踪和有序消息队列,空洞先到时缓存补洞;新增 `_isEventSignatureVerified()` 区分 pending 不标记已验签(四语言对齐)
15
+ - **V2 E2EE 注册并发保护**:SPK 注册改用 `_registeringPromise` 缓存并发请求,多并发调用时等待同一 Promise(四语言对齐)
16
+
17
+ ### 修复
18
+ - **IndexedDB 事务原子性**:`addSPK` 改用单事务处理原始记录和别名,避免独立事务导致一致性问题
19
+ - **SPK 销毁顺序**:`_doAutoDestroy` 中先删设备级密钥再删存储级密钥
20
+ - **sdk_version 拼写**:`sdk_vesion` → `sdk_version`
21
+ - **V2 并发冲突检测**:检查对端操作的 `inflightSet`,防止 SPK 注册与轮换并发冲突
22
+ - **storage/group.resources 签名和幂等性补全**:补全写操作方法进入签名集合与非幂等集合(四语言对齐)
23
+
24
+ ### 优化
25
+ - **群事件处理流程重构**:`group.changed` 事件分发逻辑从 `client.ts` 迁移到 `delivery.ts`,支持按 event_seq 保序发布;新增 `publishOrderedQueueItem()` / `publishOrderedGroupChanged()`
26
+ - **群组解散清理**:解散事件处理改为异步 `drainOrderedMessages`,保证 seq 追踪一致性
27
+ - **群事件自动 ack**:`handleGroupChangedEventSeq` 无需补洞时直接 ack event cursor
28
+ - **错误日志补充**:V2Session SPK 销毁异常捕获并输出日志
29
+
30
+ ### 测试
31
+ - 新增事件验签状态单元测试(pending 状态不标记已验签)
32
+ - 新增消息乱序补洞保序测试(高序号 push 先到时 SDK 内部消费和应用层发布的保序去重)
33
+ - 新增签名方法覆盖测试(storage 写操作和有副作用读操作进入非幂等集合)
34
+ - 新增 RPC 管道非幂等超时测试(storage/resources 方法按非幂等长超时 35s 发送)
35
+ - 修复 `handleGroupChangedEventSeq` 单元测试 async/await 标记和 ack cursor 验证
36
+
37
+ ---
38
+
9
39
  ## 0.4.10 — 2026-06-06
10
40
 
11
41
  ### 新功能
@@ -409,8 +409,8 @@ sub.unsubscribe()
409
409
  | 领域 | 手册 | 关键方法 |
410
410
  |------|------|----------|
411
411
  | 消息 | [09-message-rpc-manual.md](09-message-rpc-manual.md) | `message.send` / `message.pull` / `message.ack` / `message.thought.*` |
412
- | 群组 | [09-group-rpc-manual.md](09-group-rpc-manual.md) | `group.create` / `group.invite` / `group.send` / `group.v2.*` |
413
- | 存储 | [09-storage-rpc-manual.md](09-storage-rpc-manual.md) | `storage.upload` / `storage.download` / `storage.share` |
412
+ | 群组 | [09-group-rpc-manual.md](09-group-rpc-manual.md) | `group.create` / `group.send` / `group.v2.*` / `group.resources.*` |
413
+ | 存储 | [09-storage-rpc-manual.md](09-storage-rpc-manual.md) | `storage.put_object` / `storage.create_upload_session` / `storage.create_folder` / `storage.create_share_link` |
414
414
  | 元信息 | [09-meta-rpc-manual.md](09-meta-rpc-manual.md) | `meta.ping` / `meta.status` / `meta.trust_roots` |
415
415
  | Stream | [09-stream-rpc-manual.md](09-stream-rpc-manual.md) | `stream.create` / `stream.close` / `stream.list_active` |
416
416
  | Service Proxy | [09-proxy-rpc-manual.md](09-proxy-rpc-manual.md) | `proxy.register_services` / `proxy.unregister_services` / `proxy.list_services` |
@@ -13,13 +13,13 @@ AUNError
13
13
  │ └── IdentityConflictError
14
14
  ├── PermissionError
15
15
  ├── ValidationError
16
+ │ └── ClientSignatureError
16
17
  ├── NotFoundError
17
18
  ├── RateLimitError
18
19
  ├── VersionConflictError
19
20
  ├── StateError
20
21
  ├── SerializationError
21
22
  ├── SessionError
22
- ├── ClientSignatureError
23
23
  ├── GroupError
24
24
  └── E2EEError
25
25
  ```
@@ -55,17 +55,20 @@ except AUNError as e:
55
55
  | 4040 / 404 | 资源不存在 | `NotFoundError` |
56
56
  | 4290 / 429 | 请求限流 | `RateLimitError` |
57
57
  | -32001 / -32003 | 认证失败 | `AuthError` |
58
- | -32004 | 权限不足 | `PermissionError` |
58
+ | -32004 | RPC handler 超时(消息以 `"rpc handler timeout"` 开头) | `TimeoutError` |
59
+ | -32004 | 权限不足(其他情况) | `PermissionError` |
59
60
  | -32008 | 资源不存在 | `NotFoundError` |
60
61
  | -32009 | 版本冲突 | `VersionConflictError` |
61
62
  | -32010 / -32011 / -32013 | 会话错误 | `SessionError` |
63
+ | -32051 | 客户端签名验证失败 | `ClientSignatureError`(继承自 `ValidationError`) |
62
64
  | -32029 | 请求限流 | `RateLimitError` |
63
65
  | -32600 / -32601 / -32602 | JSON-RPC 参数错误 | `ValidationError` |
64
66
  | -32040 ~ -32044 | E2EE 群组错误 | `E2EEError` 子类 |
65
67
  | 4090 | 身份冲突 | `IdentityConflictError` |
66
68
  | -32050 | 证书已吊销 | `CertificateRevokedError` |
67
- | -32051 | 客户端签名验证失败 | `ClientSignatureError` |
68
- | -33001 ~ -33009 | 群组错误 | `GroupError` 子类 |
69
+ | -33001 | 群组不存在 | `GroupNotFoundError` |
70
+ | -33002 / -33003 | 群组状态错误 | `GroupStateError` |
71
+ | -33004 ~ -33009 | 其他群组错误 | `GroupError` 子类 |
69
72
 
70
73
  ---
71
74
 
@@ -121,6 +121,16 @@
121
121
  | 方法 | 说明 |
122
122
  |------|------|
123
123
  | [group.resources.put](#groupresourcesput) | 分享资源 |
124
+ | [group.resources.create_folder](#groupresourcescreate_folder) | 创建资源目录 |
125
+ | [group.resources.list_children](#groupresourceslist_children) | 列出目录子节点 |
126
+ | [group.resources.rename](#groupresourcesrename) | 重命名资源节点 |
127
+ | [group.resources.move](#groupresourcesmove) | 移动资源节点 |
128
+ | [group.resources.mount_object](#groupresourcesmount_object) | 挂载 storage 对象为资源 |
129
+ | [group.resources.request_mount_object](#groupresourcesrequest_mount_object) | 申请挂载 storage 对象 |
130
+ | [group.resources.unmount](#groupresourcesunmount) | 取消挂载资源 |
131
+ | [group.resources.resolve_path](#groupresourcesresolve_path) | 按路径解析资源 |
132
+ | [group.resources.list_refs_by_storage](#groupresourceslist_refs_by_storage) | 按 storage 引用反查资源 |
133
+ | [group.resources.cleanup_by_storage_ref](#groupresourcescleanup_by_storage_ref) | 清理失效 storage 引用 |
124
134
  | [group.resources.get](#groupresourcesget) | 查看资源 |
125
135
  | [group.resources.list](#groupresourceslist) | 列出资源 |
126
136
  | [group.resources.update](#groupresourcesupdate) | 更新资源元数据 |
@@ -1358,6 +1368,122 @@ result = await client.call("group.thought.get", {
1358
1368
 
1359
1369
  > `created` 为 `true` 表示新建,`false` 表示更新已有资源。
1360
1370
 
1371
+ ### group.resources.create_folder
1372
+
1373
+ 创建群资源目录。需要 **member 及以上**权限。
1374
+
1375
+ **参数**:
1376
+
1377
+ | 参数 | 类型 | 必填 | 说明 |
1378
+ |------|------|------|------|
1379
+ | `group_id` | string | 是 | 群组 ID |
1380
+ | `path` / `resource_path` | string | 否 | 完整目录路径 |
1381
+ | `name` | string | 否 | 目录名;未提供完整路径时使用 |
1382
+ | `parent_resource_id` / `parent_path` | string | 否 | 父目录 |
1383
+ | `title` | string | 否 | 显示标题,默认目录名 |
1384
+ | `metadata` | object | 否 | 自定义元数据 |
1385
+ | `visibility` | string | 否 | `"members_only"` / `"public"` |
1386
+ | `tags` | array | 否 | 标签 |
1387
+ | `mkdirs` | boolean | 否 | 是否递归创建父目录 |
1388
+ | `sort_order` | integer | 否 | 排序值 |
1389
+
1390
+ **响应**:`{ "group_id": "...", "resource": { ... }, "created": true }`。
1391
+
1392
+ ### group.resources.list_children
1393
+
1394
+ 列出某个资源目录下的直接子节点。
1395
+
1396
+ **参数**:
1397
+
1398
+ | 参数 | 类型 | 必填 | 说明 |
1399
+ |------|------|------|------|
1400
+ | `group_id` | string | 是 | 群组 ID |
1401
+ | `resource_id` / `path` / `resource_path` | string | 否 | 父目录;不传表示根目录 |
1402
+ | `type` / `resource_type` | string | 否 | `"folder"` / `"file"` / `"link"` |
1403
+ | `include_status` | boolean | 否 | 是否附带 storage 状态 |
1404
+ | `page` / `offset` | integer | 否 | 分页位置 |
1405
+ | `size` / `limit` | integer | 否 | 每页数量 |
1406
+ | `sort_by` | string | 否 | 排序字段,默认 `sort_order` |
1407
+ | `order` | string | 否 | `"asc"` / `"desc"` |
1408
+
1409
+ **响应**:`group_id`、`resource_id`、`path`、`items`、`total`、`count`、`page`、`size`、`offset`。
1410
+
1411
+ ### group.resources.rename
1412
+
1413
+ 重命名资源节点。需要资源创建者、storage owner、owner 或 admin 权限。
1414
+
1415
+ **参数**:`group_id`,资源选择器(`resource_id` / `resource_path` / `path`),`new_name`;可选 `title`、`expected_version`。
1416
+
1417
+ **响应**:更新后的 `resource`。
1418
+
1419
+ ### group.resources.move
1420
+
1421
+ 移动资源节点。目录不能移动到自身或自身子目录。
1422
+
1423
+ **参数**:`group_id`,资源选择器,目标父目录(`dst_parent_resource_id` / `dst_parent_path`),可选 `new_name` / `dst_name`、`expected_version`。
1424
+
1425
+ **响应**:更新后的 `resource`。
1426
+
1427
+ ### group.resources.mount_object
1428
+
1429
+ 将 `storage.*` 对象挂载为群资源。需要 **owner/admin** 权限。
1430
+
1431
+ **参数**:
1432
+
1433
+ | 参数 | 类型 | 必填 | 说明 |
1434
+ |------|------|------|------|
1435
+ | `group_id` | string | 是 | 群组 ID |
1436
+ | `storage_ref` | object | 是 | storage 引用,通常包含 `owner_aid`、`bucket`、`object_id` 或 `object_key` |
1437
+ | `path` / `resource_path` | string | 否 | 资源路径;不传时用 storage 文件名 |
1438
+ | `title` | string | 否 | 显示标题 |
1439
+ | `metadata` | object | 否 | 自定义元数据 |
1440
+ | `visibility` | string | 否 | `"members_only"` / `"public"` |
1441
+ | `tags` | array | 否 | 标签 |
1442
+ | `mkdirs` | boolean | 否 | 是否递归创建父目录,默认 `true` |
1443
+ | `conflict_policy` | string | 否 | `"reject"` / `"replace"` / `"keep_both"` |
1444
+
1445
+ **响应**:`{ "group_id": "...", "resource": { ... }, "created": true }`。
1446
+
1447
+ ### group.resources.request_mount_object
1448
+
1449
+ 成员申请挂载自己的 storage 对象,进入待审批队列。语义等同 `group.resources.request_add`,但输入按挂载对象组织。
1450
+
1451
+ **参数**:同 `group.resources.mount_object`,但不需要 owner/admin 权限。
1452
+
1453
+ **响应**:`{ "group_id": "...", "request": { ... } }`。
1454
+
1455
+ ### group.resources.unmount
1456
+
1457
+ 取消挂载资源,等价于非递归 `group.resources.delete`。
1458
+
1459
+ **参数**:`group_id`,资源选择器(`resource_id` / `resource_path` / `path`)。
1460
+
1461
+ **响应**:删除结果。
1462
+
1463
+ ### group.resources.resolve_path
1464
+
1465
+ 按路径解析资源节点。
1466
+
1467
+ **参数**:`group_id`、`path` / `resource_path`;可选 `expected_type`。
1468
+
1469
+ **响应**:`resource_id`、`resource_type`、`resource_path`、`path`、`status`、`resource`。
1470
+
1471
+ ### group.resources.list_refs_by_storage
1472
+
1473
+ 按 storage 引用反查群资源。传 `group_id` 时要求调用者是该群成员;不传 `group_id` 时要求调用者是 `owner_aid`。
1474
+
1475
+ **参数**:`owner_aid` 必填,`object_id` 或 `object_key` 至少一个;可选 `bucket`、`group_id`、`include_missing`、`offset`、`limit` / `size`。
1476
+
1477
+ **响应**:`items`、`total`、`count`、`limit`、`offset`,并回显 storage 选择器字段。
1478
+
1479
+ ### group.resources.cleanup_by_storage_ref
1480
+
1481
+ 清理指向已删除或失效 storage 对象的资源引用。传 `group_id` 时要求 owner/admin 或 storage owner;不传 `group_id` 时要求 storage owner。
1482
+
1483
+ **参数**:`owner_aid` 必填,`object_id` 或 `object_key` 至少一个;可选 `bucket`、`group_id`、`mode`。
1484
+
1485
+ **响应**:`affected_count` 和被影响的资源 `items`。
1486
+
1361
1487
  ### group.resources.get
1362
1488
 
1363
1489
  查看资源详情。
@@ -1485,7 +1611,7 @@ result = await client.call("group.thought.get", {
1485
1611
 
1486
1612
  ### group.resources.direct_add
1487
1613
 
1488
- Owner 直接添加资源(无需审批)。需要 **owner** 权限。
1614
+ Owner/Admin 直接添加资源(无需审批)。需要 **owner/admin** 权限。
1489
1615
 
1490
1616
  **参数**:同 `group.resources.put`(`resource_type` 不能是 `"folder"`)。
1491
1617
 
@@ -1835,7 +1961,8 @@ CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
1835
1961
  {
1836
1962
  "module_id": "group",
1837
1963
  "action": "member_added",
1838
- "group_id": "g-abc123.agentid.pub"
1964
+ "group_id": "g-abc123.agentid.pub",
1965
+ "event_seq": 42
1839
1966
  }
1840
1967
  ```
1841
1968
 
@@ -1844,9 +1971,21 @@ CAS 轮换群组 E2EE Epoch。需要 **admin 及以上**权限。
1844
1971
  | `module_id` | string | 固定 `"group"` |
1845
1972
  | `action` | string | 变更类型(见下表) |
1846
1973
  | `group_id` | string | 群组 ID |
1974
+ | `event_seq` | integer | 可选,服务端分配的单调递增序号,用于 SDK 内部保序去重 |
1847
1975
  | `request_id` | string | 可选,仅资源审批相关 action |
1848
1976
  | `resource_path` | string | 可选,仅资源相关 action |
1849
1977
 
1978
+ **保序去重(SDK 内部行为)**:
1979
+
1980
+ 服务端为每条 `group.changed` 事件分配 `event_seq`(按群 `group_event:{group_id}` 命名空间单调递增)。SDK 收到事件后:
1981
+
1982
+ 1. **去重**:`event_seq` ≤ 已连续消费序号,或已处理过该序号,则丢弃
1983
+ 2. **保序**:事件入有序队列,按序号连续后才发布给应用层
1984
+ 3. **补洞**:检测到序号空洞时,自动调用 `group.pull_events` 拉取缺失事件补齐
1985
+ 4. **ack**:连续段推进后自动发送 `group.ack_events`(namespace `group_event:{group_id}`)
1986
+
1987
+ 不携带 `event_seq` 的旧格式事件直接发布,不参与保序(兼容旧服务端)。
1988
+
1850
1989
  **action 取值**:
1851
1990
 
1852
1991
  | action | 说明 |
@@ -12,13 +12,37 @@
12
12
  | [storage.delete_object](#storagedelete_object) | 删除对象 |
13
13
  | [storage.list_objects](#storagelist_objects) | 列举对象 |
14
14
  | [storage.list_prefixes](#storagelist_prefixes) | 列举子目录 |
15
- | [storage.get_quota](#storageget_quota) | 查询配额 |
16
- | [storage.get_limits](#storageget_limits) | 查询上传限制 |
17
- | [storage.check_upload](#storagecheck_upload) | 上传预检(秒传检测 + 超限检测) |
18
-
19
- ### 数据面协调方法
20
-
21
- | 方法 | 说明 |
15
+ | [storage.get_quota](#storageget_quota) | 查询配额 |
16
+ | [storage.get_limits](#storageget_limits) | 查询上传限制 |
17
+ | [storage.check_upload](#storagecheck_upload) | 上传预检(秒传检测 + 超限检测) |
18
+
19
+ ### 目录树方法
20
+
21
+ | 方法 | 说明 |
22
+ |------|------|
23
+ | [storage.create_folder](#storagecreate_folder) | 创建目录 |
24
+ | [storage.get_folder](#storageget_folder) | 查询目录 |
25
+ | [storage.list_children](#storagelist_children) | 列出目录子节点 |
26
+ | [storage.rename_folder](#storagerename_folder) | 重命名目录 |
27
+ | [storage.move_folder](#storagemove_folder) | 移动目录 |
28
+ | [storage.delete_folder](#storagedelete_folder) | 删除目录 |
29
+ | [storage.resolve_path](#storageresolve_path) | 按路径解析节点 |
30
+
31
+ ### 对象管理方法
32
+
33
+ | 方法 | 说明 |
34
+ |------|------|
35
+ | [storage.move_object](#storagemove_object) | 移动或重命名对象 |
36
+ | [storage.copy_object](#storagecopy_object) | 复制对象 |
37
+ | [storage.batch_delete](#storagebatch_delete) | 批量删除对象/目录 |
38
+ | [storage.batch_head_object](#storagebatch_head_object) | 批量查询对象元数据 |
39
+ | [storage.set_object_meta](#storageset_object_meta) | 更新对象元数据 |
40
+ | [storage.get_object_url](#storageget_object_url) | 获取稳定对象 URL |
41
+ | [storage.append_object](#storageappend_object) | 追加写对象 |
42
+
43
+ ### 数据面协调方法
44
+
45
+ | 方法 | 说明 |
22
46
  |------|------|
23
47
  | [storage.create_upload_session](#storagecreate_upload_session) | 申请上传 URL |
24
48
  | [storage.complete_upload](#storagecomplete_upload) | 确认上传完成 |
@@ -28,9 +52,10 @@
28
52
 
29
53
  | 方法 | 说明 |
30
54
  |------|------|
31
- | [storage.create_share_link](#storagecreate_share_link) | 创建分享链接 |
32
- | [storage.list_share_links](#storagelist_share_links) | 列举分享链接 |
33
- | [storage.revoke_share_link](#storagerevoke_share_link) | 撤销分享链接 |
55
+ | [storage.create_share_link](#storagecreate_share_link) | 创建分享链接 |
56
+ | [storage.list_share_links](#storagelist_share_links) | 列举分享链接 |
57
+ | [storage.revoke_share_link](#storagerevoke_share_link) | 撤销分享链接 |
58
+ | [storage.get_by_share](#storageget_by_share) | 通过分享短码读取对象 |
34
59
 
35
60
  ---
36
61
 
@@ -256,9 +281,9 @@ for obj in result["items"]:
256
281
 
257
282
  ---
258
283
 
259
- ## storage.get_quota
260
-
261
- 查询存储配额。
284
+ ## storage.get_quota
285
+
286
+ 查询存储配额。
262
287
 
263
288
  ### 参数
264
289
 
@@ -273,13 +298,193 @@ for obj in result["items"]:
273
298
  | `owner_aid` | string | 所有者 AID |
274
299
  | `used_bytes` | integer | 已使用空间(字节) |
275
300
  | `object_count` | integer | 对象数量 |
276
- | `quota_bytes` | integer | 配额上限(字节),0 表示无限制 |
277
-
278
- ---
279
-
280
- ## storage.create_upload_session
281
-
282
- 获取上传用 presigned URL。
301
+ | `quota_bytes` | integer | 配额上限(字节),0 表示无限制 |
302
+
303
+ ---
304
+
305
+ ## storage.create_folder
306
+
307
+ 创建目录节点。目录和对象共用同一个 `bucket`,默认 bucket 为 `"default"`。
308
+
309
+ **参数**:
310
+
311
+ | 参数 | 类型 | 必填 | 说明 |
312
+ |------|------|------|------|
313
+ | `path` | string | 否 | 完整目录路径;提供时优先使用 |
314
+ | `name` | string | 否 | 目录名;未提供 `path` 时必填 |
315
+ | `parent_folder_id` | string | 否 | 父目录 ID |
316
+ | `parent_path` | string | 否 | 父目录路径,默认根目录 |
317
+ | `bucket` | string | 否 | 存储桶,默认 `"default"` |
318
+ | `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
319
+ | `mkdirs` | boolean | 否 | 是否递归创建父目录 |
320
+ | `metadata` | object | 否 | 目录元数据 |
321
+ | `conflict_policy` | string | 否 | `"reject"` / `"return_existing"` |
322
+
323
+ **响应**:返回 `folder`,同时在顶层展开 `folder_id`、`path`、`name`、`parent_folder_id`、`version` 等字段。
324
+
325
+ ---
326
+
327
+ ## storage.get_folder
328
+
329
+ 查询目录节点。
330
+
331
+ **参数**:`folder_id` 或 `path` 至少提供一个;可选 `bucket`、`owner_aid`。
332
+
333
+ **响应**:同 `storage.create_folder` 的 `folder` 视图。
334
+
335
+ ---
336
+
337
+ ## storage.list_children
338
+
339
+ 列出目录下的直接子目录和对象。
340
+
341
+ **参数**:
342
+
343
+ | 参数 | 类型 | 必填 | 说明 |
344
+ |------|------|------|------|
345
+ | `folder_id` / `path` | string | 否 | 目标目录;都不传表示根目录 |
346
+ | `type` | string | 否 | `"all"` / `"folder"` / `"object"`,默认 `"all"` |
347
+ | `bucket` | string | 否 | 存储桶,默认 `"default"` |
348
+ | `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
349
+ | `page` | integer | 否 | 页码,默认 1 |
350
+ | `size` | integer | 否 | 每页数量,最大受服务配置限制 |
351
+ | `order_by` | string | 否 | `"name"` / `"updated_at"` / `"size_bytes"` |
352
+ | `order` | string | 否 | `"asc"` / `"desc"` |
353
+ | `include_metadata` | boolean | 否 | 是否返回元数据,默认 `true` |
354
+ | `include_urls` | boolean | 否 | 是否返回 URL 字段,默认 `true` |
355
+
356
+ **响应**:`folder`、`items`、`total`、`page`、`size`、`next_marker`。`items[].node_type` 区分 `folder` / `object`。
357
+
358
+ ---
359
+
360
+ ## storage.rename_folder
361
+
362
+ 重命名目录。根目录不可改名。
363
+
364
+ **参数**:`folder_id` 或 `path`,`new_name` 必填;可选 `bucket`、`owner_aid`、`expected_version`。
365
+
366
+ **响应**:更新后的 `folder` 视图。
367
+
368
+ ---
369
+
370
+ ## storage.move_folder
371
+
372
+ 移动目录。不能移动到自身或自身子目录。
373
+
374
+ **参数**:`folder_id` 或 `path`,目标目录通过 `dst_parent_folder_id` 或 `dst_parent_path` 指定;可选 `new_name`、`bucket`、`owner_aid`、`expected_version`。
375
+
376
+ **响应**:更新后的 `folder` 视图。
377
+
378
+ ---
379
+
380
+ ## storage.delete_folder
381
+
382
+ 删除目录。
383
+
384
+ **参数**:
385
+
386
+ | 参数 | 类型 | 必填 | 说明 |
387
+ |------|------|------|------|
388
+ | `folder_id` / `path` | string | 是 | 待删除目录 |
389
+ | `recursive` | boolean | 否 | 非空目录必须传 `true` |
390
+ | `dry_run` | boolean | 否 | 只预览将删除的目录/对象 |
391
+ | `bucket` | string | 否 | 存储桶,默认 `"default"` |
392
+ | `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
393
+
394
+ **响应**:`deleted_folders`、`deleted_objects`、`deleted_object_items`、`errors`;`dry_run=true` 时返回预览列表。
395
+
396
+ ---
397
+
398
+ ## storage.resolve_path
399
+
400
+ 按路径解析目录或对象。
401
+
402
+ **参数**:`path` 必填;可选 `expected_type`(`"any"` / `"object"` / `"folder"`)、`bucket`、`owner_aid`。
403
+
404
+ **响应**:`type`、`folder_id` 或 `object_id`、`path`、`status`。
405
+
406
+ ---
407
+
408
+ ## storage.move_object
409
+
410
+ 移动或重命名对象。
411
+
412
+ **参数**:对象选择器(`object_id` / `object_key` / `path`),目标目录 `dst_parent_folder_id` 或 `dst_parent_path`;可选 `new_name`、`conflict_policy`(`"reject"` / `"replace"` / `"keep_both"`)、`expected_version`。
413
+
414
+ **响应**:返回 `object`,同时在顶层展开对象视图字段。
415
+
416
+ ---
417
+
418
+ ## storage.copy_object
419
+
420
+ 复制对象,底层内容按 CAS 引用计数复用。
421
+
422
+ **参数**:源对象选择器(`object_id` / `object_key` / `path`,也接受 `src_object_key` / `src_path`),目标 `dst_object_key` / `dst_path` 或目标父目录 + `new_name`;可选 `conflict_policy`、`copy_metadata`。
423
+
424
+ **响应**:新对象视图。
425
+
426
+ ---
427
+
428
+ ## storage.batch_delete
429
+
430
+ 批量删除对象或目录。
431
+
432
+ **参数**:
433
+
434
+ | 参数 | 类型 | 必填 | 说明 |
435
+ |------|------|------|------|
436
+ | `items` | array | 否 | 每项含 `type`、`object_id` / `object_key` / `path` / `folder_id` |
437
+ | `object_keys` | string[] | 否 | 兼容简写,转为对象删除 |
438
+ | `recursive` | boolean | 否 | 删除目录时是否递归 |
439
+ | `dry_run` | boolean | 否 | 只预览 |
440
+
441
+ **响应**:`deleted`、`errors`、`deleted_count`、`summary`。
442
+
443
+ ---
444
+
445
+ ## storage.batch_head_object
446
+
447
+ 批量查询对象元数据。
448
+
449
+ **参数**:`object_ids`、`paths` 至少提供一类;可选 `owner_aid`、`bucket`、`include_missing`、`include_metadata`、`include_urls`。
450
+
451
+ **响应**:`items` 和 `errors`。
452
+
453
+ ---
454
+
455
+ ## storage.set_object_meta
456
+
457
+ 更新对象元数据和可选 MIME 类型。
458
+
459
+ **参数**:对象选择器,`metadata`;可选 `merge`(默认 `true`)、`content_type`、`expected_version`。
460
+
461
+ **响应**:更新后的对象视图。
462
+
463
+ ---
464
+
465
+ ## storage.get_object_url
466
+
467
+ 获取稳定对象 URL。
468
+
469
+ **参数**:对象选择器;可选 `include_path_url`。
470
+
471
+ **响应**:`object_id`、`object_url`、`path_url`、`stable`。
472
+
473
+ ---
474
+
475
+ ## storage.append_object
476
+
477
+ 向对象尾部追加 base64 内容;对象不存在时创建。
478
+
479
+ **参数**:与 `storage.put_object` 类似,`content` 必填;可选 `object_key` / `path` / `name`、`bucket`、`owner_aid`、`content_type`、`metadata`、`expected_version`、`is_private`。
480
+
481
+ **响应**:对象视图。
482
+
483
+ ---
484
+
485
+ ## storage.create_upload_session
486
+
487
+ 获取上传用 presigned URL。
283
488
 
284
489
  ### 参数
285
490
 
@@ -578,9 +783,9 @@ share_url = result["aid_share_url"]
578
783
 
579
784
  ---
580
785
 
581
- ## storage.revoke_share_link
582
-
583
- 撤销分享链接。
786
+ ## storage.revoke_share_link
787
+
788
+ 撤销分享链接。
584
789
 
585
790
  ### 参数
586
791
 
@@ -595,11 +800,25 @@ share_url = result["aid_share_url"]
595
800
  | `revoked` | boolean | 是否成功撤销 |
596
801
  | `share_id` | string | 被撤销的分享短码 |
597
802
 
598
- > 链接不存在或已撤销时返回通用错误(`-32000`)。
599
-
600
- ---
601
-
602
- ## 错误码
803
+ > 链接不存在或已撤销时返回通用错误(`-32000`)。
804
+
805
+ ---
806
+
807
+ ## storage.get_by_share
808
+
809
+ 通过分享短码读取对象。公开分享无需额外授权;私有白名单分享需要请求者 AID 在 `allowed_aids` 内。
810
+
811
+ **参数**:
812
+
813
+ | 参数 | 类型 | 必填 | 说明 |
814
+ |------|------|------|------|
815
+ | `share_id` | string | 是 | 分享短码 |
816
+
817
+ **响应**:小对象返回 `content`;大对象返回 `download_url`。同时返回 `object_id`、`object_key`、`path`、`size_bytes`、`content_type`、`sha256`。
818
+
819
+ ---
820
+
821
+ ## 错误码
603
822
 
604
823
  | code | 说明 |
605
824
  |------|------|