@id-wispera/core 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.
Files changed (154) hide show
  1. package/README.md +268 -0
  2. package/dist/audit.d.ts +68 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +252 -0
  5. package/dist/audit.js.map +1 -0
  6. package/dist/auth/index.d.ts +8 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +8 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/keychainProvider.d.ts +40 -0
  11. package/dist/auth/keychainProvider.d.ts.map +1 -0
  12. package/dist/auth/keychainProvider.js +98 -0
  13. package/dist/auth/keychainProvider.js.map +1 -0
  14. package/dist/auth/passphraseProvider.d.ts +80 -0
  15. package/dist/auth/passphraseProvider.d.ts.map +1 -0
  16. package/dist/auth/passphraseProvider.js +188 -0
  17. package/dist/auth/passphraseProvider.js.map +1 -0
  18. package/dist/auth/sessionTokenManager.d.ts +106 -0
  19. package/dist/auth/sessionTokenManager.d.ts.map +1 -0
  20. package/dist/auth/sessionTokenManager.js +263 -0
  21. package/dist/auth/sessionTokenManager.js.map +1 -0
  22. package/dist/delegation.d.ts +81 -0
  23. package/dist/delegation.d.ts.map +1 -0
  24. package/dist/delegation.js +299 -0
  25. package/dist/delegation.js.map +1 -0
  26. package/dist/detection.d.ts +35 -0
  27. package/dist/detection.d.ts.map +1 -0
  28. package/dist/detection.js +474 -0
  29. package/dist/detection.js.map +1 -0
  30. package/dist/exec/execManager.d.ts +60 -0
  31. package/dist/exec/execManager.d.ts.map +1 -0
  32. package/dist/exec/execManager.js +226 -0
  33. package/dist/exec/execManager.js.map +1 -0
  34. package/dist/exec/index.d.ts +6 -0
  35. package/dist/exec/index.d.ts.map +1 -0
  36. package/dist/exec/index.js +5 -0
  37. package/dist/exec/index.js.map +1 -0
  38. package/dist/index.d.ts +35 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +98 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/integrations/base.d.ts +64 -0
  43. package/dist/integrations/base.d.ts.map +1 -0
  44. package/dist/integrations/base.js +173 -0
  45. package/dist/integrations/base.js.map +1 -0
  46. package/dist/integrations/envMapping.d.ts +47 -0
  47. package/dist/integrations/envMapping.d.ts.map +1 -0
  48. package/dist/integrations/envMapping.js +174 -0
  49. package/dist/integrations/envMapping.js.map +1 -0
  50. package/dist/integrations/google-a2a.d.ts +48 -0
  51. package/dist/integrations/google-a2a.d.ts.map +1 -0
  52. package/dist/integrations/google-a2a.js +108 -0
  53. package/dist/integrations/google-a2a.js.map +1 -0
  54. package/dist/integrations/index.d.ts +14 -0
  55. package/dist/integrations/index.d.ts.map +1 -0
  56. package/dist/integrations/index.js +14 -0
  57. package/dist/integrations/index.js.map +1 -0
  58. package/dist/integrations/langchain.d.ts +38 -0
  59. package/dist/integrations/langchain.d.ts.map +1 -0
  60. package/dist/integrations/langchain.js +45 -0
  61. package/dist/integrations/langchain.js.map +1 -0
  62. package/dist/integrations/openai-agents.d.ts +76 -0
  63. package/dist/integrations/openai-agents.d.ts.map +1 -0
  64. package/dist/integrations/openai-agents.js +95 -0
  65. package/dist/integrations/openai-agents.js.map +1 -0
  66. package/dist/integrations/slack.d.ts +59 -0
  67. package/dist/integrations/slack.d.ts.map +1 -0
  68. package/dist/integrations/slack.js +113 -0
  69. package/dist/integrations/slack.js.map +1 -0
  70. package/dist/integrations/types.d.ts +107 -0
  71. package/dist/integrations/types.d.ts.map +1 -0
  72. package/dist/integrations/types.js +6 -0
  73. package/dist/integrations/types.js.map +1 -0
  74. package/dist/locations.d.ts +157 -0
  75. package/dist/locations.d.ts.map +1 -0
  76. package/dist/locations.js +733 -0
  77. package/dist/locations.js.map +1 -0
  78. package/dist/passport.d.ts +70 -0
  79. package/dist/passport.d.ts.map +1 -0
  80. package/dist/passport.js +429 -0
  81. package/dist/passport.js.map +1 -0
  82. package/dist/policy.d.ts +80 -0
  83. package/dist/policy.d.ts.map +1 -0
  84. package/dist/policy.js +392 -0
  85. package/dist/policy.js.map +1 -0
  86. package/dist/providers/openclaw.d.ts +80 -0
  87. package/dist/providers/openclaw.d.ts.map +1 -0
  88. package/dist/providers/openclaw.js +712 -0
  89. package/dist/providers/openclaw.js.map +1 -0
  90. package/dist/provisioning/adminPassport.d.ts +51 -0
  91. package/dist/provisioning/adminPassport.d.ts.map +1 -0
  92. package/dist/provisioning/adminPassport.js +101 -0
  93. package/dist/provisioning/adminPassport.js.map +1 -0
  94. package/dist/provisioning/index.d.ts +81 -0
  95. package/dist/provisioning/index.d.ts.map +1 -0
  96. package/dist/provisioning/index.js +141 -0
  97. package/dist/provisioning/index.js.map +1 -0
  98. package/dist/provisioning/provider.d.ts +59 -0
  99. package/dist/provisioning/provider.d.ts.map +1 -0
  100. package/dist/provisioning/provider.js +52 -0
  101. package/dist/provisioning/provider.js.map +1 -0
  102. package/dist/provisioning/providers/anthropic.d.ts +32 -0
  103. package/dist/provisioning/providers/anthropic.d.ts.map +1 -0
  104. package/dist/provisioning/providers/anthropic.js +116 -0
  105. package/dist/provisioning/providers/anthropic.js.map +1 -0
  106. package/dist/provisioning/providers/aws.d.ts +29 -0
  107. package/dist/provisioning/providers/aws.d.ts.map +1 -0
  108. package/dist/provisioning/providers/aws.js +455 -0
  109. package/dist/provisioning/providers/aws.js.map +1 -0
  110. package/dist/provisioning/providers/azure-entra.d.ts +32 -0
  111. package/dist/provisioning/providers/azure-entra.d.ts.map +1 -0
  112. package/dist/provisioning/providers/azure-entra.js +312 -0
  113. package/dist/provisioning/providers/azure-entra.js.map +1 -0
  114. package/dist/provisioning/providers/github.d.ts +24 -0
  115. package/dist/provisioning/providers/github.d.ts.map +1 -0
  116. package/dist/provisioning/providers/github.js +219 -0
  117. package/dist/provisioning/providers/github.js.map +1 -0
  118. package/dist/provisioning/providers/google-cloud.d.ts +34 -0
  119. package/dist/provisioning/providers/google-cloud.d.ts.map +1 -0
  120. package/dist/provisioning/providers/google-cloud.js +366 -0
  121. package/dist/provisioning/providers/google-cloud.js.map +1 -0
  122. package/dist/provisioning/providers/openai.d.ts +29 -0
  123. package/dist/provisioning/providers/openai.d.ts.map +1 -0
  124. package/dist/provisioning/providers/openai.js +263 -0
  125. package/dist/provisioning/providers/openai.js.map +1 -0
  126. package/dist/provisioning/providers/sendgrid.d.ts +27 -0
  127. package/dist/provisioning/providers/sendgrid.d.ts.map +1 -0
  128. package/dist/provisioning/providers/sendgrid.js +186 -0
  129. package/dist/provisioning/providers/sendgrid.js.map +1 -0
  130. package/dist/provisioning/providers/twilio.d.ts +27 -0
  131. package/dist/provisioning/providers/twilio.d.ts.map +1 -0
  132. package/dist/provisioning/providers/twilio.js +194 -0
  133. package/dist/provisioning/providers/twilio.js.map +1 -0
  134. package/dist/provisioning/types.d.ts +274 -0
  135. package/dist/provisioning/types.d.ts.map +1 -0
  136. package/dist/provisioning/types.js +6 -0
  137. package/dist/provisioning/types.js.map +1 -0
  138. package/dist/sharing.d.ts +60 -0
  139. package/dist/sharing.d.ts.map +1 -0
  140. package/dist/sharing.js +305 -0
  141. package/dist/sharing.js.map +1 -0
  142. package/dist/types.d.ts +396 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +88 -0
  145. package/dist/types.js.map +1 -0
  146. package/dist/utils.d.ts +45 -0
  147. package/dist/utils.d.ts.map +1 -0
  148. package/dist/utils.js +110 -0
  149. package/dist/utils.js.map +1 -0
  150. package/dist/vault.d.ts +151 -0
  151. package/dist/vault.d.ts.map +1 -0
  152. package/dist/vault.js +499 -0
  153. package/dist/vault.js.map +1 -0
  154. package/package.json +117 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * ID Wispera Encrypted Vault
3
+ * Local-first encrypted storage using AES-256-GCM
4
+ */
5
+ import { Passport, AuditEntry, VaultConfig, VaultData, VaultState } from './types.js';
6
+ /**
7
+ * Scrypt parameters matching Python/Go SDKs for cross-SDK interoperability.
8
+ */
9
+ export declare const SCRYPT_PARAMS: {
10
+ readonly N: 16384;
11
+ readonly r: 8;
12
+ readonly p: 1;
13
+ readonly keyLen: 32;
14
+ };
15
+ /**
16
+ * Storage backend interface
17
+ */
18
+ export interface StorageBackend {
19
+ read(): Promise<VaultData | null>;
20
+ write(data: VaultData): Promise<void>;
21
+ exists(): Promise<boolean>;
22
+ delete(): Promise<void>;
23
+ }
24
+ /**
25
+ * In-memory storage backend (for testing)
26
+ */
27
+ export declare class MemoryStorageBackend implements StorageBackend {
28
+ private data;
29
+ read(): Promise<VaultData | null>;
30
+ write(data: VaultData): Promise<void>;
31
+ exists(): Promise<boolean>;
32
+ delete(): Promise<void>;
33
+ }
34
+ /**
35
+ * File system storage backend
36
+ */
37
+ export declare class FileSystemStorageBackend implements StorageBackend {
38
+ private path;
39
+ constructor(path: string);
40
+ read(): Promise<VaultData | null>;
41
+ write(data: VaultData): Promise<void>;
42
+ exists(): Promise<boolean>;
43
+ delete(): Promise<void>;
44
+ }
45
+ /**
46
+ * Encrypted vault for storing passports and audit logs
47
+ */
48
+ export declare class Vault {
49
+ private key;
50
+ private salt;
51
+ private iv;
52
+ private passports;
53
+ private auditLog;
54
+ private config;
55
+ private storage;
56
+ private createdAt;
57
+ private lastAccessedAt;
58
+ constructor(config: VaultConfig, storage?: StorageBackend);
59
+ /**
60
+ * Check if the vault is unlocked
61
+ */
62
+ get isUnlocked(): boolean;
63
+ /**
64
+ * Get vault state information
65
+ */
66
+ getState(): VaultState;
67
+ /**
68
+ * Initialize a new vault
69
+ */
70
+ init(passphrase: string): Promise<void>;
71
+ /**
72
+ * Unlock an existing vault
73
+ */
74
+ unlock(passphrase: string): Promise<void>;
75
+ /**
76
+ * Lock the vault (clear keys from memory)
77
+ */
78
+ lock(): void;
79
+ /**
80
+ * Save the vault to storage
81
+ */
82
+ private save;
83
+ /**
84
+ * Ensure vault is unlocked before operations
85
+ */
86
+ private ensureUnlocked;
87
+ /**
88
+ * Store a passport in the vault
89
+ */
90
+ storePassport(passport: Passport): Promise<void>;
91
+ /**
92
+ * Retrieve a passport by ID
93
+ */
94
+ retrievePassport(id: string): Promise<Passport | null>;
95
+ /**
96
+ * Delete a passport by ID
97
+ */
98
+ deletePassport(id: string): Promise<boolean>;
99
+ /**
100
+ * Get all passports
101
+ */
102
+ getAllPassports(): Promise<Passport[]>;
103
+ /**
104
+ * Add an entry to the audit log
105
+ */
106
+ addAuditEntry(entry: AuditEntry): Promise<void>;
107
+ /**
108
+ * Get audit log entries
109
+ */
110
+ getAuditLog(passportId?: string): Promise<AuditEntry[]>;
111
+ /**
112
+ * Export vault data (with credentials masked)
113
+ */
114
+ exportVault(format: 'json' | 'csv'): Promise<string>;
115
+ }
116
+ /**
117
+ * Migrate a v1 (PBKDF2) vault to v2 (Scrypt).
118
+ *
119
+ * 1. Reads the vault file and checks its version.
120
+ * 2. Decrypts with the v1 KDF (PBKDF2).
121
+ * 3. Re-encrypts with the v2 KDF (Scrypt).
122
+ * 4. Writes the updated vault with version 2.
123
+ *
124
+ * The passphrase does not change — only the key derivation function is upgraded.
125
+ */
126
+ export declare function migrateVault(passphrase: string, vaultPath?: string): Promise<{
127
+ migrated: boolean;
128
+ fromVersion: number;
129
+ toVersion: number;
130
+ }>;
131
+ /**
132
+ * Get the default vault path
133
+ */
134
+ export declare function getDefaultVaultPath(): string;
135
+ /**
136
+ * Initialize a new vault
137
+ */
138
+ export declare function initVault(passphrase: string, storagePath?: string): Promise<Vault>;
139
+ /**
140
+ * Unlock an existing vault
141
+ */
142
+ export declare function unlockVault(passphrase: string, storagePath?: string): Promise<Vault>;
143
+ /**
144
+ * Lock a vault
145
+ */
146
+ export declare function lockVault(vault: Vault): void;
147
+ /**
148
+ * Check if a vault exists
149
+ */
150
+ export declare function vaultExists(storagePath?: string): Promise<boolean>;
151
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
package/dist/vault.js ADDED
@@ -0,0 +1,499 @@
1
+ /**
2
+ * ID Wispera Encrypted Vault
3
+ * Local-first encrypted storage using AES-256-GCM
4
+ */
5
+ /// <reference lib="dom" />
6
+ import { VaultError, VAULT_DATA_VERSION, } from './types.js';
7
+ import { getRandomBytes, getCryptoSubtle, toBufferSource, maskValue } from './utils.js';
8
+ // ============================================================================
9
+ // Crypto Utilities
10
+ // ============================================================================
11
+ /**
12
+ * Convert bytes to hex string
13
+ */
14
+ function bytesToHex(bytes) {
15
+ return Array.from(bytes)
16
+ .map((b) => b.toString(16).padStart(2, '0'))
17
+ .join('');
18
+ }
19
+ /**
20
+ * Convert hex string to bytes
21
+ */
22
+ function hexToBytes(hex) {
23
+ const bytes = new Uint8Array(hex.length / 2);
24
+ for (let i = 0; i < hex.length; i += 2) {
25
+ bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
26
+ }
27
+ return bytes;
28
+ }
29
+ /**
30
+ * Convert string to bytes
31
+ */
32
+ function stringToBytes(str) {
33
+ return new TextEncoder().encode(str);
34
+ }
35
+ /**
36
+ * Convert bytes to string
37
+ */
38
+ function bytesToString(bytes) {
39
+ return new TextDecoder().decode(bytes);
40
+ }
41
+ /**
42
+ * Scrypt parameters matching Python/Go SDKs for cross-SDK interoperability.
43
+ */
44
+ export const SCRYPT_PARAMS = {
45
+ N: 16384, // 2^14 — CPU/memory cost
46
+ r: 8, // block size
47
+ p: 1, // parallelism
48
+ keyLen: 32, // 256-bit key
49
+ };
50
+ /**
51
+ * Derive encryption key from passphrase using the appropriate KDF for the vault version.
52
+ * - Version 1 (legacy): PBKDF2-SHA256, 100 000 iterations
53
+ * - Version 2 (current): Scrypt N=16384, r=8, p=1 — matches Python/Go SDKs
54
+ */
55
+ async function deriveKey(passphrase, salt, version = 2, iterations = 100000) {
56
+ let rawKey;
57
+ if (version >= 2) {
58
+ // Scrypt via Node.js crypto (not available in Web Crypto API)
59
+ const nodeCrypto = await import('crypto');
60
+ rawKey = nodeCrypto.scryptSync(passphrase, salt, SCRYPT_PARAMS.keyLen, { N: SCRYPT_PARAMS.N, r: SCRYPT_PARAMS.r, p: SCRYPT_PARAMS.p });
61
+ }
62
+ else {
63
+ // Legacy PBKDF2 for v1 vaults (backward compatibility)
64
+ const subtle = await getCryptoSubtle();
65
+ const keyMaterial = await subtle.importKey('raw', toBufferSource(stringToBytes(passphrase)), 'PBKDF2', false, ['deriveBits', 'deriveKey']);
66
+ return subtle.deriveKey({
67
+ name: 'PBKDF2',
68
+ salt: toBufferSource(salt),
69
+ iterations,
70
+ hash: 'SHA-256',
71
+ }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
72
+ }
73
+ // Import the raw Scrypt-derived bytes as a CryptoKey for AES-GCM
74
+ const subtle = await getCryptoSubtle();
75
+ return subtle.importKey('raw', toBufferSource(rawKey), { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
76
+ }
77
+ /**
78
+ * Encrypt data using AES-256-GCM
79
+ */
80
+ async function encrypt(data, key, iv) {
81
+ const crypto = await getCryptoSubtle();
82
+ const encrypted = await crypto.encrypt({ name: 'AES-GCM', iv: toBufferSource(iv) }, key, toBufferSource(stringToBytes(data)));
83
+ return bytesToHex(new Uint8Array(encrypted));
84
+ }
85
+ /**
86
+ * Decrypt data using AES-256-GCM
87
+ */
88
+ async function decrypt(encryptedHex, key, iv) {
89
+ const crypto = await getCryptoSubtle();
90
+ const decrypted = await crypto.decrypt({ name: 'AES-GCM', iv: toBufferSource(iv) }, key, toBufferSource(hexToBytes(encryptedHex)));
91
+ return bytesToString(new Uint8Array(decrypted));
92
+ }
93
+ /**
94
+ * In-memory storage backend (for testing)
95
+ */
96
+ export class MemoryStorageBackend {
97
+ data = null;
98
+ async read() {
99
+ return this.data;
100
+ }
101
+ async write(data) {
102
+ this.data = data;
103
+ }
104
+ async exists() {
105
+ return this.data !== null;
106
+ }
107
+ async delete() {
108
+ this.data = null;
109
+ }
110
+ }
111
+ /**
112
+ * File system storage backend
113
+ */
114
+ export class FileSystemStorageBackend {
115
+ path;
116
+ constructor(path) {
117
+ this.path = path;
118
+ }
119
+ async read() {
120
+ const fs = await import('fs/promises');
121
+ try {
122
+ const content = await fs.readFile(this.path, 'utf-8');
123
+ return JSON.parse(content);
124
+ }
125
+ catch (err) {
126
+ if (err.code === 'ENOENT') {
127
+ return null;
128
+ }
129
+ throw err;
130
+ }
131
+ }
132
+ async write(data) {
133
+ const fs = await import('fs/promises');
134
+ const path = await import('path');
135
+ const dir = path.dirname(this.path);
136
+ await fs.mkdir(dir, { recursive: true });
137
+ await fs.writeFile(this.path, JSON.stringify(data, null, 2), 'utf-8');
138
+ }
139
+ async exists() {
140
+ const fs = await import('fs/promises');
141
+ try {
142
+ await fs.access(this.path);
143
+ return true;
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ }
149
+ async delete() {
150
+ const fs = await import('fs/promises');
151
+ try {
152
+ await fs.unlink(this.path);
153
+ }
154
+ catch (err) {
155
+ if (err.code !== 'ENOENT') {
156
+ throw err;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ // ============================================================================
162
+ // Vault Class
163
+ // ============================================================================
164
+ /**
165
+ * Encrypted vault for storing passports and audit logs
166
+ */
167
+ export class Vault {
168
+ key = null;
169
+ salt = null;
170
+ iv = null;
171
+ passports = new Map();
172
+ auditLog = [];
173
+ config;
174
+ storage;
175
+ createdAt = new Date().toISOString();
176
+ lastAccessedAt = new Date().toISOString();
177
+ constructor(config, storage) {
178
+ this.config = config;
179
+ if (storage) {
180
+ this.storage = storage;
181
+ }
182
+ else if (config.storagePath) {
183
+ this.storage = new FileSystemStorageBackend(config.storagePath);
184
+ }
185
+ else {
186
+ this.storage = new MemoryStorageBackend();
187
+ }
188
+ }
189
+ /**
190
+ * Check if the vault is unlocked
191
+ */
192
+ get isUnlocked() {
193
+ return this.key !== null;
194
+ }
195
+ /**
196
+ * Get vault state information
197
+ */
198
+ getState() {
199
+ return {
200
+ isUnlocked: this.isUnlocked,
201
+ path: this.config.storagePath ?? ':memory:',
202
+ passportCount: this.passports.size,
203
+ createdAt: this.createdAt,
204
+ lastAccessedAt: this.lastAccessedAt,
205
+ };
206
+ }
207
+ /**
208
+ * Initialize a new vault
209
+ */
210
+ async init(passphrase) {
211
+ if (await this.storage.exists()) {
212
+ throw new VaultError('Vault already exists', 'VAULT_EXISTS');
213
+ }
214
+ this.salt = getRandomBytes(32);
215
+ this.iv = getRandomBytes(12);
216
+ this.key = await deriveKey(passphrase, this.salt, VAULT_DATA_VERSION, this.config.keyDerivationIterations);
217
+ this.createdAt = new Date().toISOString();
218
+ this.lastAccessedAt = new Date().toISOString();
219
+ await this.save();
220
+ }
221
+ /**
222
+ * Unlock an existing vault
223
+ */
224
+ async unlock(passphrase) {
225
+ const data = await this.storage.read();
226
+ if (!data) {
227
+ throw new VaultError('Vault does not exist', 'VAULT_NOT_FOUND');
228
+ }
229
+ if (data.version < 1 || data.version > VAULT_DATA_VERSION) {
230
+ throw new VaultError(`Unsupported vault version: ${data.version}`, 'UNSUPPORTED_VERSION', { version: data.version });
231
+ }
232
+ this.salt = hexToBytes(data.salt);
233
+ this.iv = hexToBytes(data.iv);
234
+ this.key = await deriveKey(passphrase, this.salt, data.version, this.config.keyDerivationIterations);
235
+ try {
236
+ // Try to decrypt passports to verify the key is correct
237
+ const passportsJson = await decrypt(data.encryptedPassports, this.key, this.iv);
238
+ const passports = JSON.parse(passportsJson);
239
+ this.passports = new Map(passports.map((p) => [p.id, p]));
240
+ const auditJson = await decrypt(data.encryptedAuditLog, this.key, this.iv);
241
+ this.auditLog = JSON.parse(auditJson);
242
+ this.createdAt = data.metadata.createdAt;
243
+ this.lastAccessedAt = new Date().toISOString();
244
+ }
245
+ catch {
246
+ this.key = null;
247
+ this.salt = null;
248
+ this.iv = null;
249
+ throw new VaultError('Invalid passphrase', 'INVALID_PASSPHRASE');
250
+ }
251
+ }
252
+ /**
253
+ * Lock the vault (clear keys from memory)
254
+ */
255
+ lock() {
256
+ this.key = null;
257
+ this.passports.clear();
258
+ this.auditLog = [];
259
+ }
260
+ /**
261
+ * Save the vault to storage
262
+ */
263
+ async save() {
264
+ if (!this.key || !this.salt || !this.iv) {
265
+ throw new VaultError('Vault is locked', 'VAULT_LOCKED');
266
+ }
267
+ const passportsJson = JSON.stringify(Array.from(this.passports.values()));
268
+ const auditJson = JSON.stringify(this.auditLog);
269
+ const data = {
270
+ version: VAULT_DATA_VERSION,
271
+ salt: bytesToHex(this.salt),
272
+ iv: bytesToHex(this.iv),
273
+ encryptedPassports: await encrypt(passportsJson, this.key, this.iv),
274
+ encryptedAuditLog: await encrypt(auditJson, this.key, this.iv),
275
+ metadata: {
276
+ createdAt: this.createdAt,
277
+ updatedAt: new Date().toISOString(),
278
+ passportCount: this.passports.size,
279
+ },
280
+ };
281
+ await this.storage.write(data);
282
+ }
283
+ /**
284
+ * Ensure vault is unlocked before operations
285
+ */
286
+ ensureUnlocked() {
287
+ if (!this.isUnlocked) {
288
+ throw new VaultError('Vault is locked', 'VAULT_LOCKED');
289
+ }
290
+ this.lastAccessedAt = new Date().toISOString();
291
+ }
292
+ // ============================================================================
293
+ // Passport Operations
294
+ // ============================================================================
295
+ /**
296
+ * Store a passport in the vault
297
+ */
298
+ async storePassport(passport) {
299
+ this.ensureUnlocked();
300
+ this.passports.set(passport.id, passport);
301
+ await this.save();
302
+ }
303
+ /**
304
+ * Retrieve a passport by ID
305
+ */
306
+ async retrievePassport(id) {
307
+ this.ensureUnlocked();
308
+ return this.passports.get(id) ?? null;
309
+ }
310
+ /**
311
+ * Delete a passport by ID
312
+ */
313
+ async deletePassport(id) {
314
+ this.ensureUnlocked();
315
+ const deleted = this.passports.delete(id);
316
+ if (deleted) {
317
+ await this.save();
318
+ }
319
+ return deleted;
320
+ }
321
+ /**
322
+ * Get all passports
323
+ */
324
+ async getAllPassports() {
325
+ this.ensureUnlocked();
326
+ return Array.from(this.passports.values());
327
+ }
328
+ // ============================================================================
329
+ // Audit Log Operations
330
+ // ============================================================================
331
+ /**
332
+ * Add an entry to the audit log
333
+ */
334
+ async addAuditEntry(entry) {
335
+ this.ensureUnlocked();
336
+ this.auditLog.push(entry);
337
+ await this.save();
338
+ }
339
+ /**
340
+ * Get audit log entries
341
+ */
342
+ async getAuditLog(passportId) {
343
+ this.ensureUnlocked();
344
+ if (passportId) {
345
+ return this.auditLog.filter((e) => e.passportId === passportId);
346
+ }
347
+ return [...this.auditLog];
348
+ }
349
+ // ============================================================================
350
+ // Export Operations
351
+ // ============================================================================
352
+ /**
353
+ * Export vault data (with credentials masked)
354
+ */
355
+ async exportVault(format) {
356
+ this.ensureUnlocked();
357
+ const maskedPassports = Array.from(this.passports.values()).map((p) => ({
358
+ ...p,
359
+ credentialValue: maskValue(p.credentialValue),
360
+ }));
361
+ if (format === 'json') {
362
+ return JSON.stringify({
363
+ passports: maskedPassports,
364
+ auditLog: this.auditLog,
365
+ exportedAt: new Date().toISOString(),
366
+ }, null, 2);
367
+ }
368
+ // CSV format
369
+ const headers = [
370
+ 'id',
371
+ 'name',
372
+ 'credentialType',
373
+ 'visaType',
374
+ 'status',
375
+ 'platforms',
376
+ 'humanOwner',
377
+ 'validFrom',
378
+ 'validUntil',
379
+ 'tags',
380
+ ];
381
+ const rows = maskedPassports.map((p) => [
382
+ p.id,
383
+ p.name,
384
+ p.credentialType,
385
+ p.visaType,
386
+ p.status,
387
+ p.platforms.join(';'),
388
+ p.humanOwner,
389
+ p.validFrom,
390
+ p.validUntil ?? '',
391
+ p.tags.join(';'),
392
+ ].join(','));
393
+ return [headers.join(','), ...rows].join('\n');
394
+ }
395
+ }
396
+ // ============================================================================
397
+ // Vault Migration
398
+ // ============================================================================
399
+ /**
400
+ * Migrate a v1 (PBKDF2) vault to v2 (Scrypt).
401
+ *
402
+ * 1. Reads the vault file and checks its version.
403
+ * 2. Decrypts with the v1 KDF (PBKDF2).
404
+ * 3. Re-encrypts with the v2 KDF (Scrypt).
405
+ * 4. Writes the updated vault with version 2.
406
+ *
407
+ * The passphrase does not change — only the key derivation function is upgraded.
408
+ */
409
+ export async function migrateVault(passphrase, vaultPath) {
410
+ const path = vaultPath ?? getDefaultVaultPath();
411
+ const storage = new FileSystemStorageBackend(path);
412
+ const data = await storage.read();
413
+ if (!data) {
414
+ throw new VaultError('Vault does not exist', 'VAULT_NOT_FOUND');
415
+ }
416
+ if (data.version >= VAULT_DATA_VERSION) {
417
+ return { migrated: false, fromVersion: data.version, toVersion: data.version };
418
+ }
419
+ const fromVersion = data.version;
420
+ // Decrypt with the old KDF
421
+ const salt = hexToBytes(data.salt);
422
+ const iv = hexToBytes(data.iv);
423
+ const oldKey = await deriveKey(passphrase, salt, fromVersion);
424
+ let passportsJson;
425
+ let auditJson;
426
+ try {
427
+ passportsJson = await decrypt(data.encryptedPassports, oldKey, iv);
428
+ auditJson = await decrypt(data.encryptedAuditLog, oldKey, iv);
429
+ }
430
+ catch {
431
+ throw new VaultError('Invalid passphrase', 'INVALID_PASSPHRASE');
432
+ }
433
+ // Re-encrypt with the new KDF (same salt, same IV — only the derived key changes)
434
+ const newSalt = getRandomBytes(32);
435
+ const newIv = getRandomBytes(12);
436
+ const newKey = await deriveKey(passphrase, newSalt, VAULT_DATA_VERSION);
437
+ const newData = {
438
+ version: VAULT_DATA_VERSION,
439
+ salt: bytesToHex(newSalt),
440
+ iv: bytesToHex(newIv),
441
+ encryptedPassports: await encrypt(passportsJson, newKey, newIv),
442
+ encryptedAuditLog: await encrypt(auditJson, newKey, newIv),
443
+ metadata: {
444
+ ...data.metadata,
445
+ updatedAt: new Date().toISOString(),
446
+ },
447
+ };
448
+ await storage.write(newData);
449
+ return { migrated: true, fromVersion, toVersion: VAULT_DATA_VERSION };
450
+ }
451
+ // ============================================================================
452
+ // Factory Functions
453
+ // ============================================================================
454
+ /**
455
+ * Get the default vault path
456
+ */
457
+ export function getDefaultVaultPath() {
458
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '.';
459
+ return `${home}/.id-wispera/vault.json`;
460
+ }
461
+ /**
462
+ * Initialize a new vault
463
+ */
464
+ export async function initVault(passphrase, storagePath) {
465
+ const path = storagePath ?? getDefaultVaultPath();
466
+ const vault = new Vault({
467
+ storagePath: path,
468
+ storageType: 'filesystem',
469
+ });
470
+ await vault.init(passphrase);
471
+ return vault;
472
+ }
473
+ /**
474
+ * Unlock an existing vault
475
+ */
476
+ export async function unlockVault(passphrase, storagePath) {
477
+ const path = storagePath ?? getDefaultVaultPath();
478
+ const vault = new Vault({
479
+ storagePath: path,
480
+ storageType: 'filesystem',
481
+ });
482
+ await vault.unlock(passphrase);
483
+ return vault;
484
+ }
485
+ /**
486
+ * Lock a vault
487
+ */
488
+ export function lockVault(vault) {
489
+ vault.lock();
490
+ }
491
+ /**
492
+ * Check if a vault exists
493
+ */
494
+ export async function vaultExists(storagePath) {
495
+ const path = storagePath ?? getDefaultVaultPath();
496
+ const storage = new FileSystemStorageBackend(path);
497
+ return storage.exists();
498
+ }
499
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}