@agentunion/fastaun-browser 0.4.13 → 0.5.0

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 (175) hide show
  1. package/CHANGELOG.md +480 -386
  2. package/_packed_docs/CHANGELOG.md +480 -386
  3. package/_packed_docs/INDEX.md +111 -53
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +43 -29
  5. package/_packed_docs/agent.md/SCHEMA.md +2 -0
  6. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +2 -0
  7. package/_packed_docs/agent.md/examples/human-developer.md +2 -0
  8. package/_packed_docs/agent.md/examples/openclaw-lobster.md +2 -0
  9. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +2 -0
  10. 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
  11. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +265 -686
  12. package/_packed_docs/collab-gateway-boundary-test-report.md +164 -0
  13. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +2 -0
  14. 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
  15. 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
  16. 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
  17. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -0
  18. 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
  19. 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
  20. 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
  21. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +2 -0
  22. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +2 -0
  23. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +2 -0
  24. 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
  25. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +2 -0
  26. package/_packed_docs/protocol/08-AUN-E2EE.md +2 -0
  27. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +2 -0
  28. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +28 -85
  29. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +49 -0
  30. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +2 -0
  31. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +2 -0
  32. 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
  33. 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
  34. package/_packed_docs/protocol/README.md +2 -0
  35. package/_packed_docs/protocol/agent.md/SCHEMA.md +2 -0
  36. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +2 -0
  37. package/_packed_docs/protocol/agent.md/examples/human-developer.md +2 -0
  38. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +2 -0
  39. package/_packed_docs/protocol/aun-docs-guide.md +2 -0
  40. package/_packed_docs/protocol/index.md +3 -1
  41. 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
  42. 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
  43. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +2 -0
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +2 -0
  58. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +2 -0
  59. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -0
  60. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +2 -0
  61. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +2 -0
  62. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +283 -267
  63. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +4 -1
  64. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
  65. package/_packed_docs/sdk/09-collab-rpc-manual.md +550 -0
  66. package/_packed_docs/sdk/09-custody-api-manual.md +2 -0
  67. package/_packed_docs/sdk/09-group-rpc-manual.md +197 -443
  68. package/_packed_docs/sdk/09-message-rpc-manual.md +2 -0
  69. package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -0
  70. package/_packed_docs/sdk/09-payload-reference.md +2 -0
  71. package/_packed_docs/sdk/09-proxy-rpc-manual.md +2 -0
  72. package/_packed_docs/sdk/09-storage-rpc-manual.md +952 -279
  73. package/_packed_docs/sdk/09-stream-rpc-manual.md +2 -0
  74. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +33 -20
  75. 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
  76. package/_packed_docs/sdk/INDEX.md +46 -29
  77. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +2 -0
  78. package/_packed_docs/sdk/README.md +17 -15
  79. package/dist/aid-store.d.ts +25 -0
  80. package/dist/aid-store.d.ts.map +1 -1
  81. package/dist/aid-store.js +89 -8
  82. package/dist/aid-store.js.map +1 -1
  83. package/dist/bundle.js +19128 -16784
  84. package/dist/client/delivery.d.ts +2 -0
  85. package/dist/client/delivery.d.ts.map +1 -1
  86. package/dist/client/delivery.js +52 -8
  87. package/dist/client/delivery.js.map +1 -1
  88. package/dist/client/rpc-pipeline.d.ts +1 -0
  89. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  90. package/dist/client/rpc-pipeline.js +70 -33
  91. package/dist/client/rpc-pipeline.js.map +1 -1
  92. package/dist/client.d.ts +31 -0
  93. package/dist/client.d.ts.map +1 -1
  94. package/dist/client.js +282 -20
  95. package/dist/client.js.map +1 -1
  96. package/dist/collab/client.d.ts +39 -0
  97. package/dist/collab/client.d.ts.map +1 -0
  98. package/dist/collab/client.js +124 -0
  99. package/dist/collab/client.js.map +1 -0
  100. package/dist/collab/errors.d.ts +16 -0
  101. package/dist/collab/errors.d.ts.map +1 -0
  102. package/dist/collab/errors.js +60 -0
  103. package/dist/collab/errors.js.map +1 -0
  104. package/dist/collab/index.d.ts +4 -0
  105. package/dist/collab/index.d.ts.map +1 -0
  106. package/dist/collab/index.js +4 -0
  107. package/dist/collab/index.js.map +1 -0
  108. package/dist/collab/types.d.ts +111 -0
  109. package/dist/collab/types.d.ts.map +1 -0
  110. package/dist/collab/types.js +2 -0
  111. package/dist/collab/types.js.map +1 -0
  112. package/dist/crypto.d.ts +6 -0
  113. package/dist/crypto.d.ts.map +1 -1
  114. package/dist/crypto.js +6 -0
  115. package/dist/crypto.js.map +1 -1
  116. package/dist/errors.d.ts.map +1 -1
  117. package/dist/errors.js +16 -1
  118. package/dist/errors.js.map +1 -1
  119. package/dist/facades.d.ts +89 -0
  120. package/dist/facades.d.ts.map +1 -0
  121. package/dist/facades.js +228 -0
  122. package/dist/facades.js.map +1 -0
  123. package/dist/group-fs.d.ts +103 -0
  124. package/dist/group-fs.d.ts.map +1 -0
  125. package/dist/group-fs.js +496 -0
  126. package/dist/group-fs.js.map +1 -0
  127. package/dist/group-resources.d.ts +98 -0
  128. package/dist/group-resources.d.ts.map +1 -0
  129. package/dist/group-resources.js +635 -0
  130. package/dist/group-resources.js.map +1 -0
  131. package/dist/index.d.ts +4 -1
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +6 -0
  134. package/dist/index.js.map +1 -1
  135. package/dist/register-flow.d.ts +1 -0
  136. package/dist/register-flow.d.ts.map +1 -1
  137. package/dist/register-flow.js +3 -0
  138. package/dist/register-flow.js.map +1 -1
  139. package/dist/service-proxy.d.ts +1 -0
  140. package/dist/service-proxy.d.ts.map +1 -1
  141. package/dist/service-proxy.js +15 -3
  142. package/dist/service-proxy.js.map +1 -1
  143. package/dist/storage/errors.d.ts +28 -0
  144. package/dist/storage/errors.d.ts.map +1 -0
  145. package/dist/storage/errors.js +65 -0
  146. package/dist/storage/errors.js.map +1 -0
  147. package/dist/storage/index.d.ts +2 -0
  148. package/dist/storage/index.d.ts.map +1 -0
  149. package/dist/storage/index.js +2 -0
  150. package/dist/storage/index.js.map +1 -0
  151. package/dist/storage/lowlevel.d.ts +314 -0
  152. package/dist/storage/lowlevel.d.ts.map +1 -0
  153. package/dist/storage/lowlevel.js +460 -0
  154. package/dist/storage/lowlevel.js.map +1 -0
  155. package/dist/storage/types.d.ts +59 -0
  156. package/dist/storage/types.d.ts.map +1 -0
  157. package/dist/storage/types.js +113 -0
  158. package/dist/storage/types.js.map +1 -0
  159. package/dist/storage/vfs.d.ts +144 -0
  160. package/dist/storage/vfs.d.ts.map +1 -0
  161. package/dist/storage/vfs.js +403 -0
  162. package/dist/storage/vfs.js.map +1 -0
  163. package/dist/tools/cross-sdk-agent.d.ts +3 -0
  164. package/dist/tools/cross-sdk-agent.d.ts.map +1 -0
  165. package/dist/tools/cross-sdk-agent.js +1089 -0
  166. package/dist/tools/cross-sdk-agent.js.map +1 -0
  167. package/dist/transport.d.ts +3 -0
  168. package/dist/transport.d.ts.map +1 -1
  169. package/dist/transport.js +33 -13
  170. package/dist/transport.js.map +1 -1
  171. package/dist/version.d.ts +1 -1
  172. package/dist/version.d.ts.map +1 -1
  173. package/dist/version.js +1 -1
  174. package/dist/version.js.map +1 -1
  175. package/package.json +44 -44
package/dist/client.js CHANGED
@@ -8,6 +8,7 @@ import { createConfig, getDeviceId, normalizeSlotId } from './config.js';
8
8
  import { EventDispatcher } from './events.js';
9
9
  import { normalizeGroupId } from './group-id.js';
10
10
  import { GatewayDiscovery } from './discovery.js';
11
+ import { AIDStore } from './aid-store.js';
11
12
  import { RPCTransport } from './transport.js';
12
13
  import { AuthFlow } from './auth.js';
13
14
  import { SeqTracker } from './seq-tracker.js';
@@ -17,6 +18,9 @@ import { IdentityRuntimeManager } from './client/identity.js';
17
18
  import { LifecycleController } from './client/lifecycle.js';
18
19
  import { PeerDirectory } from './client/peers.js';
19
20
  import { RpcPipeline } from './client/rpc-pipeline.js';
21
+ import { GroupFacade, MessageFacade, StreamFacade } from './facades.js';
22
+ import { StorageVFS } from './storage/vfs.js';
23
+ import { CollabClient } from './collab/client.js';
20
24
  import { V2E2EECoordinator } from './client/v2-e2ee.js';
21
25
  import { GroupStateCoordinator } from './client/group-state.js';
22
26
  import { CryptoProvider, base64ToUint8, pemToArrayBuffer, ecdsaVerifyDer, importCertPublicKeyEcdsa, } from './crypto.js';
@@ -110,18 +114,25 @@ const NON_IDEMPOTENT_METHODS = new Set([
110
114
  'storage.create_folder', 'storage.rename_folder', 'storage.move_folder',
111
115
  'storage.delete_folder', 'storage.move_object', 'storage.copy_object',
112
116
  'storage.batch_delete', 'storage.set_object_meta', 'storage.append_object',
117
+ 'storage.set_acl', 'storage.remove_acl', 'storage.set_visibility',
118
+ 'storage.issue_token', 'storage.revoke_token',
119
+ 'storage.create_symlink', 'storage.atomic_repoint',
120
+ 'storage.rename_symlink', 'storage.delete_symlink',
121
+ 'storage.fs.mkdir', 'storage.fs.remove', 'storage.fs.rename', 'storage.fs.copy',
122
+ 'storage.fs.mount', 'storage.fs.approve', 'storage.fs.reject', 'storage.fs.unmount',
123
+ 'storage.fs.invalidate_membership',
124
+ 'storage.volume.create', 'storage.volume.renew', 'storage.volume.expire_due',
113
125
  'auth.create_aid', 'auth.renew_cert', 'auth.rekey',
114
126
  'message.thought.put', 'group.thought.put',
115
- 'group.add_member',
116
- 'group.resources.put', 'group.resources.create_folder',
117
- 'group.resources.rename', 'group.resources.move',
118
- 'group.resources.mount_object', 'group.resources.update',
119
- 'group.resources.delete', 'group.resources.cleanup_by_storage_ref',
120
- 'group.resources.request_add', 'group.resources.request_mount_object',
121
- 'group.resources.direct_add', 'group.resources.approve_request',
122
- 'group.resources.reject_request', 'group.resources.unmount',
123
- 'group.resources.get_access',
124
- 'group.resources.resolve_access_ticket',
127
+ 'group.add_member', 'group.bind_group_aid', 'group.complete_transfer',
128
+ 'group.fs.mkdir', 'group.fs.rm', 'group.fs.cp', 'group.fs.mv',
129
+ 'group.fs.mount', 'group.fs.umount',
130
+ 'group.fs.check_upload', 'group.fs.create_upload_session',
131
+ 'group.fs.complete_upload', 'group.fs.create_download_ticket',
132
+ 'collab.create', 'collab.commit', 'collab.clone',
133
+ 'collab.prune', 'collab.unregister',
134
+ 'collab.tag.create', 'collab.tag.restore',
135
+ 'collab.tag.rm', 'collab.tag.prune',
125
136
  ]);
126
137
  /** 需要客户端签名的关键方法。运行时逻辑已迁入 RpcPipeline,此处保留给源码审计测试。 */
127
138
  const SIGNED_METHODS = new Set([
@@ -138,20 +149,17 @@ const SIGNED_METHODS = new Set([
138
149
  'group.leave', 'group.remove_member', 'group.update_rules',
139
150
  'group.update', 'group.update_announcement',
140
151
  'group.update_join_requirements', 'group.set_role',
141
- 'group.transfer_owner', 'group.review_join_request',
152
+ 'group.transfer_owner', 'group.bind_group_aid', 'group.complete_transfer',
153
+ 'group.review_join_request',
142
154
  'group.batch_review_join_request',
143
155
  'group.request_join', 'group.use_invite_code',
144
156
  'group.thought.put',
145
157
  'message.thought.put',
146
158
  'group.set_settings',
147
- 'group.resources.put', 'group.resources.create_folder',
148
- 'group.resources.rename', 'group.resources.move',
149
- 'group.resources.mount_object', 'group.resources.update',
150
- 'group.resources.delete', 'group.resources.cleanup_by_storage_ref',
151
- 'group.resources.request_add', 'group.resources.request_mount_object',
152
- 'group.resources.direct_add', 'group.resources.approve_request',
153
- 'group.resources.reject_request', 'group.resources.unmount',
154
- 'group.resources.get_access', 'group.resources.resolve_access_ticket',
159
+ 'group.fs.mkdir', 'group.fs.rm', 'group.fs.cp', 'group.fs.mv',
160
+ 'group.fs.mount', 'group.fs.umount',
161
+ 'group.fs.check_upload', 'group.fs.create_upload_session',
162
+ 'group.fs.complete_upload', 'group.fs.create_download_ticket',
155
163
  'storage.put_object', 'storage.delete_object',
156
164
  'storage.create_share_link', 'storage.revoke_share_link',
157
165
  'storage.get_by_share',
@@ -159,6 +167,19 @@ const SIGNED_METHODS = new Set([
159
167
  'storage.create_folder', 'storage.rename_folder', 'storage.move_folder',
160
168
  'storage.delete_folder', 'storage.move_object', 'storage.copy_object',
161
169
  'storage.batch_delete', 'storage.set_object_meta', 'storage.append_object',
170
+ 'storage.set_acl', 'storage.remove_acl', 'storage.set_visibility',
171
+ 'storage.check_access',
172
+ 'storage.issue_token', 'storage.revoke_token',
173
+ 'storage.create_symlink', 'storage.atomic_repoint',
174
+ 'storage.rename_symlink', 'storage.delete_symlink',
175
+ 'storage.fs.mkdir', 'storage.fs.remove', 'storage.fs.rename', 'storage.fs.copy',
176
+ 'storage.fs.mount', 'storage.fs.approve', 'storage.fs.reject', 'storage.fs.unmount',
177
+ 'storage.fs.invalidate_membership',
178
+ 'storage.volume.create', 'storage.volume.renew', 'storage.volume.expire_due',
179
+ 'collab.create', 'collab.commit', 'collab.clone',
180
+ 'collab.prune', 'collab.unregister',
181
+ 'collab.tag.create', 'collab.tag.restore',
182
+ 'collab.tag.rm', 'collab.tag.prune',
162
183
  'group.commit_state',
163
184
  'group.ban', 'group.unban',
164
185
  'group.dissolve', 'group.suspend', 'group.resume',
@@ -560,6 +581,7 @@ export class AUNClient {
560
581
  _onlineUnreadHintIntervalMs = 50;
561
582
  /** gap fill 来源标记:true 表示当前正在补洞(pull 触发),false 表示非补洞 */
562
583
  _gapFillActive = false;
584
+ _backgroundRpcDepth = 0;
563
585
  // Pull Gate:序列化同一 key 的并发 pull 操作,防止重复拉取
564
586
  _pullGates = new Map();
565
587
  // 重连相关
@@ -595,6 +617,11 @@ export class AUNClient {
595
617
  _delivery;
596
618
  _v2E2EE;
597
619
  _groupState;
620
+ _storage;
621
+ _collab;
622
+ _messageFacade;
623
+ _groupFacade;
624
+ _streamFacade;
598
625
  constructor(aid) {
599
626
  if (aid !== null && aid !== undefined && !isAIDObject(aid)) {
600
627
  throw new ValidationError('AUNClient only accepts an AID object or no argument');
@@ -751,6 +778,36 @@ export class AUNClient {
751
778
  get aid() {
752
779
  return this._aid;
753
780
  }
781
+ /** AUN Storage VFS 入口 */
782
+ get storage() {
783
+ if (!this._storage)
784
+ this._storage = new StorageVFS(this);
785
+ return this._storage;
786
+ }
787
+ /** AUN collab 协作层入口 */
788
+ get collab() {
789
+ if (!this._collab)
790
+ this._collab = new CollabClient(this);
791
+ return this._collab;
792
+ }
793
+ /** Message RPC facade 入口 */
794
+ get message() {
795
+ if (!this._messageFacade)
796
+ this._messageFacade = new MessageFacade(this);
797
+ return this._messageFacade;
798
+ }
799
+ /** Group RPC facade 入口 */
800
+ get group() {
801
+ if (!this._groupFacade)
802
+ this._groupFacade = new GroupFacade(this);
803
+ return this._groupFacade;
804
+ }
805
+ /** Stream RPC facade 入口 */
806
+ get stream() {
807
+ if (!this._streamFacade)
808
+ this._streamFacade = new StreamFacade(this);
809
+ return this._streamFacade;
810
+ }
754
811
  async _observeAgentMdFromEnvelope(envelope) {
755
812
  await this._agentMdManager.observeEnvelope(envelope);
756
813
  }
@@ -992,6 +1049,200 @@ export class AUNClient {
992
1049
  async call(method, params) {
993
1050
  return await this._rpcPipeline.call(method, params);
994
1051
  }
1052
+ async createGroup(params = {}) {
1053
+ if (!isJsonObject(params)) {
1054
+ throw new ValidationError('createGroup params must be an object');
1055
+ }
1056
+ const payload = { ...params };
1057
+ const groupName = String(payload.group_name ?? payload.groupName ?? '').trim();
1058
+ if (!groupName) {
1059
+ return await this.call('group.create', payload);
1060
+ }
1061
+ const keyPair = await new CryptoProvider().generateIdentity();
1062
+ payload.public_key = keyPair.public_key_der_b64;
1063
+ payload.curve = keyPair.curve;
1064
+ const result = await this.call('group.create', payload);
1065
+ const resultMap = isJsonObject(result) ? result : {};
1066
+ const group = isJsonObject(resultMap.group) ? resultMap.group : {};
1067
+ const aidCert = isJsonObject(resultMap.aid_cert) ? resultMap.aid_cert : {};
1068
+ const groupAid = String(group.group_aid ?? resultMap.group_aid ?? '').trim();
1069
+ const certPem = String(aidCert.cert ?? aidCert.cert_pem ?? resultMap.cert ?? resultMap.cert_pem ?? '').trim();
1070
+ if (!groupAid || !certPem) {
1071
+ throw new ValidationError('group.create named group response missing group.group_aid or aid_cert.cert');
1072
+ }
1073
+ const store = new AIDStore({
1074
+ aunPath: this.configModel.aunPath,
1075
+ encryptionSeed: this.configModel.seedPassword ?? '',
1076
+ slotId: this._slotId,
1077
+ rootCaPem: this.configModel.rootCaPem,
1078
+ verifySsl: this.configModel.verifySsl,
1079
+ });
1080
+ try {
1081
+ const imported = await store.importGroupIdentity(groupAid, {
1082
+ private_key_pem: keyPair.private_key_pem,
1083
+ public_key_der_b64: keyPair.public_key_der_b64,
1084
+ curve: keyPair.curve,
1085
+ cert_pem: certPem,
1086
+ });
1087
+ if (!imported.ok) {
1088
+ throw new ValidationError(imported.error.message);
1089
+ }
1090
+ }
1091
+ finally {
1092
+ store.close();
1093
+ }
1094
+ return result;
1095
+ }
1096
+ async bindGroupAid(params = {}, options = {}) {
1097
+ if (!isJsonObject(params)) {
1098
+ throw new ValidationError('bindGroupAid params must be an object');
1099
+ }
1100
+ const store = options.aidStore;
1101
+ if (!store) {
1102
+ throw new ValidationError('bindGroupAid requires aidStore');
1103
+ }
1104
+ const keyPair = await new CryptoProvider().generateIdentity();
1105
+ const payload = { ...params };
1106
+ payload.public_key = keyPair.public_key_der_b64;
1107
+ payload.curve = keyPair.curve;
1108
+ const result = await this.call('group.bind_group_aid', payload);
1109
+ const resultMap = isJsonObject(result) ? result : {};
1110
+ const group = isJsonObject(resultMap.group) ? resultMap.group : {};
1111
+ const aidCert = isJsonObject(resultMap.aid_cert) ? resultMap.aid_cert : {};
1112
+ const groupAid = String(group.group_aid ?? resultMap.group_aid ?? '').trim();
1113
+ const certPem = String(aidCert.cert ?? aidCert.cert_pem ?? resultMap.cert ?? resultMap.cert_pem ?? '').trim();
1114
+ if (!groupAid || !certPem) {
1115
+ throw new ValidationError('group.bind_group_aid response missing group.group_aid or aid_cert.cert');
1116
+ }
1117
+ const imported = await store.importGroupIdentity(groupAid, {
1118
+ private_key_pem: keyPair.private_key_pem,
1119
+ public_key_der_b64: keyPair.public_key_der_b64,
1120
+ curve: keyPair.curve,
1121
+ cert_pem: certPem,
1122
+ });
1123
+ if (!imported.ok) {
1124
+ throw new ValidationError(imported.error.message);
1125
+ }
1126
+ return result;
1127
+ }
1128
+ async startGroupTransfer(params = {}, options = {}) {
1129
+ if (!isJsonObject(params)) {
1130
+ throw new ValidationError('startGroupTransfer params must be an object');
1131
+ }
1132
+ const store = options.aidStore;
1133
+ if (!store) {
1134
+ throw new ValidationError('startGroupTransfer requires aidStore');
1135
+ }
1136
+ const groupId = String(params.group_id ?? '').trim();
1137
+ const newOwner = String(params.new_owner ?? '').trim();
1138
+ if (!groupId || !newOwner) {
1139
+ throw new ValidationError('startGroupTransfer requires group_id and new_owner');
1140
+ }
1141
+ let groupAid = String(params.group_aid ?? '').trim();
1142
+ if (!groupAid) {
1143
+ const info = await this.call('group.get', { group_id: groupId });
1144
+ const infoMap = isJsonObject(info) ? info : {};
1145
+ const grp = isJsonObject(infoMap.group) ? infoMap.group : infoMap;
1146
+ groupAid = String(grp.group_aid ?? '').trim();
1147
+ }
1148
+ if (!groupAid) {
1149
+ throw new ValidationError('startGroupTransfer: unable to determine group_aid');
1150
+ }
1151
+ const loaded = await store.load(groupAid);
1152
+ if (!loaded.ok || !loaded.data) {
1153
+ throw new ValidationError(`startGroupTransfer: group_aid identity not found: ${groupAid}`);
1154
+ }
1155
+ const aidObj = loaded.data.aid;
1156
+ if (!aidObj.isPrivateKeyValid() || !aidObj.privateKeyPem) {
1157
+ throw new ValidationError(`startGroupTransfer: group_aid private key not found: ${groupAid}`);
1158
+ }
1159
+ const nonce = globalThis.crypto.randomUUID().replace(/-/g, '');
1160
+ const issuedMs = Date.now();
1161
+ const canonical = [
1162
+ 'aun-group-owner-transfer-v1',
1163
+ groupId.toLowerCase(),
1164
+ groupAid.toLowerCase(),
1165
+ newOwner.toLowerCase(),
1166
+ nonce,
1167
+ String(issuedMs),
1168
+ ].join('|');
1169
+ const signed = await aidObj.sign(canonical);
1170
+ if (!signed.ok) {
1171
+ throw new ValidationError(`startGroupTransfer: sign failed: ${signed.error.message}`);
1172
+ }
1173
+ const payload = { ...params, group_aid: groupAid };
1174
+ payload.transfer_auth = { nonce, issued_ms: issuedMs, signature: signed.data.signature };
1175
+ return await this.call('group.transfer_owner', payload);
1176
+ }
1177
+ async completeGroupTransfer(params = {}, options = {}) {
1178
+ if (!isJsonObject(params)) {
1179
+ throw new ValidationError('completeGroupTransfer params must be an object');
1180
+ }
1181
+ const store = options.aidStore;
1182
+ if (!store) {
1183
+ throw new ValidationError('completeGroupTransfer requires aidStore');
1184
+ }
1185
+ const keyPair = await new CryptoProvider().generateIdentity();
1186
+ const payload = { ...params };
1187
+ const groupId = String(params.group_id ?? '').trim();
1188
+ if (!groupId) {
1189
+ throw new ValidationError('completeGroupTransfer requires group_id');
1190
+ }
1191
+ let groupAid = String(params.group_aid ?? '').trim();
1192
+ if (!groupAid) {
1193
+ const info = await this.call('group.get', { group_id: groupId });
1194
+ const infoMap = isJsonObject(info) ? info : {};
1195
+ const grp = isJsonObject(infoMap.group) ? infoMap.group : infoMap;
1196
+ groupAid = String(grp.group_aid ?? '').trim();
1197
+ }
1198
+ if (!groupAid) {
1199
+ throw new ValidationError('completeGroupTransfer: unable to determine group_aid');
1200
+ }
1201
+ const current = this.currentAid;
1202
+ const newOwner = String(current?.aid ?? '').trim();
1203
+ if (!current || !newOwner || !current.isPrivateKeyValid()) {
1204
+ throw new ValidationError('completeGroupTransfer requires current new-owner AID with private key');
1205
+ }
1206
+ const nonce = globalThis.crypto.randomUUID().replace(/-/g, '');
1207
+ const issuedMs = Date.now();
1208
+ const publicKeyHash = bytesToHex(new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(keyPair.public_key_der_b64))));
1209
+ const canonical = [
1210
+ 'aun-group-owner-transfer-accept-v1',
1211
+ groupId.toLowerCase(),
1212
+ groupAid.toLowerCase(),
1213
+ newOwner.toLowerCase(),
1214
+ publicKeyHash,
1215
+ nonce,
1216
+ String(issuedMs),
1217
+ ].join('|');
1218
+ const signed = await current.sign(canonical);
1219
+ if (!signed.ok) {
1220
+ throw new ValidationError(`completeGroupTransfer: accept sign failed: ${signed.error.message}`);
1221
+ }
1222
+ payload.group_aid = groupAid;
1223
+ payload.public_key = keyPair.public_key_der_b64;
1224
+ payload.curve = keyPair.curve;
1225
+ payload.transfer_accept = { nonce, issued_ms: issuedMs, signature: signed.data.signature };
1226
+ const result = await this.call('group.complete_transfer', payload);
1227
+ const resultMap = isJsonObject(result) ? result : {};
1228
+ const group = isJsonObject(resultMap.group) ? resultMap.group : {};
1229
+ const aidCert = isJsonObject(resultMap.aid_cert) ? resultMap.aid_cert : {};
1230
+ const returnedGroupAid = String(group.group_aid ?? resultMap.group_aid ?? '').trim();
1231
+ const certPem = String(aidCert.cert ?? aidCert.cert_pem ?? resultMap.cert ?? resultMap.cert_pem ?? '').trim();
1232
+ if (!returnedGroupAid || !certPem) {
1233
+ throw new ValidationError('group.complete_transfer response missing group.group_aid or aid_cert.cert');
1234
+ }
1235
+ const imported = await store.importGroupIdentity(returnedGroupAid, {
1236
+ private_key_pem: keyPair.private_key_pem,
1237
+ public_key_der_b64: keyPair.public_key_der_b64,
1238
+ curve: keyPair.curve,
1239
+ cert_pem: certPem,
1240
+ });
1241
+ if (!imported.ok) {
1242
+ throw new ValidationError(imported.error.message);
1243
+ }
1244
+ return result;
1245
+ }
995
1246
  static _notifyParamsSizeOk(params) {
996
1247
  return new TextEncoder().encode(JSON.stringify(params)).length <= MAX_NOTIFY_PAYLOAD_SIZE;
997
1248
  }
@@ -1078,6 +1329,8 @@ export class AUNClient {
1078
1329
  }
1079
1330
  async _callRawV2Rpc(method, params) {
1080
1331
  const p = { ...(params ?? {}) };
1332
+ const rpcBackground = Boolean(p._rpc_background) || this._backgroundRpcDepth > 0;
1333
+ delete p._rpc_background;
1081
1334
  delete p._pull_gate_locked;
1082
1335
  delete p._skip_auto_ack;
1083
1336
  delete p.skip_auto_ack;
@@ -1091,7 +1344,7 @@ export class AUNClient {
1091
1344
  if (method.startsWith('group.') && p.slot_id === undefined) {
1092
1345
  p.slot_id = this._slotId;
1093
1346
  }
1094
- return await this._rpcPipeline.rawCall(method, p);
1347
+ return await this._rpcPipeline.rawCall(method, p, { background: rpcBackground });
1095
1348
  }
1096
1349
  // ── 事件 ──────────────────────────────────────────
1097
1350
  /**
@@ -2688,6 +2941,15 @@ export class AUNClient {
2688
2941
  && (!slotId || slotId === (this._slotId ?? ''));
2689
2942
  }
2690
2943
  // ── Pull Gate(序列化同一 key 的并发 pull)──────────────────
2944
+ async _withBackgroundRpc(operation) {
2945
+ this._backgroundRpcDepth += 1;
2946
+ try {
2947
+ return await operation();
2948
+ }
2949
+ finally {
2950
+ this._backgroundRpcDepth = Math.max(0, this._backgroundRpcDepth - 1);
2951
+ }
2952
+ }
2691
2953
  async _runPullSerialized(key, operation) {
2692
2954
  return await this._rpcPipeline.runPullSerialized(key, operation);
2693
2955
  }