@viewportai/daemon 0.5.3 → 0.6.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 (96) hide show
  1. package/dist/cli/commands.d.ts +1 -0
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +1 -0
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/context-access-command.d.ts +0 -6
  6. package/dist/cli/context-access-command.d.ts.map +1 -1
  7. package/dist/cli/context-access-command.js +1 -71
  8. package/dist/cli/context-access-command.js.map +1 -1
  9. package/dist/cli/context-command.d.ts.map +1 -1
  10. package/dist/cli/context-command.js +526 -38
  11. package/dist/cli/context-command.js.map +1 -1
  12. package/dist/cli/context-vault-metadata-command.d.ts.map +1 -1
  13. package/dist/cli/context-vault-metadata-command.js +6 -1
  14. package/dist/cli/context-vault-metadata-command.js.map +1 -1
  15. package/dist/cli/lifecycle-commands.d.ts.map +1 -1
  16. package/dist/cli/lifecycle-commands.js +2 -8
  17. package/dist/cli/lifecycle-commands.js.map +1 -1
  18. package/dist/cli/unlock-command.d.ts +2 -0
  19. package/dist/cli/unlock-command.d.ts.map +1 -0
  20. package/dist/cli/unlock-command.js +35 -0
  21. package/dist/cli/unlock-command.js.map +1 -0
  22. package/dist/context/local-edge-store.d.ts +11 -0
  23. package/dist/context/local-edge-store.d.ts.map +1 -1
  24. package/dist/context/local-edge-store.js +25 -0
  25. package/dist/context/local-edge-store.js.map +1 -1
  26. package/dist/context/local-edge-sync.d.ts +2 -15
  27. package/dist/context/local-edge-sync.d.ts.map +1 -1
  28. package/dist/context/local-edge-sync.js +244 -85
  29. package/dist/context/local-edge-sync.js.map +1 -1
  30. package/dist/context/local-edge-types.d.ts +12 -0
  31. package/dist/context/local-edge-types.d.ts.map +1 -1
  32. package/dist/hooks/trusted-edge-plan-artifacts.d.ts +30 -27
  33. package/dist/hooks/trusted-edge-plan-artifacts.d.ts.map +1 -1
  34. package/dist/hooks/trusted-edge-plan-artifacts.js +71 -89
  35. package/dist/hooks/trusted-edge-plan-artifacts.js.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +3 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/security/epoch-enrollment.d.ts +48 -0
  41. package/dist/security/epoch-enrollment.d.ts.map +1 -0
  42. package/dist/security/epoch-enrollment.js +290 -0
  43. package/dist/security/epoch-enrollment.js.map +1 -0
  44. package/dist/security/epoch-protocol.d.ts +181 -0
  45. package/dist/security/epoch-protocol.d.ts.map +1 -0
  46. package/dist/security/epoch-protocol.js +285 -0
  47. package/dist/security/epoch-protocol.js.map +1 -0
  48. package/dist/security/epoch-public-pins.d.ts +19 -0
  49. package/dist/security/epoch-public-pins.d.ts.map +1 -0
  50. package/dist/security/epoch-public-pins.js +129 -0
  51. package/dist/security/epoch-public-pins.js.map +1 -0
  52. package/dist/security/epoch-recovery.d.ts +56 -0
  53. package/dist/security/epoch-recovery.d.ts.map +1 -0
  54. package/dist/security/epoch-recovery.js +314 -0
  55. package/dist/security/epoch-recovery.js.map +1 -0
  56. package/dist/security/epoch-store.d.ts +111 -0
  57. package/dist/security/epoch-store.d.ts.map +1 -0
  58. package/dist/security/epoch-store.js +224 -0
  59. package/dist/security/epoch-store.js.map +1 -0
  60. package/dist/security/epoch-sync.d.ts +47 -0
  61. package/dist/security/epoch-sync.d.ts.map +1 -0
  62. package/dist/security/epoch-sync.js +371 -0
  63. package/dist/security/epoch-sync.js.map +1 -0
  64. package/dist/security/team-epoch-grants.d.ts +28 -0
  65. package/dist/security/team-epoch-grants.d.ts.map +1 -0
  66. package/dist/security/team-epoch-grants.js +256 -0
  67. package/dist/security/team-epoch-grants.js.map +1 -0
  68. package/dist/server/http-context-routes.d.ts +2 -1
  69. package/dist/server/http-context-routes.d.ts.map +1 -1
  70. package/dist/server/http-context-routes.js +46 -15
  71. package/dist/server/http-context-routes.js.map +1 -1
  72. package/dist/server/http-server.js +1 -1
  73. package/dist/server/http-server.js.map +1 -1
  74. package/dist/server/rate-limiter.d.ts.map +1 -1
  75. package/dist/server/rate-limiter.js +2 -1
  76. package/dist/server/rate-limiter.js.map +1 -1
  77. package/dist/server/trusted-edge-command-capability.d.ts +1 -1
  78. package/dist/server/trusted-edge-command-capability.d.ts.map +1 -1
  79. package/dist/server/trusted-edge-command-capability.js +11 -0
  80. package/dist/server/trusted-edge-command-capability.js.map +1 -1
  81. package/dist/server/ws-command-handlers.d.ts.map +1 -1
  82. package/dist/server/ws-command-handlers.js +124 -28
  83. package/dist/server/ws-command-handlers.js.map +1 -1
  84. package/dist/server/ws-protocol.d.ts +268 -44
  85. package/dist/server/ws-protocol.d.ts.map +1 -1
  86. package/dist/server/ws-protocol.js +81 -19
  87. package/dist/server/ws-protocol.js.map +1 -1
  88. package/dist/startup.d.ts.map +1 -1
  89. package/dist/startup.js +0 -17
  90. package/dist/startup.js.map +1 -1
  91. package/docs/protocol-matrix.json +40 -8
  92. package/node_modules/@viewportai/context-engine/src/repo/materializer.js +20 -5
  93. package/node_modules/@viewportai/context-engine/src/repo/membership.js +15 -0
  94. package/node_modules/@viewportai/context-engine/src/repo/sync.js +4 -4
  95. package/node_modules/@viewportai/context-engine/src/repo/vault.js +8 -3
  96. package/package.json +1 -1
@@ -0,0 +1,314 @@
1
+ import crypto from 'node:crypto';
2
+ import { transportFetch } from '../cli/network.js';
3
+ import { configDir } from '../core/config.js';
4
+ import { getActiveLocalUserEpoch, upsertLocalUserEpoch, } from './epoch-store.js';
5
+ import { canonicalJson, fingerprintPayload, TRUSTED_EDGE_CRYPTO_PROTOCOL_HEADER, TRUSTED_EDGE_CRYPTO_PROTOCOL_VERSION, } from './epoch-protocol.js';
6
+ import { rotateUserCryptoEpoch } from './epoch-sync.js';
7
+ export const USER_EPOCH_RECOVERY_BACKUP_SCHEMA = 'viewport.user_epoch_recovery_backup/v1';
8
+ const USER_EPOCH_RECOVERY_PAYLOAD_SCHEMA = 'viewport.user_epoch_recovery_payload/v1';
9
+ const USER_EPOCH_RECOVERY_ENVELOPE_SCHEMA = 'viewport.user_epoch_recovery_envelope/v1';
10
+ const RECOVERY_KDF = 'scrypt-sha256/v1';
11
+ export function generateUserEpochRecoveryKey() {
12
+ return `vprk_${crypto.randomBytes(32).toString('base64url')}`;
13
+ }
14
+ export async function createUserEpochRecoveryBackup(options) {
15
+ const epoch = await getActiveLocalUserEpoch(options.target.workspaceId, options.home);
16
+ if (!epoch?.platformEpochId) {
17
+ throw new Error('Active local user epoch with platform id is required before backup.');
18
+ }
19
+ const payload = {
20
+ schema: USER_EPOCH_RECOVERY_PAYLOAD_SCHEMA,
21
+ workspaceId: epoch.workspaceId,
22
+ userId: epoch.userId,
23
+ userCryptoEpochId: epoch.platformEpochId,
24
+ userEpochFingerprint: epoch.fingerprint,
25
+ epoch: {
26
+ workspaceId: epoch.workspaceId,
27
+ userId: epoch.userId,
28
+ platformEpochId: epoch.platformEpochId,
29
+ epoch: epoch.epoch,
30
+ schema: epoch.schema,
31
+ status: 'active',
32
+ encryptionPublicKeyJwk: epoch.encryptionPublicKeyJwk,
33
+ encryptionPrivateKeyJwk: epoch.encryptionPrivateKeyJwk,
34
+ signingPublicKeyJwk: epoch.signingPublicKeyJwk,
35
+ signingPrivateKeyJwk: epoch.signingPrivateKeyJwk,
36
+ fingerprint: epoch.fingerprint,
37
+ previousEpochFingerprint: epoch.previousEpochFingerprint ?? null,
38
+ },
39
+ };
40
+ const kdfParams = recoveryKdfParams();
41
+ const aad = recoveryAad(payload);
42
+ const encryptedPayload = encryptRecoveryPayload({
43
+ recoveryKey: options.recoveryKey,
44
+ kdfParams,
45
+ aad,
46
+ payload,
47
+ });
48
+ const response = await postJson(options.fetchImpl ?? transportFetch, `${runtimeBaseUrl(options.target)}/crypto/user-key-backups`, {
49
+ credential: options.target.credential,
50
+ schema: USER_EPOCH_RECOVERY_BACKUP_SCHEMA,
51
+ user_crypto_epoch_id: epoch.platformEpochId,
52
+ kdf: RECOVERY_KDF,
53
+ kdf_params: kdfParams,
54
+ encrypted_payload: encryptedPayload,
55
+ }, options.target);
56
+ return userKeyBackupResponse(response);
57
+ }
58
+ export async function restoreUserEpochFromRecoveryBackup(options) {
59
+ const fetchImpl = options.fetchImpl ?? transportFetch;
60
+ const backup = userKeyBackupResponse(await getJson(fetchImpl, `${runtimeBaseUrl(options.target)}/crypto/user-key-backups/latest`, options.target));
61
+ const payload = decryptRecoveryPayload({
62
+ recoveryKey: options.recoveryKey,
63
+ kdfParams: backup.kdf_params,
64
+ envelope: backup.encrypted_payload,
65
+ });
66
+ if (payload.workspaceId !== options.target.workspaceId ||
67
+ payload.userCryptoEpochId !== backup.user_crypto_epoch_id ||
68
+ payload.userEpochFingerprint !== payload.epoch.fingerprint) {
69
+ throw new Error('Recovery backup payload does not match the backup metadata.');
70
+ }
71
+ const restoredEpoch = await upsertLocalUserEpoch(payload.epoch, options.home ?? configDir());
72
+ const rotatedEpoch = await rotateUserCryptoEpoch({
73
+ target: options.target,
74
+ reason: 'recovery',
75
+ home: options.home,
76
+ fetchImpl,
77
+ });
78
+ const rotatedBackup = await createUserEpochRecoveryBackup({
79
+ target: options.target,
80
+ recoveryKey: options.recoveryKey,
81
+ home: options.home,
82
+ fetchImpl,
83
+ });
84
+ return { backup, restoredEpoch, rotatedEpoch, rotatedBackup };
85
+ }
86
+ function encryptRecoveryPayload(input) {
87
+ const iv = crypto.randomBytes(12);
88
+ const aad = Buffer.from(canonicalJson(input.aad));
89
+ const cipher = crypto.createCipheriv('aes-256-gcm', deriveRecoveryKey(input.recoveryKey, input.kdfParams), iv);
90
+ cipher.setAAD(aad);
91
+ const ciphertext = Buffer.concat([
92
+ cipher.update(Buffer.from(canonicalJson(input.payload))),
93
+ cipher.final(),
94
+ ]);
95
+ return {
96
+ schema: USER_EPOCH_RECOVERY_ENVELOPE_SCHEMA,
97
+ alg: 'aes-256-gcm',
98
+ aad: input.aad,
99
+ iv: iv.toString('base64url'),
100
+ ciphertext: ciphertext.toString('base64url'),
101
+ tag: cipher.getAuthTag().toString('base64url'),
102
+ aadDigest: fingerprintPayload(input.aad),
103
+ createdAt: new Date().toISOString(),
104
+ };
105
+ }
106
+ function decryptRecoveryPayload(input) {
107
+ if (input.envelope.schema !== USER_EPOCH_RECOVERY_ENVELOPE_SCHEMA) {
108
+ throw new Error('Unsupported recovery envelope schema.');
109
+ }
110
+ if (input.envelope.alg !== 'aes-256-gcm') {
111
+ throw new Error('Unsupported recovery envelope algorithm.');
112
+ }
113
+ const aad = input.envelope.aad;
114
+ const decipher = crypto.createDecipheriv('aes-256-gcm', deriveRecoveryKey(input.recoveryKey, input.kdfParams), Buffer.from(input.envelope.iv, 'base64url'));
115
+ decipher.setAAD(Buffer.from(canonicalJson(aad)));
116
+ decipher.setAuthTag(Buffer.from(input.envelope.tag, 'base64url'));
117
+ const plaintext = Buffer.concat([
118
+ decipher.update(Buffer.from(input.envelope.ciphertext, 'base64url')),
119
+ decipher.final(),
120
+ ]);
121
+ const payload = recoveryBackupPayload(JSON.parse(plaintext.toString('utf8')));
122
+ const expectedAad = recoveryAad(payload);
123
+ if (input.envelope.aadDigest !== fingerprintPayload(expectedAad)) {
124
+ throw new Error('Recovery backup AAD mismatch.');
125
+ }
126
+ return payload;
127
+ }
128
+ function recoveryAad(payload) {
129
+ return {
130
+ schema: USER_EPOCH_RECOVERY_BACKUP_SCHEMA,
131
+ workspaceId: payload.workspaceId,
132
+ userId: payload.userId,
133
+ userCryptoEpochId: payload.userCryptoEpochId,
134
+ userEpochFingerprint: payload.userEpochFingerprint,
135
+ };
136
+ }
137
+ function recoveryKdfParams() {
138
+ return {
139
+ salt: crypto.randomBytes(16).toString('base64url'),
140
+ keyLength: 32,
141
+ N: 32768,
142
+ r: 8,
143
+ p: 1,
144
+ };
145
+ }
146
+ function deriveRecoveryKey(recoveryKey, params) {
147
+ return crypto.scryptSync(recoveryKey, Buffer.from(params.salt, 'base64url'), params.keyLength, {
148
+ N: params.N,
149
+ r: params.r,
150
+ p: params.p,
151
+ maxmem: 128 * 1024 * 1024,
152
+ });
153
+ }
154
+ function runtimeBaseUrl(target) {
155
+ return `${target.serverUrl.replace(/\/+$/, '')}/api/runtime/workspaces/${encodeURIComponent(target.workspaceId)}`;
156
+ }
157
+ async function getJson(fetchImpl, url, transportOptions) {
158
+ const requestUrl = new URL(url);
159
+ requestUrl.searchParams.set('credential', transportOptions.credential);
160
+ const response = await fetchImpl(requestUrl.toString(), {
161
+ method: 'GET',
162
+ headers: trustedEdgeCryptoHeaders(),
163
+ timeoutMs: 5_000,
164
+ tlsVerify: transportOptions.tlsVerify,
165
+ caCertPath: transportOptions.caCertPath,
166
+ tlsPins: transportOptions.tlsPins,
167
+ });
168
+ const payload = await response.json().catch(() => null);
169
+ if (!response.ok) {
170
+ const message = payload && typeof payload === 'object' && 'message' in payload
171
+ ? String(payload.message)
172
+ : `${response.status} ${response.statusText}`;
173
+ throw new Error(`Recovery backup sync failed: ${message}`);
174
+ }
175
+ return payload;
176
+ }
177
+ async function postJson(fetchImpl, url, body, transportOptions) {
178
+ const response = await fetchImpl(url, {
179
+ method: 'POST',
180
+ headers: trustedEdgeCryptoHeaders({ 'content-type': 'application/json' }),
181
+ body: JSON.stringify(body),
182
+ timeoutMs: 5_000,
183
+ tlsVerify: transportOptions.tlsVerify,
184
+ caCertPath: transportOptions.caCertPath,
185
+ tlsPins: transportOptions.tlsPins,
186
+ });
187
+ const payload = await response.json().catch(() => null);
188
+ if (!response.ok) {
189
+ const message = payload && typeof payload === 'object' && 'message' in payload
190
+ ? String(payload.message)
191
+ : `${response.status} ${response.statusText}`;
192
+ throw new Error(`Recovery backup sync failed: ${message}`);
193
+ }
194
+ return payload;
195
+ }
196
+ function trustedEdgeCryptoHeaders(extra = {}) {
197
+ return {
198
+ accept: 'application/json',
199
+ [TRUSTED_EDGE_CRYPTO_PROTOCOL_HEADER]: TRUSTED_EDGE_CRYPTO_PROTOCOL_VERSION,
200
+ ...extra,
201
+ };
202
+ }
203
+ function userKeyBackupResponse(value) {
204
+ const data = objectField(value, 'data');
205
+ const schema = stringField(data, 'schema');
206
+ const kdf = stringField(data, 'kdf');
207
+ if (schema !== USER_EPOCH_RECOVERY_BACKUP_SCHEMA) {
208
+ throw new Error(`Unsupported recovery backup schema: ${schema}`);
209
+ }
210
+ if (kdf !== RECOVERY_KDF) {
211
+ throw new Error(`Unsupported recovery backup KDF: ${kdf}`);
212
+ }
213
+ return {
214
+ id: stringField(data, 'id'),
215
+ workspace_id: stringField(data, 'workspace_id'),
216
+ user_id: numberOrStringField(data, 'user_id'),
217
+ user_crypto_epoch_id: stringField(data, 'user_crypto_epoch_id'),
218
+ schema,
219
+ status: stringField(data, 'status'),
220
+ kdf,
221
+ kdf_params: recoveryKdfParamsResponse(objectField(data, 'kdf_params')),
222
+ encrypted_payload: recoveryEnvelope(objectField(data, 'encrypted_payload')),
223
+ created_at: typeof data.created_at === 'string' ? data.created_at : null,
224
+ };
225
+ }
226
+ function recoveryKdfParamsResponse(value) {
227
+ return {
228
+ salt: stringField(value, 'salt'),
229
+ keyLength: numberField(value, 'keyLength'),
230
+ N: numberField(value, 'N'),
231
+ r: numberField(value, 'r'),
232
+ p: numberField(value, 'p'),
233
+ };
234
+ }
235
+ function recoveryEnvelope(value) {
236
+ return {
237
+ schema: expectLiteral(stringField(value, 'schema'), USER_EPOCH_RECOVERY_ENVELOPE_SCHEMA, 'recovery envelope schema'),
238
+ alg: expectLiteral(stringField(value, 'alg'), 'aes-256-gcm', 'recovery envelope algorithm'),
239
+ aad: (value.aad ?? null),
240
+ iv: stringField(value, 'iv'),
241
+ ciphertext: stringField(value, 'ciphertext'),
242
+ tag: stringField(value, 'tag'),
243
+ aadDigest: stringField(value, 'aadDigest'),
244
+ createdAt: stringField(value, 'createdAt'),
245
+ };
246
+ }
247
+ function recoveryBackupPayload(value) {
248
+ const data = objectValue(value);
249
+ return {
250
+ schema: expectLiteral(stringField(data, 'schema'), USER_EPOCH_RECOVERY_PAYLOAD_SCHEMA, 'recovery payload schema'),
251
+ workspaceId: stringField(data, 'workspaceId'),
252
+ userId: stringField(data, 'userId'),
253
+ userCryptoEpochId: stringField(data, 'userCryptoEpochId'),
254
+ userEpochFingerprint: stringField(data, 'userEpochFingerprint'),
255
+ epoch: localUserEpochPayload(objectField(data, 'epoch')),
256
+ };
257
+ }
258
+ function localUserEpochPayload(data) {
259
+ return {
260
+ workspaceId: stringField(data, 'workspaceId'),
261
+ userId: stringField(data, 'userId'),
262
+ platformEpochId: typeof data.platformEpochId === 'string' ? data.platformEpochId : null,
263
+ epoch: numberField(data, 'epoch'),
264
+ schema: 'viewport.user_crypto_epoch/v1',
265
+ status: 'active',
266
+ encryptionPublicKeyJwk: objectField(data, 'encryptionPublicKeyJwk'),
267
+ encryptionPrivateKeyJwk: objectField(data, 'encryptionPrivateKeyJwk'),
268
+ signingPublicKeyJwk: objectField(data, 'signingPublicKeyJwk'),
269
+ signingPrivateKeyJwk: objectField(data, 'signingPrivateKeyJwk'),
270
+ fingerprint: stringField(data, 'fingerprint'),
271
+ previousEpochFingerprint: typeof data.previousEpochFingerprint === 'string' ? data.previousEpochFingerprint : null,
272
+ };
273
+ }
274
+ function objectField(value, field) {
275
+ const object = objectValue(value);
276
+ const child = object[field];
277
+ if (!child || typeof child !== 'object' || Array.isArray(child)) {
278
+ throw new Error(`Recovery backup response did not include ${field}`);
279
+ }
280
+ return child;
281
+ }
282
+ function objectValue(value) {
283
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
284
+ throw new Error('Expected recovery backup object.');
285
+ }
286
+ return value;
287
+ }
288
+ function stringField(value, field) {
289
+ const child = value[field];
290
+ if (typeof child !== 'string' || child.trim().length === 0) {
291
+ throw new Error(`Recovery backup response did not include ${field}`);
292
+ }
293
+ return child;
294
+ }
295
+ function numberField(value, field) {
296
+ const child = value[field];
297
+ if (typeof child !== 'number') {
298
+ throw new Error(`Recovery backup response did not include numeric ${field}`);
299
+ }
300
+ return child;
301
+ }
302
+ function numberOrStringField(value, field) {
303
+ const child = value[field];
304
+ if (typeof child !== 'number' && typeof child !== 'string') {
305
+ throw new Error(`Recovery backup response did not include ${field}`);
306
+ }
307
+ return child;
308
+ }
309
+ function expectLiteral(value, expected, label) {
310
+ if (value !== expected)
311
+ throw new Error(`Unsupported ${label}: ${value}`);
312
+ return expected;
313
+ }
314
+ //# sourceMappingURL=epoch-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch-recovery.js","sourceRoot":"","sources":["../../src/security/epoch-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { TEAM_EPOCH_SCHEMA, USER_EPOCH_SCHEMA, type EpochDescriptor, type JsonValue } from './epoch-protocol.js';
2
+ export interface LocalUserCryptoEpoch {
3
+ workspaceId: string;
4
+ userId: string;
5
+ platformEpochId?: string | null;
6
+ epoch: number;
7
+ schema: typeof USER_EPOCH_SCHEMA;
8
+ status: 'active' | 'superseded' | 'revoked';
9
+ encryptionPublicKeyJwk: JsonValue;
10
+ encryptionPrivateKeyJwk: JsonValue;
11
+ signingPublicKeyJwk: JsonValue;
12
+ signingPrivateKeyJwk: JsonValue;
13
+ fingerprint: string;
14
+ previousEpochFingerprint?: string | null;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ }
18
+ export interface LocalTeamCryptoEpoch {
19
+ workspaceId: string;
20
+ teamId: string;
21
+ platformTeamId?: string | null;
22
+ platformEpochId?: string | null;
23
+ epoch: number;
24
+ schema: typeof TEAM_EPOCH_SCHEMA;
25
+ status: 'active' | 'superseded' | 'revoked';
26
+ encryptionPublicKeyJwk: JsonValue;
27
+ encryptionPrivateKeyJwk: JsonValue;
28
+ signingPublicKeyJwk: JsonValue;
29
+ signingPrivateKeyJwk: JsonValue;
30
+ fingerprint: string;
31
+ previousEpochFingerprint?: string | null;
32
+ createdAt: string;
33
+ updatedAt: string;
34
+ }
35
+ export interface LocalDeviceEnrollment {
36
+ workspaceId: string;
37
+ enrollmentId?: string | null;
38
+ userId?: string | null;
39
+ deviceId: string;
40
+ deviceLabel: string;
41
+ status: 'pending' | 'approved' | 'accepted' | 'revoked';
42
+ encryptionPublicKeyJwk: JsonValue;
43
+ encryptionPrivateKeyJwk: JsonValue;
44
+ signingPublicKeyJwk: JsonValue;
45
+ signingPrivateKeyJwk: JsonValue;
46
+ fingerprint: string;
47
+ nonce: string;
48
+ createdAt: string;
49
+ updatedAt: string;
50
+ }
51
+ export interface LocalPublicEpochPin {
52
+ workspaceId: string;
53
+ subjectType: 'user' | 'team';
54
+ subjectId: string;
55
+ platformEpochId: string;
56
+ epoch: number;
57
+ schema: typeof USER_EPOCH_SCHEMA | typeof TEAM_EPOCH_SCHEMA;
58
+ fingerprint: string;
59
+ encryptionPublicKeyJwk: JsonValue;
60
+ signingPublicKeyJwk: JsonValue;
61
+ previousEpochFingerprint?: string | null;
62
+ continuityPayload?: JsonValue | null;
63
+ continuitySignature?: string | null;
64
+ signedByEpochFingerprint?: string | null;
65
+ createdAt: string;
66
+ updatedAt: string;
67
+ }
68
+ export declare function getActiveLocalUserEpoch(workspaceId: string, home?: string): Promise<LocalUserCryptoEpoch | null>;
69
+ export declare function getActiveLocalTeamEpoch(workspaceId: string, teamId: string, home?: string): Promise<LocalTeamCryptoEpoch | null>;
70
+ export declare function listActiveLocalTeamEpochs(workspaceId: string, home?: string): Promise<LocalTeamCryptoEpoch[]>;
71
+ export declare function getLocalTeamEpochByPlatformId(workspaceId: string, platformEpochId: string, home?: string): Promise<LocalTeamCryptoEpoch | null>;
72
+ export declare function getLocalUserEpochByPlatformId(workspaceId: string, platformEpochId: string, home?: string): Promise<LocalUserCryptoEpoch | null>;
73
+ export declare function getLocalDeviceEnrollment(workspaceId: string, enrollmentIdOrFingerprint: string, home?: string): Promise<LocalDeviceEnrollment | null>;
74
+ export declare function upsertLocalUserEpoch(input: Omit<LocalUserCryptoEpoch, 'createdAt' | 'updatedAt'>, home?: string): Promise<LocalUserCryptoEpoch>;
75
+ export declare function upsertLocalTeamEpoch(input: Omit<LocalTeamCryptoEpoch, 'createdAt' | 'updatedAt'>, home?: string): Promise<LocalTeamCryptoEpoch>;
76
+ export declare function upsertLocalDeviceEnrollment(input: Omit<LocalDeviceEnrollment, 'createdAt' | 'updatedAt'>, home?: string): Promise<LocalDeviceEnrollment>;
77
+ export declare function getLocalPublicEpochPin(input: {
78
+ workspaceId: string;
79
+ subjectType: 'user' | 'team';
80
+ subjectId: string;
81
+ }, home?: string): Promise<LocalPublicEpochPin | null>;
82
+ export declare function upsertLocalPublicEpochPin(input: Omit<LocalPublicEpochPin, 'createdAt' | 'updatedAt'>, home?: string): Promise<LocalPublicEpochPin>;
83
+ export declare function createLocalUserEpochKeyMaterial(input: {
84
+ workspaceId: string;
85
+ userId?: string;
86
+ epoch?: number;
87
+ previousEpochFingerprint?: string | null;
88
+ }): {
89
+ descriptor: EpochDescriptor;
90
+ encryptionPrivateKeyJwk: JsonValue;
91
+ signingPrivateKeyJwk: JsonValue;
92
+ };
93
+ export declare function createLocalTeamEpochKeyMaterial(input: {
94
+ workspaceId: string;
95
+ teamId: string;
96
+ epoch?: number;
97
+ previousEpochFingerprint?: string | null;
98
+ }): {
99
+ descriptor: EpochDescriptor;
100
+ encryptionPrivateKeyJwk: JsonValue;
101
+ signingPrivateKeyJwk: JsonValue;
102
+ };
103
+ export declare function createLocalDeviceEnrollmentKeyMaterial(input: {
104
+ workspaceId: string;
105
+ deviceId: string;
106
+ deviceLabel: string;
107
+ nonce?: string;
108
+ }): {
109
+ enrollment: Omit<LocalDeviceEnrollment, 'enrollmentId' | 'userId' | 'fingerprint' | 'status' | 'createdAt' | 'updatedAt'>;
110
+ };
111
+ //# sourceMappingURL=epoch-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch-store.d.ts","sourceRoot":"","sources":["../../src/security/epoch-store.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,MAAM,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5C,sBAAsB,EAAE,SAAS,CAAC;IAClC,uBAAuB,EAAE,SAAS,CAAC;IACnC,mBAAmB,EAAE,SAAS,CAAC;IAC/B,oBAAoB,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,iBAAiB,CAAC;IACjC,MAAM,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5C,sBAAsB,EAAE,SAAS,CAAC;IAClC,uBAAuB,EAAE,SAAS,CAAC;IACnC,mBAAmB,EAAE,SAAS,CAAC;IAC/B,oBAAoB,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,sBAAsB,EAAE,SAAS,CAAC;IAClC,uBAAuB,EAAE,SAAS,CAAC;IACnC,mBAAmB,EAAE,SAAS,CAAC;IAC/B,oBAAoB,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,iBAAiB,GAAG,OAAO,iBAAiB,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,SAAS,CAAC;IAClC,mBAAmB,EAAE,SAAS,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,iBAAiB,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAOtC;AAED,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAYtC;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAKjC;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAUtC;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAUtC;AAED,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,yBAAyB,EAAE,MAAM,EACjC,IAAI,SAAc,GACjB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAUvC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,WAAW,CAAC,EAC5D,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAsB/B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,WAAW,CAAC,EAC5D,IAAI,SAAc,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,WAAW,GAAG,WAAW,CAAC,EAC7D,IAAI,SAAc,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAmBhC;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE;IACL,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,IAAI,SAAc,GACjB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAYrC;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,WAAW,CAAC,EAC3D,IAAI,SAAc,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAoB9B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C,GAAG;IACF,UAAU,EAAE,eAAe,CAAC;IAC5B,uBAAuB,EAAE,SAAS,CAAC;IACnC,oBAAoB,EAAE,SAAS,CAAC;CACjC,CAoBA;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C,GAAG;IACF,UAAU,EAAE,eAAe,CAAC;IAC5B,uBAAuB,EAAE,SAAS,CAAC;IACnC,oBAAoB,EAAE,SAAS,CAAC;CACjC,CAoBA;AAED,wBAAgB,sCAAsC,CAAC,KAAK,EAAE;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG;IACF,UAAU,EAAE,IAAI,CACd,qBAAqB,EACrB,cAAc,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CACjF,CAAC;CACH,CAgBA"}