@serviceme/devtools-core 2.0.1 → 2.0.3

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 (82) hide show
  1. package/dist/auth-Bzss8zOv.mjs +995 -0
  2. package/dist/auth-Bzss8zOv.mjs.map +1 -0
  3. package/dist/auth-DXam3c4S.js +1078 -0
  4. package/dist/auth-DXam3c4S.js.map +1 -0
  5. package/dist/auth.d.mts +2 -2
  6. package/dist/auth.d.ts +2 -2
  7. package/dist/auth.js +14 -1029
  8. package/dist/auth.mjs +2 -991
  9. package/dist/device-Bn2NzajD.mjs +793 -0
  10. package/dist/device-Bn2NzajD.mjs.map +1 -0
  11. package/dist/device-ihxrFR-w.js +874 -0
  12. package/dist/device-ihxrFR-w.js.map +1 -0
  13. package/dist/device.d.mts +2 -455
  14. package/dist/device.d.ts +2 -455
  15. package/dist/device.js +15 -728
  16. package/dist/device.mjs +2 -679
  17. package/dist/index-2rX86yMq.d.mts +331 -0
  18. package/dist/index-CoA6y0MP.d.mts +498 -0
  19. package/dist/index-CoA6y0MP.d.ts +498 -0
  20. package/dist/index-DGXYp8J5.d.mts +392 -0
  21. package/dist/index-DGXYp8J5.d.ts +392 -0
  22. package/dist/index-DaW7IYA-.d.mts +185 -0
  23. package/dist/index-DaW7IYA-.d.ts +185 -0
  24. package/dist/index-Dp6FwWKh.d.ts +331 -0
  25. package/dist/index.d.mts +2261 -2207
  26. package/dist/index.d.ts +2261 -2207
  27. package/dist/index.js +8095 -10919
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.mjs +7873 -10690
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/rolldown-runtime-VH7oDXx4.js +28 -0
  32. package/dist/skill-linker.d.mts +82 -81
  33. package/dist/skill-linker.d.ts +82 -81
  34. package/dist/skill-linker.js +359 -402
  35. package/dist/skill-linker.js.map +1 -1
  36. package/dist/skill-linker.mjs +345 -357
  37. package/dist/skill-linker.mjs.map +1 -1
  38. package/dist/skill-store-Bym2yinU.mjs +388 -0
  39. package/dist/skill-store-Bym2yinU.mjs.map +1 -0
  40. package/dist/skill-store-CJdYyyxu.js +408 -0
  41. package/dist/skill-store-CJdYyyxu.js.map +1 -0
  42. package/dist/skill-store.d.mts +41 -42
  43. package/dist/skill-store.d.ts +41 -42
  44. package/dist/skill-store.js +5 -338
  45. package/dist/skill-store.mjs +2 -301
  46. package/dist/submit-Cg7wSa3x.mjs +84 -0
  47. package/dist/submit-Cg7wSa3x.mjs.map +1 -0
  48. package/dist/submit-CltE6YOZ.js +98 -0
  49. package/dist/submit-CltE6YOZ.js.map +1 -0
  50. package/dist/submit.d.mts +2 -3
  51. package/dist/submit.d.ts +2 -3
  52. package/dist/submit.js +4 -166
  53. package/dist/submit.mjs +2 -130
  54. package/dist/toolbox-CbfxpNg-.mjs +540 -0
  55. package/dist/toolbox-CbfxpNg-.mjs.map +1 -0
  56. package/dist/toolbox-CxnOr-FY.js +614 -0
  57. package/dist/toolbox-CxnOr-FY.js.map +1 -0
  58. package/dist/toolbox.d.mts +2 -244
  59. package/dist/toolbox.d.ts +2 -244
  60. package/dist/toolbox.js +14 -584
  61. package/dist/toolbox.mjs +2 -536
  62. package/dist/{types-B9gk3dXH.d.ts → types-BCV3IedE.d.mts} +25 -23
  63. package/dist/{types-B9gk3dXH.d.mts → types-BCV3IedE.d.ts} +25 -23
  64. package/dist/userHome-BquDeFVE.js +526 -0
  65. package/dist/userHome-BquDeFVE.js.map +1 -0
  66. package/dist/userHome-CcnAQPG1.mjs +212 -0
  67. package/dist/userHome-CcnAQPG1.mjs.map +1 -0
  68. package/package.json +10 -10
  69. package/dist/auth.js.map +0 -1
  70. package/dist/auth.mjs.map +0 -1
  71. package/dist/device.js.map +0 -1
  72. package/dist/device.mjs.map +0 -1
  73. package/dist/index-BMk4tqIT.d.mts +0 -328
  74. package/dist/index-CymN0x9Z.d.ts +0 -328
  75. package/dist/index-PD135hlB.d.mts +0 -626
  76. package/dist/index-PD135hlB.d.ts +0 -626
  77. package/dist/skill-store.js.map +0 -1
  78. package/dist/skill-store.mjs.map +0 -1
  79. package/dist/submit.js.map +0 -1
  80. package/dist/submit.mjs.map +0 -1
  81. package/dist/toolbox.js.map +0 -1
  82. package/dist/toolbox.mjs.map +0 -1
@@ -0,0 +1,392 @@
1
+ import { DeviceBindingState, DeviceEnrollResult, DeviceRotateSecretResult, DeviceStatus } from "@serviceme/devtools-protocol";
2
+ //#region src/device/deviceAuth.d.ts
3
+ /**
4
+ * deviceAuth — Device request signing helpers for device auth headers.
5
+ *
6
+ * **Boundary exception copy.** The single source of truth for the
7
+ * `x-ms-device-*` header names + the signature algorithms now lives in
8
+ * `@serviceme/devtools-shared` (`device-auth.ts`), consumed by the
9
+ * extension signer and the server verifier. ADL-003 forbids
10
+ * core → shared (and shared → core), so this module keeps a
11
+ * byte-for-byte copy as the documented exception. Keep it in lock-step
12
+ * with `packages/serviceme-shared/src/device-auth.ts`.
13
+ *
14
+ * See `docs/architecture/phase-5-device-header-spec.md` §5 for the wire
15
+ * format. Legacy (v1) basis is `METHOD\nPATH\nTIMESTAMP\nBODY\nSECRET`
16
+ * hashed with a secret-suffix SHA-256; v2 basis is
17
+ * `METHOD\nPATH?QUERY\nTIMESTAMP\nNONCE\nBODY\nSECRET` MACed with real
18
+ * HMAC-SHA-256 keyed by the device secret and signed over the full
19
+ * path-with-query. Both output lowercase hex.
20
+ */
21
+ /** Canonical header names — MUST match `@serviceme/devtools-shared`'s `DeviceAuthHeaders`. */
22
+ declare const DeviceAuthHeaders: {
23
+ readonly deviceId: "x-ms-device-id";
24
+ readonly deviceSecret: "x-ms-device-secret";
25
+ readonly signature: "x-ms-device-signature";
26
+ readonly timestamp: "x-ms-device-timestamp";
27
+ readonly secretVersion: "x-ms-device-secret-version";
28
+ /** v2 only — algorithm self-declaration so the server can verify
29
+ * both schemes during the legacy-client rollout window. */
30
+ readonly sigAlg: "x-ms-device-sig-alg";
31
+ /** v2 only — one-time value folded into the signature basis and
32
+ * checked against a server-side replay cache. */
33
+ readonly nonce: "x-ms-device-nonce";
34
+ };
35
+ interface DeviceRequestSignatureParams {
36
+ method: string;
37
+ path: string;
38
+ timestamp: number;
39
+ body: string;
40
+ secret: string;
41
+ }
42
+ /**
43
+ * Legacy (v1) secret-suffix SHA-256 over the canonical basis. Retained
44
+ * for backward compatibility with fielded verifiers/clients that
45
+ * predate v2; new code should use `createDeviceRequestSignatureV2`.
46
+ */
47
+ declare function createDeviceRequestSignature(params: DeviceRequestSignatureParams): string;
48
+ /** Header map consumed by `fetch()` callers (CLI bridge, Extension). */
49
+ interface DeviceSignedHeaders {
50
+ [DeviceAuthHeaders.deviceId]: string;
51
+ [DeviceAuthHeaders.deviceSecret]: string;
52
+ [DeviceAuthHeaders.signature]: string;
53
+ [DeviceAuthHeaders.timestamp]: string;
54
+ [DeviceAuthHeaders.secretVersion]: string;
55
+ [DeviceAuthHeaders.sigAlg]: string;
56
+ [DeviceAuthHeaders.nonce]: string;
57
+ }
58
+ interface BuildSignedHeadersParams {
59
+ method: string;
60
+ /** Full request path INCLUDING the query string (v2 signs it). */
61
+ path: string;
62
+ body: string;
63
+ publicId: string;
64
+ deviceSecret: string;
65
+ secretVersion: number;
66
+ /** Override for deterministic tests. */
67
+ timestamp?: number;
68
+ /** Override for deterministic tests; defaults to a fresh random UUID. */
69
+ nonce?: string;
70
+ }
71
+ /**
72
+ * Build the v2 header map. The `path` parameter MUST include the exact
73
+ * query string sent on the wire, and the `body` parameter MUST be the
74
+ * exact byte sequence sent on the wire (no whitespace
75
+ * re-canonicalization between client serialization and signature basis
76
+ * construction).
77
+ */
78
+ declare function buildSignedHeaders(params: BuildSignedHeadersParams): DeviceSignedHeaders;
79
+ //#endregion
80
+ //#region src/device/types.d.ts
81
+ /**
82
+ * Schema version of the on-disk `device.json` file. Bumped when the
83
+ * shape changes incompatibly. IdentityStore checks this on read and
84
+ * either migrates (versions ≤ 1) or refuses (versions > supported).
85
+ */
86
+ declare const DEVICE_JSON_SCHEMA_VERSION = 1;
87
+ /** Internal representation of the persisted identity file. */
88
+ interface PersistedDeviceIdentity {
89
+ version: number;
90
+ /** Stable per-machine id (UUID v4 shape) — survives secret rotates. */
91
+ installationId: string;
92
+ /** Raw `os.hostname()` for diagnostics. */
93
+ machineId: string;
94
+ /** Platform string (e.g. "darwin"). */
95
+ platform: string;
96
+ /** Optional hostname override for environments where `os.hostname()` is unstable. */
97
+ hostname?: string;
98
+ /** Public, non-secret id returned by the server. 32-char hex. */
99
+ publicId: string;
100
+ /** Monotonic secret version counter, starts at 1 after first enroll. */
101
+ secretVersion: number;
102
+ /** Current binding state — drives the re-enroll matrix. */
103
+ bindingState: DeviceBindingState;
104
+ /** HMAC secret (32 bytes hex-encoded = 64 chars). Persisted per `device-header-spec.md` §3.1. */
105
+ deviceSecret: string;
106
+ /** Optional: previous secret retained during the grace window (rotation). */
107
+ previousDeviceSecret?: string;
108
+ /** Optional: ISO timestamp at which the previous secret stops being accepted. */
109
+ previousSecretExpiresAt?: string;
110
+ /** ISO timestamp of the most recent successful enroll / rotate. */
111
+ lastEnrollAt: string;
112
+ /** Optional ISO timestamp of the most recent server sync. */
113
+ lastSyncAt?: string;
114
+ /** Optional human-readable message for the last sync error. */
115
+ lastSyncError?: string;
116
+ }
117
+ /** Result of a single atomic write. */
118
+ interface AtomicWriteResult {
119
+ bytesWritten: number;
120
+ /** Path to the temp file (post-rename it no longer exists; useful for diagnostics). */
121
+ tmpPath: string;
122
+ }
123
+ /** Hook called before/after every identity write — used by tests to assert concurrency safety. */
124
+ interface IdentityStoreHooks {
125
+ beforeWrite?: (next: PersistedDeviceIdentity) => void | Promise<void>;
126
+ afterWrite?: (next: PersistedDeviceIdentity) => void | Promise<void>;
127
+ }
128
+ //#endregion
129
+ //#region src/device/IdentityStore.d.ts
130
+ /**
131
+ * Minimal interface for reading + writing the persisted identity file.
132
+ * Default impl uses `getDeviceJsonPath()` (which honors `SERVICEME_HOME`),
133
+ * but tests can substitute a custom path for isolation.
134
+ */
135
+ interface IdentityFileBackend {
136
+ read(filePath: string): Promise<PersistedDeviceIdentity | null>;
137
+ write(filePath: string, payload: PersistedDeviceIdentity): Promise<AtomicWriteResult>;
138
+ exists(filePath: string): Promise<boolean>;
139
+ delete(filePath: string): Promise<void>;
140
+ listDir?(dir: string): Promise<string[]>;
141
+ }
142
+ interface IdentityStoreOptions {
143
+ filePath?: string;
144
+ hooks?: IdentityStoreHooks;
145
+ lockTimeoutMs?: number;
146
+ lockRetryMs?: number;
147
+ /** Injectable clock for deterministic tests. */
148
+ now?: () => Date;
149
+ backend?: IdentityFileBackend;
150
+ }
151
+ /**
152
+ * Default file backend — uses `node:fs/promises` with the canonical
153
+ * tmp-then-rename atomic-write pattern.
154
+ */
155
+ declare class FsIdentityFileBackend implements IdentityFileBackend {
156
+ exists(filePath: string): Promise<boolean>;
157
+ read(filePath: string): Promise<PersistedDeviceIdentity | null>;
158
+ write(filePath: string, payload: PersistedDeviceIdentity): Promise<AtomicWriteResult>;
159
+ delete(filePath: string): Promise<void>;
160
+ }
161
+ declare class IdentityStore {
162
+ private readonly filePath;
163
+ private readonly backend;
164
+ private readonly hooks;
165
+ private readonly lockTimeoutMs;
166
+ private readonly lockRetryMs;
167
+ constructor(opts?: IdentityStoreOptions);
168
+ /** Absolute path to the underlying JSON file (test seam). */
169
+ getFilePath(): string;
170
+ /** True when the JSON file already exists on disk. */
171
+ exists(): Promise<boolean>;
172
+ /** Read the persisted identity; returns `null` when no identity is stored. */
173
+ read(): Promise<PersistedDeviceIdentity | null>;
174
+ /**
175
+ * Atomically write the given identity. Concurrent writers are
176
+ * serialized via the file lock; the read-modify-write happens
177
+ * inside the lock so callers can't see a partial state.
178
+ */
179
+ write(next: PersistedDeviceIdentity): Promise<AtomicWriteResult>;
180
+ /**
181
+ * Read-modify-write under the same lock. The mutator receives the
182
+ * current identity (or `null` on first call) and returns the
183
+ * replacement. Throwing inside the mutator aborts the write.
184
+ */
185
+ mutate<T>(mutator: (current: PersistedDeviceIdentity | null) => Promise<{
186
+ next: PersistedDeviceIdentity;
187
+ result?: T;
188
+ }>): Promise<{
189
+ result: T | undefined;
190
+ written: PersistedDeviceIdentity;
191
+ }>;
192
+ /** Wipe the persisted identity (used by `device.enroll --force`). */
193
+ clear(): Promise<void>;
194
+ /**
195
+ * Resolve the installation metadata for the current machine.
196
+ * Pure helper — no I/O, just `os.*` calls.
197
+ */
198
+ resolveInstallationMetadata(): Pick<PersistedDeviceIdentity, "installationId" | "machineId" | "platform">;
199
+ /**
200
+ * Ensure the parent directory exists (`~/.serviceme/`). Idempotent.
201
+ * Useful when the bootstrap phase5 placeholder wasn't run yet.
202
+ */
203
+ ensureHome(): Promise<void>;
204
+ }
205
+ //#endregion
206
+ //#region src/device/Enroller.d.ts
207
+ interface EnrollerOptions {
208
+ identityStore: IdentityStore;
209
+ /** Injectable clock for deterministic tests. */
210
+ now?: () => Date;
211
+ /** Override the random source (tests). */
212
+ randomBytes?: (size: number) => Buffer;
213
+ /** Caller-supplied enroll HTTP function. Phase 5.4 wires the real one. */
214
+ enrollRequest?: EnrollRequestFn;
215
+ }
216
+ type EnrollRequestFn = (input: {
217
+ installationId: string;
218
+ machineId: string;
219
+ platform: string;
220
+ existing: PersistedDeviceIdentity | null;
221
+ force: boolean;
222
+ requireAuth: boolean;
223
+ }) => Promise<EnrollResponse>;
224
+ interface EnrollResponse {
225
+ publicId: string;
226
+ deviceSecret: string;
227
+ secretVersion: number;
228
+ bindingState: DeviceBindingState;
229
+ expiresAt?: string;
230
+ }
231
+ /** Sentinel error — re-enroll on a claimed device without auth. */
232
+ declare class DeviceReenrollRequiresAuthError extends Error {
233
+ constructor(message?: string);
234
+ }
235
+ /** Sentinel error — server returned a 410 / version-mismatch after rotation. */
236
+ declare class DeviceSecretVersionMismatchError extends Error {
237
+ constructor(message?: string);
238
+ }
239
+ declare class Enroller {
240
+ private readonly identity;
241
+ private readonly now;
242
+ private readonly random;
243
+ private readonly enrollRequest?;
244
+ private inflight;
245
+ constructor(opts: EnrollerOptions);
246
+ /**
247
+ * Read the current binding state without touching the disk.
248
+ * Returns `anonymous` when no identity is stored.
249
+ */
250
+ currentState(): Promise<DeviceBindingState>;
251
+ /**
252
+ * Drive the enrollment flow.
253
+ *
254
+ * @param force when true, drop the local identity and start fresh
255
+ * (server treats this as a brand-new install).
256
+ * @param requireAuth when true, refuse to silently re-enroll an
257
+ * existing claimed device — throw
258
+ * `DeviceReenrollRequiresAuthError` instead.
259
+ */
260
+ /**
261
+ * Resolve when any in-flight enrollment completes. Returns immediately
262
+ * when no enrollment is in progress. Allows callers (e.g. the extension's
263
+ * `buildDeviceAuthHeaders`) to wait for a concurrent `syncDeviceInfo()`
264
+ * enrollment before attempting to read the identity from the store.
265
+ */
266
+ waitForEnrollment(): Promise<void>;
267
+ enroll(opts?: {
268
+ force?: boolean;
269
+ requireAuth?: boolean;
270
+ }): Promise<DeviceEnrollResult>;
271
+ /** Test seam — surface the underlying identity store. */
272
+ getIdentityStore(): IdentityStore;
273
+ /** True when an enrollment is currently in-flight. Used by callers (e.g. the extension's `buildDeviceAuthHeaders`) to skip triggering a competing enrollment. */
274
+ isEnrolling(): boolean;
275
+ private runEnroll;
276
+ /**
277
+ * Rotate the HMAC secret. Keeps the previous secret for the grace
278
+ * window (default 7 days per `2.需求澄清.md` §1.2) — the
279
+ * `previousSecretExpiresAt` is stamped on the persisted identity.
280
+ */
281
+ rotateSecret(opts?: {
282
+ gracePeriodDays?: number;
283
+ }): Promise<{
284
+ publicId: string;
285
+ secretVersion: number;
286
+ gracePeriodDays: number;
287
+ }>;
288
+ /**
289
+ * Mark the device as `expired`. Used when the server returns a
290
+ * device-expiry response; the next `enroll()` call forces a fresh
291
+ * round-trip.
292
+ */
293
+ markExpired(): Promise<void>;
294
+ /**
295
+ * Mark the device as `claimed`. Called by the bridge after a
296
+ * successful `device.claim` server response.
297
+ */
298
+ markClaimed(): Promise<void>;
299
+ }
300
+ //#endregion
301
+ //#region src/device/DeviceCore.d.ts
302
+ interface DeviceCoreOptions {
303
+ identityStore?: IdentityStore;
304
+ enrollRequest?: EnrollRequestFn;
305
+ now?: () => Date;
306
+ /** Optional override for `deriveInstallationId` (used by tests for determinism). */
307
+ resolveInstallationId?: () => string;
308
+ }
309
+ declare class DeviceCore {
310
+ private readonly identity;
311
+ private readonly enroller;
312
+ private readonly resolveInstallationId;
313
+ constructor(opts?: DeviceCoreOptions);
314
+ /** Read-only snapshot of the device status (matches `device.status` wire shape). */
315
+ status(): Promise<DeviceStatus>;
316
+ /** Enroll (or re-enroll) the device. */
317
+ enroll(opts?: {
318
+ force?: boolean;
319
+ requireAuth?: boolean;
320
+ }): Promise<DeviceEnrollResult>;
321
+ /** Wait for any in-flight enrollment to finish. Use before `buildSignedHeaders` so that a concurrent `syncDeviceInfo` enrollment has time to write the identity to the store. */
322
+ waitForEnrollment(): Promise<void>;
323
+ /** True when an enrollment is currently in-flight. Used by callers to skip triggering a competing enrollment. */
324
+ isEnrolling(): boolean;
325
+ /** Rotate the HMAC secret while keeping the previous one for the grace window. */
326
+ rotateSecret(opts?: {
327
+ gracePeriodDays?: number;
328
+ }): Promise<DeviceRotateSecretResult>;
329
+ /** Build the v2 signed header map for an outbound request. The path
330
+ * MUST include the query string (v2 signs it). */
331
+ buildSignedHeaders(input: {
332
+ method: string;
333
+ path: string;
334
+ body: string;
335
+ }): Promise<DeviceSignedHeaders | null>;
336
+ /** Raw stored identity (CLI/extension internal use). Test seam too. */
337
+ readIdentity(): Promise<PersistedDeviceIdentity | null>;
338
+ /** Wipe the local identity (the `--force` path before re-enroll). */
339
+ clear(): Promise<void>;
340
+ /** Mark the device as claimed (called by the bridge after a successful claim). */
341
+ markClaimed(): Promise<void>;
342
+ /** Mark the device as expired (server returned an expiry response). */
343
+ markExpired(): Promise<void>;
344
+ /** Expose the identity store (CLI uses it for direct file access in tests). */
345
+ getIdentityStore(): IdentityStore;
346
+ /** Expose the enroller (CLI uses it for state inspection). */
347
+ getEnroller(): Enroller;
348
+ /** Header name constants — re-exported from `deviceAuth.ts`. */
349
+ getHeaderNames(): typeof DeviceAuthHeaders;
350
+ /** Compute the installation id for the current machine. */
351
+ getInstallationId(): string;
352
+ }
353
+ //#endregion
354
+ //#region src/device/InstallationId.d.ts
355
+ /**
356
+ * InstallationId — Derive a stable per-machine identifier from
357
+ * `os.hostname()` + `os.userInfo()`.
358
+ *
359
+ * Per `docs/architecture/phase-5-auth-device-toolbox.md § P5-2 (并入本文时对应 § P5-2 拆分)` B2,
360
+ * `installationId` MUST survive Extension re-installs but vary across
361
+ * machines. We compute a UUID v5-style hash over hostname + username +
362
+ * platform so the result is:
363
+ * - deterministic (same machine → same id)
364
+ * - collision-resistant (SHA-256, 128-bit truncated)
365
+ * - browser-safe (no PII survives — username never enters output)
366
+ *
367
+ * Note: this intentionally differs from `vscode.env.machineId`, which
368
+ * is per-Extension-install and uses a different algorithm. The two
369
+ * coexist: `installationId` is what gets sent to the server, while
370
+ * `machineId` (raw `os.hostname()`) is for diagnostics.
371
+ *
372
+ * Refs:
373
+ * - 4.功能规划.md §2.2 — `InstallationId.ts os.hostname() + os.userInfo() 哈希生成`
374
+ * - 3.功能拆分.md B2 — installationId semantics
375
+ */
376
+ /**
377
+ * Returns a deterministic installation id for the current machine.
378
+ * Use this when you need an id that survives Extension reinstalls
379
+ * but stays stable across restarts on the same machine.
380
+ */
381
+ declare function deriveInstallationId(): string;
382
+ /**
383
+ * Returns a random installation id (UUID v4). Use this for fresh
384
+ * installs when no fingerprint input is available (e.g. containerized
385
+ * CI runners where `os.hostname()` is meaningless).
386
+ */
387
+ declare function randomInstallationId(): string;
388
+ /** SHA-256 fingerprint material exposed for tests + diagnostics. */
389
+ declare function fingerprintSource(): string;
390
+ //#endregion
391
+ export { DeviceSignedHeaders as C, DeviceRequestSignatureParams as S, createDeviceRequestSignature as T, DEVICE_JSON_SCHEMA_VERSION as _, DeviceCoreOptions as a, BuildSignedHeadersParams as b, EnrollRequestFn as c, EnrollerOptions as d, FsIdentityFileBackend as f, AtomicWriteResult as g, IdentityStoreOptions as h, DeviceCore as i, EnrollResponse as l, IdentityStore as m, fingerprintSource as n, DeviceReenrollRequiresAuthError as o, IdentityFileBackend as p, randomInstallationId as r, DeviceSecretVersionMismatchError as s, deriveInstallationId as t, Enroller as u, IdentityStoreHooks as v, buildSignedHeaders as w, DeviceAuthHeaders as x, PersistedDeviceIdentity as y };
392
+ //# sourceMappingURL=index-DGXYp8J5.d.mts.map