@dharma-ai-labs/agent-fabric-local-vault 0.1.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.
@@ -0,0 +1,33 @@
1
+ import { type SecureSecretStore } from '@dharma-ai-labs/agent-fabric-secure-store';
2
+ export interface VaultOptions {
3
+ root: string;
4
+ masterKey: Buffer;
5
+ }
6
+ export declare class LocalVault {
7
+ #private;
8
+ readonly root: string;
9
+ private constructor();
10
+ static open(options: VaultOptions): Promise<LocalVault>;
11
+ putBlob(plaintext: Uint8Array, kind: string): Promise<string>;
12
+ putFile(sourcePath: string, kind: string): Promise<{
13
+ contentId: string;
14
+ bytes: number;
15
+ }>;
16
+ getBlob(contentId: string): Promise<Buffer>;
17
+ recordSession(input: {
18
+ sessionId: string;
19
+ provider: string;
20
+ workspaceId: string;
21
+ sourceLocator: string;
22
+ status: string;
23
+ observedAt: string;
24
+ }): void;
25
+ recordCapsule(trajectoryId: string, revision: number, capsuleHash: string, blobContentId: string): void;
26
+ getLatestCapsule<T = Record<string, unknown>>(trajectoryId: string): Promise<T>;
27
+ recordDisclosure(disclosureId: string, receiptHash: string, bytesUploaded: number): void;
28
+ listSessions(): unknown[];
29
+ close(): void;
30
+ }
31
+ export declare function loadExplicitTestKey(env: NodeJS.ProcessEnv): Buffer;
32
+ export declare function loadOrCreateVaultMasterKey(store?: SecureSecretStore): Promise<Buffer>;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAI5G,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAU;;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAItB,OAAO;WAMM,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAsCvD,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB7D,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAyCxF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAajD,aAAa,CAAC,KAAK,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QACzD,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;KAC3D,GAAG,IAAI;IASR,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAejG,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAQrF,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAaxF,YAAY,IAAI,OAAO,EAAE;IAMzB,KAAK,IAAI,IAAI;CASd;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAOlE;AAED,wBAAsB,0BAA0B,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAe3F"}
package/dist/index.js ADDED
@@ -0,0 +1,214 @@
1
+ import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'node:crypto';
2
+ import { createReadStream } from 'node:fs';
3
+ import { mkdir, open, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
4
+ import { dirname, resolve } from 'node:path';
5
+ import { DatabaseSync } from 'node:sqlite';
6
+ import { createSystemSecureStore } from '@dharma-ai-labs/agent-fabric-secure-store';
7
+ const BLOB_VERSION = 1;
8
+ export class LocalVault {
9
+ root;
10
+ #masterKey;
11
+ #database;
12
+ constructor(options, database) {
13
+ this.root = options.root;
14
+ this.#masterKey = options.masterKey;
15
+ this.#database = database;
16
+ }
17
+ static async open(options) {
18
+ if (options.masterKey.length !== 32)
19
+ throw new Error('Vault master key must contain exactly 32 bytes.');
20
+ await mkdir(resolve(options.root, 'blobs'), { recursive: true, mode: 0o700 });
21
+ const database = new DatabaseSync(resolve(options.root, 'vault.sqlite'));
22
+ database.exec(`
23
+ pragma journal_mode = WAL;
24
+ create table if not exists blobs (
25
+ content_id text primary key,
26
+ bytes integer not null,
27
+ kind text not null,
28
+ created_at text not null
29
+ );
30
+ create table if not exists sessions (
31
+ session_id text primary key,
32
+ provider text not null,
33
+ workspace_id text not null,
34
+ source_locator_hash text not null,
35
+ status text not null,
36
+ observed_at text not null
37
+ );
38
+ create table if not exists capsules (
39
+ trajectory_id text not null,
40
+ revision integer not null,
41
+ capsule_hash text not null,
42
+ blob_content_id text not null,
43
+ created_at text not null,
44
+ primary key (trajectory_id, revision)
45
+ );
46
+ create table if not exists disclosures (
47
+ disclosure_id text primary key,
48
+ receipt_hash text not null,
49
+ bytes_uploaded integer not null,
50
+ created_at text not null
51
+ );
52
+ `);
53
+ return new LocalVault(options, database);
54
+ }
55
+ async putBlob(plaintext, kind) {
56
+ const contentId = `sha256:${createHash('sha256').update(plaintext).digest('hex')}`;
57
+ const path = this.#blobPath(contentId);
58
+ const existing = this.#database.prepare('select content_id from blobs where content_id = ?').get(contentId);
59
+ if (existing)
60
+ return contentId;
61
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
62
+ const nonce = randomBytes(12);
63
+ const cipher = createCipheriv('aes-256-gcm', this.#masterKey, nonce);
64
+ const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
65
+ const tag = cipher.getAuthTag();
66
+ const envelope = Buffer.concat([Buffer.from([BLOB_VERSION]), nonce, tag, ciphertext]);
67
+ const temporary = `${path}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`;
68
+ await writeFile(temporary, envelope, { mode: 0o600, flag: 'wx' });
69
+ await rename(temporary, path);
70
+ this.#database.prepare('insert into blobs(content_id, bytes, kind, created_at) values (?, ?, ?, ?)').run(contentId, plaintext.byteLength, kind, new Date().toISOString());
71
+ return contentId;
72
+ }
73
+ async putFile(sourcePath, kind) {
74
+ const source = await stat(sourcePath);
75
+ if (!source.isFile() || source.size < 1)
76
+ throw new Error('Vault source must be a non-empty file.');
77
+ const nonce = randomBytes(12);
78
+ const cipher = createCipheriv('aes-256-gcm', this.#masterKey, nonce);
79
+ const hash = createHash('sha256');
80
+ const incoming = resolve(this.root, 'blobs', `.incoming-${process.pid}-${randomBytes(8).toString('hex')}`);
81
+ const destination = await open(incoming, 'wx', 0o600);
82
+ try {
83
+ await destination.write(Buffer.concat([Buffer.from([BLOB_VERSION]), nonce, Buffer.alloc(16)]));
84
+ for await (const value of createReadStream(sourcePath, { highWaterMark: 1_048_576 })) {
85
+ const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
86
+ hash.update(chunk);
87
+ const encrypted = cipher.update(chunk);
88
+ if (encrypted.length)
89
+ await destination.write(encrypted);
90
+ }
91
+ const final = cipher.final();
92
+ if (final.length)
93
+ await destination.write(final);
94
+ await destination.write(cipher.getAuthTag(), 0, 16, 13);
95
+ }
96
+ catch (error) {
97
+ await destination.close().catch(() => undefined);
98
+ await rm(incoming, { force: true });
99
+ throw error;
100
+ }
101
+ await destination.close();
102
+ const contentId = `sha256:${hash.digest('hex')}`;
103
+ const path = this.#blobPath(contentId);
104
+ const existing = this.#database.prepare('select content_id from blobs where content_id = ?').get(contentId);
105
+ if (existing) {
106
+ await rm(incoming, { force: true });
107
+ return { contentId, bytes: source.size };
108
+ }
109
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
110
+ await rename(incoming, path);
111
+ this.#database.prepare('insert into blobs(content_id, bytes, kind, created_at) values (?, ?, ?, ?)').run(contentId, source.size, kind, new Date().toISOString());
112
+ return { contentId, bytes: source.size };
113
+ }
114
+ async getBlob(contentId) {
115
+ const envelope = await readFile(this.#blobPath(contentId));
116
+ if (envelope[0] !== BLOB_VERSION || envelope.length < 29)
117
+ throw new Error('Unsupported or corrupt vault blob.');
118
+ const nonce = envelope.subarray(1, 13);
119
+ const tag = envelope.subarray(13, 29);
120
+ const decipher = createDecipheriv('aes-256-gcm', this.#masterKey, nonce);
121
+ decipher.setAuthTag(tag);
122
+ const plaintext = Buffer.concat([decipher.update(envelope.subarray(29)), decipher.final()]);
123
+ const actual = `sha256:${createHash('sha256').update(plaintext).digest('hex')}`;
124
+ if (actual !== contentId)
125
+ throw new Error('Vault content hash mismatch.');
126
+ return plaintext;
127
+ }
128
+ recordSession(input) {
129
+ const locatorHash = createHash('sha256').update(input.sourceLocator).digest('hex');
130
+ this.#database.prepare(`
131
+ insert into sessions(session_id, provider, workspace_id, source_locator_hash, status, observed_at)
132
+ values (?, ?, ?, ?, ?, ?)
133
+ on conflict(session_id) do update set status = excluded.status, observed_at = excluded.observed_at
134
+ `).run(input.sessionId, input.provider, input.workspaceId, locatorHash, input.status, input.observedAt);
135
+ }
136
+ recordCapsule(trajectoryId, revision, capsuleHash, blobContentId) {
137
+ const result = this.#database.prepare(`
138
+ insert into capsules(trajectory_id, revision, capsule_hash, blob_content_id, created_at)
139
+ values (?, ?, ?, ?, ?)
140
+ on conflict(trajectory_id, revision) do nothing
141
+ `).run(trajectoryId, revision, capsuleHash, blobContentId, new Date().toISOString());
142
+ if (result.changes > 0)
143
+ return;
144
+ const existing = this.#database.prepare(`
145
+ select capsule_hash from capsules where trajectory_id = ? and revision = ?
146
+ `).get(trajectoryId, revision);
147
+ if (existing?.capsule_hash !== capsuleHash) {
148
+ throw new Error('Trajectory capsule revision hash conflict.');
149
+ }
150
+ }
151
+ async getLatestCapsule(trajectoryId) {
152
+ const record = this.#database.prepare(`
153
+ select blob_content_id from capsules where trajectory_id = ? order by revision desc limit 1
154
+ `).get(trajectoryId);
155
+ if (!record)
156
+ throw new Error('Trajectory capsule is not available in the local vault.');
157
+ return JSON.parse((await this.getBlob(record.blob_content_id)).toString('utf8'));
158
+ }
159
+ recordDisclosure(disclosureId, receiptHash, bytesUploaded) {
160
+ if (!/^sha256:[a-f0-9]{64}$/.test(receiptHash) || !Number.isSafeInteger(bytesUploaded) || bytesUploaded < 0) {
161
+ throw new Error('Disclosure receipt is invalid.');
162
+ }
163
+ this.#database.prepare(`
164
+ insert into disclosures(disclosure_id, receipt_hash, bytes_uploaded, created_at)
165
+ values (?, ?, ?, ?)
166
+ on conflict(disclosure_id) do update set
167
+ receipt_hash = excluded.receipt_hash,
168
+ bytes_uploaded = excluded.bytes_uploaded
169
+ `).run(disclosureId, receiptHash, bytesUploaded, new Date().toISOString());
170
+ }
171
+ listSessions() {
172
+ return this.#database.prepare(`
173
+ select session_id, provider, workspace_id, status, observed_at from sessions order by observed_at desc
174
+ `).all();
175
+ }
176
+ close() {
177
+ this.#database.close();
178
+ }
179
+ #blobPath(contentId) {
180
+ if (!/^sha256:[a-f0-9]{64}$/.test(contentId))
181
+ throw new Error('Invalid content ID.');
182
+ const digest = contentId.slice('sha256:'.length);
183
+ return resolve(this.root, 'blobs', digest.slice(0, 2), `${digest}.blob`);
184
+ }
185
+ }
186
+ export function loadExplicitTestKey(env) {
187
+ if (env.DHARMA_ALLOW_ENV_KEY !== '1' || !env.DHARMA_VAULT_KEY) {
188
+ throw new Error('No secure operating-system key store is configured.');
189
+ }
190
+ const key = Buffer.from(env.DHARMA_VAULT_KEY, 'base64');
191
+ if (key.length !== 32)
192
+ throw new Error('DHARMA_VAULT_KEY must be a base64-encoded 32-byte key.');
193
+ return key;
194
+ }
195
+ export async function loadOrCreateVaultMasterKey(store) {
196
+ if (process.env.DHARMA_ALLOW_ENV_KEY === '1')
197
+ return loadExplicitTestKey(process.env);
198
+ const secureStore = store ?? await createSystemSecureStore();
199
+ const account = 'vault-master-key-v1';
200
+ const current = await secureStore.get(account);
201
+ if (current) {
202
+ const key = Buffer.from(current, 'base64');
203
+ if (key.length !== 32)
204
+ throw new Error('Stored vault master key is corrupt.');
205
+ return key;
206
+ }
207
+ const key = randomBytes(32);
208
+ await secureStore.put(account, key.toString('base64'));
209
+ const confirmed = await secureStore.get(account);
210
+ if (confirmed !== key.toString('base64'))
211
+ throw new Error('Secure store did not confirm the vault key write.');
212
+ return key;
213
+ }
214
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import assert from 'node:assert/strict';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { mkdtemp, readFile, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+ import { LocalVault, loadExplicitTestKey, loadOrCreateVaultMasterKey } from './index.js';
8
+ test('vault encrypts content and verifies it on read', async () => {
9
+ const root = await mkdtemp(join(tmpdir(), 'dharma-vault-'));
10
+ const vault = await LocalVault.open({ root, masterKey: randomBytes(32) });
11
+ const secret = Buffer.from('test-secret-value', 'utf8');
12
+ const contentId = await vault.putBlob(secret, 'provider-session');
13
+ assert.deepEqual(await vault.getBlob(contentId), secret);
14
+ const digest = contentId.slice('sha256:'.length);
15
+ const stored = await readFile(join(root, 'blobs', digest.slice(0, 2), `${digest}.blob`));
16
+ assert.equal(stored.includes(secret), false);
17
+ vault.close();
18
+ });
19
+ test('vault streams large provider files without buffering the plaintext', async () => {
20
+ const root = await mkdtemp(join(tmpdir(), 'dharma-vault-'));
21
+ const source = join(root, 'provider.jsonl');
22
+ const plaintext = Buffer.alloc(4 * 1024 * 1024, 'x');
23
+ await writeFile(source, plaintext);
24
+ const vault = await LocalVault.open({ root: join(root, 'vault'), masterKey: randomBytes(32) });
25
+ const stored = await vault.putFile(source, 'raw-provider-session');
26
+ assert.equal(stored.bytes, plaintext.length);
27
+ assert.deepEqual(await vault.getBlob(stored.contentId), plaintext);
28
+ vault.close();
29
+ });
30
+ test('vault master key is generated once in the operating-system store', async () => {
31
+ const values = new Map();
32
+ const store = {
33
+ backend: 'linux-secret-service',
34
+ async get(account) { return values.get(account) ?? null; },
35
+ async put(account, secret) { values.set(account, secret); },
36
+ async delete(account) { values.delete(account); },
37
+ };
38
+ const first = await loadOrCreateVaultMasterKey(store);
39
+ const second = await loadOrCreateVaultMasterKey(store);
40
+ assert.equal(first.length, 32);
41
+ assert.deepEqual(second, first);
42
+ });
43
+ test('vault accepts identical capsule retries and rejects revision drift', async () => {
44
+ const root = await mkdtemp(join(tmpdir(), 'dharma-vault-'));
45
+ const vault = await LocalVault.open({ root, masterKey: randomBytes(32) });
46
+ vault.recordCapsule('trajectory-1', 1, 'sha256:first', 'sha256:blob');
47
+ assert.doesNotThrow(() => vault.recordCapsule('trajectory-1', 1, 'sha256:first', 'sha256:blob'));
48
+ assert.throws(() => vault.recordCapsule('trajectory-1', 1, 'sha256:changed', 'sha256:other'), /revision hash conflict/);
49
+ vault.close();
50
+ });
51
+ test('vault resolves the latest capsule and records idempotent disclosure receipts', async () => {
52
+ const root = await mkdtemp(join(tmpdir(), 'dharma-vault-'));
53
+ const vault = await LocalVault.open({ root, masterKey: randomBytes(32) });
54
+ const firstBlob = await vault.putBlob(Buffer.from(JSON.stringify({ revision: 1 })), 'trajectory-capsule');
55
+ const secondBlob = await vault.putBlob(Buffer.from(JSON.stringify({ revision: 2 })), 'trajectory-capsule');
56
+ vault.recordCapsule('trajectory-1', 1, `sha256:${'1'.repeat(64)}`, firstBlob);
57
+ vault.recordCapsule('trajectory-1', 2, `sha256:${'2'.repeat(64)}`, secondBlob);
58
+ assert.deepEqual(await vault.getLatestCapsule('trajectory-1'), { revision: 2 });
59
+ assert.doesNotThrow(() => vault.recordDisclosure('response-1', `sha256:${'3'.repeat(64)}`, 42));
60
+ assert.doesNotThrow(() => vault.recordDisclosure('response-1', `sha256:${'3'.repeat(64)}`, 42));
61
+ vault.close();
62
+ });
63
+ test('environment keys fail closed unless explicitly enabled', () => {
64
+ const value = randomBytes(32).toString('base64');
65
+ assert.throws(() => loadExplicitTestKey({ DHARMA_VAULT_KEY: value }));
66
+ assert.equal(loadExplicitTestKey({ DHARMA_ALLOW_ENV_KEY: '1', DHARMA_VAULT_KEY: value }).length, 32);
67
+ });
68
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "@dharma-ai-labs/agent-fabric-local-vault",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "repository": { "type": "git", "url": "git+https://github.com/dharma-ai-labs/dharma-agent-fabric.git", "directory": "packages/local-vault" },
8
+ "exports": { ".": "./dist/index.js" },
9
+ "files": ["dist"],
10
+ "publishConfig": { "access": "public", "provenance": true },
11
+ "scripts": { "test": "node --test dist/*.test.js" },
12
+ "dependencies": { "@dharma-ai-labs/agent-fabric-secure-store": "0.1.0" }
13
+ }