@agentunion/fastaun 0.4.3 → 0.4.5

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 +213 -185
  2. package/_packed_docs/CHANGELOG.md +213 -185
  3. package/_packed_docs/INDEX.md +17 -17
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +11 -11
  5. package/_packed_docs/agent.md/SCHEMA.md +49 -49
  6. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +22 -22
  7. 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 +327 -327
  8. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +686 -686
  9. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -542
  10. 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 +124 -124
  11. 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 +665 -665
  12. 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 -2
  13. 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 +170 -170
  14. 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 +419 -419
  15. package/_packed_docs/protocol/README.md +1 -1
  16. package/_packed_docs/protocol/aun-docs-guide.md +1 -1
  17. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +15 -15
  18. 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 +4 -4
  19. 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 +98 -98
  20. 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 +46 -46
  21. 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 +257 -257
  22. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  23. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
  24. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1 -0
  25. package/_packed_docs/sdk/09-payload-reference.md +13 -13
  26. 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 +171 -171
  27. package/dist/aid-store.d.ts +1 -0
  28. package/dist/aid-store.js +26 -3
  29. package/dist/aid-store.js.map +1 -1
  30. package/dist/aid.d.ts +2 -1
  31. package/dist/aid.js +7 -6
  32. package/dist/aid.js.map +1 -1
  33. package/dist/auth.d.ts +17 -32
  34. package/dist/auth.js +42 -291
  35. package/dist/auth.js.map +1 -1
  36. package/dist/client.d.ts +10 -3
  37. package/dist/client.js +275 -138
  38. package/dist/client.js.map +1 -1
  39. package/dist/index.d.ts +1 -0
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/keystore/aid-db.d.ts +0 -4
  43. package/dist/keystore/aid-db.js +4 -95
  44. package/dist/keystore/aid-db.js.map +1 -1
  45. package/dist/keystore/file.d.ts +8 -5
  46. package/dist/keystore/file.js +109 -68
  47. package/dist/keystore/file.js.map +1 -1
  48. package/dist/keystore/index.d.ts +39 -36
  49. package/dist/keystore/index.js +3 -2
  50. package/dist/keystore/index.js.map +1 -1
  51. package/dist/register-flow.d.ts +49 -0
  52. package/dist/register-flow.js +366 -0
  53. package/dist/register-flow.js.map +1 -0
  54. package/dist/secret-store/file-store.js +6 -1
  55. package/dist/secret-store/file-store.js.map +1 -1
  56. package/dist/tools/cross-sdk-agent.js +0 -9
  57. package/dist/tools/cross-sdk-agent.js.map +1 -1
  58. package/dist/transport.d.ts +1 -0
  59. package/dist/transport.js +7 -1
  60. package/dist/transport.js.map +1 -1
  61. package/dist/v2/session/keystore.d.ts +5 -0
  62. package/dist/v2/session/keystore.js +21 -3
  63. package/dist/v2/session/keystore.js.map +1 -1
  64. package/dist/version.d.ts +1 -1
  65. package/dist/version.js +1 -1
  66. package/package.json +1 -1
  67. package/_packed_docs/0.4.0_/345/267/256/345/274/202/346/240/270/345/256/236/345/206/263/347/255/226/350/256/260/345/275/225.md +0 -302
  68. package/_packed_docs/AUN_SDK_0.4.0_/350/256/276/350/256/241/345/257/271/346/257/224/345/210/206/346/236/220.md +0 -194
  69. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/345/256/236/346/226/275/350/256/241/345/210/222.md +0 -596
  70. 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 +0 -1697
  71. package/_packed_docs/python-sdk-v2-only-changelog.md +0 -189
package/dist/index.d.ts CHANGED
@@ -21,6 +21,7 @@ export { FileSecretStore, SeedMigrationError, type SeedChangeResult } from './se
21
21
  export { RPCTransport } from './transport.js';
22
22
  export { GatewayDiscovery } from './discovery.js';
23
23
  export { AuthFlow } from './auth.js';
24
+ export { RegisterFlow, type RegisterResult } from './register-flow.js';
24
25
  export { ProtectedHeaders } from './protected-headers.js';
25
26
  export type { ProtectedHeadersInput } from './protected-headers.js';
26
27
  export { encryptP2PMessage, encryptGroupMessage, decryptMessage, } from './v2/e2ee/index.js';
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ export { RPCTransport } from './transport.js';
28
28
  export { GatewayDiscovery } from './discovery.js';
29
29
  // ── 认证流程 ─────────────────────────────────────────────────
30
30
  export { AuthFlow } from './auth.js';
31
+ export { RegisterFlow } from './register-flow.js';
31
32
  // ── E2EE ─────────────────────────────────────────────────────
32
33
  export { ProtectedHeaders } from './protected-headers.js';
33
34
  // ── E2EE V2 ──────────────────────────────────────────────────
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAA0B,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,GAAG,EAAqB,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAkC,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAA+B,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/E,8DAA8D;AAC9D,OAAO,EAAE,WAAW,EAAkB,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExF,4DAA4D;AAC5D,OAAO,EACL,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAE/E,8DAA8D;AAC9D,OAAO,EACL,eAAe,EAiBf,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,6DAA6D;AAC7D,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAInE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,8BAA8B,CAAC;AAE1G,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,8DAA8D;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,4DAA4D;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,gEAAgE;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,gEAAgE;AAChE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAA0B,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,GAAG,EAAqB,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAkC,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAA+B,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/E,8DAA8D;AAC9D,OAAO,EAAE,WAAW,EAAkB,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExF,4DAA4D;AAC5D,OAAO,EACL,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AAE/E,8DAA8D;AAC9D,OAAO,EACL,eAAe,EAiBf,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,6DAA6D;AAC7D,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAInE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,8BAA8B,CAAC;AAE1G,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,8DAA8D;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,4DAA4D;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAuB,MAAM,oBAAoB,CAAC;AAEvE,gEAAgE;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,gEAAgE;AAChE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -40,10 +40,6 @@ export declare class AIDDatabase {
40
40
  setMetadata(key: string, value: string): void;
41
41
  deleteMetadata(key: string): void;
42
42
  getAllMetadata(): Record<string, string>;
43
- private _agentMdCacheColumns;
44
- private _normalizeAgentMdRecord;
45
- loadAgentMdCache(aid: string): Record<string, unknown> | null;
46
- upsertAgentMdCache(aid: string, fields: Record<string, unknown>): Record<string, unknown>;
47
43
  saveGroupState(groupId: string, stateVersion: number, stateHash: string, keyEpoch: number, membershipJson: string, policyJson: string): void;
48
44
  loadGroupState(groupId: string): {
49
45
  group_id: string;
@@ -8,7 +8,7 @@ import { mkdirSync } from 'node:fs';
8
8
  import { createRequire } from 'node:module';
9
9
  import { dirname, resolve } from 'node:path';
10
10
  import { slotIsolationKey } from '../config.js';
11
- const SCHEMA_VERSION = 2;
11
+ const SCHEMA_VERSION = 3;
12
12
  const { DatabaseSync } = createRequire(import.meta.url)('node:sqlite');
13
13
  const _dbPool = new Map();
14
14
  function configureDatabase(db, busyTimeoutMs) {
@@ -83,21 +83,6 @@ const DDL_STATEMENTS = [
83
83
  key TEXT PRIMARY KEY,
84
84
  value TEXT NOT NULL,
85
85
  updated_at INTEGER NOT NULL
86
- )`,
87
- `CREATE TABLE IF NOT EXISTS agent_md_cache (
88
- aid TEXT PRIMARY KEY,
89
- content TEXT NOT NULL DEFAULT '',
90
- local_etag TEXT NOT NULL DEFAULT '',
91
- remote_etag TEXT NOT NULL DEFAULT '',
92
- last_modified TEXT NOT NULL DEFAULT '',
93
- fetched_at INTEGER NOT NULL DEFAULT 0,
94
- observed_at INTEGER NOT NULL DEFAULT 0,
95
- checked_at INTEGER NOT NULL DEFAULT 0,
96
- remote_status TEXT NOT NULL DEFAULT '',
97
- verify_status TEXT NOT NULL DEFAULT '',
98
- verify_error TEXT NOT NULL DEFAULT '',
99
- last_error TEXT NOT NULL DEFAULT '',
100
- updated_at INTEGER NOT NULL
101
86
  )`,
102
87
  `CREATE TABLE IF NOT EXISTS group_state (
103
88
  group_id TEXT PRIMARY KEY,
@@ -175,6 +160,9 @@ export class AIDDatabase {
175
160
  this._db.exec("ALTER TABLE instance_state ADD COLUMN slot_id_full TEXT NOT NULL DEFAULT ''");
176
161
  this._db.exec("ALTER TABLE seq_tracker ADD COLUMN slot_id_full TEXT NOT NULL DEFAULT ''");
177
162
  }
163
+ if (row.version < 3) {
164
+ this._db.exec('DROP TABLE IF EXISTS agent_md_cache');
165
+ }
178
166
  this._db.prepare('UPDATE _schema_version SET version = ? WHERE id = 1').run(SCHEMA_VERSION);
179
167
  }
180
168
  }
@@ -244,85 +232,6 @@ export class AIDDatabase {
244
232
  result[row.key] = row.value;
245
233
  return result;
246
234
  }
247
- _agentMdCacheColumns() {
248
- return [
249
- 'aid',
250
- 'content',
251
- 'local_etag',
252
- 'remote_etag',
253
- 'last_modified',
254
- 'fetched_at',
255
- 'observed_at',
256
- 'checked_at',
257
- 'remote_status',
258
- 'verify_status',
259
- 'verify_error',
260
- 'last_error',
261
- 'updated_at',
262
- ];
263
- }
264
- _normalizeAgentMdRecord(row) {
265
- const out = {};
266
- for (const col of this._agentMdCacheColumns())
267
- out[col] = row[col];
268
- for (const col of ['fetched_at', 'observed_at', 'checked_at', 'updated_at']) {
269
- out[col] = Number(out[col] ?? 0);
270
- }
271
- return out;
272
- }
273
- loadAgentMdCache(aid) {
274
- const target = String(aid ?? '').trim();
275
- if (!target)
276
- return null;
277
- const columns = this._agentMdCacheColumns();
278
- const row = this._db.prepare(`SELECT ${columns.join(', ')} FROM agent_md_cache WHERE aid = ?`).get(target);
279
- return row ? this._normalizeAgentMdRecord(row) : null;
280
- }
281
- upsertAgentMdCache(aid, fields) {
282
- const target = String(aid ?? '').trim();
283
- if (!target)
284
- throw new Error('agent_md_cache aid is required');
285
- const current = this.loadAgentMdCache(target) ?? {
286
- aid: target,
287
- content: '',
288
- local_etag: '',
289
- remote_etag: '',
290
- last_modified: '',
291
- fetched_at: 0,
292
- observed_at: 0,
293
- checked_at: 0,
294
- remote_status: '',
295
- verify_status: '',
296
- verify_error: '',
297
- last_error: '',
298
- updated_at: 0,
299
- };
300
- for (const key of [
301
- 'content',
302
- 'local_etag',
303
- 'remote_etag',
304
- 'last_modified',
305
- 'remote_status',
306
- 'verify_status',
307
- 'verify_error',
308
- 'last_error',
309
- ]) {
310
- if (Object.prototype.hasOwnProperty.call(fields, key) && fields[key] !== undefined && fields[key] !== null) {
311
- current[key] = String(fields[key] ?? '');
312
- }
313
- }
314
- for (const key of ['fetched_at', 'observed_at', 'checked_at']) {
315
- if (Object.prototype.hasOwnProperty.call(fields, key) && fields[key] !== undefined && fields[key] !== null) {
316
- const value = Number(fields[key] ?? 0);
317
- current[key] = Number.isFinite(value) ? Math.trunc(value) : 0;
318
- }
319
- }
320
- current.updated_at = Date.now();
321
- const columns = this._agentMdCacheColumns();
322
- this._db.prepare(`INSERT INTO agent_md_cache (${columns.join(', ')}) VALUES (${columns.map(() => '?').join(', ')})
323
- ON CONFLICT(aid) DO UPDATE SET ${columns.filter(col => col !== 'aid').map(col => `${col}=excluded.${col}`).join(', ')}`).run(...columns.map(col => current[col]));
324
- return this.loadAgentMdCache(target) ?? current;
325
- }
326
235
  saveGroupState(groupId, stateVersion, stateHash, keyEpoch, membershipJson, policyJson) {
327
236
  this._db.prepare(`INSERT INTO group_state (group_id, state_version, state_hash, key_epoch, membership_json, policy_json, updated_at)
328
237
  VALUES (?, ?, ?, ?, ?, ?, ?)
@@ -1 +1 @@
1
- {"version":3,"file":"aid-db.js","sourceRoot":"","sources":["../../src/keystore/aid-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aid-db.js","sourceRoot":"","sources":["../../src/keystore/aid-db.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * - tokens / instance_state / metadata_kv / group_state 全部存 SQLite
7
7
  * - 废弃 meta.json
8
8
  */
9
- import type { AgentMdCacheRecord, AgentMdCacheUpsert, KeyStore } from './index.js';
9
+ import type { KeyStore } from './index.js';
10
10
  import type { SecretStore } from '../secret-store/index.js';
11
11
  import type { ModuleLogger } from '../logger.js';
12
12
  import { V2KeyStore } from '../v2/session/keystore.js';
@@ -33,6 +33,7 @@ export declare class FileKeyStore implements KeyStore {
33
33
  private _prepareRoot;
34
34
  loadKeyPair(aid: string): KeyPairRecord | null;
35
35
  saveKeyPair(aid: string, keyPair: KeyPairRecord): void;
36
+ private _saveKeyPairAtPath;
36
37
  private _restoreKeyPair;
37
38
  loadCert(aid: string, certFingerprint?: string): string | null;
38
39
  saveCert(aid: string, certPem: string, certFingerprint?: string, opts?: {
@@ -54,8 +55,6 @@ export declare class FileKeyStore implements KeyStore {
54
55
  loadMetadata(aid: string): Record<string, unknown> | null;
55
56
  /** 保存指定 AID 的元数据;只覆盖传入字段,不清理其它 metadata。 */
56
57
  saveMetadata(aid: string, metadata: Record<string, unknown>): void;
57
- private _protectText;
58
- private _revealText;
59
58
  saveE2EEPrekey(aid: string, prekeyId: string, prekeyData: Record<string, unknown>, deviceId?: string): Promise<void>;
60
59
  loadE2EEPrekeys(aid: string, deviceId?: string): Promise<Record<string, Record<string, unknown>>>;
61
60
  listGroupSecretIds(aid: string): Promise<string[]>;
@@ -69,8 +68,6 @@ export declare class FileKeyStore implements KeyStore {
69
68
  }): Promise<boolean>;
70
69
  saveE2EESession(aid: string, sessionId: string, data: Record<string, unknown>): Promise<void>;
71
70
  loadE2EESessions(aid: string): Promise<Array<Record<string, unknown>>>;
72
- loadAgentMdCache(ownerAid: string, targetAid: string): AgentMdCacheRecord | null;
73
- upsertAgentMdCache(ownerAid: string, targetAid: string, fields: AgentMdCacheUpsert): AgentMdCacheRecord;
74
71
  trustRootDir(): string;
75
72
  trustRootBundlePath(): string;
76
73
  saveTrustRoots(trustList: Record<string, unknown>, rootCerts: Array<{
@@ -91,16 +88,22 @@ export declare class FileKeyStore implements KeyStore {
91
88
  * 子目录 private/ public/ 一并创建。
92
89
  */
93
90
  pendingIdentityDir(aid: string): string;
91
+ listPendingIdentityDirs(aid: string): string[];
92
+ savePendingKeyPair(pendingDir: string, aid: string, keyPair: KeyPairRecord): void;
93
+ loadPendingKeyPair(pendingDir: string, aid: string): KeyPairRecord | null;
94
+ savePendingCert(pendingDir: string, certPem: string): void;
94
95
  /**
95
96
  * 把临时目录原子 rename 到正式 AIDs/{aid}/。
96
97
  * 目标已存在 → 抛错(调用方应当返回 IdentityConflictError)。
97
98
  */
98
99
  promotePendingIdentity(pendingDir: string, aid: string): string;
100
+ private _ensurePendingKeyPairProtected;
99
101
  /**
100
102
  * 删除 AIDs/_pending/ 下 mtime 超过 maxAgeMs 的子目录。
101
103
  * 失败仅记 warn,不抛错。返回被清理的目录数量。
102
104
  */
103
105
  cleanupPendingDirs(maxAgeMs?: number): number;
106
+ discardPendingIdentity(pendingDir: string): void;
104
107
  /** 获取指定 AID 的 V2KeyStore(共享同一 SQLite 连接)。 */
105
108
  getV2KeyStore(aid: string): V2KeyStore;
106
109
  }
@@ -27,6 +27,23 @@ function secureFilePermissions(path) {
27
27
  catch { /* ignore */ }
28
28
  }
29
29
  }
30
+ function replaceFileSync(tmpPath, targetPath) {
31
+ try {
32
+ renameSync(tmpPath, targetPath);
33
+ return;
34
+ }
35
+ catch (renameErr) {
36
+ try {
37
+ unlinkSync(targetPath);
38
+ }
39
+ catch (unlinkErr) {
40
+ if (unlinkErr.code !== 'ENOENT') {
41
+ throw new Error(`replace target cleanup failed: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}; original rename error: ${renameErr instanceof Error ? renameErr.message : String(renameErr)}`);
42
+ }
43
+ }
44
+ renameSync(tmpPath, targetPath);
45
+ }
46
+ }
30
47
  function deepClone(value) {
31
48
  return JSON.parse(JSON.stringify(value));
32
49
  }
@@ -126,17 +143,21 @@ export class FileKeyStore {
126
143
  const path = this._keyPairPath(aid);
127
144
  if (!existsSync(path))
128
145
  return null;
146
+ let raw;
129
147
  try {
130
- const raw = JSON.parse(readFileSync(path, 'utf-8'));
131
- return this._restoreKeyPair(aid, raw);
148
+ raw = JSON.parse(readFileSync(path, 'utf-8'));
132
149
  }
133
150
  catch (exc) {
134
151
  this._logger.warn('key.json read or parse failed, treating as non-existent');
135
152
  return null;
136
153
  }
154
+ return this._restoreKeyPair(aid, raw, path);
137
155
  }
138
156
  saveKeyPair(aid, keyPair) {
139
157
  const path = this._keyPairPath(aid);
158
+ this._saveKeyPairAtPath(aid, path, keyPair);
159
+ }
160
+ _saveKeyPairAtPath(aid, path, keyPair) {
140
161
  mkdirSync(dirname(path), { recursive: true });
141
162
  const protected_ = deepClone(keyPair);
142
163
  const pem = protected_.private_key_pem;
@@ -145,16 +166,35 @@ export class FileKeyStore {
145
166
  const rec = this._secretStore.protect(safeAid(aid), 'identity/private_key', Buffer.from(pem, 'utf-8'));
146
167
  protected_.private_key_protection = rec;
147
168
  }
148
- writeFileSync(path, JSON.stringify(protected_, null, 2), { mode: 0o600 });
169
+ const tmpPath = `${path}.tmp-${process.pid}-${Date.now()}-${crypto.randomBytes(4).toString('hex')}`;
170
+ writeFileSync(tmpPath, JSON.stringify(protected_, null, 2), { mode: 0o600 });
171
+ secureFilePermissions(tmpPath);
172
+ try {
173
+ replaceFileSync(tmpPath, path);
174
+ }
175
+ catch (exc) {
176
+ try {
177
+ unlinkSync(tmpPath);
178
+ }
179
+ catch { /* ignore tmp cleanup failure */ }
180
+ throw exc;
181
+ }
149
182
  secureFilePermissions(path);
150
183
  }
151
- _restoreKeyPair(aid, kp) {
184
+ _restoreKeyPair(aid, kp, persistPath) {
152
185
  const out = deepClone(kp);
153
186
  const rec = out.private_key_protection;
154
187
  if (isJsonObject(rec)) {
155
188
  const plain = this._secretStore.reveal(safeAid(aid), 'identity/private_key', rec);
156
- if (plain)
157
- out.private_key_pem = plain.toString('utf-8');
189
+ if (!plain) {
190
+ throw new Error(`private key decrypt failed for aid ${aid}: seed_password mismatch or key.json corrupted`);
191
+ }
192
+ out.private_key_pem = plain.toString('utf-8');
193
+ return out;
194
+ }
195
+ if (persistPath && typeof out.private_key_pem === 'string' && out.private_key_pem) {
196
+ // 兼容历史明文 key.json:首次加载成功后立即用当前 seed_password 加密回写。
197
+ this._saveKeyPairAtPath(aid, persistPath, out);
158
198
  }
159
199
  return out;
160
200
  }
@@ -284,6 +324,8 @@ export class FileKeyStore {
284
324
  for (const entry of readdirSync(this._aidsRoot, { withFileTypes: true })) {
285
325
  if (!entry.isDirectory())
286
326
  continue;
327
+ if (entry.name.startsWith('_'))
328
+ continue;
287
329
  const identity = this.loadIdentity(entry.name);
288
330
  if (identity)
289
331
  return identity;
@@ -368,44 +410,6 @@ export class FileKeyStore {
368
410
  }
369
411
  }
370
412
  // ── 旧 E2EE 存储互操作 ───────────────────────────────────
371
- _protectText(aid, name, plaintext) {
372
- if (!plaintext)
373
- return plaintext;
374
- try {
375
- const rec = this._secretStore.protect(safeAid(aid), name, Buffer.from(plaintext, 'utf-8'));
376
- return JSON.stringify(rec);
377
- }
378
- catch (exc) {
379
- this._logger.error(`field encryption failed (scope=${safeAid(aid)}, name=${name}): ${exc instanceof Error ? exc.message : String(exc)}`);
380
- return plaintext;
381
- }
382
- }
383
- _revealText(aid, name, stored) {
384
- if (!stored)
385
- return stored;
386
- let rec;
387
- try {
388
- rec = JSON.parse(stored);
389
- }
390
- catch {
391
- return stored;
392
- }
393
- if (rec === null || typeof rec !== 'object' || Array.isArray(rec)) {
394
- return stored;
395
- }
396
- const record = rec;
397
- if (record.scheme !== 'file_aes' || String(record.name ?? '') !== name) {
398
- return stored;
399
- }
400
- try {
401
- const plain = this._secretStore.reveal(safeAid(aid), name, record);
402
- return plain ? plain.toString('utf-8') : stored;
403
- }
404
- catch (exc) {
405
- this._logger.error(`field decryption failed (scope=${safeAid(aid)}, name=${name}): ${exc instanceof Error ? exc.message : String(exc)}`);
406
- return stored;
407
- }
408
- }
409
413
  async saveE2EEPrekey(aid, prekeyId, prekeyData, deviceId = '') {
410
414
  const now = Date.now();
411
415
  const privateKey = String(prekeyData.private_key_pem ?? '');
@@ -432,7 +436,7 @@ export class FileKeyStore {
432
436
  if (!id)
433
437
  continue;
434
438
  const entry = {
435
- private_key_pem: this._revealText(aid, `prekey/${id}`, String(row.private_key_enc ?? '')),
439
+ private_key_pem: String(row.private_key_enc ?? ''),
436
440
  created_at: row.created_at,
437
441
  updated_at: row.updated_at,
438
442
  expires_at: row.expires_at,
@@ -465,7 +469,7 @@ export class FileKeyStore {
465
469
  const entry = {
466
470
  group_id: groupId,
467
471
  epoch: current.epoch,
468
- secret: this._revealText(aid, `group/${groupId}/current`, String(current.secret_enc ?? '')),
472
+ secret: String(current.secret_enc ?? ''),
469
473
  updated_at: current.updated_at,
470
474
  };
471
475
  try {
@@ -483,7 +487,7 @@ export class FileKeyStore {
483
487
  return null;
484
488
  const entry = {
485
489
  epoch: old.epoch,
486
- secret: this._revealText(aid, `group/${groupId}/epoch/${Number(old.epoch ?? 0)}`, String(old.secret_enc ?? '')),
490
+ secret: String(old.secret_enc ?? ''),
487
491
  updated_at: old.updated_at,
488
492
  };
489
493
  if (old.expires_at != null)
@@ -505,14 +509,14 @@ export class FileKeyStore {
505
509
  return false;
506
510
  if (current && Number(current.epoch ?? 0) !== epoch) {
507
511
  const oldEpoch = Number(current.epoch ?? 0);
508
- const oldSecret = this._revealText(aid, `group/${groupId}/current`, String(current.secret_enc ?? ''));
512
+ const oldSecret = String(current.secret_enc ?? '');
509
513
  db.prepare(`INSERT INTO group_old_epochs (group_id, epoch, secret_enc, data, updated_at, expires_at)
510
514
  VALUES (?, ?, ?, ?, ?, ?)
511
515
  ON CONFLICT(group_id, epoch) DO UPDATE SET
512
516
  secret_enc=excluded.secret_enc,
513
517
  data=excluded.data,
514
518
  updated_at=excluded.updated_at,
515
- expires_at=excluded.expires_at`).run(groupId, oldEpoch, this._protectText(aid, `group/${groupId}/epoch/${oldEpoch}`, oldSecret), String(current.data ?? '{}'), Number(current.updated_at ?? now), Number(current.updated_at ?? now) + Number(opts.oldEpochRetentionMs ?? 0));
519
+ expires_at=excluded.expires_at`).run(groupId, oldEpoch, oldSecret, String(current.data ?? '{}'), Number(current.updated_at ?? now), Number(current.updated_at ?? now) + Number(opts.oldEpochRetentionMs ?? 0));
516
520
  }
517
521
  const data = {
518
522
  commitment: String(opts.commitment ?? ''),
@@ -541,7 +545,7 @@ export class FileKeyStore {
541
545
  if (!sessionId)
542
546
  continue;
543
547
  try {
544
- const entry = JSON.parse(this._revealText(aid, `session/${sessionId}`, String(row.data_enc ?? '{}')));
548
+ const entry = JSON.parse(String(row.data_enc ?? '{}'));
545
549
  if (entry && typeof entry === 'object' && !Array.isArray(entry)) {
546
550
  result.push({ ...entry, session_id: sessionId, updated_at: row.updated_at });
547
551
  }
@@ -550,24 +554,6 @@ export class FileKeyStore {
550
554
  }
551
555
  return result;
552
556
  }
553
- // ── agent.md Cache ───────────────────────────────────────
554
- loadAgentMdCache(ownerAid, targetAid) {
555
- const owner = String(ownerAid ?? '').trim();
556
- const target = String(targetAid ?? '').trim();
557
- if (!owner || !target)
558
- return null;
559
- const record = this._getDB(owner).loadAgentMdCache(target);
560
- return record ? deepClone(record) : null;
561
- }
562
- upsertAgentMdCache(ownerAid, targetAid, fields) {
563
- const owner = String(ownerAid ?? '').trim();
564
- const target = String(targetAid ?? '').trim();
565
- if (!owner || !target) {
566
- throw new Error('upsertAgentMdCache requires ownerAid and targetAid');
567
- }
568
- const record = this._getDB(owner).upsertAgentMdCache(target, fields);
569
- return deepClone(record);
570
- }
571
557
  // ── 信任根管理 ─────────────────────────────────────────────
572
558
  trustRootDir() {
573
559
  const dir = join(this._root, 'CA', 'root');
@@ -667,11 +653,50 @@ export class FileKeyStore {
667
653
  mkdirSync(join(dir, 'public'), { recursive: true });
668
654
  return dir;
669
655
  }
656
+ listPendingIdentityDirs(aid) {
657
+ const root = this._pendingRoot();
658
+ if (!existsSync(root))
659
+ return [];
660
+ const prefix = `${safeAid(aid)}-`;
661
+ const items = [];
662
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
663
+ if (!entry.isDirectory() || !entry.name.startsWith(prefix))
664
+ continue;
665
+ const path = join(root, entry.name);
666
+ try {
667
+ items.push({ path, mtimeMs: statSync(path).mtimeMs });
668
+ }
669
+ catch { /* ignore unreadable pending entry */ }
670
+ }
671
+ return items.sort((a, b) => b.mtimeMs - a.mtimeMs).map((item) => item.path);
672
+ }
673
+ savePendingKeyPair(pendingDir, aid, keyPair) {
674
+ this._saveKeyPairAtPath(aid, join(pendingDir, 'private', 'key.json'), keyPair);
675
+ }
676
+ loadPendingKeyPair(pendingDir, aid) {
677
+ const keyPath = join(pendingDir, 'private', 'key.json');
678
+ if (!existsSync(keyPath))
679
+ return null;
680
+ let raw;
681
+ try {
682
+ raw = JSON.parse(readFileSync(keyPath, 'utf-8'));
683
+ }
684
+ catch {
685
+ return null;
686
+ }
687
+ return this._restoreKeyPair(aid, raw, keyPath);
688
+ }
689
+ savePendingCert(pendingDir, certPem) {
690
+ const certPath = join(pendingDir, 'public', 'cert.pem');
691
+ mkdirSync(dirname(certPath), { recursive: true });
692
+ writeFileSync(certPath, certPem, { encoding: 'utf-8', mode: 0o600 });
693
+ }
670
694
  /**
671
695
  * 把临时目录原子 rename 到正式 AIDs/{aid}/。
672
696
  * 目标已存在 → 抛错(调用方应当返回 IdentityConflictError)。
673
697
  */
674
698
  promotePendingIdentity(pendingDir, aid) {
699
+ this._ensurePendingKeyPairProtected(pendingDir, aid);
675
700
  const target = join(this._aidsRoot, safeAid(aid));
676
701
  if (existsSync(target)) {
677
702
  throw new Error(`promotePendingIdentity: target exists: ${target}`);
@@ -690,6 +715,19 @@ export class FileKeyStore {
690
715
  fsRenameSync(pendingDir, target);
691
716
  return target;
692
717
  }
718
+ _ensurePendingKeyPairProtected(pendingDir, aid) {
719
+ const keyPath = join(pendingDir, 'private', 'key.json');
720
+ if (!existsSync(keyPath)) {
721
+ throw new Error(`pending identity missing key pair for ${aid}`);
722
+ }
723
+ const raw = JSON.parse(readFileSync(keyPath, 'utf-8'));
724
+ if (typeof raw.private_key_pem === 'string' && raw.private_key_pem) {
725
+ throw new Error(`pending identity private key is plaintext for ${aid}`);
726
+ }
727
+ if (!isJsonObject(raw.private_key_protection)) {
728
+ throw new Error(`pending identity private key is not encrypted for ${aid}`);
729
+ }
730
+ }
693
731
  /**
694
732
  * 删除 AIDs/_pending/ 下 mtime 超过 maxAgeMs 的子目录。
695
733
  * 失败仅记 warn,不抛错。返回被清理的目录数量。
@@ -722,6 +760,9 @@ export class FileKeyStore {
722
760
  }
723
761
  return removed;
724
762
  }
763
+ discardPendingIdentity(pendingDir) {
764
+ fsRmSync(pendingDir, { recursive: true, force: true });
765
+ }
725
766
  /** 获取指定 AID 的 V2KeyStore(共享同一 SQLite 连接)。 */
726
767
  getV2KeyStore(aid) {
727
768
  const db = this._getDB(aid);