@agentunion/fastaun 0.3.6 → 0.4.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 (62) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/345/256/236/346/226/275/350/256/241/345/210/222.md +596 -0
  3. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/350/256/276/350/256/241/346/226/271/346/241/210_v3.md +1697 -0
  4. package/_packed_docs/CHANGELOG.md +31 -0
  5. package/_packed_docs/INDEX.md +17 -11
  6. package/_packed_docs/KITE_DOCS_GUIDE.md +11 -10
  7. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +134 -158
  8. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +11 -7
  9. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +98 -119
  10. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +147 -374
  11. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +153 -153
  12. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +168 -1383
  13. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +71 -91
  14. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +76 -63
  15. package/_packed_docs/sdk/09-custody-api-manual.md +7 -6
  16. package/_packed_docs/sdk/09-meta-rpc-manual.md +13 -14
  17. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +37 -49
  18. package/_packed_docs/sdk/INDEX.md +72 -98
  19. package/_packed_docs/sdk/README.md +85 -266
  20. package/dist/aid-store.d.ts +130 -0
  21. package/dist/aid-store.js +540 -0
  22. package/dist/aid-store.js.map +1 -0
  23. package/dist/aid.d.ts +58 -0
  24. package/dist/aid.js +146 -0
  25. package/dist/aid.js.map +1 -0
  26. package/dist/auth.js +1 -1
  27. package/dist/auth.js.map +1 -1
  28. package/dist/cert-utils.d.ts +29 -0
  29. package/dist/cert-utils.js +142 -0
  30. package/dist/cert-utils.js.map +1 -0
  31. package/dist/client.d.ts +93 -102
  32. package/dist/client.js +703 -293
  33. package/dist/client.js.map +1 -1
  34. package/dist/error-codes.d.ts +25 -0
  35. package/dist/error-codes.js +26 -0
  36. package/dist/error-codes.js.map +1 -0
  37. package/dist/errors.d.ts +4 -1
  38. package/dist/errors.js +4 -1
  39. package/dist/errors.js.map +1 -1
  40. package/dist/index.d.ts +6 -5
  41. package/dist/index.js +5 -4
  42. package/dist/index.js.map +1 -1
  43. package/dist/keystore/aid-db.js +33 -0
  44. package/dist/keystore/aid-db.js.map +1 -1
  45. package/dist/keystore/file.d.ts +17 -0
  46. package/dist/keystore/file.js +195 -1
  47. package/dist/keystore/file.js.map +1 -1
  48. package/dist/keystore/index.d.ts +2 -0
  49. package/dist/result.d.ts +17 -0
  50. package/dist/result.js +10 -0
  51. package/dist/result.js.map +1 -0
  52. package/dist/tools/cross-sdk-agent.js +27 -22
  53. package/dist/tools/cross-sdk-agent.js.map +1 -1
  54. package/dist/types.d.ts +14 -0
  55. package/dist/types.js +30 -0
  56. package/dist/types.js.map +1 -1
  57. package/dist/v2/e2ee/encrypt-p2p.js +1 -1
  58. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
  59. package/dist/version.d.ts +1 -0
  60. package/dist/version.js +5 -0
  61. package/dist/version.js.map +1 -0
  62. package/package.json +1 -1
package/dist/client.d.ts CHANGED
@@ -10,18 +10,38 @@
10
10
  * - 客户端签名(关键操作)
11
11
  * - 群组 E2EE 全自动编排(建群/加人/踢人/退出)
12
12
  */
13
- import type { ProtectedHeadersInput } from './protected-headers.js';
14
13
  import { type Subscription, type EventHandler } from './events.js';
15
- import { AuthNamespace } from './namespaces/auth.js';
16
- import { CustodyNamespace } from './namespaces/custody.js';
17
- import { MetaNamespace } from './namespaces/meta.js';
18
- import { type JsonValue, type RpcParams, type RpcResult } from './types.js';
14
+ import { type JsonValue, type RpcParams, type RpcResult, ConnectionState } from './types.js';
15
+ import { AID } from './aid.js';
19
16
  /**
20
17
  * 递归排序键的 JSON 序列化(Canonical JSON for AUN)
21
18
  * 等价于 Python json.dumps(sort_keys=True, separators=(",",":"), ensure_ascii=False)
22
19
  * 非 ASCII 字符直接以 UTF-8 输出,与 AAD 序列化规则一致。
23
20
  */
24
21
  export declare function stableStringify(obj: JsonValue | object | undefined): string;
22
+ export interface ConnectionOptions {
23
+ auto_reconnect?: boolean;
24
+ connect_timeout?: number;
25
+ retry_initial_delay?: number;
26
+ retry_max_delay?: number;
27
+ retry_max_attempts?: number;
28
+ heartbeat_interval?: number;
29
+ call_timeout?: number;
30
+ }
31
+ export interface AUNClientOptions extends Record<string, unknown> {
32
+ root_ca_path?: string;
33
+ rootCaPath?: string;
34
+ verify_ssl?: boolean;
35
+ verifySSL?: boolean;
36
+ verifySsl?: boolean;
37
+ require_forward_secrecy?: boolean;
38
+ requireForwardSecrecy?: boolean;
39
+ replay_window_seconds?: number;
40
+ replayWindowSeconds?: number;
41
+ debug?: boolean;
42
+ protected_headers?: Record<string, unknown> | null;
43
+ aid?: never;
44
+ }
25
45
  export declare class AUNClient {
26
46
  /** 原始配置 */
27
47
  readonly config: RpcParams;
@@ -33,6 +53,16 @@ export declare class AUNClient {
33
53
  private _identity;
34
54
  /** 连接状态 */
35
55
  private _state;
56
+ /** 当前 AID 值对象(新 API) */
57
+ private _currentAid;
58
+ /** 实例级 protected_headers */
59
+ private _instanceProtectedHeaders;
60
+ /** 重连退避时间戳(ms) */
61
+ private _nextRetryAt;
62
+ private _retryAttempt;
63
+ private _retryMaxAttempts;
64
+ private _lastError;
65
+ private _lastErrorCode;
36
66
  /** Gateway URL */
37
67
  private _gatewayUrl;
38
68
  /** 是否正在关闭 */
@@ -47,12 +77,6 @@ export declare class AUNClient {
47
77
  private _auth;
48
78
  /** 密钥存储 */
49
79
  private _keystore;
50
- /** Auth 命名空间 */
51
- readonly auth: AuthNamespace;
52
- /** AID 托管命名空间 */
53
- readonly custody: CustodyNamespace;
54
- /** Meta 命名空间(心跳、状态、信任根管理) */
55
- readonly meta: MetaNamespace;
56
80
  /** 会话参数(重连用) */
57
81
  private _sessionParams;
58
82
  /** 会话选项 */
@@ -71,6 +95,9 @@ export declare class AUNClient {
71
95
  private _remoteAgentMdEtag;
72
96
  private _agentMdCache;
73
97
  private _agentMdFetchInflight;
98
+ private _agentMdDownloadInflight;
99
+ private _agentMdDownloadActive;
100
+ private _agentMdDownloadWaiters;
74
101
  /** 消息序列号跟踪器(群消息 + P2P 空洞检测) */
75
102
  private _seqTracker;
76
103
  private _seqTrackerContext;
@@ -115,8 +142,11 @@ export declare class AUNClient {
115
142
  private static readonly V2_BOOTSTRAP_TTL_MS;
116
143
  private static readonly V2_RETRYABLE_CODES;
117
144
  private static readonly PULL_GATE_STALE_MS;
145
+ /** 对端 AID 缓存(aid string → AID 对象) */
146
+ private _peerCache;
118
147
  private static readonly V2_SIG_CACHE_TTL_MS;
119
148
  private static readonly V2_SIG_CACHE_MAX;
149
+ private static readonly AGENT_MD_DOWNLOAD_CONCURRENCY;
120
150
  private _reconnectActive;
121
151
  private _reconnectAbort;
122
152
  private _serverKicked;
@@ -124,43 +154,51 @@ export declare class AUNClient {
124
154
  private _lastDisconnectInfo;
125
155
  private _logger;
126
156
  private _clientLog;
127
- constructor(config?: RpcParams, debug?: boolean);
157
+ constructor(aid?: AID);
128
158
  /** 当前 AID */
129
159
  get aid(): string | null;
160
+ /** 当前 AID 值对象 */
161
+ get currentAid(): AID | null;
162
+ get hasIdentity(): boolean;
163
+ get canSign(): boolean;
164
+ get canConnect(): boolean;
165
+ get canSend(): boolean;
166
+ get isReady(): boolean;
167
+ get isOnline(): boolean;
168
+ get isClosed(): boolean;
169
+ get aunPath(): string | null;
170
+ get nextRetryAt(): Date | null;
171
+ get nextRetryInSeconds(): number | null;
172
+ get retryAttempt(): number;
173
+ get retryMaxAttempts(): number;
174
+ get lastError(): Error | null;
175
+ get lastErrorCode(): string | null;
176
+ loadIdentity(aid: AID): void;
177
+ setProtectedHeaders(headers: Record<string, unknown> | null): void;
178
+ getProtectedHeaders(): Record<string, string> | null;
179
+ cachePeer(aid: AID): AID;
180
+ getPeer(aid: string): AID | null;
181
+ lookupPeer(aid: string): Promise<AID>;
182
+ peers(): AID[];
183
+ private _resolveAgentMdUrl;
184
+ private _ensureAgentMdUploadToken;
185
+ private _uploadAgentMd;
186
+ private _acquireAgentMdDownloadSlot;
187
+ private _releaseAgentMdDownloadSlot;
188
+ private _downloadAgentMd;
189
+ private _downloadAgentMdOnce;
190
+ private _headAgentMd;
191
+ private _verifyAgentMd;
130
192
  /**
131
193
  * 读取 {agentMdPath}/{self_aid}/agent.md,签名后上传,并把签名结果原子写回本地。
132
194
  */
133
195
  publishAgentMd(): Promise<Record<string, unknown>>;
134
- /**
135
- * 下载 agent.md 并自动验签;内容固定保存到 {agentMdPath}/{aid}/agent.md。
136
- */
137
- fetchAgentMd(aid?: string | null): Promise<{
138
- aid: string;
139
- content: string;
140
- signature: Record<string, unknown>;
141
- in_sync: boolean | null;
142
- saved_to: string | null;
143
- save_error: string | null;
144
- }>;
145
196
  private _startAgentMdFetchTask;
146
197
  private _fetchAgentMdOnce;
147
198
  /**
148
199
  * 设置 agent.md 本地存储根目录;为空时恢复默认 {aun_path}/AIDs。
149
200
  */
150
- setAgentMdPath(root?: string | null): string;
151
- SetAgentMDPath(root?: string | null): string;
152
- /**
153
- * 记录本地 agent.md 文件路径并一次性计算 etag(quoted sha256,与服务端一致)。
154
- *
155
- * - path 为空字符串:清除本地 path 与 etag。
156
- * - 文件不存在 / 读取失败:清除 etag 并返回空串,不抛异常(应用可读 getLocalAgentMdEtag()
157
- * 为空判断)。
158
- * - 浏览器环境无文件系统:直接返回空串,记录 warn 日志。
159
- * - 文件变更后需要重新调用 setLocalAgentMdPath() 触发重算(按设计:设置时一次性计算)。
160
- *
161
- * 返回当前 etag(quoted hex 或空串)。
162
- */
163
- setLocalAgentMdPath(path: string): string;
201
+ private _setAgentMdRoot;
164
202
  /** 返回 setLocalAgentMdPath 计算的 etag;未设置或读取失败时返回空串。 */
165
203
  getLocalAgentMdEtag(): string;
166
204
  /**
@@ -193,22 +231,18 @@ export declare class AUNClient {
193
231
  private _observeAgentMdMeta;
194
232
  private _observeAgentMdEtag;
195
233
  private _observeAgentMdFromEnvelope;
196
- checkAgentMd(aid?: string | null, maxUnsyncedDays?: number): Promise<Record<string, unknown>>;
234
+ private _checkAgentMdCache;
197
235
  /** transport 的 meta observer:吸收 gateway 注入的 _meta 字段。失败不影响业务。 */
198
236
  private _observeRpcMeta;
199
237
  /** 连接状态 */
200
- get state(): string;
238
+ get state(): ConnectionState;
239
+ private _publicState;
201
240
  /** 最近一次 gateway health check 结果,null 表示尚未检查 */
202
241
  get gatewayHealth(): boolean | null;
203
- /** gatewayUrl 的 /health 端点发送 GET 请求,检查网关可用性 */
204
- checkGatewayHealth(gatewayUrl: string, timeout?: number): Promise<boolean>;
205
- /**
206
- * 连接到 Gateway。
207
- *
208
- * @param auth - 认证参数(必须包含 access_token 和 gateway)
209
- * @param options - 会话选项(auto_reconnect、heartbeat_interval 等)
210
- */
211
- connect(auth: RpcParams, options?: RpcParams): Promise<void>;
242
+ /** 仅认证当前身份,获取/刷新 token,但不建立长连接。 */
243
+ authenticate(options?: RpcParams): Promise<Record<string, unknown>>;
244
+ /** 连接到 Gateway;身份来自构造函数或 loadIdentity(aid),认证由 SDK 内部自动完成。 */
245
+ connect(opts?: ConnectionOptions): Promise<void>;
212
246
  /** 关闭连接 */
213
247
  close(): Promise<void>;
214
248
  /**
@@ -216,38 +250,11 @@ export declare class AUNClient {
216
250
  * disconnect 是可恢复的:停止心跳、关闭 WebSocket,但不清理 keystore 等状态。
217
251
  */
218
252
  disconnect(): Promise<void>;
219
- /**
220
- * 列出本地身份摘要。
221
- *
222
- * @param opts.all=false(默认):仅返回严格校验通过的可用身份——
223
- * keypair 完整 + cert 公钥 == keypair 公钥 + cert 时间窗口有效
224
- * @param opts.all=true:返回所有 AIDs/ 子目录(不含 _pending/);
225
- * 每项含 valid=bool 和 reason=string 字段
226
- */
227
- listIdentities(opts?: {
228
- all?: boolean;
229
- }): Array<{
230
- aid: string;
231
- valid: boolean;
232
- reason?: string;
233
- metadata?: Record<string, unknown>;
234
- }>;
235
- /**
236
- * 严格校验本地身份的可用性。返回 {valid, reason}。
237
- * 4 项校验:keypair 完整 + cert 存在 + cert 公钥 == keypair 公钥 + cert 时间窗口有效。
238
- */
239
- private _validateLocalIdentity;
240
253
  /**
241
254
  * 发送 JSON-RPC 调用。
242
255
  * 自动处理内部方法限制、E2EE 加解密、客户端签名等。
243
256
  */
244
257
  call(method: string, params?: RpcParams): Promise<RpcResult>;
245
- /** 心跳检测 */
246
- ping(params?: RpcParams): Promise<RpcResult>;
247
- /** 获取服务端状态 */
248
- status(params?: RpcParams): Promise<RpcResult>;
249
- /** 获取信任根证书列表 */
250
- trustRoots(params?: RpcParams): Promise<RpcResult>;
251
258
  /** 订阅事件 */
252
259
  on(event: string, handler: EventHandler): Subscription;
253
260
  private _callRawV2Rpc;
@@ -383,7 +390,7 @@ export declare class AUNClient {
383
390
  * 初始化 V2 session:IK 使用 AID 长期私钥,SPK 存储在 per-AID SQLite 的 v2_device_keys 表。
384
391
  * connect 成功后会自动调用;重复调用幂等。
385
392
  */
386
- initV2Session(): Promise<void>;
393
+ private _initV2Session;
387
394
  private _v2TrustedIKPubDer;
388
395
  private _v2SPKTimestampText;
389
396
  private _v2VerifySPKDevice;
@@ -400,38 +407,20 @@ export declare class AUNClient {
400
407
  */
401
408
  private _buildV2P2PEnvelope;
402
409
  /** V2 P2P 加密发送,推测性缓存失败后刷新 bootstrap 重试一次。 */
403
- sendV2(to: string, payload: Record<string, unknown>, opts?: {
404
- messageId?: string;
405
- timestamp?: number;
406
- protectedHeaders?: ProtectedHeadersInput;
407
- context?: Record<string, unknown>;
408
- }): Promise<unknown>;
410
+ private _sendV2;
409
411
  /** V2 P2P 拉取并解密;直接方法返回消息数组,call("message.pull") 会包装为 {messages}. */
410
- pullV2(afterSeq?: number, limit?: number, opts?: {
411
- skipAutoAck?: boolean;
412
- gateLocked?: boolean;
413
- scheduleFollowup?: boolean;
414
- force?: boolean;
415
- }): Promise<Array<Record<string, unknown>>>;
412
+ private _pullV2;
416
413
  /** V2 P2P ack,并触发旧 SPK 销毁自检。 */
417
- ackV2(upToSeq?: number): Promise<unknown>;
414
+ private _ackV2;
418
415
  /** V2 Group 加密发送,推测性缓存失败后刷新 bootstrap 重试一次。 */
419
- sendGroupV2(groupId: string, payload: Record<string, unknown>, opts?: {
420
- messageId?: string;
421
- timestamp?: number;
422
- protectedHeaders?: ProtectedHeadersInput;
423
- context?: Record<string, unknown>;
424
- }): Promise<unknown>;
416
+ private _sendGroupV2;
425
417
  /** 构造 V2 Group envelope;group.send 与 group.thought.put 共用。 */
426
418
  private _buildV2GroupEnvelope;
427
419
  private _pullGroupV2Internal;
428
420
  /** V2 Group 拉取并解密;直接方法返回消息数组,call("group.pull") 会包装为 {messages}. */
429
- pullGroupV2(groupId: string, afterSeq?: number, limit?: number, opts?: {
430
- gateLocked?: boolean;
431
- scheduleFollowup?: boolean;
432
- }): Promise<Array<Record<string, unknown>>>;
421
+ private _pullGroupV2;
433
422
  /** V2 Group ack。 */
434
- ackGroupV2(groupId: string, upToSeq?: number): Promise<unknown>;
423
+ private _ackGroupV2;
435
424
  /** 解密单条 V2 pull 消息。缺 sender IK 时先入 pending,后台补齐后重试。 */
436
425
  private _decryptV2Message;
437
426
  private _v2E2eeMeta;
@@ -472,6 +461,8 @@ export declare class AUNClient {
472
461
  /** Push 通知带 payload 时的就地解密(复用 _decryptV2Message) */
473
462
  private _decryptV2PushMessage;
474
463
  private _onV2EpochRotated;
464
+ /** 按当前 AID 发现 Gateway;用于 authenticate()/connect() 的新入口。 */
465
+ private _resolveGatewayForAid;
475
466
  /** 从参数中解析 Gateway URL */
476
467
  private _resolveGateway;
477
468
  /** 从参数中解析所有 Gateway URL(支持 string 或 string[]) */
@@ -523,11 +514,11 @@ export declare class AUNClient {
523
514
  * 创建命名群:本地生成 P-256 keypair,调用 group.create 传入 public_key,
524
515
  * 服务端签发群 AID 证书,返回后将证书和私钥存入 keystore。
525
516
  */
526
- createNamedGroup(groupName: string, opts?: Record<string, unknown>): Promise<Record<string, unknown>>;
517
+ private createNamedGroup;
527
518
  /**
528
519
  * 为已有普通群绑定命名 AID(升级为命名群)。
529
520
  */
530
- bindGroupAid(groupId: string, groupName: string): Promise<Record<string, unknown>>;
521
+ private bindGroupAid;
531
522
  /** 判断是否应重试重连 */
532
523
  private static _shouldRetryReconnect;
533
524
  }