@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.
- package/CHANGELOG.md +480 -386
- package/_packed_docs/CHANGELOG.md +480 -386
- package/_packed_docs/INDEX.md +111 -53
- package/_packed_docs/KITE_DOCS_GUIDE.md +43 -29
- package/_packed_docs/agent.md/SCHEMA.md +2 -0
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +2 -0
- package/_packed_docs/agent.md/examples/human-developer.md +2 -0
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +2 -0
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +2 -0
- 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
- package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +265 -686
- package/_packed_docs/collab-gateway-boundary-test-report.md +164 -0
- package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +2 -0
- 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
- 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
- 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
- package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -0
- 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
- 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
- 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
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +2 -0
- package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +2 -0
- 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
- package/_packed_docs/protocol/08-AUN-E2EE-Group.md +2 -0
- package/_packed_docs/protocol/08-AUN-E2EE.md +2 -0
- package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +2 -0
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +28 -85
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +49 -0
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +2 -0
- 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
- 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
- package/_packed_docs/protocol/README.md +2 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +2 -0
- package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +2 -0
- package/_packed_docs/protocol/agent.md/examples/human-developer.md +2 -0
- package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +2 -0
- package/_packed_docs/protocol/aun-docs-guide.md +2 -0
- package/_packed_docs/protocol/index.md +3 -1
- 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
- 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
- package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +2 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +2 -0
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +2 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +2 -0
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +2 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +283 -267
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +4 -1
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
- package/_packed_docs/sdk/09-collab-rpc-manual.md +550 -0
- package/_packed_docs/sdk/09-custody-api-manual.md +2 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +197 -443
- package/_packed_docs/sdk/09-message-rpc-manual.md +2 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -0
- package/_packed_docs/sdk/09-payload-reference.md +2 -0
- package/_packed_docs/sdk/09-proxy-rpc-manual.md +2 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +952 -279
- package/_packed_docs/sdk/09-stream-rpc-manual.md +2 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +33 -20
- 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
- package/_packed_docs/sdk/INDEX.md +46 -29
- package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +2 -0
- package/_packed_docs/sdk/README.md +17 -15
- package/dist/aid-store.d.ts +25 -0
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +89 -8
- package/dist/aid-store.js.map +1 -1
- package/dist/bundle.js +19128 -16784
- package/dist/client/delivery.d.ts +2 -0
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +52 -8
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +1 -0
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +70 -33
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client.d.ts +31 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +282 -20
- package/dist/client.js.map +1 -1
- package/dist/collab/client.d.ts +39 -0
- package/dist/collab/client.d.ts.map +1 -0
- package/dist/collab/client.js +124 -0
- package/dist/collab/client.js.map +1 -0
- package/dist/collab/errors.d.ts +16 -0
- package/dist/collab/errors.d.ts.map +1 -0
- package/dist/collab/errors.js +60 -0
- package/dist/collab/errors.js.map +1 -0
- package/dist/collab/index.d.ts +4 -0
- package/dist/collab/index.d.ts.map +1 -0
- package/dist/collab/index.js +4 -0
- package/dist/collab/index.js.map +1 -0
- package/dist/collab/types.d.ts +111 -0
- package/dist/collab/types.d.ts.map +1 -0
- package/dist/collab/types.js +2 -0
- package/dist/collab/types.js.map +1 -0
- package/dist/crypto.d.ts +6 -0
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +6 -0
- package/dist/crypto.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -1
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +89 -0
- package/dist/facades.d.ts.map +1 -0
- package/dist/facades.js +228 -0
- package/dist/facades.js.map +1 -0
- package/dist/group-fs.d.ts +103 -0
- package/dist/group-fs.d.ts.map +1 -0
- package/dist/group-fs.js +496 -0
- package/dist/group-fs.js.map +1 -0
- package/dist/group-resources.d.ts +98 -0
- package/dist/group-resources.d.ts.map +1 -0
- package/dist/group-resources.js +635 -0
- package/dist/group-resources.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/register-flow.d.ts +1 -0
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +3 -0
- package/dist/register-flow.js.map +1 -1
- package/dist/service-proxy.d.ts +1 -0
- package/dist/service-proxy.d.ts.map +1 -1
- package/dist/service-proxy.js +15 -3
- package/dist/service-proxy.js.map +1 -1
- package/dist/storage/errors.d.ts +28 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +65 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/lowlevel.d.ts +314 -0
- package/dist/storage/lowlevel.d.ts.map +1 -0
- package/dist/storage/lowlevel.js +460 -0
- package/dist/storage/lowlevel.js.map +1 -0
- package/dist/storage/types.d.ts +59 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +113 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/vfs.d.ts +144 -0
- package/dist/storage/vfs.d.ts.map +1 -0
- package/dist/storage/vfs.js +403 -0
- package/dist/storage/vfs.js.map +1 -0
- package/dist/tools/cross-sdk-agent.d.ts +3 -0
- package/dist/tools/cross-sdk-agent.d.ts.map +1 -0
- package/dist/tools/cross-sdk-agent.js +1089 -0
- package/dist/tools/cross-sdk-agent.js.map +1 -0
- package/dist/transport.d.ts +3 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +33 -13
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- 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.
|
|
117
|
-
'group.
|
|
118
|
-
'group.
|
|
119
|
-
'group.
|
|
120
|
-
'
|
|
121
|
-
'
|
|
122
|
-
'
|
|
123
|
-
'
|
|
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.
|
|
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.
|
|
148
|
-
'group.
|
|
149
|
-
'group.
|
|
150
|
-
'group.
|
|
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
|
}
|