@the-ai-company/cbio-node-runtime 0.31.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -0
  3. package/dist/agent/agent.d.ts +234 -0
  4. package/dist/agent/agent.js +565 -0
  5. package/dist/agent/agent.js.map +1 -0
  6. package/dist/audit/ActivityLog.d.ts +25 -0
  7. package/dist/audit/ActivityLog.js +66 -0
  8. package/dist/audit/ActivityLog.js.map +1 -0
  9. package/dist/errors.d.ts +28 -0
  10. package/dist/errors.js +37 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/http/authClient.d.ts +26 -0
  13. package/dist/http/authClient.js +132 -0
  14. package/dist/http/authClient.js.map +1 -0
  15. package/dist/http/localAuthProxy.d.ts +33 -0
  16. package/dist/http/localAuthProxy.js +93 -0
  17. package/dist/http/localAuthProxy.js.map +1 -0
  18. package/dist/http/secretAcquisition.d.ts +54 -0
  19. package/dist/http/secretAcquisition.js +177 -0
  20. package/dist/http/secretAcquisition.js.map +1 -0
  21. package/dist/protocol/childSecretNaming.d.ts +7 -0
  22. package/dist/protocol/childSecretNaming.js +12 -0
  23. package/dist/protocol/childSecretNaming.js.map +1 -0
  24. package/dist/protocol/crypto.d.ts +23 -0
  25. package/dist/protocol/crypto.js +37 -0
  26. package/dist/protocol/crypto.js.map +1 -0
  27. package/dist/protocol/identity.d.ts +8 -0
  28. package/dist/protocol/identity.js +16 -0
  29. package/dist/protocol/identity.js.map +1 -0
  30. package/dist/runtime/index.d.ts +14 -0
  31. package/dist/runtime/index.js +11 -0
  32. package/dist/runtime/index.js.map +1 -0
  33. package/dist/sealed/index.d.ts +6 -0
  34. package/dist/sealed/index.js +6 -0
  35. package/dist/sealed/index.js.map +1 -0
  36. package/dist/sealed/seal.d.ts +19 -0
  37. package/dist/sealed/seal.js +56 -0
  38. package/dist/sealed/seal.js.map +1 -0
  39. package/dist/storage/fs.d.ts +16 -0
  40. package/dist/storage/fs.js +68 -0
  41. package/dist/storage/fs.js.map +1 -0
  42. package/dist/storage/memory.d.ts +11 -0
  43. package/dist/storage/memory.js +19 -0
  44. package/dist/storage/memory.js.map +1 -0
  45. package/dist/storage/provider.d.ts +12 -0
  46. package/dist/storage/provider.js +6 -0
  47. package/dist/storage/provider.js.map +1 -0
  48. package/dist/vault/secretPolicy.d.ts +3 -0
  49. package/dist/vault/secretPolicy.js +14 -0
  50. package/dist/vault/secretPolicy.js.map +1 -0
  51. package/dist/vault/vault.d.ts +91 -0
  52. package/dist/vault/vault.js +534 -0
  53. package/dist/vault/vault.js.map +1 -0
  54. package/docs/ARCHITECTURE.md +100 -0
  55. package/docs/REFERENCE.md +184 -0
  56. package/docs/TODO-multi-vault.md +29 -0
  57. package/docs/WORKS_WITH_CUSTOM_FETCH.md +196 -0
  58. package/docs/es/README.md +27 -0
  59. package/docs/fr/README.md +27 -0
  60. package/docs/ja/README.md +27 -0
  61. package/docs/ko/README.md +27 -0
  62. package/docs/pt/README.md +27 -0
  63. package/docs/spec/runtime/README.md +27 -0
  64. package/docs/spec/runtime/activity-log.md +67 -0
  65. package/docs/spec/runtime/managed-agent-record.md +52 -0
  66. package/docs/spec/runtime/merge-rules.md +52 -0
  67. package/docs/spec/runtime/secret-origin-policy.md +46 -0
  68. package/docs/zh/README.md +27 -0
  69. package/examples/minimal.ts +13 -0
  70. package/package.json +57 -0
@@ -0,0 +1,91 @@
1
+ import { Signer } from '../protocol/crypto.js';
2
+ import type { IStorageProvider } from '../storage/provider.js';
3
+ import { type ActivityLogEntry, type ActivityLogMetadata } from '../audit/ActivityLog.js';
4
+ export interface SecretPolicy {
5
+ allowedOrigins?: string[];
6
+ }
7
+ /**
8
+ * CbioVault
9
+ *
10
+ * A secure container for third-party API keys and secrets.
11
+ * Secrets are stored in a private field (#) and are inaccessible
12
+ * to the outside Agent logic. Vault stores ONLY secrets (encrypted).
13
+ */
14
+ export declare class CbioVault {
15
+ #private;
16
+ private static readonly PERSIST_SALT;
17
+ private static readonly VERSIONED_SECRET_PREFIX;
18
+ /**
19
+ * @internal Used by Owner. Binds storage and loads vault from disk. Do not call directly.
20
+ */
21
+ initFromStorage(signer: Signer, storageKey: string, storage?: IStorageProvider, activityLogKey?: string, activityLogKeyIsDerived?: boolean): Promise<void>;
22
+ /**
23
+ * @internal Used by Owner.importIdentity. Binds storage and loads vault from blob. Do not call directly.
24
+ */
25
+ initFromBlob(signer: Signer, blob: string, storageKey: string, storage?: IStorageProvider, activityLogKey?: string, activityLogKeyIsDerived?: boolean): Promise<void>;
26
+ /**
27
+ * Add a new secret. Fails if secretName already exists.
28
+ */
29
+ addSecret(secretName: string, secretValue: string, options?: SecretPolicy): Promise<void>;
30
+ /**
31
+ * Update an existing secret. Fails if secretName does not exist.
32
+ */
33
+ updateSecret(secretName: string, secretValue: string): Promise<void>;
34
+ setSecretAllowedOrigins(secretName: string, allowedOrigins: readonly string[]): Promise<void>;
35
+ rotateSecret(secretName: string, secretValue: string, sourceOrigin: string): Promise<void>;
36
+ /**
37
+ * Case 3: Retrieve a secret in plaintext.
38
+ * @internal @admin
39
+ * WARNING: This is an ADMIN-ONLY method. Do not use in Agent's autonomous logic.
40
+ */
41
+ getSecret(secretName: string): string | undefined;
42
+ /**
43
+ * Case 4: Permanently delete a secret from memory and disk.
44
+ * @internal @admin
45
+ * WARNING: This is an ADMIN-ONLY method. Agent should NEVER be allowed
46
+ * to delete its own memory autonomously. Only Owner (Human) can call this.
47
+ */
48
+ deleteSecret(secretName: string): Promise<void>;
49
+ /**
50
+ * @internal Used by AuthClient to append activity log entries.
51
+ */
52
+ appendActivityLogEntry(entry: ActivityLogEntry): Promise<void>;
53
+ /**
54
+ * Persistence: Atomic save with write-read-verify.
55
+ */
56
+ save(signer: Signer, storageKey?: string, storage?: IStorageProvider): Promise<void>;
57
+ serializeToBlob(signer: Signer): Promise<string>;
58
+ /**
59
+ * Seal vault with external key (AES-256-GCM) for portable local storage.
60
+ */
61
+ seal(kdk: string): string;
62
+ /**
63
+ * Unseal vault from blob encrypted with kdk.
64
+ */
65
+ unseal(kdk: string, sealed: string): void;
66
+ hasSecret(secretName: string): boolean;
67
+ listSecretNames(): string[];
68
+ /**
69
+ * Read activity log. Owner-only. Returns [] if activity log not enabled.
70
+ */
71
+ getActivityLog(): Promise<readonly ActivityLogEntry[]>;
72
+ /**
73
+ * Read activity log metadata (agentId, storageKey). Returns null if not present.
74
+ */
75
+ getActivityLogMetadata(): Promise<ActivityLogMetadata | null>;
76
+ /**
77
+ * Merge secrets from another vault instance.
78
+ * Only allowed if both vaults belong to the same identity.
79
+ * @param options.onConflict 'abort' = return conflicts (default); 'skip' = merge non-conflicting only; 'overwrite' = use other's value for conflicts.
80
+ */
81
+ mergeFrom(otherVault: CbioVault, options?: {
82
+ onConflict?: 'abort' | 'skip' | 'overwrite';
83
+ }): Promise<MergeResult>;
84
+ }
85
+ export interface MergeResult {
86
+ merged: boolean;
87
+ added: string[];
88
+ skipped: string[];
89
+ overwritten: string[];
90
+ conflicts?: string[];
91
+ }
@@ -0,0 +1,534 @@
1
+ var _a;
2
+ import { Buffer } from 'node:buffer';
3
+ import * as crypto from 'node:crypto';
4
+ import { deriveRootAgentId } from '../protocol/identity.js';
5
+ import { IdentityError, IdentityErrorCode } from '../errors.js';
6
+ import { FsStorageProvider } from '../storage/fs.js';
7
+ import { appendActivityLog, readActivityLog, readActivityLogMetadata, } from '../audit/ActivityLog.js';
8
+ import { sealBlob, unsealBlob } from '../sealed/seal.js';
9
+ import { normalizeSecretPolicyOrigin } from './secretPolicy.js';
10
+ const VAULT_FORMAT_VERSION = "v1.0";
11
+ const SUPPORTED_VERSIONS = ["v1.0"];
12
+ /**
13
+ * CbioVault
14
+ *
15
+ * A secure container for third-party API keys and secrets.
16
+ * Secrets are stored in a private field (#) and are inaccessible
17
+ * to the outside Agent logic. Vault stores ONLY secrets (encrypted).
18
+ */
19
+ export class CbioVault {
20
+ #secrets = new Map();
21
+ #secretMetadata = new Map();
22
+ #autoSigner = null;
23
+ #storage = null;
24
+ #storageKey = null;
25
+ #activityLogKey = null;
26
+ #activityLogKeyIsDerived = false;
27
+ #identityFingerprint = null;
28
+ static PERSIST_SALT = "CBIO_VAULT_PERSIST_V1";
29
+ static VERSIONED_SECRET_PREFIX = "__cbio_secret_version__:";
30
+ static #isVersionStorageKey(secretName) {
31
+ return secretName.startsWith(_a.VERSIONED_SECRET_PREFIX);
32
+ }
33
+ static #normalizeAllowedOrigins(allowedOrigins) {
34
+ if (!allowedOrigins || allowedOrigins.length === 0)
35
+ return undefined;
36
+ const normalized = Array.from(new Set(allowedOrigins.map((origin) => {
37
+ try {
38
+ return normalizeSecretPolicyOrigin(origin);
39
+ }
40
+ catch (error) {
41
+ throw new IdentityError(IdentityErrorCode.SECRET_POLICY_REQUIRED, error instanceof Error ? error.message : String(error));
42
+ }
43
+ })));
44
+ return normalized.length > 0 ? normalized : undefined;
45
+ }
46
+ #makeVersionStorageKey(secretName, versionId) {
47
+ return `${_a.VERSIONED_SECRET_PREFIX}${secretName}:${versionId}`;
48
+ }
49
+ #assertPublicSecretName(secretName) {
50
+ if (_a.#isVersionStorageKey(secretName)) {
51
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret name '${secretName}' is reserved for internal version storage.`);
52
+ }
53
+ }
54
+ #createVersionedSecret(secretName, secretValue, options) {
55
+ const versionId = 'v1';
56
+ const storageKey = this.#makeVersionStorageKey(secretName, versionId);
57
+ this.#secrets.set(storageKey, secretValue);
58
+ this.#secretMetadata.set(secretName, {
59
+ activeVersion: versionId,
60
+ nextVersionNumber: 2,
61
+ versions: {
62
+ [versionId]: {
63
+ storageKey,
64
+ state: 'active',
65
+ createdAt: Date.now(),
66
+ ...(options?.sourceOrigin && { sourceOrigin: options.sourceOrigin }),
67
+ }
68
+ },
69
+ ...(options?.allowedOrigins && { allowedOrigins: _a.#normalizeAllowedOrigins(options.allowedOrigins) }),
70
+ });
71
+ }
72
+ #ensureVersionedSecret(secretName) {
73
+ const existing = this.#secretMetadata.get(secretName);
74
+ if (existing)
75
+ return existing;
76
+ const legacyValue = this.#secrets.get(secretName);
77
+ if (legacyValue !== undefined) {
78
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Secret '${secretName}' exists in legacy format. Legacy vault format is no longer supported.`);
79
+ }
80
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret name '${secretName}' not found. Use addSecret to add.`);
81
+ }
82
+ #getActiveVersionValue(secretName) {
83
+ const metadata = this.#secretMetadata.get(secretName);
84
+ if (!metadata) {
85
+ if (this.#secrets.has(secretName)) {
86
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Secret '${secretName}' exists in legacy format. Legacy vault format is no longer supported.`);
87
+ }
88
+ return undefined;
89
+ }
90
+ const active = metadata.versions[metadata.activeVersion];
91
+ return active ? this.#secrets.get(active.storageKey) : undefined;
92
+ }
93
+ #cloneSecretMetadata(secretName, metadata) {
94
+ const versions = {};
95
+ for (const [versionId, version] of Object.entries(metadata.versions)) {
96
+ versions[versionId] = {
97
+ storageKey: version.storageKey,
98
+ state: version.state,
99
+ createdAt: version.createdAt,
100
+ ...(version.sourceOrigin ? { sourceOrigin: version.sourceOrigin } : {}),
101
+ };
102
+ }
103
+ return {
104
+ activeVersion: metadata.activeVersion,
105
+ nextVersionNumber: metadata.nextVersionNumber,
106
+ versions,
107
+ ...(metadata.allowedOrigins ? { allowedOrigins: [...metadata.allowedOrigins] } : {}),
108
+ };
109
+ }
110
+ async #replaceSecretFromVault(secretName, otherVault) {
111
+ const otherMetadata = otherVault.#secretMetadata.get(secretName);
112
+ if (otherMetadata) {
113
+ if (this.hasSecret(secretName)) {
114
+ await this.deleteSecret(secretName);
115
+ }
116
+ const clonedMetadata = this.#cloneSecretMetadata(secretName, otherMetadata);
117
+ for (const version of Object.values(clonedMetadata.versions)) {
118
+ const value = otherVault.#secrets.get(version.storageKey);
119
+ if (value === undefined) {
120
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret '${secretName}' is missing version data during merge.`);
121
+ }
122
+ this.#secrets.set(version.storageKey, value);
123
+ }
124
+ this.#secretMetadata.set(secretName, clonedMetadata);
125
+ return;
126
+ }
127
+ if (otherVault.#secrets.has(secretName)) {
128
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Secret '${secretName}' exists in legacy format in source vault. Legacy vault format is no longer supported.`);
129
+ }
130
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret '${secretName}' metadata is missing from source vault.`);
131
+ }
132
+ /**
133
+ * @internal Used by Owner. Binds storage and loads vault from disk. Do not call directly.
134
+ */
135
+ async initFromStorage(signer, storageKey, storage, activityLogKey, activityLogKeyIsDerived = false) {
136
+ await this.#setupAutoSave(signer, storageKey, storage, activityLogKey, activityLogKeyIsDerived);
137
+ await this.#load(signer, storageKey, storage);
138
+ }
139
+ /**
140
+ * @internal Used by Owner.importIdentity. Binds storage and loads vault from blob. Do not call directly.
141
+ */
142
+ async initFromBlob(signer, blob, storageKey, storage, activityLogKey, activityLogKeyIsDerived = false) {
143
+ await this.#setupAutoSave(signer, storageKey, storage, activityLogKey, activityLogKeyIsDerived);
144
+ await this.#deserializeFromBlob(signer, blob);
145
+ }
146
+ async #setupAutoSave(signer, storageKey, storage, activityLogKey, activityLogKeyIsDerived = false) {
147
+ const provider = storage ?? new FsStorageProvider();
148
+ const testKey = `${storageKey}.cbio_write_test_${crypto.randomBytes(4).toString('hex')}`;
149
+ try {
150
+ await provider.write(testKey, Buffer.from('test'));
151
+ await provider.delete(testKey);
152
+ }
153
+ catch (e) {
154
+ const msg = `CRITICAL: Vault persistence failed. Storage is not writable.\n` +
155
+ `Error: ${e.message}\n` +
156
+ `Solution: Check storage permissions or provide a custom IStorageProvider.`;
157
+ throw new IdentityError(IdentityErrorCode.VAULT_PERSISTENCE_FAILED, msg, { cause: e });
158
+ }
159
+ this.#autoSigner = signer;
160
+ this.#storage = provider;
161
+ this.#storageKey = storageKey;
162
+ this.#activityLogKey = activityLogKey ?? null;
163
+ this.#activityLogKeyIsDerived = activityLogKeyIsDerived;
164
+ const publicKey = await signer.getPublicKey();
165
+ this.#identityFingerprint = crypto.createHash('sha256').update(publicKey).digest('hex');
166
+ }
167
+ /**
168
+ * Add a new secret. Fails if secretName already exists.
169
+ */
170
+ async addSecret(secretName, secretValue, options) {
171
+ this.#assertPublicSecretName(secretName);
172
+ if (this.hasSecret(secretName)) {
173
+ throw new IdentityError(IdentityErrorCode.SECRET_ALREADY_EXISTS, `Secret name '${secretName}' already exists. Use updateSecret to overwrite.`);
174
+ }
175
+ this.#createVersionedSecret(secretName, secretValue, { allowedOrigins: options?.allowedOrigins });
176
+ await this.#persistIfPossible();
177
+ }
178
+ /**
179
+ * Update an existing secret. Fails if secretName does not exist.
180
+ */
181
+ async updateSecret(secretName, secretValue) {
182
+ this.#assertPublicSecretName(secretName);
183
+ const metadata = this.#secretMetadata.get(secretName);
184
+ if (!metadata) {
185
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret name '${secretName}' not found. Use addSecret to add.`);
186
+ }
187
+ const active = metadata.versions[metadata.activeVersion];
188
+ if (!active) {
189
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret name '${secretName}' has no active version.`);
190
+ }
191
+ this.#secrets.set(active.storageKey, secretValue);
192
+ await this.#persistIfPossible();
193
+ }
194
+ async setSecretAllowedOrigins(secretName, allowedOrigins) {
195
+ this.#assertPublicSecretName(secretName);
196
+ const metadata = this.#ensureVersionedSecret(secretName);
197
+ metadata.allowedOrigins = _a.#normalizeAllowedOrigins(allowedOrigins);
198
+ await this.#persistIfPossible();
199
+ }
200
+ async rotateSecret(secretName, secretValue, sourceOrigin) {
201
+ this.#assertPublicSecretName(secretName);
202
+ const metadata = this.#ensureVersionedSecret(secretName);
203
+ const allowedOrigins = metadata.allowedOrigins;
204
+ if (!allowedOrigins || allowedOrigins.length === 0) {
205
+ throw new IdentityError(IdentityErrorCode.SECRET_POLICY_REQUIRED, `Secret '${secretName}' cannot be rotated by agent until owner sets allowedOrigins.`);
206
+ }
207
+ const normalizedOrigin = new URL(sourceOrigin).origin;
208
+ if (!allowedOrigins.includes(normalizedOrigin)) {
209
+ throw new IdentityError(IdentityErrorCode.SECRET_SOURCE_ORIGIN_MISMATCH, `Secret '${secretName}' only allows rotation from ${allowedOrigins.join(', ')}. Received: ${normalizedOrigin}`);
210
+ }
211
+ const current = metadata.versions[metadata.activeVersion];
212
+ if (current)
213
+ current.state = 'deprecated';
214
+ const versionId = `v${metadata.nextVersionNumber}`;
215
+ metadata.nextVersionNumber += 1;
216
+ const storageKey = this.#makeVersionStorageKey(secretName, versionId);
217
+ this.#secrets.set(storageKey, secretValue);
218
+ metadata.versions[versionId] = {
219
+ storageKey,
220
+ state: 'active',
221
+ createdAt: Date.now(),
222
+ sourceOrigin: normalizedOrigin,
223
+ };
224
+ metadata.activeVersion = versionId;
225
+ await this.#persistIfPossible();
226
+ }
227
+ /**
228
+ * Case 3: Retrieve a secret in plaintext.
229
+ * @internal @admin
230
+ * WARNING: This is an ADMIN-ONLY method. Do not use in Agent's autonomous logic.
231
+ */
232
+ getSecret(secretName) {
233
+ if (_a.#isVersionStorageKey(secretName))
234
+ return undefined;
235
+ return this.#getActiveVersionValue(secretName);
236
+ }
237
+ /**
238
+ * Case 4: Permanently delete a secret from memory and disk.
239
+ * @internal @admin
240
+ * WARNING: This is an ADMIN-ONLY method. Agent should NEVER be allowed
241
+ * to delete its own memory autonomously. Only Owner (Human) can call this.
242
+ */
243
+ async deleteSecret(secretName) {
244
+ this.#assertPublicSecretName(secretName);
245
+ const metadata = this.#secretMetadata.get(secretName);
246
+ if (!metadata) {
247
+ throw new IdentityError(IdentityErrorCode.SECRET_NOT_FOUND, `Secret name '${secretName}' not found. Nothing to delete.`);
248
+ }
249
+ for (const version of Object.values(metadata.versions)) {
250
+ this.#secrets.delete(version.storageKey);
251
+ }
252
+ this.#secretMetadata.delete(secretName);
253
+ await this.#persistIfPossible();
254
+ }
255
+ async #appendActivityLog(entry) {
256
+ if (!this.#storage || !this.#activityLogKey || !this.#autoSigner || !this.#storageKey)
257
+ return;
258
+ const metadata = {
259
+ v: 1,
260
+ agentId: deriveRootAgentId(await this.#autoSigner.getPublicKey()),
261
+ storageKey: this.#storageKey,
262
+ };
263
+ await appendActivityLog(this.#storage, this.#activityLogKey, entry, metadata);
264
+ }
265
+ /**
266
+ * @internal Used by AuthClient to append activity log entries.
267
+ */
268
+ async appendActivityLogEntry(entry) {
269
+ await this.#appendActivityLog(entry);
270
+ }
271
+ /**
272
+ * Persistence: Atomic save with write-read-verify.
273
+ */
274
+ async save(signer, storageKey, storage) {
275
+ const resolvedStorageKey = storageKey ?? this.#storageKey;
276
+ if (!resolvedStorageKey) {
277
+ throw new IdentityError(IdentityErrorCode.VAULT_PERSISTENCE_FAILED, 'Vault save requires a bound storageKey or an explicit storageKey argument.');
278
+ }
279
+ const provider = storage ?? this.#storage ?? new FsStorageProvider();
280
+ const tmpKey = `${resolvedStorageKey}.tmp`;
281
+ const bundle = await this.#serializeToBundle(signer);
282
+ const checksum = crypto.createHash('sha256').update(bundle).digest('hex');
283
+ await provider.write(tmpKey, bundle);
284
+ const readBack = await provider.read(tmpKey);
285
+ if (!readBack) {
286
+ throw new IdentityError(IdentityErrorCode.VAULT_WRITE_INTEGRITY_FAILED, `Vault write integrity failure: could not read back ${tmpKey}`);
287
+ }
288
+ const readChecksum = crypto.createHash('sha256').update(readBack).digest('hex');
289
+ if (readChecksum !== checksum) {
290
+ throw new IdentityError(IdentityErrorCode.VAULT_WRITE_INTEGRITY_FAILED, `Vault write integrity failure: checksum mismatch. Do not delete ${tmpKey} for forensic analysis.`);
291
+ }
292
+ if (provider.rename) {
293
+ await provider.rename(tmpKey, resolvedStorageKey);
294
+ }
295
+ else {
296
+ await provider.write(resolvedStorageKey, bundle);
297
+ await provider.delete(tmpKey);
298
+ }
299
+ }
300
+ async serializeToBlob(signer) {
301
+ const bundle = await this.#serializeToBundle(signer);
302
+ return bundle.toString('base64url');
303
+ }
304
+ /**
305
+ * Seal vault with external key (AES-256-GCM) for portable local storage.
306
+ */
307
+ seal(kdk) {
308
+ try {
309
+ return sealBlob({
310
+ version: VAULT_FORMAT_VERSION,
311
+ secrets: Object.fromEntries(this.#secrets),
312
+ secretMetadata: Object.fromEntries(this.#secretMetadata),
313
+ }, kdk);
314
+ }
315
+ catch (e) {
316
+ if (e.code === IdentityErrorCode.INVALID_KDK)
317
+ throw e;
318
+ throw new IdentityError(IdentityErrorCode.INVALID_KDK, "seal: " + (e.message || String(e)), { cause: e });
319
+ }
320
+ }
321
+ /**
322
+ * Unseal vault from blob encrypted with kdk.
323
+ */
324
+ unseal(kdk, sealed) {
325
+ try {
326
+ const data = unsealBlob(sealed, kdk);
327
+ this.#loadFromPayload(data);
328
+ }
329
+ catch (e) {
330
+ if (e instanceof IdentityError)
331
+ throw e;
332
+ throw new IdentityError(IdentityErrorCode.INVALID_KDK, "unseal: " + (e.message || String(e)), { cause: e });
333
+ }
334
+ }
335
+ async #serializeToBundle(signer) {
336
+ const signature = await signer.sign(_a.PERSIST_SALT);
337
+ const encryptionKey = crypto.createHash('sha256').update(signature).digest();
338
+ const payload = {
339
+ version: VAULT_FORMAT_VERSION,
340
+ secrets: Object.fromEntries(this.#secrets),
341
+ secretMetadata: Object.fromEntries(this.#secretMetadata),
342
+ };
343
+ const plainText = JSON.stringify(payload);
344
+ const iv = crypto.randomBytes(12);
345
+ const cipher = crypto.createCipheriv('aes-256-gcm', encryptionKey, iv);
346
+ const encrypted = Buffer.concat([cipher.update(plainText, 'utf8'), cipher.final()]);
347
+ const tag = cipher.getAuthTag();
348
+ return Buffer.concat([iv, tag, encrypted]);
349
+ }
350
+ #loadFromPayload(data) {
351
+ if (typeof data.secrets !== 'object' || data.secrets === null) {
352
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, 'Vault payload must have a secrets object. Legacy format is no longer supported.');
353
+ }
354
+ if (typeof data.secretMetadata !== 'object' || data.secretMetadata === null) {
355
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, 'Vault payload must have a secretMetadata object. Legacy format is no longer supported.');
356
+ }
357
+ this.#secrets = new Map(Object.entries(data.secrets));
358
+ this.#secretMetadata = new Map(Object.entries(data.secretMetadata));
359
+ }
360
+ async #persistIfPossible() {
361
+ if (this.#autoSigner && this.#storage && this.#storageKey) {
362
+ await this.save(this.#autoSigner, this.#storageKey, this.#storage);
363
+ }
364
+ }
365
+ async #load(signer, storageKey, storage, mode = 'optional') {
366
+ const provider = storage ?? this.#storage ?? new FsStorageProvider();
367
+ const tmpKey = `${storageKey}.tmp`;
368
+ const tryLoad = async (k) => {
369
+ try {
370
+ const bundle = await provider.read(k);
371
+ if (!bundle)
372
+ return false;
373
+ await this.#deserializeFromBundle(signer, bundle);
374
+ return true;
375
+ }
376
+ catch {
377
+ return false;
378
+ }
379
+ };
380
+ if (await tryLoad(storageKey)) {
381
+ await provider.delete(tmpKey).catch(() => { });
382
+ return;
383
+ }
384
+ const mainMissing = !(await provider.has(storageKey));
385
+ if (mainMissing) {
386
+ if (await tryLoad(tmpKey)) {
387
+ if (provider.rename) {
388
+ await provider.rename(tmpKey, storageKey);
389
+ }
390
+ else {
391
+ const bundle = await provider.read(tmpKey);
392
+ if (bundle)
393
+ await provider.write(storageKey, bundle);
394
+ await provider.delete(tmpKey);
395
+ }
396
+ return;
397
+ }
398
+ if (mode === 'required') {
399
+ throw new IdentityError(IdentityErrorCode.VAULT_FILE_NOT_FOUND, `Vault file not found: ${storageKey}`);
400
+ }
401
+ return;
402
+ }
403
+ if (await tryLoad(tmpKey)) {
404
+ if (provider.rename) {
405
+ await provider.rename(tmpKey, storageKey);
406
+ }
407
+ else {
408
+ const bundle = await provider.read(tmpKey);
409
+ if (bundle)
410
+ await provider.write(storageKey, bundle);
411
+ await provider.delete(tmpKey);
412
+ }
413
+ return;
414
+ }
415
+ // Path collision: main exists but decrypt failed. Try suffixed paths only if file looks valid (not obviously corrupt).
416
+ const bundle = await provider.read(storageKey);
417
+ if (!bundle || bundle.length < 32) {
418
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Vault corrupted: both ${storageKey} and ${tmpKey} are unreadable. Do not overwrite. Seek recovery support.`);
419
+ }
420
+ const base = storageKey.replace(/\.enc$/, '');
421
+ for (let n = 1; n <= 100; n++) {
422
+ const altKey = `${base}_${n}.enc`;
423
+ if (await tryLoad(altKey)) {
424
+ this.#storageKey = altKey;
425
+ if (this.#activityLogKey && this.#activityLogKeyIsDerived) {
426
+ this.#activityLogKey = `${base}_${n}.activity.jsonl`;
427
+ }
428
+ return;
429
+ }
430
+ }
431
+ throw new IdentityError(IdentityErrorCode.VAULT_DECRYPT_FAILED, `Vault decrypt failed: ${storageKey} exists but could not be decrypted with this key. Wrong key, tampered file, or incompatible format. Do not overwrite. Seek recovery support.`);
432
+ }
433
+ async #deserializeFromBlob(signer, blob) {
434
+ const bundle = Buffer.from(blob, 'base64url');
435
+ await this.#deserializeFromBundle(signer, bundle);
436
+ }
437
+ async #deserializeFromBundle(signer, bundle) {
438
+ const signature = await signer.sign(_a.PERSIST_SALT);
439
+ const encryptionKey = crypto.createHash('sha256').update(signature).digest();
440
+ const iv = bundle.subarray(0, 12);
441
+ const tag = bundle.subarray(12, 28);
442
+ const encrypted = bundle.subarray(28);
443
+ const decipher = crypto.createDecipheriv('aes-256-gcm', encryptionKey, iv);
444
+ decipher.setAuthTag(tag);
445
+ const plainText = decipher.update(encrypted, undefined, 'utf8') + decipher.final('utf8');
446
+ const data = JSON.parse(plainText);
447
+ if (!SUPPORTED_VERSIONS.includes(data.version)) {
448
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Vault format version '${data.version ?? '(missing)'}' not supported. Expected v1.0. Legacy formats are no longer supported.`);
449
+ }
450
+ this.#loadFromPayload(data);
451
+ }
452
+ hasSecret(secretName) {
453
+ if (_a.#isVersionStorageKey(secretName))
454
+ return false;
455
+ if (this.#secrets.has(secretName)) {
456
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Secret '${secretName}' exists in legacy format. Legacy vault format is no longer supported.`);
457
+ }
458
+ return this.#secretMetadata.has(secretName);
459
+ }
460
+ listSecretNames() {
461
+ for (const secretName of this.#secrets.keys()) {
462
+ if (!_a.#isVersionStorageKey(secretName)) {
463
+ throw new IdentityError(IdentityErrorCode.VAULT_CORRUPTED, `Secret '${secretName}' exists in legacy format. Legacy vault format is no longer supported.`);
464
+ }
465
+ }
466
+ return Array.from(this.#secretMetadata.keys());
467
+ }
468
+ /**
469
+ * Read activity log. Owner-only. Returns [] if activity log not enabled.
470
+ */
471
+ async getActivityLog() {
472
+ if (!this.#storage || !this.#activityLogKey)
473
+ return [];
474
+ return await readActivityLog(this.#storage, this.#activityLogKey);
475
+ }
476
+ /**
477
+ * Read activity log metadata (agentId, storageKey). Returns null if not present.
478
+ */
479
+ async getActivityLogMetadata() {
480
+ if (!this.#storage || !this.#activityLogKey)
481
+ return null;
482
+ return await readActivityLogMetadata(this.#storage, this.#activityLogKey);
483
+ }
484
+ /**
485
+ * Merge secrets from another vault instance.
486
+ * Only allowed if both vaults belong to the same identity.
487
+ * @param options.onConflict 'abort' = return conflicts (default); 'skip' = merge non-conflicting only; 'overwrite' = use other's value for conflicts.
488
+ */
489
+ async mergeFrom(otherVault, options) {
490
+ const onConflict = options?.onConflict ?? 'abort';
491
+ if (this.#identityFingerprint !== otherVault.#identityFingerprint) {
492
+ throw new IdentityError(IdentityErrorCode.MERGE_IDENTITY_MISMATCH, "Cannot merge vaults belonging to different identities.");
493
+ }
494
+ const conflicts = [];
495
+ for (const secretName of otherVault.listSecretNames()) {
496
+ if (this.hasSecret(secretName))
497
+ conflicts.push(secretName);
498
+ }
499
+ if (conflicts.length > 0 && onConflict === 'abort') {
500
+ return {
501
+ merged: false,
502
+ added: [],
503
+ skipped: [],
504
+ overwritten: [],
505
+ conflicts,
506
+ };
507
+ }
508
+ const added = [];
509
+ const skipped = [];
510
+ const overwritten = [];
511
+ for (const secretName of otherVault.listSecretNames()) {
512
+ if (!this.hasSecret(secretName)) {
513
+ await this.#replaceSecretFromVault(secretName, otherVault);
514
+ added.push(secretName);
515
+ }
516
+ else if (onConflict === 'skip') {
517
+ skipped.push(secretName);
518
+ }
519
+ else if (onConflict === 'overwrite') {
520
+ await this.#replaceSecretFromVault(secretName, otherVault);
521
+ overwritten.push(secretName);
522
+ }
523
+ }
524
+ await this.#persistIfPossible();
525
+ return {
526
+ merged: true,
527
+ added,
528
+ skipped,
529
+ overwritten,
530
+ };
531
+ }
532
+ }
533
+ _a = CbioVault;
534
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/vault/vault.ts"],"names":[],"mappings":"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"}