@agentunion/fastaun 0.3.5 → 0.4.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 (71) hide show
  1. package/CHANGELOG.md +18 -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 +1633 -0
  4. package/_packed_docs/CHANGELOG.md +18 -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 +163 -1364
  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/09-storage-rpc-manual.md +89 -0
  18. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +37 -49
  19. package/_packed_docs/sdk/INDEX.md +72 -98
  20. package/_packed_docs/sdk/README.md +85 -266
  21. package/dist/aid-store.d.ts +66 -0
  22. package/dist/aid-store.js +539 -0
  23. package/dist/aid-store.js.map +1 -0
  24. package/dist/aid.d.ts +52 -0
  25. package/dist/aid.js +140 -0
  26. package/dist/aid.js.map +1 -0
  27. package/dist/auth.d.ts +18 -1
  28. package/dist/auth.js +28 -9
  29. package/dist/auth.js.map +1 -1
  30. package/dist/cert-utils.d.ts +29 -0
  31. package/dist/cert-utils.js +142 -0
  32. package/dist/cert-utils.js.map +1 -0
  33. package/dist/client.d.ts +102 -89
  34. package/dist/client.js +871 -253
  35. package/dist/client.js.map +1 -1
  36. package/dist/error-codes.d.ts +25 -0
  37. package/dist/error-codes.js +26 -0
  38. package/dist/error-codes.js.map +1 -0
  39. package/dist/errors.d.ts +4 -1
  40. package/dist/errors.js +4 -1
  41. package/dist/errors.js.map +1 -1
  42. package/dist/index.d.ts +6 -5
  43. package/dist/index.js +5 -4
  44. package/dist/index.js.map +1 -1
  45. package/dist/keystore/aid-db.js +33 -0
  46. package/dist/keystore/aid-db.js.map +1 -1
  47. package/dist/keystore/file.d.ts +17 -0
  48. package/dist/keystore/file.js +194 -0
  49. package/dist/keystore/file.js.map +1 -1
  50. package/dist/keystore/index.d.ts +2 -0
  51. package/dist/namespaces/auth.js +2 -0
  52. package/dist/namespaces/auth.js.map +1 -1
  53. package/dist/result.d.ts +17 -0
  54. package/dist/result.js +10 -0
  55. package/dist/result.js.map +1 -0
  56. package/dist/secret-store/file-store.d.ts +5 -0
  57. package/dist/secret-store/file-store.js +32 -13
  58. package/dist/secret-store/file-store.js.map +1 -1
  59. package/dist/tools/cross-sdk-agent.js +24 -12
  60. package/dist/tools/cross-sdk-agent.js.map +1 -1
  61. package/dist/transport.js +1 -1
  62. package/dist/transport.js.map +1 -1
  63. package/dist/types.d.ts +14 -0
  64. package/dist/types.js +30 -0
  65. package/dist/types.js.map +1 -1
  66. package/dist/v2/e2ee/encrypt-p2p.js +1 -1
  67. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
  68. package/dist/version.d.ts +1 -0
  69. package/dist/version.js +5 -0
  70. package/dist/version.js.map +1 -0
  71. package/package.json +1 -1
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 证书与签名工具函数 — 对齐 Python SDK _cert_utils.py
3
+ * 从 namespaces/auth.ts 提取的纯函数,供 AID/AIDStore 使用。
4
+ */
5
+ import { certificateSha256Fingerprint } from './crypto.js';
6
+ /** 解析 agent.md 尾部签名块 */
7
+ export declare function parseAgentMdTailSignature(content: string): {
8
+ payload: string;
9
+ fields: Record<string, string> | null;
10
+ parseError?: string;
11
+ };
12
+ /** 从 agent.md frontmatter 提取 aid 字段 */
13
+ export declare function extractAgentMdAid(payload: string): string;
14
+ /** 规范化 agent.md payload(去除签名块,确保末尾换行) */
15
+ export declare function normalizeAgentMdPayload(content: string): string;
16
+ /** 构造 agent.md 签名块 */
17
+ export declare function buildAgentMdSignatureBlock(certFingerprint: string, timestamp: number, signatureB64: string): string;
18
+ /** 使用私钥签名(ECDSA P-256 SHA-256,DER 编码输出) */
19
+ export declare function signBytes(privateKeyPem: string, payload: Buffer): Buffer;
20
+ /** 使用证书公钥验签 */
21
+ export declare function verifySignatureWithCert(certPem: string, signature: Buffer, data: Buffer): boolean;
22
+ /** 获取证书 Subject CN */
23
+ export declare function certCommonName(certPem: string, issuer?: boolean): string;
24
+ /** 检查证书有效期,返回 '' | 'expired' | 'not_yet_valid' */
25
+ export declare function certTimeError(certPem: string): '' | 'expired' | 'not_yet_valid';
26
+ /** 获取证书公钥 DER base64 */
27
+ export declare function publicKeyDerB64(certPem: string): string;
28
+ /** 证书 SHA-256 指纹(复用 crypto.ts 的实现) */
29
+ export { certificateSha256Fingerprint as certFingerprint };
@@ -0,0 +1,142 @@
1
+ /**
2
+ * 证书与签名工具函数 — 对齐 Python SDK _cert_utils.py
3
+ * 从 namespaces/auth.ts 提取的纯函数,供 AID/AIDStore 使用。
4
+ */
5
+ import { createSign, createVerify, X509Certificate } from 'node:crypto';
6
+ import { certificateSha256Fingerprint } from './crypto.js';
7
+ const AGENT_MD_SIGNATURE_MARKER = '<!-- AUN-SIGNATURE';
8
+ const AGENT_MD_SIGNATURE_RE = /^<!-- AUN-SIGNATURE\r?\n(?<body>[\s\S]*?)\r?\n-->\s*$/;
9
+ const AGENT_MD_FINGERPRINT_RE = /^sha256:[0-9a-f]{64}$/;
10
+ /** 解析 agent.md 尾部签名块 */
11
+ export function parseAgentMdTailSignature(content) {
12
+ const idx = content.lastIndexOf(AGENT_MD_SIGNATURE_MARKER);
13
+ if (idx < 0)
14
+ return { payload: content, fields: null };
15
+ if (idx > 0 && content[idx - 1] !== '\n' && content[idx - 1] !== '\r') {
16
+ return { payload: content, fields: null };
17
+ }
18
+ const tail = content.slice(idx);
19
+ const match = tail.match(AGENT_MD_SIGNATURE_RE);
20
+ if (!match) {
21
+ return { payload: content.slice(0, idx), fields: null, parseError: 'malformed signature block' };
22
+ }
23
+ const fields = {};
24
+ for (const rawLine of match.groups?.body?.split(/\r?\n/) ?? []) {
25
+ const line = rawLine.trim();
26
+ if (!line)
27
+ continue;
28
+ const colon = line.indexOf(':');
29
+ if (colon < 0) {
30
+ return { payload: content.slice(0, idx), fields: null, parseError: `malformed signature field: ${line}` };
31
+ }
32
+ fields[line.slice(0, colon).trim().toLowerCase()] = line.slice(colon + 1).trim();
33
+ }
34
+ for (const req of ['cert_fingerprint', 'timestamp', 'signature']) {
35
+ if (!fields[req]) {
36
+ return { payload: content.slice(0, idx), fields: null, parseError: `signature block missing ${req}` };
37
+ }
38
+ }
39
+ if (!AGENT_MD_FINGERPRINT_RE.test(fields.cert_fingerprint.toLowerCase())) {
40
+ return { payload: content.slice(0, idx), fields: null, parseError: 'invalid cert_fingerprint' };
41
+ }
42
+ if (!Number.isFinite(Number(fields.timestamp))) {
43
+ return { payload: content.slice(0, idx), fields: null, parseError: 'invalid timestamp' };
44
+ }
45
+ return { payload: content.slice(0, idx), fields };
46
+ }
47
+ /** 从 agent.md frontmatter 提取 aid 字段 */
48
+ export function extractAgentMdAid(payload) {
49
+ const lines = payload.replace(/^/, '').split(/\r?\n/);
50
+ if (!lines.length || lines[0].trim() !== '---')
51
+ return '';
52
+ for (const line of lines.slice(1)) {
53
+ const t = line.trim();
54
+ if (t === '---')
55
+ break;
56
+ if (t.startsWith('aid:')) {
57
+ let v = t.slice(4).trim();
58
+ if (v.length >= 2 && v[0] === v[v.length - 1] && (v[0] === '"' || v[0] === "'")) {
59
+ v = v.slice(1, -1);
60
+ }
61
+ return v.trim();
62
+ }
63
+ }
64
+ return '';
65
+ }
66
+ /** 规范化 agent.md payload(去除签名块,确保末尾换行) */
67
+ export function normalizeAgentMdPayload(content) {
68
+ let payload = parseAgentMdTailSignature(String(content ?? '')).payload;
69
+ if (payload && !payload.endsWith('\n') && !payload.endsWith('\r'))
70
+ payload += '\n';
71
+ return payload;
72
+ }
73
+ /** 构造 agent.md 签名块 */
74
+ export function buildAgentMdSignatureBlock(certFingerprint, timestamp, signatureB64) {
75
+ return [
76
+ '<!-- AUN-SIGNATURE',
77
+ `cert_fingerprint: ${certFingerprint}`,
78
+ `timestamp: ${Math.trunc(timestamp)}`,
79
+ `signature: ${signatureB64}`,
80
+ '-->',
81
+ ].join('\n');
82
+ }
83
+ /** 使用私钥签名(ECDSA P-256 SHA-256,DER 编码输出) */
84
+ export function signBytes(privateKeyPem, payload) {
85
+ const signer = createSign('SHA256');
86
+ signer.update(payload);
87
+ signer.end();
88
+ return signer.sign(privateKeyPem);
89
+ }
90
+ /** 使用证书公钥验签 */
91
+ export function verifySignatureWithCert(certPem, signature, data) {
92
+ try {
93
+ const cert = new X509Certificate(certPem);
94
+ const verifier = createVerify('SHA256');
95
+ verifier.update(data);
96
+ verifier.end();
97
+ return verifier.verify(cert.publicKey, signature);
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ /** 获取证书 Subject CN */
104
+ export function certCommonName(certPem, issuer = false) {
105
+ try {
106
+ const cert = new X509Certificate(certPem);
107
+ const dn = issuer ? cert.issuer : cert.subject;
108
+ const match = dn.match(/(?:^|,\s*)CN=([^,\n]+)/);
109
+ return match?.[1]?.trim() ?? '';
110
+ }
111
+ catch {
112
+ return '';
113
+ }
114
+ }
115
+ /** 检查证书有效期,返回 '' | 'expired' | 'not_yet_valid' */
116
+ export function certTimeError(certPem) {
117
+ try {
118
+ const cert = new X509Certificate(certPem);
119
+ const now = Date.now();
120
+ if (now < new Date(cert.validFrom).getTime())
121
+ return 'not_yet_valid';
122
+ if (now > new Date(cert.validTo).getTime())
123
+ return 'expired';
124
+ return '';
125
+ }
126
+ catch {
127
+ return 'expired';
128
+ }
129
+ }
130
+ /** 获取证书公钥 DER base64 */
131
+ export function publicKeyDerB64(certPem) {
132
+ try {
133
+ const cert = new X509Certificate(certPem);
134
+ return cert.publicKey.export({ type: 'spki', format: 'der' }).toString('base64');
135
+ }
136
+ catch {
137
+ return '';
138
+ }
139
+ }
140
+ /** 证书 SHA-256 指纹(复用 crypto.ts 的实现) */
141
+ export { certificateSha256Fingerprint as certFingerprint };
142
+ //# sourceMappingURL=cert-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-utils.js","sourceRoot":"","sources":["../src/cert-utils.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -10,18 +10,37 @@
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 AUNClientOptions extends Record<string, unknown> {
23
+ aun_path?: string;
24
+ aunPath?: string;
25
+ root_ca_path?: string;
26
+ rootCaPath?: string;
27
+ seed_password?: string;
28
+ seedPassword?: string;
29
+ encryption_seed?: string;
30
+ encryptionSeed?: string;
31
+ discovery_port?: number;
32
+ discoveryPort?: number;
33
+ verify_ssl?: boolean;
34
+ verifySSL?: boolean;
35
+ verifySsl?: boolean;
36
+ require_forward_secrecy?: boolean;
37
+ requireForwardSecrecy?: boolean;
38
+ replay_window_seconds?: number;
39
+ replayWindowSeconds?: number;
40
+ debug?: boolean;
41
+ protected_headers?: Record<string, unknown> | null;
42
+ aid?: never;
43
+ }
25
44
  export declare class AUNClient {
26
45
  /** 原始配置 */
27
46
  readonly config: RpcParams;
@@ -33,6 +52,16 @@ export declare class AUNClient {
33
52
  private _identity;
34
53
  /** 连接状态 */
35
54
  private _state;
55
+ /** 当前 AID 值对象(新 API) */
56
+ private _currentAid;
57
+ /** 实例级 protected_headers */
58
+ private _instanceProtectedHeaders;
59
+ /** 重连退避时间戳(ms) */
60
+ private _nextRetryAt;
61
+ private _retryAttempt;
62
+ private _retryMaxAttempts;
63
+ private _lastError;
64
+ private _lastErrorCode;
36
65
  /** Gateway URL */
37
66
  private _gatewayUrl;
38
67
  /** 是否正在关闭 */
@@ -47,12 +76,6 @@ export declare class AUNClient {
47
76
  private _auth;
48
77
  /** 密钥存储 */
49
78
  private _keystore;
50
- /** Auth 命名空间 */
51
- readonly auth: AuthNamespace;
52
- /** AID 托管命名空间 */
53
- readonly custody: CustodyNamespace;
54
- /** Meta 命名空间(心跳、状态、信任根管理) */
55
- readonly meta: MetaNamespace;
56
79
  /** 会话参数(重连用) */
57
80
  private _sessionParams;
58
81
  /** 会话选项 */
@@ -71,6 +94,9 @@ export declare class AUNClient {
71
94
  private _remoteAgentMdEtag;
72
95
  private _agentMdCache;
73
96
  private _agentMdFetchInflight;
97
+ private _agentMdDownloadInflight;
98
+ private _agentMdDownloadActive;
99
+ private _agentMdDownloadWaiters;
74
100
  /** 消息序列号跟踪器(群消息 + P2P 空洞检测) */
75
101
  private _seqTracker;
76
102
  private _seqTrackerContext;
@@ -115,8 +141,11 @@ export declare class AUNClient {
115
141
  private static readonly V2_BOOTSTRAP_TTL_MS;
116
142
  private static readonly V2_RETRYABLE_CODES;
117
143
  private static readonly PULL_GATE_STALE_MS;
144
+ /** 对端 AID 缓存(aid string → AID 对象) */
145
+ private _peerCache;
118
146
  private static readonly V2_SIG_CACHE_TTL_MS;
119
147
  private static readonly V2_SIG_CACHE_MAX;
148
+ private static readonly AGENT_MD_DOWNLOAD_CONCURRENCY;
120
149
  private _reconnectActive;
121
150
  private _reconnectAbort;
122
151
  private _serverKicked;
@@ -124,31 +153,52 @@ export declare class AUNClient {
124
153
  private _lastDisconnectInfo;
125
154
  private _logger;
126
155
  private _clientLog;
127
- constructor(config?: RpcParams, debug?: boolean);
156
+ constructor(options?: AUNClientOptions | null);
157
+ constructor(aid: AID, options?: AUNClientOptions | null);
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;
201
+ private _setAgentMdRoot;
152
202
  /**
153
203
  * 记录本地 agent.md 文件路径并一次性计算 etag(quoted sha256,与服务端一致)。
154
204
  *
@@ -193,22 +243,18 @@ export declare class AUNClient {
193
243
  private _observeAgentMdMeta;
194
244
  private _observeAgentMdEtag;
195
245
  private _observeAgentMdFromEnvelope;
196
- checkAgentMd(aid?: string | null, maxUnsyncedDays?: number): Promise<Record<string, unknown>>;
246
+ private _checkAgentMdCache;
197
247
  /** transport 的 meta observer:吸收 gateway 注入的 _meta 字段。失败不影响业务。 */
198
248
  private _observeRpcMeta;
199
249
  /** 连接状态 */
200
- get state(): string;
250
+ get state(): ConnectionState;
251
+ private _publicState;
201
252
  /** 最近一次 gateway health check 结果,null 表示尚未检查 */
202
253
  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>;
254
+ /** 仅认证当前身份,获取/刷新 token,但不建立长连接。 */
255
+ authenticate(options?: RpcParams): Promise<Record<string, unknown>>;
256
+ /** 连接到 Gateway;身份来自构造函数或 loadIdentity(aid),认证由 SDK 内部自动完成。 */
257
+ connect(options?: RpcParams): Promise<void>;
212
258
  /** 关闭连接 */
213
259
  close(): Promise<void>;
214
260
  /**
@@ -216,38 +262,11 @@ export declare class AUNClient {
216
262
  * disconnect 是可恢复的:停止心跳、关闭 WebSocket,但不清理 keystore 等状态。
217
263
  */
218
264
  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
265
  /**
241
266
  * 发送 JSON-RPC 调用。
242
267
  * 自动处理内部方法限制、E2EE 加解密、客户端签名等。
243
268
  */
244
269
  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
270
  /** 订阅事件 */
252
271
  on(event: string, handler: EventHandler): Subscription;
253
272
  private _callRawV2Rpc;
@@ -383,7 +402,7 @@ export declare class AUNClient {
383
402
  * 初始化 V2 session:IK 使用 AID 长期私钥,SPK 存储在 per-AID SQLite 的 v2_device_keys 表。
384
403
  * connect 成功后会自动调用;重复调用幂等。
385
404
  */
386
- initV2Session(): Promise<void>;
405
+ private _initV2Session;
387
406
  private _v2TrustedIKPubDer;
388
407
  private _v2SPKTimestampText;
389
408
  private _v2VerifySPKDevice;
@@ -400,43 +419,35 @@ export declare class AUNClient {
400
419
  */
401
420
  private _buildV2P2PEnvelope;
402
421
  /** 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>;
422
+ private _sendV2;
409
423
  /** V2 P2P 拉取并解密;直接方法返回消息数组,call("message.pull") 会包装为 {messages}. */
410
- pullV2(afterSeq?: number, limit?: number, opts?: {
411
- skipAutoAck?: boolean;
412
- gateLocked?: boolean;
413
- scheduleFollowup?: boolean;
414
- }): Promise<Array<Record<string, unknown>>>;
424
+ private _pullV2;
415
425
  /** V2 P2P ack,并触发旧 SPK 销毁自检。 */
416
- ackV2(upToSeq?: number): Promise<unknown>;
426
+ private _ackV2;
417
427
  /** V2 Group 加密发送,推测性缓存失败后刷新 bootstrap 重试一次。 */
418
- sendGroupV2(groupId: string, payload: Record<string, unknown>, opts?: {
419
- messageId?: string;
420
- timestamp?: number;
421
- protectedHeaders?: ProtectedHeadersInput;
422
- context?: Record<string, unknown>;
423
- }): Promise<unknown>;
428
+ private _sendGroupV2;
424
429
  /** 构造 V2 Group envelope;group.send 与 group.thought.put 共用。 */
425
430
  private _buildV2GroupEnvelope;
426
431
  private _pullGroupV2Internal;
427
432
  /** V2 Group 拉取并解密;直接方法返回消息数组,call("group.pull") 会包装为 {messages}. */
428
- pullGroupV2(groupId: string, afterSeq?: number, limit?: number, opts?: {
429
- gateLocked?: boolean;
430
- scheduleFollowup?: boolean;
431
- }): Promise<Array<Record<string, unknown>>>;
433
+ private _pullGroupV2;
432
434
  /** V2 Group ack。 */
433
- ackGroupV2(groupId: string, upToSeq?: number): Promise<unknown>;
435
+ private _ackGroupV2;
434
436
  /** 解密单条 V2 pull 消息。缺 sender IK 时先入 pending,后台补齐后重试。 */
435
437
  private _decryptV2Message;
436
438
  private _v2E2eeMeta;
437
439
  private _attachV2EnvelopeMetadata;
438
440
  private _attachV2EnvelopeMetadataFromSource;
439
441
  private _extractV2EnvelopeFromSource;
442
+ private _truthyBool;
443
+ private _encryptedPushEnvelope;
444
+ private _isEncryptedPushMessage;
445
+ private _isEncryptedEnvelopePayload;
446
+ private _isV2EncryptedEnvelopePayload;
447
+ private _safeUndecryptablePushEvent;
448
+ private _decryptEncryptedPushPayload;
449
+ private _publishEncryptedPushAsUndecryptable;
450
+ private _publishEncryptedPushMessage;
440
451
  private _metadataWithoutAuth;
441
452
  private _putMessageThoughtEncryptedV2;
442
453
  private _putGroupThoughtEncryptedV2;
@@ -462,6 +473,8 @@ export declare class AUNClient {
462
473
  /** Push 通知带 payload 时的就地解密(复用 _decryptV2Message) */
463
474
  private _decryptV2PushMessage;
464
475
  private _onV2EpochRotated;
476
+ /** 按当前 AID 发现 Gateway;用于 authenticate()/connect() 的新入口。 */
477
+ private _resolveGatewayForAid;
465
478
  /** 从参数中解析 Gateway URL */
466
479
  private _resolveGateway;
467
480
  /** 从参数中解析所有 Gateway URL(支持 string 或 string[]) */
@@ -513,11 +526,11 @@ export declare class AUNClient {
513
526
  * 创建命名群:本地生成 P-256 keypair,调用 group.create 传入 public_key,
514
527
  * 服务端签发群 AID 证书,返回后将证书和私钥存入 keystore。
515
528
  */
516
- createNamedGroup(groupName: string, opts?: Record<string, unknown>): Promise<Record<string, unknown>>;
529
+ private createNamedGroup;
517
530
  /**
518
531
  * 为已有普通群绑定命名 AID(升级为命名群)。
519
532
  */
520
- bindGroupAid(groupId: string, groupName: string): Promise<Record<string, unknown>>;
533
+ private bindGroupAid;
521
534
  /** 判断是否应重试重连 */
522
535
  private static _shouldRetryReconnect;
523
536
  }