@viewportai/daemon 0.5.2 → 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 (109) 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 +593 -27
  11. package/dist/cli/context-command.js.map +1 -1
  12. package/dist/cli/context-sync-target.d.ts +2 -1
  13. package/dist/cli/context-sync-target.d.ts.map +1 -1
  14. package/dist/cli/context-sync-target.js +28 -0
  15. package/dist/cli/context-sync-target.js.map +1 -1
  16. package/dist/cli/context-vault-metadata-command.d.ts.map +1 -1
  17. package/dist/cli/context-vault-metadata-command.js +6 -1
  18. package/dist/cli/context-vault-metadata-command.js.map +1 -1
  19. package/dist/cli/lifecycle-commands.d.ts.map +1 -1
  20. package/dist/cli/lifecycle-commands.js +6 -6
  21. package/dist/cli/lifecycle-commands.js.map +1 -1
  22. package/dist/cli/unlock-command.d.ts +2 -0
  23. package/dist/cli/unlock-command.d.ts.map +1 -0
  24. package/dist/cli/unlock-command.js +35 -0
  25. package/dist/cli/unlock-command.js.map +1 -0
  26. package/dist/context/local-edge-store.d.ts +23 -1
  27. package/dist/context/local-edge-store.d.ts.map +1 -1
  28. package/dist/context/local-edge-store.js +51 -0
  29. package/dist/context/local-edge-store.js.map +1 -1
  30. package/dist/context/local-edge-sync.d.ts +63 -0
  31. package/dist/context/local-edge-sync.d.ts.map +1 -1
  32. package/dist/context/local-edge-sync.js +464 -4
  33. package/dist/context/local-edge-sync.js.map +1 -1
  34. package/dist/context/local-edge-types.d.ts +21 -0
  35. package/dist/context/local-edge-types.d.ts.map +1 -1
  36. package/dist/hooks/platform-plan-sync.d.ts +4 -1
  37. package/dist/hooks/platform-plan-sync.d.ts.map +1 -1
  38. package/dist/hooks/platform-plan-sync.js +20 -5
  39. package/dist/hooks/platform-plan-sync.js.map +1 -1
  40. package/dist/hooks/trusted-edge-plan-artifacts.d.ts +117 -0
  41. package/dist/hooks/trusted-edge-plan-artifacts.d.ts.map +1 -0
  42. package/dist/hooks/trusted-edge-plan-artifacts.js +371 -0
  43. package/dist/hooks/trusted-edge-plan-artifacts.js.map +1 -0
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +3 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/relay/bridge-token-issuer.d.ts +1 -0
  49. package/dist/relay/bridge-token-issuer.d.ts.map +1 -1
  50. package/dist/relay/bridge-token-issuer.js +1 -1
  51. package/dist/relay/bridge-token-issuer.js.map +1 -1
  52. package/dist/security/epoch-enrollment.d.ts +48 -0
  53. package/dist/security/epoch-enrollment.d.ts.map +1 -0
  54. package/dist/security/epoch-enrollment.js +290 -0
  55. package/dist/security/epoch-enrollment.js.map +1 -0
  56. package/dist/security/epoch-protocol.d.ts +181 -0
  57. package/dist/security/epoch-protocol.d.ts.map +1 -0
  58. package/dist/security/epoch-protocol.js +285 -0
  59. package/dist/security/epoch-protocol.js.map +1 -0
  60. package/dist/security/epoch-public-pins.d.ts +19 -0
  61. package/dist/security/epoch-public-pins.d.ts.map +1 -0
  62. package/dist/security/epoch-public-pins.js +129 -0
  63. package/dist/security/epoch-public-pins.js.map +1 -0
  64. package/dist/security/epoch-recovery.d.ts +56 -0
  65. package/dist/security/epoch-recovery.d.ts.map +1 -0
  66. package/dist/security/epoch-recovery.js +314 -0
  67. package/dist/security/epoch-recovery.js.map +1 -0
  68. package/dist/security/epoch-store.d.ts +111 -0
  69. package/dist/security/epoch-store.d.ts.map +1 -0
  70. package/dist/security/epoch-store.js +224 -0
  71. package/dist/security/epoch-store.js.map +1 -0
  72. package/dist/security/epoch-sync.d.ts +47 -0
  73. package/dist/security/epoch-sync.d.ts.map +1 -0
  74. package/dist/security/epoch-sync.js +371 -0
  75. package/dist/security/epoch-sync.js.map +1 -0
  76. package/dist/security/team-epoch-grants.d.ts +28 -0
  77. package/dist/security/team-epoch-grants.d.ts.map +1 -0
  78. package/dist/security/team-epoch-grants.js +256 -0
  79. package/dist/security/team-epoch-grants.js.map +1 -0
  80. package/dist/server/context-preview-service.d.ts +26 -0
  81. package/dist/server/context-preview-service.d.ts.map +1 -0
  82. package/dist/server/context-preview-service.js +71 -0
  83. package/dist/server/context-preview-service.js.map +1 -0
  84. package/dist/server/http-context-routes.d.ts +2 -1
  85. package/dist/server/http-context-routes.d.ts.map +1 -1
  86. package/dist/server/http-context-routes.js +65 -30
  87. package/dist/server/http-context-routes.js.map +1 -1
  88. package/dist/server/http-server.js +1 -1
  89. package/dist/server/http-server.js.map +1 -1
  90. package/dist/server/rate-limiter.d.ts.map +1 -1
  91. package/dist/server/rate-limiter.js +6 -1
  92. package/dist/server/rate-limiter.js.map +1 -1
  93. package/dist/server/trusted-edge-command-capability.d.ts +14 -0
  94. package/dist/server/trusted-edge-command-capability.d.ts.map +1 -0
  95. package/dist/server/trusted-edge-command-capability.js +114 -0
  96. package/dist/server/trusted-edge-command-capability.js.map +1 -0
  97. package/dist/server/ws-command-handlers.d.ts.map +1 -1
  98. package/dist/server/ws-command-handlers.js +231 -27
  99. package/dist/server/ws-command-handlers.js.map +1 -1
  100. package/dist/server/ws-protocol.d.ts +419 -5
  101. package/dist/server/ws-protocol.d.ts.map +1 -1
  102. package/dist/server/ws-protocol.js +141 -4
  103. package/dist/server/ws-protocol.js.map +1 -1
  104. package/docs/protocol-matrix.json +93 -5
  105. package/node_modules/@viewportai/context-engine/src/repo/materializer.js +20 -5
  106. package/node_modules/@viewportai/context-engine/src/repo/membership.js +15 -0
  107. package/node_modules/@viewportai/context-engine/src/repo/sync.js +4 -4
  108. package/node_modules/@viewportai/context-engine/src/repo/vault.js +8 -3
  109. package/package.json +1 -1
@@ -0,0 +1,290 @@
1
+ import { transportFetch } from '../cli/network.js';
2
+ import { configDir } from '../core/config.js';
3
+ import { createLocalDeviceEnrollmentKeyMaterial, getActiveLocalUserEpoch, getLocalDeviceEnrollment, upsertLocalDeviceEnrollment, upsertLocalUserEpoch, } from './epoch-store.js';
4
+ import { DEVICE_ENROLLMENT_SCHEMA, signDeviceEnrollmentRequest, signUserEpochDeviceMaterialization, TRUSTED_EDGE_CRYPTO_PROTOCOL_HEADER, TRUSTED_EDGE_CRYPTO_PROTOCOL_VERSION, unwrapJsonFromX25519Envelope, userEpochDeviceMaterializationPayload, wrapJsonForX25519Recipient, } from './epoch-protocol.js';
5
+ export async function requestDeviceEpochEnrollment(options) {
6
+ const material = createLocalDeviceEnrollmentKeyMaterial({
7
+ workspaceId: options.target.workspaceId,
8
+ deviceId: options.deviceId,
9
+ deviceLabel: options.deviceLabel,
10
+ });
11
+ const requestPayload = {
12
+ schema: DEVICE_ENROLLMENT_SCHEMA,
13
+ workspaceId: options.target.workspaceId,
14
+ deviceId: options.deviceId,
15
+ deviceLabel: options.deviceLabel,
16
+ encryptionPublicKeyJwk: material.enrollment.encryptionPublicKeyJwk,
17
+ signingPublicKeyJwk: material.enrollment.signingPublicKeyJwk,
18
+ nonce: material.enrollment.nonce,
19
+ };
20
+ const signedRequest = signDeviceEnrollmentRequest({
21
+ payload: requestPayload,
22
+ signingPrivateKeyJwk: material.enrollment.signingPrivateKeyJwk,
23
+ });
24
+ const payload = await postJson(options.fetchImpl ?? transportFetch, `${runtimeBaseUrl(options.target)}/crypto/device-enrollments`, {
25
+ credential: options.target.credential,
26
+ device_id: options.deviceId,
27
+ device_label: options.deviceLabel,
28
+ encryption_public_key_jwk: material.enrollment.encryptionPublicKeyJwk,
29
+ signing_public_key_jwk: material.enrollment.signingPublicKeyJwk,
30
+ nonce: material.enrollment.nonce,
31
+ request_payload: signedRequest.payload,
32
+ request_signature: signedRequest.signature,
33
+ }, options.target);
34
+ const data = enrollmentPayload(payload);
35
+ return upsertLocalDeviceEnrollment({
36
+ workspaceId: data.workspace_id,
37
+ enrollmentId: data.id,
38
+ userId: String(data.user_id),
39
+ deviceId: data.device_id,
40
+ deviceLabel: data.device_label,
41
+ status: data.status,
42
+ encryptionPublicKeyJwk: data.encryption_public_key_jwk,
43
+ encryptionPrivateKeyJwk: material.enrollment.encryptionPrivateKeyJwk,
44
+ signingPublicKeyJwk: data.signing_public_key_jwk,
45
+ signingPrivateKeyJwk: material.enrollment.signingPrivateKeyJwk,
46
+ fingerprint: data.fingerprint,
47
+ nonce: data.nonce,
48
+ }, options.home ?? configDir());
49
+ }
50
+ export async function listDeviceEpochEnrollments(options) {
51
+ const payload = await getJson(options.fetchImpl ?? transportFetch, `${runtimeBaseUrl(options.target)}/crypto/device-enrollments`, options.target);
52
+ const response = record(payload, 'device enrollments response');
53
+ const data = response.data;
54
+ if (!Array.isArray(data)) {
55
+ throw new Error('Device enrollment response did not include data array.');
56
+ }
57
+ return data.map((item) => enrollmentPayload({ data: item }));
58
+ }
59
+ export async function approveDeviceEpochEnrollment(options) {
60
+ const epoch = await getActiveLocalUserEpoch(options.target.workspaceId, options.home);
61
+ if (!epoch?.platformEpochId) {
62
+ throw new Error('Active local user epoch with platform id is required before approving a device.');
63
+ }
64
+ const enrollment = await fetchEnrollment(options);
65
+ const aad = userEpochDeviceGrantAad({ epoch, enrollment });
66
+ const encryptedPayload = wrapJsonForX25519Recipient({
67
+ recipientPublicKeyJwk: enrollment.encryption_public_key_jwk,
68
+ aad,
69
+ payload: {
70
+ schema: 'viewport.user_epoch_device_material/v1',
71
+ workspaceId: epoch.workspaceId,
72
+ userId: epoch.userId,
73
+ platformEpochId: epoch.platformEpochId,
74
+ epoch: epoch.epoch,
75
+ fingerprint: epoch.fingerprint,
76
+ encryptionPublicKeyJwk: epoch.encryptionPublicKeyJwk,
77
+ encryptionPrivateKeyJwk: epoch.encryptionPrivateKeyJwk,
78
+ signingPublicKeyJwk: epoch.signingPublicKeyJwk,
79
+ signingPrivateKeyJwk: epoch.signingPrivateKeyJwk,
80
+ previousEpochFingerprint: epoch.previousEpochFingerprint ?? null,
81
+ },
82
+ });
83
+ const response = await postJson(options.fetchImpl ?? transportFetch, `${runtimeBaseUrl(options.target)}/crypto/device-enrollments/${encodeURIComponent(options.enrollmentId)}/approve`, {
84
+ credential: options.target.credential,
85
+ user_crypto_epoch_id: epoch.platformEpochId,
86
+ aad,
87
+ encrypted_payload: encryptedPayload,
88
+ }, options.target);
89
+ return enrollmentPayload(response);
90
+ }
91
+ export async function acceptDeviceEpochEnrollment(options) {
92
+ const enrollment = await fetchEnrollment(options);
93
+ const localEnrollment = await getLocalDeviceEnrollment(options.target.workspaceId, enrollment.id, options.home);
94
+ if (!localEnrollment) {
95
+ throw new Error('Local pending device enrollment key material was not found.');
96
+ }
97
+ const grant = (enrollment.grants ?? []).find((item) => item.recipient_fingerprint === localEnrollment.fingerprint);
98
+ if (!grant) {
99
+ throw new Error('No encrypted user epoch grant is available for this device enrollment.');
100
+ }
101
+ const payload = unwrapJsonFromX25519Envelope({
102
+ recipientPrivateKeyJwk: localEnrollment.encryptionPrivateKeyJwk,
103
+ envelope: grant.encrypted_payload,
104
+ aad: grant.aad,
105
+ });
106
+ const material = materialPayload(payload);
107
+ const receipt = signUserEpochDeviceMaterialization({
108
+ payload: userEpochDeviceMaterializationPayload({
109
+ workspaceId: material.workspaceId,
110
+ userId: material.userId,
111
+ enrollmentId: enrollment.id,
112
+ grantId: grant.id,
113
+ userCryptoEpochId: material.platformEpochId,
114
+ userEpochFingerprint: material.fingerprint,
115
+ recipientFingerprint: grant.recipient_fingerprint,
116
+ }),
117
+ signingPrivateKeyJwk: material.signingPrivateKeyJwk,
118
+ signedByUserEpochFingerprint: material.fingerprint,
119
+ });
120
+ const epoch = await upsertLocalUserEpoch({
121
+ workspaceId: material.workspaceId,
122
+ userId: material.userId,
123
+ platformEpochId: material.platformEpochId,
124
+ epoch: material.epoch,
125
+ schema: 'viewport.user_crypto_epoch/v1',
126
+ status: 'active',
127
+ encryptionPublicKeyJwk: material.encryptionPublicKeyJwk,
128
+ encryptionPrivateKeyJwk: material.encryptionPrivateKeyJwk,
129
+ signingPublicKeyJwk: material.signingPublicKeyJwk,
130
+ signingPrivateKeyJwk: material.signingPrivateKeyJwk,
131
+ fingerprint: material.fingerprint,
132
+ previousEpochFingerprint: material.previousEpochFingerprint,
133
+ }, options.home ?? configDir());
134
+ await upsertLocalDeviceEnrollment({
135
+ ...localEnrollment,
136
+ status: 'accepted',
137
+ }, options.home ?? configDir());
138
+ await postJson(options.fetchImpl ?? transportFetch, `${runtimeBaseUrl(options.target)}/crypto/device-enrollments/${encodeURIComponent(enrollment.id)}/materialized`, {
139
+ credential: options.target.credential,
140
+ grant_id: grant.id,
141
+ receipt,
142
+ }, options.target);
143
+ return epoch;
144
+ }
145
+ function userEpochDeviceGrantAad(input) {
146
+ return {
147
+ schema: 'viewport.user_epoch_device_grant_aad/v1',
148
+ workspaceId: input.epoch.workspaceId,
149
+ userId: input.epoch.userId,
150
+ platformEpochId: input.epoch.platformEpochId ?? null,
151
+ epochFingerprint: input.epoch.fingerprint,
152
+ enrollmentId: input.enrollment.id,
153
+ recipientFingerprint: input.enrollment.fingerprint,
154
+ };
155
+ }
156
+ async function fetchEnrollment(options) {
157
+ const payload = await getJson(options.fetchImpl ?? transportFetch, `${runtimeBaseUrl(options.target)}/crypto/device-enrollments/${encodeURIComponent(options.enrollmentId)}`, options.target);
158
+ return enrollmentPayload(payload);
159
+ }
160
+ function runtimeBaseUrl(target) {
161
+ return `${target.serverUrl.replace(/\/+$/, '')}/api/runtime/workspaces/${encodeURIComponent(target.workspaceId)}`;
162
+ }
163
+ async function postJson(fetchImpl, url, body, transportOptions = {}) {
164
+ const response = await fetchImpl(url, {
165
+ method: 'POST',
166
+ headers: trustedEdgeCryptoHeaders({ 'content-type': 'application/json' }),
167
+ body: JSON.stringify(body),
168
+ timeoutMs: 5_000,
169
+ tlsVerify: transportOptions.tlsVerify,
170
+ caCertPath: transportOptions.caCertPath,
171
+ tlsPins: transportOptions.tlsPins,
172
+ });
173
+ const payload = await response.json().catch(() => null);
174
+ if (!response.ok)
175
+ throw new Error(responseError(payload, response));
176
+ return payload;
177
+ }
178
+ async function getJson(fetchImpl, url, transportOptions) {
179
+ const requestUrl = new URL(url);
180
+ requestUrl.searchParams.set('credential', transportOptions.credential);
181
+ const response = await fetchImpl(requestUrl.toString(), {
182
+ method: 'GET',
183
+ headers: trustedEdgeCryptoHeaders(),
184
+ timeoutMs: 5_000,
185
+ tlsVerify: transportOptions.tlsVerify,
186
+ caCertPath: transportOptions.caCertPath,
187
+ tlsPins: transportOptions.tlsPins,
188
+ });
189
+ const payload = await response.json().catch(() => null);
190
+ if (!response.ok)
191
+ throw new Error(responseError(payload, response));
192
+ return payload;
193
+ }
194
+ function trustedEdgeCryptoHeaders(extra = {}) {
195
+ return {
196
+ accept: 'application/json',
197
+ [TRUSTED_EDGE_CRYPTO_PROTOCOL_HEADER]: TRUSTED_EDGE_CRYPTO_PROTOCOL_VERSION,
198
+ ...extra,
199
+ };
200
+ }
201
+ function responseError(payload, response) {
202
+ const message = payload && typeof payload === 'object' && 'message' in payload
203
+ ? String(payload.message)
204
+ : `${response.status} ${response.statusText}`;
205
+ return `Device enrollment sync failed: ${message}`;
206
+ }
207
+ function enrollmentPayload(payload) {
208
+ const data = objectField(payload, 'data');
209
+ return {
210
+ id: stringField(data, 'id'),
211
+ workspace_id: stringField(data, 'workspace_id'),
212
+ user_id: numberOrStringField(data, 'user_id'),
213
+ device_id: stringField(data, 'device_id'),
214
+ device_label: stringField(data, 'device_label'),
215
+ encryption_public_key_jwk: objectField(data, 'encryption_public_key_jwk'),
216
+ signing_public_key_jwk: objectField(data, 'signing_public_key_jwk'),
217
+ fingerprint: stringField(data, 'fingerprint'),
218
+ nonce: stringField(data, 'nonce'),
219
+ status: statusField(data, 'status'),
220
+ grants: Array.isArray(data.grants) ? data.grants.map((item) => deviceGrantPayload(item)) : [],
221
+ };
222
+ }
223
+ function deviceGrantPayload(value) {
224
+ const data = record(value, 'grant');
225
+ return {
226
+ id: stringField(data, 'id'),
227
+ user_crypto_epoch_id: stringField(data, 'user_crypto_epoch_id'),
228
+ recipient_fingerprint: stringField(data, 'recipient_fingerprint'),
229
+ aad: objectField(data, 'aad'),
230
+ encrypted_payload: objectField(data, 'encrypted_payload'),
231
+ };
232
+ }
233
+ function materialPayload(value) {
234
+ const data = record(value, 'material');
235
+ return {
236
+ workspaceId: stringField(data, 'workspaceId'),
237
+ userId: stringField(data, 'userId'),
238
+ platformEpochId: stringField(data, 'platformEpochId'),
239
+ epoch: numberField(data, 'epoch'),
240
+ fingerprint: stringField(data, 'fingerprint'),
241
+ encryptionPublicKeyJwk: objectField(data, 'encryptionPublicKeyJwk'),
242
+ encryptionPrivateKeyJwk: objectField(data, 'encryptionPrivateKeyJwk'),
243
+ signingPublicKeyJwk: objectField(data, 'signingPublicKeyJwk'),
244
+ signingPrivateKeyJwk: objectField(data, 'signingPrivateKeyJwk'),
245
+ previousEpochFingerprint: typeof data.previousEpochFingerprint === 'string' ? data.previousEpochFingerprint : null,
246
+ };
247
+ }
248
+ function objectField(value, field) {
249
+ const data = record(value, 'response');
250
+ const child = data[field];
251
+ if (!child || typeof child !== 'object' || Array.isArray(child)) {
252
+ throw new Error(`Device enrollment response did not include ${field}`);
253
+ }
254
+ return child;
255
+ }
256
+ function record(value, label) {
257
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
258
+ throw new Error(`Expected ${label} object.`);
259
+ }
260
+ return value;
261
+ }
262
+ function stringField(value, field) {
263
+ const child = value[field];
264
+ if (typeof child !== 'string' || child.trim().length === 0) {
265
+ throw new Error(`Device enrollment response did not include ${field}`);
266
+ }
267
+ return child;
268
+ }
269
+ function numberField(value, field) {
270
+ const child = value[field];
271
+ if (typeof child !== 'number') {
272
+ throw new Error(`Device enrollment response did not include numeric ${field}`);
273
+ }
274
+ return child;
275
+ }
276
+ function numberOrStringField(value, field) {
277
+ const child = value[field];
278
+ if (typeof child !== 'number' && typeof child !== 'string') {
279
+ throw new Error(`Device enrollment response did not include ${field}`);
280
+ }
281
+ return child;
282
+ }
283
+ function statusField(value, field) {
284
+ const child = stringField(value, field);
285
+ if (child !== 'pending' && child !== 'approved' && child !== 'accepted' && child !== 'revoked') {
286
+ throw new Error(`Unsupported device enrollment status: ${child}`);
287
+ }
288
+ return child;
289
+ }
290
+ //# sourceMappingURL=epoch-enrollment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch-enrollment.js","sourceRoot":"","sources":["../../src/security/epoch-enrollment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ export declare const USER_EPOCH_SCHEMA = "viewport.user_crypto_epoch/v1";
2
+ export declare const TEAM_EPOCH_SCHEMA = "viewport.team_crypto_epoch/v1";
3
+ export declare const DEVICE_ENROLLMENT_SCHEMA = "viewport.device_enrollment/v1";
4
+ export declare const RESOURCE_GRANT_SCHEMA = "viewport.resource_key_grant/v1";
5
+ export declare const WRAPPED_KEY_ENVELOPE_SCHEMA = "viewport.wrapped_key_envelope/v1";
6
+ export declare const TRUSTED_EDGE_CRYPTO_PROTOCOL_HEADER = "X-Viewport-Crypto-Protocol";
7
+ export declare const TRUSTED_EDGE_CRYPTO_PROTOCOL_VERSION = "viewport.trusted_edge_crypto/v2";
8
+ export type JsonValue = null | boolean | number | string | JsonValue[] | {
9
+ [key: string]: JsonValue;
10
+ };
11
+ export interface EpochDescriptor {
12
+ schema: typeof USER_EPOCH_SCHEMA | typeof TEAM_EPOCH_SCHEMA;
13
+ workspaceId: string;
14
+ subjectType: 'user' | 'team';
15
+ subjectId: string;
16
+ epoch: number;
17
+ encryptionPublicKeyJwk: JsonValue;
18
+ signingPublicKeyJwk: JsonValue;
19
+ previousEpochFingerprint?: string | null;
20
+ createdAt: string;
21
+ }
22
+ export interface DeviceEnrollmentRequest {
23
+ schema: typeof DEVICE_ENROLLMENT_SCHEMA;
24
+ workspaceId: string;
25
+ deviceId: string;
26
+ deviceLabel: string;
27
+ encryptionPublicKeyJwk: JsonValue;
28
+ signingPublicKeyJwk: JsonValue;
29
+ nonce: string;
30
+ }
31
+ export interface SignedDeviceEnrollmentRequest {
32
+ payload: DeviceEnrollmentRequest;
33
+ signature: string;
34
+ }
35
+ export interface UserEpochDeviceMaterializationPayload {
36
+ schema: 'viewport.user_epoch_device_materialization/v1';
37
+ workspaceId: string;
38
+ userId: string;
39
+ enrollmentId: string;
40
+ grantId: string;
41
+ userCryptoEpochId: string;
42
+ userEpochFingerprint: string;
43
+ recipientFingerprint: string;
44
+ }
45
+ export interface SignedUserEpochDeviceMaterialization {
46
+ payload: UserEpochDeviceMaterializationPayload;
47
+ signature: string;
48
+ signedByUserEpochFingerprint: string;
49
+ }
50
+ export interface TeamEpochMemberMaterializationPayload {
51
+ schema: 'viewport.team_epoch_member_materialization/v1';
52
+ workspaceId: string;
53
+ grantId: string;
54
+ teamCryptoEpochId: string;
55
+ teamEpochFingerprint: string;
56
+ recipientUserCryptoEpochId: string;
57
+ recipientUserEpochFingerprint: string;
58
+ }
59
+ export interface SignedTeamEpochMemberMaterialization {
60
+ payload: TeamEpochMemberMaterializationPayload;
61
+ signature: string;
62
+ signedByTeamEpochFingerprint: string;
63
+ }
64
+ export interface ContextGrantMaterializationPayload {
65
+ schema: 'viewport.context_vault_grant_materialization/v1';
66
+ workspaceId: string;
67
+ contextResourceId: string;
68
+ grantEventId: string;
69
+ recipientName: string;
70
+ keyEpoch: number | null;
71
+ }
72
+ export interface SignedContextGrantMaterialization {
73
+ payload: ContextGrantMaterializationPayload;
74
+ signature: string;
75
+ signedByEpochFingerprint: string;
76
+ }
77
+ export interface SignedEpochTransition {
78
+ payload: EpochTransitionPayload;
79
+ signature: string;
80
+ signedByEpochFingerprint: string;
81
+ }
82
+ export interface WrappedKeyEnvelope {
83
+ schema: typeof WRAPPED_KEY_ENVELOPE_SCHEMA;
84
+ alg: 'x25519-hkdf-sha256-aes-256-gcm';
85
+ ephemeralPublicKeyJwk: JsonValue;
86
+ iv: string;
87
+ ciphertext: string;
88
+ tag: string;
89
+ aadDigest: string;
90
+ createdAt: string;
91
+ }
92
+ export interface EpochTransitionPayload {
93
+ schema: 'viewport.epoch_transition/v1';
94
+ workspaceId: string;
95
+ subjectType: 'user' | 'team';
96
+ subjectId: string;
97
+ fromEpoch: number;
98
+ fromEpochFingerprint: string;
99
+ toEpoch: number;
100
+ toEpochFingerprint: string;
101
+ reason: 'initial' | 'device_enrolled' | 'device_revoked' | 'member_added' | 'member_revoked' | 'manual_rotation' | 'recovery';
102
+ createdAt: string;
103
+ }
104
+ export declare function canonicalJson(value: unknown): string;
105
+ export declare function sha256Base64Url(value: string | Buffer): string;
106
+ export declare function fingerprintPayload(value: JsonValue): string;
107
+ export declare function epochFingerprint(epoch: EpochDescriptor): string;
108
+ export declare function deviceEnrollmentFingerprint(request: DeviceEnrollmentRequest): string;
109
+ export declare function signDeviceEnrollmentRequest(input: {
110
+ payload: DeviceEnrollmentRequest;
111
+ signingPrivateKeyJwk: JsonValue;
112
+ }): SignedDeviceEnrollmentRequest;
113
+ export declare function userEpochDeviceMaterializationPayload(input: {
114
+ workspaceId: string;
115
+ userId: string;
116
+ enrollmentId: string;
117
+ grantId: string;
118
+ userCryptoEpochId: string;
119
+ userEpochFingerprint: string;
120
+ recipientFingerprint: string;
121
+ }): UserEpochDeviceMaterializationPayload;
122
+ export declare function signUserEpochDeviceMaterialization(input: {
123
+ payload: UserEpochDeviceMaterializationPayload;
124
+ signingPrivateKeyJwk: JsonValue;
125
+ signedByUserEpochFingerprint: string;
126
+ }): SignedUserEpochDeviceMaterialization;
127
+ export declare function teamEpochMemberMaterializationPayload(input: {
128
+ workspaceId: string;
129
+ grantId: string;
130
+ teamCryptoEpochId: string;
131
+ teamEpochFingerprint: string;
132
+ recipientUserCryptoEpochId: string;
133
+ recipientUserEpochFingerprint: string;
134
+ }): TeamEpochMemberMaterializationPayload;
135
+ export declare function signTeamEpochMemberMaterialization(input: {
136
+ payload: TeamEpochMemberMaterializationPayload;
137
+ signingPrivateKeyJwk: JsonValue;
138
+ signedByTeamEpochFingerprint: string;
139
+ }): SignedTeamEpochMemberMaterialization;
140
+ export declare function contextGrantMaterializationPayload(input: {
141
+ workspaceId: string;
142
+ contextResourceId: string;
143
+ grantEventId: string;
144
+ recipientName: string;
145
+ keyEpoch: number | null;
146
+ }): ContextGrantMaterializationPayload;
147
+ export declare function signContextGrantMaterialization(input: {
148
+ payload: ContextGrantMaterializationPayload;
149
+ signingPrivateKeyJwk: JsonValue;
150
+ signedByEpochFingerprint: string;
151
+ }): SignedContextGrantMaterialization;
152
+ export declare function epochTransitionPayload(input: {
153
+ from: EpochDescriptor;
154
+ to: EpochDescriptor;
155
+ reason: EpochTransitionPayload['reason'];
156
+ createdAt: string;
157
+ }): EpochTransitionPayload;
158
+ export declare function signEpochTransition(input: {
159
+ payload: EpochTransitionPayload;
160
+ signingPrivateKeyJwk: JsonValue;
161
+ signedByEpochFingerprint: string;
162
+ }): SignedEpochTransition;
163
+ export declare function verifyEpochTransition(input: {
164
+ signed: SignedEpochTransition;
165
+ signingPublicKeyJwk: JsonValue;
166
+ expectedFromEpochFingerprint: string;
167
+ expectedToEpochFingerprint: string;
168
+ }): boolean;
169
+ export declare function wrapJsonForX25519Recipient(input: {
170
+ recipientPublicKeyJwk: JsonValue;
171
+ payload: JsonValue;
172
+ aad: JsonValue;
173
+ createdAt?: string;
174
+ }): WrappedKeyEnvelope;
175
+ export declare function unwrapJsonFromX25519Envelope(input: {
176
+ recipientPrivateKeyJwk: JsonValue;
177
+ envelope: WrappedKeyEnvelope;
178
+ aad: JsonValue;
179
+ }): JsonValue;
180
+ export declare function assertNoPrivateKeyMaterial(value: JsonValue, path?: string): void;
181
+ //# sourceMappingURL=epoch-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch-protocol.d.ts","sourceRoot":"","sources":["../../src/security/epoch-protocol.ts"],"names":[],"mappings":"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"}