@agentunion/fastaun-browser 0.4.13 → 0.5.1

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 (223) hide show
  1. package/CHANGELOG.md +536 -386
  2. package/_packed_docs/CHANGELOG-validators.md +144 -0
  3. package/_packed_docs/CHANGELOG.md +536 -386
  4. package/_packed_docs/INDEX.md +159 -84
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +48 -31
  6. package/_packed_docs/agent.md/SCHEMA.md +2 -0
  7. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +2 -0
  8. package/_packed_docs/agent.md/examples/human-developer.md +2 -0
  9. package/_packed_docs/agent.md/examples/openclaw-lobster.md +2 -0
  10. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +2 -0
  11. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +2 -0
  12. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +266 -686
  13. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
  14. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +2 -0
  15. package/_packed_docs/design/AUNClient/346/213/206/345/210/206/351/207/215/346/236/204/346/211/247/350/241/214/346/226/271/346/241/210.md +2 -0
  16. package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +2 -0
  17. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +2 -0
  18. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -0
  19. package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +2 -0
  20. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +2 -0
  21. package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +2 -0
  22. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +2 -0
  23. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +2 -0
  24. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +2 -0
  25. package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +2 -0
  26. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +296 -900
  27. package/_packed_docs/protocol/08-AUN-E2EE.md +2 -0
  28. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +2 -0
  29. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +66 -173
  30. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +55 -0
  31. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +2 -0
  32. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +2 -0
  33. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +2 -0
  34. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +2 -0
  35. package/_packed_docs/protocol/16-/347/263/273/347/273/237/347/233/256/345/275/225/344/277/235/346/212/244/346/226/271/346/241/210.md +177 -0
  36. package/_packed_docs/protocol/README.md +4 -1
  37. package/_packed_docs/protocol/agent.md/SCHEMA.md +2 -0
  38. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +2 -0
  39. package/_packed_docs/protocol/agent.md/examples/human-developer.md +2 -0
  40. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +2 -0
  41. package/_packed_docs/protocol/aun-docs-guide.md +2 -0
  42. package/_packed_docs/protocol/index.md +10 -3
  43. package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +2 -0
  44. package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +2 -0
  45. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +2 -0
  46. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +2 -0
  47. package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +2 -0
  48. package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +2 -0
  49. package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +2 -0
  50. package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +2 -0
  51. package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +2 -0
  52. package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  53. package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  54. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +2 -0
  55. package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +2 -0
  56. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  57. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  58. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +2 -0
  59. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +2 -0
  60. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +2 -0
  61. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -0
  62. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +2 -0
  63. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -252
  64. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +219 -177
  65. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +4 -1
  66. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
  67. package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -0
  68. package/_packed_docs/sdk/09-custody-api-manual.md +2 -0
  69. package/_packed_docs/sdk/09-group-rpc-manual.md +301 -634
  70. package/_packed_docs/sdk/09-message-rpc-manual.md +2 -0
  71. package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -0
  72. package/_packed_docs/sdk/09-payload-reference.md +2 -0
  73. package/_packed_docs/sdk/09-proxy-rpc-manual.md +2 -0
  74. package/_packed_docs/sdk/09-storage-rpc-manual.md +984 -274
  75. package/_packed_docs/sdk/09-stream-rpc-manual.md +2 -0
  76. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +36 -23
  77. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +2 -0
  78. package/_packed_docs/sdk/INDEX.md +47 -30
  79. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +2 -0
  80. package/_packed_docs/sdk/README.md +17 -15
  81. package/dist/aid-store.d.ts +25 -0
  82. package/dist/aid-store.d.ts.map +1 -1
  83. package/dist/aid-store.js +89 -8
  84. package/dist/aid-store.js.map +1 -1
  85. package/dist/bundle.js +19615 -16870
  86. package/dist/client/delivery.d.ts +15 -2
  87. package/dist/client/delivery.d.ts.map +1 -1
  88. package/dist/client/delivery.js +303 -54
  89. package/dist/client/delivery.js.map +1 -1
  90. package/dist/client/group-state.d.ts.map +1 -1
  91. package/dist/client/group-state.js +36 -14
  92. package/dist/client/group-state.js.map +1 -1
  93. package/dist/client/lifecycle.js +2 -2
  94. package/dist/client/lifecycle.js.map +1 -1
  95. package/dist/client/rpc-pipeline.d.ts +2 -0
  96. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  97. package/dist/client/rpc-pipeline.js +235 -82
  98. package/dist/client/rpc-pipeline.js.map +1 -1
  99. package/dist/client/v2-e2ee.d.ts +14 -1
  100. package/dist/client/v2-e2ee.d.ts.map +1 -1
  101. package/dist/client/v2-e2ee.js +300 -121
  102. package/dist/client/v2-e2ee.js.map +1 -1
  103. package/dist/client.d.ts +36 -4
  104. package/dist/client.d.ts.map +1 -1
  105. package/dist/client.js +460 -57
  106. package/dist/client.js.map +1 -1
  107. package/dist/collab/client.d.ts +47 -0
  108. package/dist/collab/client.d.ts.map +1 -0
  109. package/dist/collab/client.js +136 -0
  110. package/dist/collab/client.js.map +1 -0
  111. package/dist/collab/errors.d.ts +16 -0
  112. package/dist/collab/errors.d.ts.map +1 -0
  113. package/dist/collab/errors.js +60 -0
  114. package/dist/collab/errors.js.map +1 -0
  115. package/dist/collab/index.d.ts +4 -0
  116. package/dist/collab/index.d.ts.map +1 -0
  117. package/dist/collab/index.js +4 -0
  118. package/dist/collab/index.js.map +1 -0
  119. package/dist/collab/types.d.ts +111 -0
  120. package/dist/collab/types.d.ts.map +1 -0
  121. package/dist/collab/types.js +2 -0
  122. package/dist/collab/types.js.map +1 -0
  123. package/dist/crypto.d.ts +6 -0
  124. package/dist/crypto.d.ts.map +1 -1
  125. package/dist/crypto.js +6 -0
  126. package/dist/crypto.js.map +1 -1
  127. package/dist/errors.d.ts +0 -20
  128. package/dist/errors.d.ts.map +1 -1
  129. package/dist/errors.js +9 -37
  130. package/dist/errors.js.map +1 -1
  131. package/dist/facades.d.ts +94 -0
  132. package/dist/facades.d.ts.map +1 -0
  133. package/dist/facades.js +389 -0
  134. package/dist/facades.js.map +1 -0
  135. package/dist/group-fs.d.ts +120 -0
  136. package/dist/group-fs.d.ts.map +1 -0
  137. package/dist/group-fs.js +539 -0
  138. package/dist/group-fs.js.map +1 -0
  139. package/dist/group-id.d.ts +9 -12
  140. package/dist/group-id.d.ts.map +1 -1
  141. package/dist/group-id.js +41 -63
  142. package/dist/group-id.js.map +1 -1
  143. package/dist/group-resources.d.ts +98 -0
  144. package/dist/group-resources.d.ts.map +1 -0
  145. package/dist/group-resources.js +635 -0
  146. package/dist/group-resources.js.map +1 -0
  147. package/dist/index.d.ts +8 -3
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +10 -1
  150. package/dist/index.js.map +1 -1
  151. package/dist/keystore/index.d.ts +2 -54
  152. package/dist/keystore/index.d.ts.map +1 -1
  153. package/dist/keystore/indexeddb-identity-store.d.ts +3 -0
  154. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  155. package/dist/keystore/indexeddb-identity-store.js +65 -0
  156. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  157. package/dist/keystore/indexeddb-shared.d.ts +3 -17
  158. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  159. package/dist/keystore/indexeddb-shared.js +4 -47
  160. package/dist/keystore/indexeddb-shared.js.map +1 -1
  161. package/dist/keystore/indexeddb-token-store.d.ts +1 -64
  162. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  163. package/dist/keystore/indexeddb-token-store.js +45 -774
  164. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  165. package/dist/logger.d.ts +2 -0
  166. package/dist/logger.d.ts.map +1 -1
  167. package/dist/logger.js +4 -0
  168. package/dist/logger.js.map +1 -1
  169. package/dist/register-flow.d.ts +1 -0
  170. package/dist/register-flow.d.ts.map +1 -1
  171. package/dist/register-flow.js +3 -0
  172. package/dist/register-flow.js.map +1 -1
  173. package/dist/service-proxy.d.ts +1 -0
  174. package/dist/service-proxy.d.ts.map +1 -1
  175. package/dist/service-proxy.js +15 -3
  176. package/dist/service-proxy.js.map +1 -1
  177. package/dist/storage/errors.d.ts +28 -0
  178. package/dist/storage/errors.d.ts.map +1 -0
  179. package/dist/storage/errors.js +65 -0
  180. package/dist/storage/errors.js.map +1 -0
  181. package/dist/storage/index.d.ts +2 -0
  182. package/dist/storage/index.d.ts.map +1 -0
  183. package/dist/storage/index.js +2 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/lowlevel.d.ts +322 -0
  186. package/dist/storage/lowlevel.d.ts.map +1 -0
  187. package/dist/storage/lowlevel.js +471 -0
  188. package/dist/storage/lowlevel.js.map +1 -0
  189. package/dist/storage/types.d.ts +59 -0
  190. package/dist/storage/types.d.ts.map +1 -0
  191. package/dist/storage/types.js +113 -0
  192. package/dist/storage/types.js.map +1 -0
  193. package/dist/storage/vfs.d.ts +166 -0
  194. package/dist/storage/vfs.d.ts.map +1 -0
  195. package/dist/storage/vfs.js +457 -0
  196. package/dist/storage/vfs.js.map +1 -0
  197. package/dist/tools/cross-sdk-agent.d.ts +3 -0
  198. package/dist/tools/cross-sdk-agent.d.ts.map +1 -0
  199. package/dist/tools/cross-sdk-agent.js +1376 -0
  200. package/dist/tools/cross-sdk-agent.js.map +1 -0
  201. package/dist/transport.d.ts +5 -0
  202. package/dist/transport.d.ts.map +1 -1
  203. package/dist/transport.js +125 -12
  204. package/dist/transport.js.map +1 -1
  205. package/dist/types.d.ts +39 -56
  206. package/dist/types.d.ts.map +1 -1
  207. package/dist/v2/session/session.d.ts +2 -0
  208. package/dist/v2/session/session.d.ts.map +1 -1
  209. package/dist/v2/session/session.js +58 -22
  210. package/dist/v2/session/session.js.map +1 -1
  211. package/dist/v2/state/commitment.d.ts +1 -1
  212. package/dist/v2/state/commitment.d.ts.map +1 -1
  213. package/dist/v2/state/commitment.js +5 -3
  214. package/dist/v2/state/commitment.js.map +1 -1
  215. package/dist/validators.d.ts +35 -0
  216. package/dist/validators.d.ts.map +1 -0
  217. package/dist/validators.js +127 -0
  218. package/dist/validators.js.map +1 -0
  219. package/dist/version.d.ts +1 -1
  220. package/dist/version.d.ts.map +1 -1
  221. package/dist/version.js +1 -1
  222. package/dist/version.js.map +1 -1
  223. package/package.json +44 -44
@@ -12,37 +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
- | 方法 | 说明 |
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
- | 方法 | 说明 |
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
+ | 方法 | 说明 |
46
46
  |------|------|
47
47
  | [storage.create_upload_session](#storagecreate_upload_session) | 申请上传 URL |
48
48
  | [storage.complete_upload](#storagecomplete_upload) | 确认上传完成 |
@@ -52,15 +52,76 @@
52
52
 
53
53
  | 方法 | 说明 |
54
54
  |------|------|
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) | 通过分享短码读取对象 |
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) | 通过分享短码读取对象 |
59
+
60
+ ### POSIX VFS 方法
61
+
62
+ > 在对象存储之上提供 Linux 文件系统语义(`ls/find/df/stat/lstat/mkdir/touch/rm/mv/cp/mount`)。节点类型:`file` / `dir` / `symlink` / `mount`。
63
+
64
+ | 方法 | 说明 |
65
+ |------|------|
66
+ | [storage.fs.list](#storagefslist) | 列目录(ls) |
67
+ | [storage.fs.find](#storagefsfind) | 递归查找(find,支持 name/type/size/mtime 过滤) |
68
+ | [storage.fs.df](#storagefsdf) | 配额/用量报告(df) |
69
+ | [storage.fs.stat](#storagefsstat) | 查节点(stat,跟随末级软链) |
70
+ | [storage.fs.lstat](#storagefslstat) | 查节点(lstat,不跟随软链) |
71
+ | [storage.fs.mkdir](#storagefsmkdir) | 建目录(mkdir) |
72
+ | [storage.fs.touch](#storagefstouch) | 创建空文件或更新时间戳(touch) |
73
+ | [storage.fs.remove](#storagefsremove) | 删除文件/目录/软链(rm) |
74
+ | [storage.fs.rename](#storagefsrename) | 同 owner 内移动/改名(mv) |
75
+ | [storage.fs.copy](#storagefscopy) | 复制对象或软链(cp) |
76
+ | [storage.fs.mount](#storagefsmount) | 挂载卷或他人子树 |
77
+ | [storage.fs.approve](#storagefsapprove) | 源 owner 批准待审挂载 |
78
+ | [storage.fs.reject](#storagefsreject) | 拒绝待审挂载 |
79
+ | [storage.fs.unmount](#storagefsunmount) | 卸载挂载点 |
80
+ | [storage.fs.invalidate_membership](#storagefsinvalidate_membership) | 群成员变更时失效群挂载 |
81
+
82
+ ### 软链方法
83
+
84
+ | 方法 | 说明 |
85
+ |------|------|
86
+ | [storage.create_symlink](#storagecreate_symlink) | 创建软链 |
87
+ | [storage.readlink](#storagereadlink) | 读软链 target |
88
+ | [storage.atomic_repoint](#storageatomic_repoint) | 原子重指 target(CAS 乐观锁) |
89
+ | [storage.rename_symlink](#storagerename_symlink) | 改软链 key(target 不变) |
90
+ | [storage.delete_symlink](#storagedelete_symlink) | 删软链记录(不动 target) |
91
+
92
+ ### ACL / 权限方法
93
+
94
+ > 统一权限求值顺序(硬顺序):公开位 → token → ACL(最近祖先前缀)→ 角色 → owner → 拒绝。
95
+ >
96
+ > AID storage 的 `storage.set_acl/remove_acl` 面向具体 AID,当前主要用于写/删除授权;直接读授权不通过 ACL 下发,读访问应使用 `storage.create_share_link` / `storage.get_by_share`,撤销分享使用 `storage.revoke_share_link`。`role:*` 伪主体只允许可信 group 内部门面管理,客户端不得直接对 `group_aid` 空间设置角色 ACL;群自有区 admin 写授权使用 `group.fs.set_acl/remove_acl`。
97
+
98
+ | 方法 | 说明 |
99
+ |------|------|
100
+ | [storage.set_acl](#storageset_acl) | 授予路径前缀 ACL |
101
+ | [storage.remove_acl](#storageremove_acl) | 移除 ACL 授权 |
102
+ | [storage.list_acl](#storagelist_acl) | 列出路径 ACL |
103
+ | [storage.set_visibility](#storageset_visibility) | 切换公开/私有 |
104
+ | [storage.check_access](#storagecheck_access) | 非抛错的访问探测 |
105
+ | [storage.issue_token](#storageissue_token) | 签发路径访问 token |
106
+ | [storage.revoke_token](#storagerevoke_token) | 吊销 token |
107
+ | [storage.list_tokens](#storagelist_tokens) | 列出 token |
108
+
109
+ ### 卷方法
110
+
111
+ | 方法 | 说明 |
112
+ |------|------|
113
+ | [storage.volume.create](#storagevolumecreate) | 创建/upsert 配额卷 |
114
+ | [storage.volume.renew](#storagevolumerenew) | 续期卷 |
115
+ | [storage.volume.expire_due](#storagevolumeexpire_due) | 过期到期卷并失效其挂载 |
59
116
 
60
117
  ---
61
118
 
62
119
  > `object_key` 当前仅支持 ASCII 安全字符集合 `[A-Za-z0-9._/-]`,且不允许空路径段、`..`、反斜杠转义后的非法段。
63
120
 
121
+ ## SDK 封装状态
122
+
123
+ Python / Go / TypeScript / JavaScript SDK 均提供 storage low-level 与 VFS 门面。普通应用优先使用 SDK VFS:`write_bytes` / `upload_file` 会先 `check_upload`,小对象走 `put_object`,大对象走 `create_upload_session` → HTTP PUT → `complete_upload`,秒传路径用 `complete_upload(skip_blob=true)`;`read_bytes` / `download_file` 优先尝试 inline `get_object`,超限时回退 `create_download_ticket`;`touch` 直接封装 `storage.fs.touch`。需要精确控制 ACL、token、软链、卷、批量操作或 URL 字段时,再直接调用本手册中的 `storage.*` RPC。
124
+
64
125
  ## storage.put_object
65
126
 
66
127
  上传小对象(内容 base64 编码通过 RPC 传输)。
@@ -84,7 +145,7 @@
84
145
 
85
146
  | 字段 | 类型 | 说明 |
86
147
  |------|------|------|
87
- | `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/storage/{object_key}`,经 NameService 302 跳转到直链 |
148
+ | `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/{object_key}`,经 NameService fallback 302 跳转到 storage 服务 |
88
149
  | `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无跳转 |
89
150
  | `owner_aid` | string | 所有者 AID |
90
151
  | `bucket` | string | 存储桶 |
@@ -281,9 +342,9 @@ for obj in result["items"]:
281
342
 
282
343
  ---
283
344
 
284
- ## storage.get_quota
285
-
286
- 查询存储配额。
345
+ ## storage.get_quota
346
+
347
+ 查询存储配额。
287
348
 
288
349
  ### 参数
289
350
 
@@ -298,193 +359,193 @@ for obj in result["items"]:
298
359
  | `owner_aid` | string | 所有者 AID |
299
360
  | `used_bytes` | integer | 已使用空间(字节) |
300
361
  | `object_count` | integer | 对象数量 |
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。
362
+ | `quota_bytes` | integer | 配额上限(字节),0 表示无限制 |
363
+
364
+ ---
365
+
366
+ ## storage.create_folder
367
+
368
+ 创建目录节点。目录和对象共用同一个 `bucket`,默认 bucket 为 `"default"`。
369
+
370
+ **参数**:
371
+
372
+ | 参数 | 类型 | 必填 | 说明 |
373
+ |------|------|------|------|
374
+ | `path` | string | 否 | 完整目录路径;提供时优先使用 |
375
+ | `name` | string | 否 | 目录名;未提供 `path` 时必填 |
376
+ | `parent_folder_id` | string | 否 | 父目录 ID |
377
+ | `parent_path` | string | 否 | 父目录路径,默认根目录 |
378
+ | `bucket` | string | 否 | 存储桶,默认 `"default"` |
379
+ | `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
380
+ | `mkdirs` | boolean | 否 | 是否递归创建父目录 |
381
+ | `metadata` | object | 否 | 目录元数据 |
382
+ | `conflict_policy` | string | 否 | `"reject"` / `"return_existing"` |
383
+
384
+ **响应**:返回 `folder`,同时在顶层展开 `folder_id`、`path`、`name`、`parent_folder_id`、`version` 等字段。
385
+
386
+ ---
387
+
388
+ ## storage.get_folder
389
+
390
+ 查询目录节点。
391
+
392
+ **参数**:`folder_id` 或 `path` 至少提供一个;可选 `bucket`、`owner_aid`。
393
+
394
+ **响应**:同 `storage.create_folder` 的 `folder` 视图。
395
+
396
+ ---
397
+
398
+ ## storage.list_children
399
+
400
+ 列出目录下的直接子目录和对象。
401
+
402
+ **参数**:
403
+
404
+ | 参数 | 类型 | 必填 | 说明 |
405
+ |------|------|------|------|
406
+ | `folder_id` / `path` | string | 否 | 目标目录;都不传表示根目录 |
407
+ | `type` | string | 否 | `"all"` / `"folder"` / `"object"`,默认 `"all"` |
408
+ | `bucket` | string | 否 | 存储桶,默认 `"default"` |
409
+ | `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
410
+ | `page` | integer | 否 | 页码,默认 1 |
411
+ | `size` | integer | 否 | 每页数量,最大受服务配置限制 |
412
+ | `order_by` | string | 否 | `"name"` / `"updated_at"` / `"size_bytes"` |
413
+ | `order` | string | 否 | `"asc"` / `"desc"` |
414
+ | `include_metadata` | boolean | 否 | 是否返回元数据,默认 `true` |
415
+ | `include_urls` | boolean | 否 | 是否返回 URL 字段,默认 `true` |
416
+
417
+ **响应**:`folder`、`items`、`total`、`page`、`size`、`next_marker`。`items[].node_type` 区分 `folder` / `object`。
418
+
419
+ ---
420
+
421
+ ## storage.rename_folder
422
+
423
+ 重命名目录。根目录不可改名。
424
+
425
+ **参数**:`folder_id` 或 `path`,`new_name` 必填;可选 `bucket`、`owner_aid`、`expected_version`。
426
+
427
+ **响应**:更新后的 `folder` 视图。
428
+
429
+ ---
430
+
431
+ ## storage.move_folder
432
+
433
+ 移动目录。不能移动到自身或自身子目录。
434
+
435
+ **参数**:`folder_id` 或 `path`,目标目录通过 `dst_parent_folder_id` 或 `dst_parent_path` 指定;可选 `new_name`、`bucket`、`owner_aid`、`expected_version`。
436
+
437
+ **响应**:更新后的 `folder` 视图。
438
+
439
+ ---
440
+
441
+ ## storage.delete_folder
442
+
443
+ 删除目录。
444
+
445
+ **参数**:
446
+
447
+ | 参数 | 类型 | 必填 | 说明 |
448
+ |------|------|------|------|
449
+ | `folder_id` / `path` | string | 是 | 待删除目录 |
450
+ | `recursive` | boolean | 否 | 非空目录必须传 `true` |
451
+ | `dry_run` | boolean | 否 | 只预览将删除的目录/对象 |
452
+ | `bucket` | string | 否 | 存储桶,默认 `"default"` |
453
+ | `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
454
+
455
+ **响应**:`deleted_folders`、`deleted_objects`、`deleted_object_items`、`errors`;`dry_run=true` 时返回预览列表。
456
+
457
+ ---
458
+
459
+ ## storage.resolve_path
460
+
461
+ 按路径解析目录或对象。
462
+
463
+ **参数**:`path` 必填;可选 `expected_type`(`"any"` / `"object"` / `"folder"`)、`bucket`、`owner_aid`。
464
+
465
+ **响应**:`type`、`folder_id` 或 `object_id`、`path`、`status`。
466
+
467
+ ---
468
+
469
+ ## storage.move_object
470
+
471
+ 移动或重命名对象。
472
+
473
+ **参数**:对象选择器(`object_id` / `object_key` / `path`),目标目录 `dst_parent_folder_id` 或 `dst_parent_path`;可选 `new_name`、`conflict_policy`(`"reject"` / `"replace"` / `"keep_both"`)、`expected_version`。
474
+
475
+ **响应**:返回 `object`,同时在顶层展开对象视图字段。
476
+
477
+ ---
478
+
479
+ ## storage.copy_object
480
+
481
+ 复制对象,底层内容按 CAS 引用计数复用。
482
+
483
+ **参数**:源对象选择器(`object_id` / `object_key` / `path`,也接受 `src_object_key` / `src_path`),目标 `dst_object_key` / `dst_path` 或目标父目录 + `new_name`;可选 `conflict_policy`、`copy_metadata`。
484
+
485
+ **响应**:新对象视图。
486
+
487
+ ---
488
+
489
+ ## storage.batch_delete
490
+
491
+ 批量删除对象或目录。
492
+
493
+ **参数**:
494
+
495
+ | 参数 | 类型 | 必填 | 说明 |
496
+ |------|------|------|------|
497
+ | `items` | array | 否 | 每项含 `type`、`object_id` / `object_key` / `path` / `folder_id` |
498
+ | `object_keys` | string[] | 否 | 兼容简写,转为对象删除 |
499
+ | `recursive` | boolean | 否 | 删除目录时是否递归 |
500
+ | `dry_run` | boolean | 否 | 只预览 |
501
+
502
+ **响应**:`deleted`、`errors`、`deleted_count`、`summary`。
503
+
504
+ ---
505
+
506
+ ## storage.batch_head_object
507
+
508
+ 批量查询对象元数据。
509
+
510
+ **参数**:`object_ids`、`paths` 至少提供一类;可选 `owner_aid`、`bucket`、`include_missing`、`include_metadata`、`include_urls`。
511
+
512
+ **响应**:`items` 和 `errors`。
513
+
514
+ ---
515
+
516
+ ## storage.set_object_meta
517
+
518
+ 更新对象元数据和可选 MIME 类型。
519
+
520
+ **参数**:对象选择器,`metadata`;可选 `merge`(默认 `true`)、`content_type`、`expected_version`。
521
+
522
+ **响应**:更新后的对象视图。
523
+
524
+ ---
525
+
526
+ ## storage.get_object_url
527
+
528
+ 获取稳定对象 URL。
529
+
530
+ **参数**:对象选择器;可选 `include_path_url`。
531
+
532
+ **响应**:`object_id`、`object_url`、`path_url`、`stable`。
533
+
534
+ ---
535
+
536
+ ## storage.append_object
537
+
538
+ 向对象尾部追加 base64 内容;对象不存在时创建。
539
+
540
+ **参数**:与 `storage.put_object` 类似,`content` 必填;可选 `object_key` / `path` / `name`、`bucket`、`owner_aid`、`content_type`、`metadata`、`expected_version`、`is_private`。
541
+
542
+ **响应**:对象视图。
543
+
544
+ ---
545
+
546
+ ## storage.create_upload_session
547
+
548
+ 获取上传用 presigned URL。
488
549
 
489
550
  ### 参数
490
551
 
@@ -534,7 +595,7 @@ for obj in result["items"]:
534
595
  | `content_type` | string | 否 | MIME 类型,默认 `"application/octet-stream"` |
535
596
  | `is_private` | boolean | 否 | 是否私有,默认 `true` |
536
597
  | `size_bytes` | integer | 否 | 预期文件大小(用于校验) |
537
- | `skip_blob` | boolean | 否 | 秒传模式,默认 `false`;为 `true` 时跳过 blob 上传,必须提供 `sha256`,且当前 owner 已拥有相同内容 |
598
+ | `skip_blob` | boolean | 否 | 秒传模式,默认 `false`;为 `true` 时跳过 blob 上传,必须提供 `sha256`,且当前 owner 已拥有相同内容 |
538
599
  | `expected_version` | integer | 否 | 乐观并发控制版本号 |
539
600
  | `expire_in_seconds` | integer | 否 | 过期时间(秒) |
540
601
  | `metadata` | object | 否 | 自定义元数据 |
@@ -543,7 +604,7 @@ for obj in result["items"]:
543
604
 
544
605
  | 字段 | 类型 | 说明 |
545
606
  |------|------|------|
546
- | `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/storage/{object_key}`,经 NameService 302 跳转 |
607
+ | `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/{object_key}`,经 NameService fallback 302 跳转 |
547
608
  | `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,无跳转 |
548
609
  | `owner_aid` | string | 所有者 AID |
549
610
  | `bucket` | string | 存储桶 |
@@ -574,10 +635,11 @@ for obj in result["items"]:
574
635
 
575
636
  | 字段 | 类型 | 说明 |
576
637
  |------|------|------|
577
- | `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/storage/{object_key}`,经 NameService 302 跳转 |
578
- | `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无跳转 |
579
- | `download_url` | string | 预签名下载 URL(有时效,签名形式由 BlobStore 后端决定) |
580
- | `expire_at` | integer | `download_url` 的过期时间戳(Unix 秒) |
638
+ | `url` | string | **AID 风格 URL(默认/推荐)**:public 文件为 `https://{owner_aid}/{object_key}`,private 文件为 `https://{owner_aid}/{object_key}?t={token}`。经 NameService fallback 302 跳转到 storage 服务,storage 实时鉴权后出文件(302 到 blob 后端,对客户端透明) |
639
+ | `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无 NameService 跳转 |
640
+ | `download_url` | string | `url`(兼容旧客户端,格式已统一) |
641
+ | `expire_at` | integer | token 过期时间戳(Unix 秒),public 文件此字段无实际约束 |
642
+ | `token` | string | private 文件的不透明访问 token(10 位 Base62),public 文件无此字段 |
581
643
  | `file_name` | string | 文件名(从 object_key 提取) |
582
644
  | `size_bytes` | integer | 文件大小(字节) |
583
645
  | `content_type` | string | MIME 类型 |
@@ -585,9 +647,7 @@ for obj in result["items"]:
585
647
  | `version` | integer | 版本号 |
586
648
  | `etag` | string | 实体标签 |
587
649
 
588
- 客户端获得 `download_url` 后,通过 HTTP GET 下载文件。`url` 为永久可分享的 AID 风格链接,`logical_url` 为无跳转直链。
589
-
590
- > 当前实现会对 BlobStore 返回的 loopback URL 做对外地址规范化:优先使用 `KITE_STORAGE_EXTERNAL_URL`,否则按 `storage.{issuer}` 形式改写。对外地址不可使用 `127.0.0.1` 或 `localhost`。
650
+ `url` 是推荐使用的干净链接。访问时 storage 服务实时鉴权:public 文件直接通过,private 文件需 `?t=` token 或 `Authorization: Bearer <AID JWT>` 头证明 owner 身份。鉴权通过后 storage 302 到 blob 后端完成实际下载,这一步对客户端完全透明。
591
651
 
592
652
  ---
593
653
 
@@ -650,25 +710,25 @@ print(f"配额: {limits['quota_used_bytes']}/{limits['quota_total_bytes']}")
650
710
 
651
711
  ## storage.check_upload
652
712
 
653
- 上传预检:一次调用同时回答"文件是否超限"和"当前 owner 是否可秒传"。客户端应在计算完文件 SHA-256 后、实际上传前调用。
654
-
655
- > `check_upload` / `complete_upload(skip_blob=true)` 只允许复用当前 owner 已拥有的内容,避免跨 owner 暴露全局 CAS 存在性或跳过上传克隆他人私有内容。不同 owner 上传相同内容时,仍会在完成上传后归一到同一个 CAS blob,由服务端引用计数管理物理去重。
713
+ 上传预检:一次调用同时回答"文件是否超限"和"当前 owner 是否可秒传"。客户端应在计算完文件 SHA-256 后、实际上传前调用。
714
+
715
+ > `check_upload` / `complete_upload(skip_blob=true)` 只允许复用当前 owner 已拥有的内容,避免跨 owner 暴露全局 CAS 存在性或跳过上传克隆他人私有内容。不同 owner 上传相同内容时,仍会在完成上传后归一到同一个 CAS blob,由服务端引用计数管理物理去重。
656
716
 
657
717
  ### 参数
658
718
 
659
- | 参数 | 类型 | 必填 | 说明 |
660
- |------|------|------|------|
661
- | `sha256` | string | 是 | 文件内容的 SHA-256 hex(64 字符) |
662
- | `size_bytes` | integer | 是 | 文件大小(字节) |
663
- | `owner_aid` | string | 否 | 检查指定 owner 是否可秒传,默认当前用户;必须等于当前登录 AID |
719
+ | 参数 | 类型 | 必填 | 说明 |
720
+ |------|------|------|------|
721
+ | `sha256` | string | 是 | 文件内容的 SHA-256 hex(64 字符) |
722
+ | `size_bytes` | integer | 是 | 文件大小(字节) |
723
+ | `owner_aid` | string | 否 | 检查指定 owner 是否可秒传,默认当前用户;必须等于当前登录 AID |
664
724
 
665
725
  ### 响应
666
726
 
667
727
  | 字段 | 类型 | 说明 |
668
728
  |------|------|------|
669
729
  | `within_limit` | boolean | 文件大小是否在限制内 |
670
- | `exists` | boolean | 当前 owner 是否已拥有相同内容且 CAS blob 可用 |
671
- | `skip_upload` | boolean | 是否可跳过上传(秒传) |
730
+ | `exists` | boolean | 当前 owner 是否已拥有相同内容且 CAS blob 可用 |
731
+ | `skip_upload` | boolean | 是否可跳过上传(秒传) |
672
732
 
673
733
  ### 使用场景
674
734
 
@@ -686,7 +746,7 @@ check = await client.call("storage.check_upload", {
686
746
  if not check["within_limit"]:
687
747
  print("文件超限,无法上传")
688
748
  elif check["skip_upload"]:
689
- # 秒传:当前 owner 已拥有相同内容,跳过上传直接 complete
749
+ # 秒传:当前 owner 已拥有相同内容,跳过上传直接 complete
690
750
  await client.call("storage.complete_upload", {
691
751
  "object_key": "my/file.bin",
692
752
  "sha256": sha256,
@@ -729,13 +789,16 @@ else:
729
789
  | 字段 | 类型 | 说明 |
730
790
  |------|------|------|
731
791
  | `share_id` | string | 10 位 Base62 分享短码 |
732
- | `aid_share_url` | string | **AID 风格分享 URL(默认/推荐)**:`https://{owner_aid}/storage/{share_id}`,体现分享者身份 |
733
- | `share_url` | string | 直链分享 URL:`{base_url}/s/{share_id}`,兼容字段 |
792
+ | `url` | string | **默认分享 URL(隐藏路径)**:`https://{owner_aid}/s/{share_id}`,最短直链 |
793
+ | `path_url` | string | **可选分享 URL(暴露路径)**:`https://{owner_aid}/{object_key}?t={share_id}`,可读性强 |
794
+ | `aid_share_url` | string | 同 `url`(兼容旧字段) |
795
+ | `share_url` | string | storage 直链:`https://storage.{issuer}/s/{share_id}`,兼容字段 |
734
796
  | `expire_at` | integer | 过期时间戳(Unix 秒),`0` 表示永不过期 |
735
797
  | `max_uses` | integer | 最大使用次数,`0` 表示无限制 |
736
798
  | `allowed_aids` | string[] | 授权 AID 列表,`["*"]` 表示公开 |
737
799
 
738
- > 访问 `aid_share_url` 时经 NameService 302 跳转到 `share_url`。share_id 是 10 位无斜杠 Base62,与 object_key 路径天然区分(object_key 含 `/` 或非 10 位)。
800
+ > 两种格式都通过 `share_id` 定位到 `share_links` 记录鉴权。`url` 隐藏文件结构,`path_url` 暴露文件名便于识别,调用者按需选择。
801
+ > 访问 `url` 时经 NameService 302 跳转到 `storage.{issuer}/s/{share_id}`;访问 `path_url` 时经 NameService fallback 到 storage,由 `?t=` token 鉴权。
739
802
  > share_id 指向 `(owner_aid, bucket, object_key)` 逻辑引用,非内容快照:对象改名/移动后原 share_id 失效,内容覆盖后下载到新内容。
740
803
 
741
804
  ### 示例
@@ -747,7 +810,7 @@ result = await client.call("storage.create_share_link", {
747
810
  "expire_in_seconds": 3600,
748
811
  "max_uses": 5,
749
812
  })
750
- share_url = result["aid_share_url"]
813
+ share_url = result["url"] # https://alice.agentid.pub/s/Ab3xK9mZ2q
751
814
  ```
752
815
 
753
816
  ---
@@ -774,8 +837,10 @@ share_url = result["aid_share_url"]
774
837
  | 字段 | 类型 | 说明 |
775
838
  |------|------|------|
776
839
  | `share_id` | string | 分享短码 |
777
- | `aid_share_url` | string | AID 风格分享 URL(主字段) |
778
- | `share_url` | string | 直链分享 URL(兼容) |
840
+ | `url` | string | 默认分享 URL(隐藏路径):`https://{owner_aid}/s/{share_id}` |
841
+ | `path_url` | string | 可选分享 URL(暴露路径):`https://{owner_aid}/{object_key}?t={share_id}` |
842
+ | `aid_share_url` | string | 同 `url`(兼容旧字段) |
843
+ | `share_url` | string | storage 直链(兼容) |
779
844
  | `object_key` | string | 被分享对象路径 |
780
845
  | `bucket` | string | 存储桶 |
781
846
  | `allowed_aids` | string[] | 授权 AID 列表,`["*"]` 表示公开 |
@@ -786,9 +851,9 @@ share_url = result["aid_share_url"]
786
851
 
787
852
  ---
788
853
 
789
- ## storage.revoke_share_link
790
-
791
- 撤销分享链接。
854
+ ## storage.revoke_share_link
855
+
856
+ 撤销分享链接。
792
857
 
793
858
  ### 参数
794
859
 
@@ -803,25 +868,670 @@ share_url = result["aid_share_url"]
803
868
  | `revoked` | boolean | 是否成功撤销 |
804
869
  | `share_id` | string | 被撤销的分享短码 |
805
870
 
806
- > 链接不存在或已撤销时返回通用错误(`-32000`)。
807
-
808
- ---
809
-
810
- ## storage.get_by_share
811
-
812
- 通过分享短码读取对象。公开分享无需额外授权;私有白名单分享需要请求者 AID 在 `allowed_aids` 内。
813
-
814
- **参数**:
815
-
816
- | 参数 | 类型 | 必填 | 说明 |
817
- |------|------|------|------|
818
- | `share_id` | string | 是 | 分享短码 |
819
-
820
- **响应**:小对象返回 `content`;大对象返回 `download_url`。同时返回 `object_id`、`object_key`、`path`、`size_bytes`、`content_type`、`sha256`。
821
-
822
- ---
823
-
824
- ## 错误码
871
+ > 链接不存在或已撤销时返回通用错误(`-32000`)。
872
+
873
+ ---
874
+
875
+ ## storage.get_by_share
876
+
877
+ 通过分享短码读取对象。公开分享无需额外授权;私有白名单分享需要请求者 AID 在 `allowed_aids` 内。
878
+
879
+ **参数**:
880
+
881
+ | 参数 | 类型 | 必填 | 说明 |
882
+ |------|------|------|------|
883
+ | `share_id` | string | 是 | 分享短码 |
884
+
885
+ **响应**:小对象返回 `content`;大对象返回 `download_url`。同时返回 `object_id`、`object_key`、`path`、`size_bytes`、`content_type`、`sha256`。
886
+
887
+ ---
888
+
889
+ ## storage.fs.list
890
+
891
+ 列目录(POSIX `ls`)。混合返回子目录/对象/软链/可用挂载点,排序 dir < file < symlink < mount。群 owner 路径回退到 Group FS 子节点。
892
+
893
+ ### 参数
894
+
895
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
896
+ |------|------|------|------|------|
897
+ | `path` | string | 否 | `""` | 目录路径(空=根) |
898
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
899
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
900
+ | `page` | integer | 否 | `1` | 页码 |
901
+ | `size` | integer | 否 | `100` | 每页条数(受 `list_max_limit` 上限约束) |
902
+ | `marker` | string | 否 | — | 分页游标 |
903
+ | `token` | string | 否 | — | 访问 token |
904
+
905
+ ### 响应
906
+
907
+ | 字段 | 类型 | 说明 |
908
+ |------|------|------|
909
+ | `nodes` | array | 节点列表,每项 `{type, node_type, name, path, mode, size, mtime, owner_principal}` |
910
+ | `items` | array | 同 `nodes`(兼容别名) |
911
+ | `total` | integer | 总数 |
912
+ | `page` / `size` | integer | 分页 |
913
+ | `next_marker` | string | 下一页游标 |
914
+
915
+ `type` 取值:`file` / `dir` / `symlink` / `mount`。
916
+
917
+ ---
918
+
919
+ ## storage.fs.find
920
+
921
+ 递归查找(POSIX `find`),支持 name/type/size/mtime 过滤与分页。Group FS 与 `.collab` 注册表有回退。
922
+
923
+ ### 参数
924
+
925
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
926
+ |------|------|------|------|------|
927
+ | `path` | string | 是 | — | 起始目录 |
928
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
929
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
930
+ | `name` | string | 否 | — | 名称 glob(如 `*.md`) |
931
+ | `type` | string | 否 | — | 节点类型过滤:`f`/`d`/`l`(SDK 形参 `node_type`) |
932
+ | `size` | string | 否 | — | 大小表达式(如 `+1M`) |
933
+ | `mtime` | string | 否 | — | 修改时间表达式 |
934
+ | `page` | integer | 否 | `1` | 页码 |
935
+ | `page_size` | integer | 否 | `1000` | 每页条数 |
936
+ | `token` | string | 否 | — | 访问 token |
937
+
938
+ ### 响应
939
+
940
+ 同 `storage.fs.list`:`{nodes, items, total, page, size, next_marker}`。
941
+
942
+ ---
943
+
944
+ ## storage.fs.df
945
+
946
+ 配额/用量报告(POSIX `df`),含每 owner 卷(过期卷重新计算)。
947
+
948
+ ### 参数
949
+
950
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
951
+ |------|------|------|------|------|
952
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
953
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
954
+
955
+ ### 响应
956
+
957
+ | 字段 | 类型 | 说明 |
958
+ |------|------|------|
959
+ | `owner_aid` / `bucket` | string | 所有者 / 桶 |
960
+ | `used_bytes` | integer | 已用字节 |
961
+ | `object_count` | integer | 对象数 |
962
+ | `quota_bytes` | integer | 配额上限 |
963
+ | `avail_bytes` | integer | 剩余可用 |
964
+ | `volumes` | array | 每卷用量明细 |
965
+
966
+ ---
967
+
968
+ ## storage.fs.stat
969
+
970
+ 查节点元数据(POSIX `stat`)。`follow_final=true`,解析末级软链 target。
971
+
972
+ ### 参数
973
+
974
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
975
+ |------|------|------|------|------|
976
+ | `path` | string | 是 | — | 节点路径 |
977
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
978
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
979
+ | `token` | string | 否 | — | 访问 token |
980
+
981
+ ### 响应
982
+
983
+ fs 节点视图:`{type, node_type, name, path, mode, size, mtime, owner_principal, ...}`。
984
+
985
+ ---
986
+
987
+ ## storage.fs.lstat
988
+
989
+ 查节点(POSIX `lstat`),**不跟随末级软链**——返回软链本身(携带 `dangling` 悬空标志),不返回 target。
990
+
991
+ ### 参数
992
+
993
+ 同 `storage.fs.stat`。
994
+
995
+ ### 响应
996
+
997
+ fs 节点视图;若为软链,返回软链节点本身(含 `dangling` 标志)。
998
+
999
+ ---
1000
+
1001
+ ## storage.fs.mkdir
1002
+
1003
+ 建目录(POSIX `mkdir`)。委托 `create_folder`。
1004
+
1005
+ ### 参数
1006
+
1007
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1008
+ |------|------|------|------|------|
1009
+ | `path` | string | 是 | — | 目录路径 |
1010
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1011
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1012
+ | `parents` | boolean | 否 | `false` | 递归创建父目录(类 `mkdir -p`) |
1013
+
1014
+ ### 响应
1015
+
1016
+ fs 目录节点视图。
1017
+
1018
+ ---
1019
+
1020
+ ## storage.fs.touch
1021
+
1022
+ 创建空文件或刷新已有节点的修改时间(POSIX `touch`)。已存在的文件、目录或软链会更新时间戳;不存在时默认创建 0 字节私有文件;`no_create=true` 时不存在不创建并返回 `{touched:false, created:false}`。
1023
+
1024
+ ### 参数
1025
+
1026
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1027
+ |------|------|------|------|------|
1028
+ | `path` | string | 是 | — | 目标路径 |
1029
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1030
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1031
+ | `parents` | boolean | 否 | `false` | 创建文件时是否递归创建父目录 |
1032
+ | `no_create` / `noCreate` | boolean | 否 | `false` | 目标不存在时不创建 |
1033
+ | `mtime` | integer | 否 | 当前时间 | Unix 秒或毫秒;小于 `10000000000` 按秒解释 |
1034
+ | `follow_symlinks` / `followSymlinks` | boolean | 否 | `false` | 目标为软链时是否跟随末级软链 |
1035
+ | `content_type` | string | 否 | `"application/octet-stream"` | 新建空文件的 MIME 类型 |
1036
+ | `metadata` | object | 否 | `{}` | 新建空文件的元数据 |
1037
+ | `expire_in_seconds` | integer | 否 | `0` | 新建空文件的过期秒数 |
1038
+
1039
+ ### 响应
1040
+
1041
+ 成功返回 fs 节点视图,并额外包含:
1042
+
1043
+ | 字段 | 类型 | 说明 |
1044
+ |------|------|------|
1045
+ | `touched` | boolean | 是否实际更新或创建 |
1046
+ | `created` | boolean | 是否新建了空文件 |
1047
+
1048
+ ---
1049
+
1050
+ ## storage.fs.remove
1051
+
1052
+ 删除文件/目录/软链(POSIX `rm`,目录用 `recursive`)。**拒绝删除挂载点**(须先 unmount)。
1053
+
1054
+ ### 参数
1055
+
1056
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1057
+ |------|------|------|------|------|
1058
+ | `path` | string | 是 | — | 节点路径 |
1059
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1060
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1061
+ | `recursive` | boolean | 否 | `false` | 递归删除目录 |
1062
+
1063
+ ### 响应
1064
+
1065
+ | 字段 | 类型 | 说明 |
1066
+ |------|------|------|
1067
+ | `owner_aid` / `bucket` / `path` | string | 目标 |
1068
+ | `removed_count` | integer | 删除节点数 |
1069
+ | `deleted` | boolean | 是否删除成功 |
1070
+
1071
+ ---
1072
+
1073
+ ## storage.fs.rename
1074
+
1075
+ 同 owner/bucket 内移动或改名(POSIX `mv`)。**跨 owner/bucket 被拒**;按节点类型分派到 move_folder / rename_symlink / move_object。
1076
+
1077
+ ### 参数
1078
+
1079
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1080
+ |------|------|------|------|------|
1081
+ | `src` | string | 是 | — | 源路径 |
1082
+ | `dst` | string | 是 | — | 目标路径 |
1083
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1084
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1085
+ | `overwrite` | boolean | 否 | `false` | 覆盖已存在目标 |
1086
+ | `expected_version` | integer | 否 | — | 乐观锁版本号 |
1087
+
1088
+ ### 响应
1089
+
1090
+ 被重命名节点的 fs 节点视图。
1091
+
1092
+ ---
1093
+
1094
+ ## storage.fs.copy
1095
+
1096
+ 复制对象或软链(POSIX `cp`,目录复制暂不支持)。CAS blob 引用计数复用,支持跨 owner 对象复制。
1097
+
1098
+ ### 参数
1099
+
1100
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1101
+ |------|------|------|------|------|
1102
+ | `src` | string | 是 | — | 源路径 |
1103
+ | `dst` | string | 是 | — | 目标路径 |
1104
+ | `owner_aid` | string | 否 | 当前用户 | 源所有者 AID |
1105
+ | `bucket` | string | 否 | `"default"` | 源存储桶 |
1106
+ | `overwrite` | boolean | 否 | `false` | 覆盖已存在目标 |
1107
+ | `follow_symlinks` | boolean | 否 | `false` | 复制软链 target 而非软链本身 |
1108
+ | `dst_owner_aid` | string | 否 | 同源 | 目标所有者(SDK 形参 `dst_owner`) |
1109
+ | `dst_bucket` | string | 否 | 同源 | 目标存储桶 |
1110
+
1111
+ ### 响应
1112
+
1113
+ 被复制节点的 fs 节点视图。
1114
+
1115
+ ---
1116
+
1117
+ ## storage.fs.mount
1118
+
1119
+ 挂载卷或他人子树进 owner 命名空间。`readonly` 默认 true;`require_approval=true` 时进入 pending 直到源 owner 批准。群成员卷挂载场景下,storage 通过 CA `aid_type=group` 识别群命名空间,命中 `/memberdata/` 时调 `group.check_membership` 实时校验成员身份。
1120
+
1121
+ ### 参数
1122
+
1123
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1124
+ |------|------|------|------|------|
1125
+ | `mount_path` | string | 是 | — | 挂载点路径 |
1126
+ | `owner_aid` | string | 否 | 当前用户 | 命名空间所有者 |
1127
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1128
+ | `volume_id` | string | 否 | — | 挂载实体卷(与 source_* 互斥) |
1129
+ | `source_aid` | string | 否 | — | 虚拟卷源 AID(与 volume_id 互斥) |
1130
+ | `source_path` | string | 否 | — | 虚拟卷源路径 |
1131
+ | `source_bucket` | string | 否 | — | 虚拟卷源存储桶 |
1132
+ | `readonly` | boolean | 否 | `true` | 只读挂载 |
1133
+ | `require_approval` | boolean | 否 | `false` | 需源 owner 批准 |
1134
+ | `expires_at` | integer | 否 | — | 挂载过期时间 |
1135
+
1136
+ ### 响应
1137
+
1138
+ | 字段 | 类型 | 说明 |
1139
+ |------|------|------|
1140
+ | `mount` | object | 挂载视图 |
1141
+ | `status` | string | `active`(直接生效)/ `pending`(待批准) |
1142
+
1143
+ > `status` 字段仅在直接调用 lowlevel RPC(`fs_mount`/`FSMount`/`fsMount` 原始返回)时可见。四语言 SDK 的高层 VFS 门面(`vfs.mount()`/`StorageVFS.Mount()`/`vfs.mount()`)会把响应解析为通用 NodeView,该视图不保留顶层 `status` 字段;需要判断是否 `pending` 时请改用 lowlevel 接口读取原始响应,或检查服务端在 `pending` 场景下额外写入的 `request_id`。
1144
+
1145
+ ---
1146
+
1147
+ ## storage.fs.approve
1148
+
1149
+ 源 owner 批准 pending 挂载(重新校验源路径存在)。`mount_id` 或 `(owner_aid, bucket, mount_path)` 二选一定位。
1150
+
1151
+ ### 参数
1152
+
1153
+ | 参数 | 类型 | 必填 | 说明 |
1154
+ |------|------|------|------|
1155
+ | `mount_id` | string | 否 | 挂载 ID(或用下方三元组定位) |
1156
+ | `owner_aid` | string | 否 | 命名空间所有者 |
1157
+ | `bucket` | string | 否 | 存储桶 |
1158
+ | `mount_path` | string | 否 | 挂载点路径 |
1159
+
1160
+ ### 响应
1161
+
1162
+ | 字段 | 类型 | 说明 |
1163
+ |------|------|------|
1164
+ | `approved` | boolean | `true` |
1165
+ | `mount` | object | 挂载视图 |
1166
+
1167
+ ---
1168
+
1169
+ ## storage.fs.reject
1170
+
1171
+ 源 owner 或挂载 owner 拒绝 pending 挂载。定位方式同 `fs.approve`。
1172
+
1173
+ ### 响应
1174
+
1175
+ `{rejected: boolean, mount}`。
1176
+
1177
+ ---
1178
+
1179
+ ## storage.fs.unmount
1180
+
1181
+ 卸载挂载点(仅 owner 可操作)。
1182
+
1183
+ ### 参数
1184
+
1185
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1186
+ |------|------|------|------|------|
1187
+ | `mount_path` | string | 是 | — | 挂载点路径 |
1188
+ | `owner_aid` | string | 否 | 当前用户 | 命名空间所有者 |
1189
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1190
+
1191
+ ### 响应
1192
+
1193
+ `{unmounted: boolean, owner_aid, bucket, path, mount_path}`。
1194
+
1195
+ ---
1196
+
1197
+ ## storage.fs.invalidate_membership
1198
+
1199
+ 群成员变更/群解散时失效群挂载(仅群 owner 或内部调用者)。SDK 形参不带 owner/bucket。
1200
+
1201
+ ### 参数
1202
+
1203
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1204
+ |------|------|------|------|------|
1205
+ | `group_id` | string | 是 | — | 群 ID |
1206
+ | `group_owner_aid` | string | 是 | — | 群 owner AID |
1207
+ | `member_aid` | string | 否 | — | 成员 AID(不传=全员) |
1208
+ | `reason` | string | 否 | `"membership_changed"` | `dissolved` / `membership_changed` |
1209
+ | `status` | string | 否 | — | `inactive` / `unavailable` |
1210
+
1211
+ ### 响应
1212
+
1213
+ `{group_id, group_aid, group_owner_aid, member_aid, reason, status, invalidated}`(`invalidated`=失效挂载数)。
1214
+
1215
+ ---
1216
+
1217
+ ## storage.create_symlink
1218
+
1219
+ 创建软链。target 受限于 owner 命名空间;拒绝同名 file/dir;父路径不可含软链前缀。
1220
+
1221
+ ### 参数
1222
+
1223
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1224
+ |------|------|------|------|------|
1225
+ | `path` | string | 是 | — | 软链路径 |
1226
+ | `target` | string | 是 | — | 指向目标路径 |
1227
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1228
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1229
+ | `overwrite` | boolean | 否 | `false` | 覆盖已存在软链 |
1230
+
1231
+ ### 响应
1232
+
1233
+ 软链视图(含 `dangling` 悬空标志)。
1234
+
1235
+ ---
1236
+
1237
+ ## storage.readlink
1238
+
1239
+ 读软链 target(owner 校验)。
1240
+
1241
+ ### 参数
1242
+
1243
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1244
+ |------|------|------|------|------|
1245
+ | `path` | string | 是 | — | 软链路径 |
1246
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1247
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1248
+
1249
+ ### 响应
1250
+
1251
+ 软链视图 `{symlink, target, version, ...}`。
1252
+
1253
+ ---
1254
+
1255
+ ## storage.atomic_repoint
1256
+
1257
+ 原子重指软链 target(乐观锁 CAS)。**collab commit / tag 并发正确性的底层核心**。
1258
+
1259
+ ### 参数
1260
+
1261
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1262
+ |------|------|------|------|------|
1263
+ | `path` | string | 是 | — | 软链路径 |
1264
+ | `new_target` | string | 是 | — | 新 target |
1265
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1266
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1267
+ | `expected_version` | integer | 否 | — | CAS 期望版本(null=跳过 CAS) |
1268
+
1269
+ ### 响应
1270
+
1271
+ **成功**:`{ok: true, ...软链视图}`(version+1)。
1272
+ **CAS 失败**:`{ok: false, current_version, current_target}`。
1273
+
1274
+ ---
1275
+
1276
+ ## storage.rename_symlink
1277
+
1278
+ 改软链 key(同 owner/bucket 内移动/改名),target 不变。跨 owner 被拒。
1279
+
1280
+ ### 参数
1281
+
1282
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1283
+ |------|------|------|------|------|
1284
+ | `path` | string | 是 | — | 原软链路径(SDK 形参 `path`/服务端 `src`) |
1285
+ | `new_path` | string | 是 | — | 新软链路径(服务端 `dst`) |
1286
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1287
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1288
+ | `overwrite` | boolean | 否 | `false` | 覆盖已存在 |
1289
+ | `expected_version` | integer | 否 | — | CAS 期望版本 |
1290
+
1291
+ ### 响应
1292
+
1293
+ **成功**:`{ok: true, ...软链视图}`。
1294
+ **CAS 失败**:`{ok: false, current_version, current_path, current_target}`。
1295
+
1296
+ ---
1297
+
1298
+ ## storage.delete_symlink
1299
+
1300
+ 删软链记录(不动 target 对象)。
1301
+
1302
+ ### 参数
1303
+
1304
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1305
+ |------|------|------|------|------|
1306
+ | `path` | string | 是 | — | 软链路径 |
1307
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1308
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1309
+
1310
+ ### 响应
1311
+
1312
+ `{deleted: boolean, owner_aid, bucket, path, symlink_id, target}`。
1313
+
1314
+ ---
1315
+
1316
+ ## storage.set_acl
1317
+
1318
+ 授予路径前缀 ACL grant。普通 AID storage 的 `grantee_aid` 必须是具体 AID,主要用于授予写/删除权限;子路径默认继承(最近祖先覆盖)。读取不通过 AID ACL 直接授权,应用应改用 `storage.create_share_link` 并在需要时用 `storage.revoke_share_link` 撤销。
1319
+
1320
+ `role:*` 伪主体只允许可信 group 内部门面写入。客户端不能直接对 `group_aid` 空间调用 `storage.set_acl` 设置 `role:admin`;群自有区角色写授权统一使用 `group.fs.set_acl`。
1321
+
1322
+ ### 参数
1323
+
1324
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1325
+ |------|------|------|------|------|
1326
+ | `path` | string | 是 | — | 授权路径前缀 |
1327
+ | `grantee_aid` | string | 是 | — | 被授权 AID;`role:*` 仅限 group 内部调用 |
1328
+ | `perms` | string | 是 | — | 权限位:`r`/`w`/`rw`/`rwx`(`rwx` 含删除) |
1329
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1330
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1331
+ | `expires_at` | integer | 否 | — | 授权过期时间 |
1332
+ | `max_uses` | integer | 否 | — | 最大使用次数 |
1333
+
1334
+ ### 响应
1335
+
1336
+ ACL 视图。
1337
+
1338
+ ---
1339
+
1340
+ ## storage.remove_acl
1341
+
1342
+ 移除路径 ACL 授权。对 AID storage,这是撤销写/删除授权的入口;读分享的撤销入口是 `storage.revoke_share_link`。群自有区角色写授权撤销使用 `group.fs.remove_acl`,不要由客户端直接调用 `storage.remove_acl` 操作 `role:*`。
1343
+
1344
+ ### 参数
1345
+
1346
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1347
+ |------|------|------|------|------|
1348
+ | `path` | string | 是 | — | 授权路径前缀 |
1349
+ | `grantee_aid` | string | 是 | — | 被授权 AID |
1350
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1351
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1352
+
1353
+ ### 响应
1354
+
1355
+ `{removed: boolean, owner_aid, bucket, path, grantee_aid}`。
1356
+
1357
+ ---
1358
+
1359
+ ## storage.list_acl
1360
+
1361
+ 列出路径上的 ACL 授权(owner 校验)。
1362
+
1363
+ ### 参数
1364
+
1365
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1366
+ |------|------|------|------|------|
1367
+ | `path` | string | 是 | — | 路径 |
1368
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1369
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1370
+
1371
+ ### 响应
1372
+
1373
+ `{owner_aid, bucket, path, acls}`。
1374
+
1375
+ ---
1376
+
1377
+ ## storage.set_visibility
1378
+
1379
+ 切换对象或目录的公开/私有(软链不支持)。`allow_roles` 是低层兼容字段,不能作为群自有区 admin 写授权入口;群自有区角色写授权必须使用 `group.fs.set_acl/remove_acl`。
1380
+
1381
+ ### 参数
1382
+
1383
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1384
+ |------|------|------|------|------|
1385
+ | `path` | string | 是 | — | 路径 |
1386
+ | `visibility` | string | 是 | — | `public` / `private` |
1387
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1388
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1389
+ | `allow_roles` | array | 否 | — | 低层兼容字段,仅表示可见性读角色;不能用于群自有区写授权 |
1390
+
1391
+ ### 响应
1392
+
1393
+ fs 节点视图(含 `allow_roles`)。
1394
+
1395
+ ---
1396
+
1397
+ ## storage.check_access
1398
+
1399
+ 非抛错的访问探测——探测某操作在某路径是否放行(内部捕获 NotFound/Dangling/Permission)。
1400
+
1401
+ ### 参数
1402
+
1403
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1404
+ |------|------|------|------|------|
1405
+ | `path` | string | 是 | — | 路径(服务端别名 `object_key`) |
1406
+ | `operation` | string | 否 | `"read"` | `read` / `write` / `delete`(服务端别名 `op`) |
1407
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1408
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1409
+ | `token` | string | 否 | — | 访问 token |
1410
+ | `follow_symlinks` | boolean | 否 | `true` | 跟随软链 |
1411
+
1412
+ ### 响应
1413
+
1414
+ `{allowed: boolean, reason, message, requester_aid, owner_aid, bucket, path, operation}`。
1415
+
1416
+ ---
1417
+
1418
+ ## storage.issue_token
1419
+
1420
+ 签发 hash 化的 bearer 访问 token,scope 到某路径。返回的明文 token 仅此一次可见。
1421
+
1422
+ ### 参数
1423
+
1424
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1425
+ |------|------|------|------|------|
1426
+ | `path` | string | 是 | — | 授权路径(服务端别名 `object_key`) |
1427
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1428
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1429
+ | `expires_at` | integer | 否 | — | 过期时间 |
1430
+ | `max_reads` | integer | 否 | — | 最大读取次数(服务端别名 `max_uses`) |
1431
+
1432
+ ### 响应
1433
+
1434
+ token 视图 + 明文 token(一次性返回)。
1435
+
1436
+ ---
1437
+
1438
+ ## storage.revoke_token
1439
+
1440
+ 按明文 token 值吊销(内部 hash 后查找)。
1441
+
1442
+ ### 参数
1443
+
1444
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1445
+ |------|------|------|------|------|
1446
+ | `path` | string | 是 | — | 路径(服务端别名 `object_key`) |
1447
+ | `token` | string | 是 | — | 要吊销的明文 token |
1448
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1449
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1450
+
1451
+ ### 响应
1452
+
1453
+ `{revoked: boolean, owner_aid, bucket, path}`。
1454
+
1455
+ ---
1456
+
1457
+ ## storage.list_tokens
1458
+
1459
+ 列出路径上的 token(owner 校验,不返回明文)。
1460
+
1461
+ ### 参数
1462
+
1463
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1464
+ |------|------|------|------|------|
1465
+ | `path` | string | 是 | — | 路径 |
1466
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1467
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1468
+
1469
+ ### 响应
1470
+
1471
+ token 列表(hash 摘要 + 元数据)。
1472
+
1473
+ ---
1474
+
1475
+ ## storage.volume.create
1476
+
1477
+ 创建/upsert 配额卷(含 mount_point)。
1478
+
1479
+ ### 参数
1480
+
1481
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1482
+ |------|------|------|------|------|
1483
+ | `size_bytes` | integer | 是 | — | 卷容量(>0) |
1484
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1485
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1486
+ | `volume_id` | string | 否 | 自动 | 卷 ID |
1487
+ | `used_bytes` | integer | 否 | — | 已用字节 |
1488
+ | `status` | string | 否 | `active` | `active` / `grace` / `expired` |
1489
+ | `mount_point` | string | 否 | — | 挂载点 |
1490
+ | `expires_at` | integer | 否 | — | 过期时间 |
1491
+
1492
+ ### 响应
1493
+
1494
+ `{volume, ...卷视图}`。
1495
+
1496
+ ---
1497
+
1498
+ ## storage.volume.renew
1499
+
1500
+ 续期卷过期时间/状态(owner 校验,owner 不符抛 PermissionError)。
1501
+
1502
+ ### 参数
1503
+
1504
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1505
+ |------|------|------|------|------|
1506
+ | `volume_id` | string | 是 | — | 卷 ID(服务端别名 `id`) |
1507
+ | `expires_at` | integer | 是 | — | 新过期时间 |
1508
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1509
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1510
+ | `status` | string | 否 | — | 卷状态 |
1511
+
1512
+ ### 响应
1513
+
1514
+ `{volume, ...卷视图}`。
1515
+
1516
+ ---
1517
+
1518
+ ## storage.volume.expire_due
1519
+
1520
+ 过期所有到期卷并标记其挂载为 unavailable。
1521
+
1522
+ ### 参数
1523
+
1524
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
1525
+ |------|------|------|------|------|
1526
+ | `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
1527
+ | `bucket` | string | 否 | `"default"` | 存储桶 |
1528
+ | `now` | integer | 否 | 当前时间 | 判定基准时间 |
1529
+
1530
+ ### 响应
1531
+
1532
+ `{owner_aid, bucket, expired, mounts_unavailable, volumes, mounts}`。
1533
+
1534
+ ## 错误码
825
1535
 
826
1536
  | code | 说明 |
827
1537
  |------|------|