@tgoliveira/vault-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 (138) hide show
  1. package/API_REFERENCE.md +36 -0
  2. package/ARCHITECTURE.md +32 -0
  3. package/LICENSE +21 -0
  4. package/MIGRATION_FROM_LIQSENSE.md +42 -0
  5. package/PASSKEY_PRF_ENVELOPES.md +9 -0
  6. package/PASSWORD_ENVELOPES.md +7 -0
  7. package/README.md +78 -0
  8. package/RECOVERY_PHRASE.md +9 -0
  9. package/SECURITY.md +31 -0
  10. package/dist/browser.d.ts +11 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +71 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/constants.d.ts +5 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/constants.js +5 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/crypto/aad.d.ts +4 -0
  19. package/dist/crypto/aad.d.ts.map +1 -0
  20. package/dist/crypto/aad.js +23 -0
  21. package/dist/crypto/aad.js.map +1 -0
  22. package/dist/crypto/aes-gcm.d.ts +9 -0
  23. package/dist/crypto/aes-gcm.d.ts.map +1 -0
  24. package/dist/crypto/aes-gcm.js +58 -0
  25. package/dist/crypto/aes-gcm.js.map +1 -0
  26. package/dist/crypto/encoding.d.ts +6 -0
  27. package/dist/crypto/encoding.d.ts.map +1 -0
  28. package/dist/crypto/encoding.js +27 -0
  29. package/dist/crypto/encoding.js.map +1 -0
  30. package/dist/crypto/random.d.ts +2 -0
  31. package/dist/crypto/random.d.ts.map +1 -0
  32. package/dist/crypto/random.js +4 -0
  33. package/dist/crypto/random.js.map +1 -0
  34. package/dist/crypto/serialization.d.ts +3 -0
  35. package/dist/crypto/serialization.d.ts.map +1 -0
  36. package/dist/crypto/serialization.js +7 -0
  37. package/dist/crypto/serialization.js.map +1 -0
  38. package/dist/envelopes/passkey-prf.d.ts +21 -0
  39. package/dist/envelopes/passkey-prf.d.ts.map +1 -0
  40. package/dist/envelopes/passkey-prf.js +78 -0
  41. package/dist/envelopes/passkey-prf.js.map +1 -0
  42. package/dist/envelopes/password.d.ts +20 -0
  43. package/dist/envelopes/password.d.ts.map +1 -0
  44. package/dist/envelopes/password.js +41 -0
  45. package/dist/envelopes/password.js.map +1 -0
  46. package/dist/envelopes/recovery.d.ts +46 -0
  47. package/dist/envelopes/recovery.d.ts.map +1 -0
  48. package/dist/envelopes/recovery.js +167 -0
  49. package/dist/envelopes/recovery.js.map +1 -0
  50. package/dist/errors/vault-errors.d.ts +20 -0
  51. package/dist/errors/vault-errors.d.ts.map +1 -0
  52. package/dist/errors/vault-errors.js +37 -0
  53. package/dist/errors/vault-errors.js.map +1 -0
  54. package/dist/index.d.ts +21 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +20 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/kdf/argon2id.d.ts +24 -0
  59. package/dist/kdf/argon2id.d.ts.map +1 -0
  60. package/dist/kdf/argon2id.js +57 -0
  61. package/dist/kdf/argon2id.js.map +1 -0
  62. package/dist/kdf/params.d.ts +9 -0
  63. package/dist/kdf/params.d.ts.map +1 -0
  64. package/dist/kdf/params.js +8 -0
  65. package/dist/kdf/params.js.map +1 -0
  66. package/dist/keys/user-vault-key.d.ts +7 -0
  67. package/dist/keys/user-vault-key.d.ts.map +1 -0
  68. package/dist/keys/user-vault-key.js +15 -0
  69. package/dist/keys/user-vault-key.js.map +1 -0
  70. package/dist/payload/encrypted-payload.d.ts +5 -0
  71. package/dist/payload/encrypted-payload.d.ts.map +1 -0
  72. package/dist/payload/encrypted-payload.js +14 -0
  73. package/dist/payload/encrypted-payload.js.map +1 -0
  74. package/dist/profile.d.ts +21 -0
  75. package/dist/profile.d.ts.map +1 -0
  76. package/dist/profile.js +9 -0
  77. package/dist/profile.js.map +1 -0
  78. package/dist/react/index.d.ts +6 -0
  79. package/dist/react/index.d.ts.map +1 -0
  80. package/dist/react/index.js +6 -0
  81. package/dist/react/index.js.map +1 -0
  82. package/dist/react/session/use-vault-session.d.ts +11 -0
  83. package/dist/react/session/use-vault-session.d.ts.map +1 -0
  84. package/dist/react/session/use-vault-session.js +29 -0
  85. package/dist/react/session/use-vault-session.js.map +1 -0
  86. package/dist/react/session/use-vault-unlocked.d.ts +3 -0
  87. package/dist/react/session/use-vault-unlocked.d.ts.map +1 -0
  88. package/dist/react/session/use-vault-unlocked.js +9 -0
  89. package/dist/react/session/use-vault-unlocked.js.map +1 -0
  90. package/dist/react/session/vault-session-provider.d.ts +9 -0
  91. package/dist/react/session/vault-session-provider.d.ts.map +1 -0
  92. package/dist/react/session/vault-session-provider.js +16 -0
  93. package/dist/react/session/vault-session-provider.js.map +1 -0
  94. package/dist/react/status/resolve-vault-client-status.d.ts +8 -0
  95. package/dist/react/status/resolve-vault-client-status.d.ts.map +1 -0
  96. package/dist/react/status/resolve-vault-client-status.js +13 -0
  97. package/dist/react/status/resolve-vault-client-status.js.map +1 -0
  98. package/dist/react/status/use-vault-client-status.d.ts +3 -0
  99. package/dist/react/status/use-vault-client-status.d.ts.map +1 -0
  100. package/dist/react/status/use-vault-client-status.js +8 -0
  101. package/dist/react/status/use-vault-client-status.js.map +1 -0
  102. package/dist/recovery/kit.d.ts +16 -0
  103. package/dist/recovery/kit.d.ts.map +1 -0
  104. package/dist/recovery/kit.js +33 -0
  105. package/dist/recovery/kit.js.map +1 -0
  106. package/dist/session/auto-lock.d.ts +18 -0
  107. package/dist/session/auto-lock.d.ts.map +1 -0
  108. package/dist/session/auto-lock.js +86 -0
  109. package/dist/session/auto-lock.js.map +1 -0
  110. package/dist/session/memory-session.d.ts +8 -0
  111. package/dist/session/memory-session.d.ts.map +1 -0
  112. package/dist/session/memory-session.js +20 -0
  113. package/dist/session/memory-session.js.map +1 -0
  114. package/dist/testing/fixtures/liqsense-compat.d.ts +32 -0
  115. package/dist/testing/fixtures/liqsense-compat.d.ts.map +1 -0
  116. package/dist/testing/fixtures/liqsense-compat.js +31 -0
  117. package/dist/testing/fixtures/liqsense-compat.js.map +1 -0
  118. package/dist/testing/no-plaintext.d.ts +2 -0
  119. package/dist/testing/no-plaintext.d.ts.map +1 -0
  120. package/dist/testing/no-plaintext.js +2 -0
  121. package/dist/testing/no-plaintext.js.map +1 -0
  122. package/dist/testing.d.ts +2 -0
  123. package/dist/testing.d.ts.map +1 -0
  124. package/dist/testing.js +2 -0
  125. package/dist/testing.js.map +1 -0
  126. package/dist/validation/aad-assert.d.ts +5 -0
  127. package/dist/validation/aad-assert.d.ts.map +1 -0
  128. package/dist/validation/aad-assert.js +29 -0
  129. package/dist/validation/aad-assert.js.map +1 -0
  130. package/dist/validation/plaintext-reject.d.ts +23 -0
  131. package/dist/validation/plaintext-reject.d.ts.map +1 -0
  132. package/dist/validation/plaintext-reject.js +75 -0
  133. package/dist/validation/plaintext-reject.js.map +1 -0
  134. package/dist/validation/schemas.d.ts +203 -0
  135. package/dist/validation/schemas.d.ts.map +1 -0
  136. package/dist/validation/schemas.js +39 -0
  137. package/dist/validation/schemas.js.map +1 -0
  138. package/package.json +100 -0
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_ARGON2ID_PARAMS = {
2
+ memory: 65536,
3
+ iterations: 3,
4
+ parallelism: 1,
5
+ hashLength: 32,
6
+ saltLength: 16,
7
+ };
8
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/kdf/params.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;CACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type UserVaultKey = CryptoKey;
2
+ export declare function createUserVaultKey(): Promise<CryptoKey>;
3
+ /** @deprecated Use createUserVaultKey */
4
+ export declare const generateUserVaultKey: typeof createUserVaultKey;
5
+ export declare function importUserVaultKey(rawKey: Uint8Array): Promise<CryptoKey>;
6
+ export declare function exportUserVaultKey(key: CryptoKey): Promise<Uint8Array>;
7
+ //# sourceMappingURL=user-vault-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-vault-key.d.ts","sourceRoot":"","sources":["../../src/keys/user-vault-key.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,SAAS,CAAC,CAE7D;AAED,yCAAyC;AACzC,eAAO,MAAM,oBAAoB,2BAAqB,CAAC;AAEvD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAG/E;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAG5E"}
@@ -0,0 +1,15 @@
1
+ import { generateAesKey } from "../crypto/aes-gcm.js";
2
+ export async function createUserVaultKey() {
3
+ return generateAesKey();
4
+ }
5
+ /** @deprecated Use createUserVaultKey */
6
+ export const generateUserVaultKey = createUserVaultKey;
7
+ export async function importUserVaultKey(rawKey) {
8
+ const { importAesKey } = await import("../crypto/aes-gcm.js");
9
+ return importAesKey(rawKey);
10
+ }
11
+ export async function exportUserVaultKey(key) {
12
+ const { exportAesKey } = await import("../crypto/aes-gcm.js");
13
+ return exportAesKey(key);
14
+ }
15
+ //# sourceMappingURL=user-vault-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-vault-key.js","sourceRoot":"","sources":["../../src/keys/user-vault-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB;IACzD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAc;IACrD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC9D,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { VaultCryptoProfile, VaultAadScope } from "../profile.js";
2
+ import type { EncryptedVaultPayload } from "../validation/schemas.js";
3
+ export declare function encryptVaultPayload<T>(payload: T, vaultKey: CryptoKey, scope: Pick<VaultAadScope, "userId" | "resourceId">, profile: VaultCryptoProfile): Promise<EncryptedVaultPayload>;
4
+ export declare function decryptVaultPayload<T>(encrypted: EncryptedVaultPayload, vaultKey: CryptoKey): Promise<T>;
5
+ //# sourceMappingURL=encrypted-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypted-payload.d.ts","sourceRoot":"","sources":["../../src/payload/encrypted-payload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,CAAC,EACV,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,YAAY,CAAC,EACnD,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAMhC;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,SAAS,EAAE,qBAAqB,EAChC,QAAQ,EAAE,SAAS,GAClB,OAAO,CAAC,CAAC,CAAC,CAGZ"}
@@ -0,0 +1,14 @@
1
+ import { encryptField, decryptField } from "../crypto/aes-gcm.js";
2
+ import { parseVaultPayload, serializeVaultPayload } from "../crypto/serialization.js";
3
+ export async function encryptVaultPayload(payload, vaultKey, scope, profile) {
4
+ return encryptField(serializeVaultPayload(payload), vaultKey, {
5
+ userId: scope.userId,
6
+ resourceId: scope.resourceId,
7
+ field: "vault_payload",
8
+ }, profile);
9
+ }
10
+ export async function decryptVaultPayload(encrypted, vaultKey) {
11
+ const json = await decryptField(encrypted, vaultKey);
12
+ return parseVaultPayload(json);
13
+ }
14
+ //# sourceMappingURL=encrypted-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypted-payload.js","sourceRoot":"","sources":["../../src/payload/encrypted-payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAItF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAU,EACV,QAAmB,EACnB,KAAmD,EACnD,OAA2B;IAE3B,OAAO,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE;QAC5D,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,eAAe;KACvB,EAAE,OAAO,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAgC,EAChC,QAAmB;IAEnB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,iBAAiB,CAAI,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type VaultCryptoVersion = "vault-v1";
2
+ export type VaultCryptoProfile = {
3
+ cryptoVersion: VaultCryptoVersion;
4
+ aadContextVault: string;
5
+ aadContextEnvelope: string;
6
+ };
7
+ export type VaultAadField = "vault_key" | "vault_payload" | "vault_index";
8
+ export type VaultAadScope = {
9
+ userId: string;
10
+ resourceId: string;
11
+ field: VaultAadField;
12
+ context?: string;
13
+ };
14
+ export type RecoveryPhraseWordCount = 12 | 24;
15
+ export type VaultLockState = "locked" | "unlocked";
16
+ export type VaultUnlockResult<TPayload> = {
17
+ vaultKey: CryptoKey;
18
+ payload: TPayload;
19
+ };
20
+ export declare function resolveAadContext(scope: Pick<VaultAadScope, "field" | "context">, profile: VaultCryptoProfile): string;
21
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,kBAAkB,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEnD,MAAM,MAAM,iBAAiB,CAAC,QAAQ,IAAI;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC,EAC/C,OAAO,EAAE,kBAAkB,GAC1B,MAAM,CAOR"}
@@ -0,0 +1,9 @@
1
+ export function resolveAadContext(scope, profile) {
2
+ if (scope.context !== undefined) {
3
+ return scope.context;
4
+ }
5
+ return scope.field === "vault_key"
6
+ ? profile.aadContextEnvelope
7
+ : profile.aadContextVault;
8
+ }
9
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,iBAAiB,CAC/B,KAA+C,EAC/C,OAA2B;IAE3B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,KAAK,WAAW;QAChC,CAAC,CAAC,OAAO,CAAC,kBAAkB;QAC5B,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { resolveVaultClientStatus, type VaultClientStatus, type VaultServerStatusSnapshot, } from "./status/resolve-vault-client-status.js";
2
+ export { useVaultClientStatus } from "./status/use-vault-client-status.js";
3
+ export { useVaultUnlocked, useVaultLockState, } from "./session/use-vault-unlocked.js";
4
+ export { useVaultSession, type UseVaultSessionOptions } from "./session/use-vault-session.js";
5
+ export { VaultSessionProvider, type VaultSessionProviderProps, } from "./session/vault-session-provider.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE9F,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { resolveVaultClientStatus, } from "./status/resolve-vault-client-status.js";
2
+ export { useVaultClientStatus } from "./status/use-vault-client-status.js";
3
+ export { useVaultUnlocked, useVaultLockState, } from "./session/use-vault-unlocked.js";
4
+ export { useVaultSession } from "./session/use-vault-session.js";
5
+ export { VaultSessionProvider, } from "./session/vault-session-provider.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAGzB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,eAAe,EAA+B,MAAM,gCAAgC,CAAC;AAE9F,OAAO,EACL,oBAAoB,GAErB,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type VaultSessionConfig } from "../../browser.js";
2
+ export type UseVaultSessionOptions = {
3
+ sessionConfig?: VaultSessionConfig;
4
+ registerUnloadGuard?: boolean;
5
+ };
6
+ export declare function useVaultSession(options?: UseVaultSessionOptions): {
7
+ unlocked: boolean;
8
+ lock: () => void;
9
+ touch: () => void;
10
+ };
11
+ //# sourceMappingURL=use-vault-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-vault-session.d.ts","sourceRoot":"","sources":["../../../src/react/session/use-vault-session.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B;;;;EA4BnE"}
@@ -0,0 +1,29 @@
1
+ import { useCallback, useEffect } from "react";
2
+ import { configureVaultSession, lockVaultSession, registerVaultUnloadGuard, touchVaultSession, } from "../../browser.js";
3
+ import { useVaultUnlocked } from "./use-vault-unlocked.js";
4
+ export function useVaultSession(options = {}) {
5
+ const { sessionConfig, registerUnloadGuard = true } = options;
6
+ const unlocked = useVaultUnlocked();
7
+ useEffect(() => {
8
+ if (sessionConfig) {
9
+ configureVaultSession(sessionConfig);
10
+ }
11
+ }, [sessionConfig]);
12
+ useEffect(() => {
13
+ if (!registerUnloadGuard)
14
+ return;
15
+ return registerVaultUnloadGuard();
16
+ }, [registerUnloadGuard]);
17
+ const lock = useCallback(() => {
18
+ lockVaultSession();
19
+ }, []);
20
+ const touch = useCallback(() => {
21
+ touchVaultSession();
22
+ }, []);
23
+ return {
24
+ unlocked,
25
+ lock,
26
+ touch,
27
+ };
28
+ }
29
+ //# sourceMappingURL=use-vault-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-vault-session.js","sourceRoot":"","sources":["../../../src/react/session/use-vault-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,MAAM,UAAU,eAAe,CAAC,UAAkC,EAAE;IAClE,MAAM,EAAE,aAAa,EAAE,mBAAmB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE,CAAC;YAClB,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACjC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,gBAAgB,EAAE,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,iBAAiB,EAAE,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function useVaultUnlocked(): boolean;
2
+ export declare function useVaultLockState(): "locked" | "unlocked";
3
+ //# sourceMappingURL=use-vault-unlocked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-vault-unlocked.d.ts","sourceRoot":"","sources":["../../../src/react/session/use-vault-unlocked.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C;AAED,wBAAgB,iBAAiB,IAAI,QAAQ,GAAG,UAAU,CAEzD"}
@@ -0,0 +1,9 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { isVaultUnlocked, subscribeVaultSession } from "../../browser.js";
3
+ export function useVaultUnlocked() {
4
+ return useSyncExternalStore(subscribeVaultSession, () => isVaultUnlocked(), () => false);
5
+ }
6
+ export function useVaultLockState() {
7
+ return useVaultUnlocked() ? "unlocked" : "locked";
8
+ }
9
+ //# sourceMappingURL=use-vault-unlocked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-vault-unlocked.js","sourceRoot":"","sources":["../../../src/react/session/use-vault-unlocked.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE1E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CACzB,qBAAqB,EACrB,GAAG,EAAE,CAAC,eAAe,EAAE,EACvB,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from "react";
2
+ import { type VaultSessionConfig } from "../../browser.js";
3
+ export type VaultSessionProviderProps = {
4
+ children: ReactNode;
5
+ sessionConfig?: VaultSessionConfig;
6
+ registerUnloadGuard?: boolean;
7
+ };
8
+ export declare function VaultSessionProvider({ children, sessionConfig, registerUnloadGuard, }: VaultSessionProviderProps): ReactNode;
9
+ //# sourceMappingURL=vault-session-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-session-provider.d.ts","sourceRoot":"","sources":["../../../src/react/session/vault-session-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,OAAO,CAAC;AAClD,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,aAAa,EACb,mBAA0B,GAC3B,EAAE,yBAAyB,aAa3B"}
@@ -0,0 +1,16 @@
1
+ import { useEffect } from "react";
2
+ import { configureVaultSession, registerVaultUnloadGuard, } from "../../browser.js";
3
+ export function VaultSessionProvider({ children, sessionConfig, registerUnloadGuard = true, }) {
4
+ useEffect(() => {
5
+ if (sessionConfig) {
6
+ configureVaultSession(sessionConfig);
7
+ }
8
+ }, [sessionConfig]);
9
+ useEffect(() => {
10
+ if (!registerUnloadGuard)
11
+ return;
12
+ return registerVaultUnloadGuard();
13
+ }, [registerUnloadGuard]);
14
+ return children;
15
+ }
16
+ //# sourceMappingURL=vault-session-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-session-provider.js","sourceRoot":"","sources":["../../../src/react/session/vault-session-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GAEzB,MAAM,kBAAkB,CAAC;AAQ1B,MAAM,UAAU,oBAAoB,CAAC,EACnC,QAAQ,EACR,aAAa,EACb,mBAAmB,GAAG,IAAI,GACA;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE,CAAC;YAClB,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACjC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type VaultClientStatus = "not_setup" | "locked" | "unlocked" | "unsupported_prf" | "error";
2
+ /** Minimal server status fields needed to derive client lock UI state. */
3
+ export type VaultServerStatusSnapshot = {
4
+ configured: boolean;
5
+ hasPasskeyPrfEnvelope?: boolean;
6
+ };
7
+ export declare function resolveVaultClientStatus(status: VaultServerStatusSnapshot | null, unlocked: boolean, prfSupported: boolean): VaultClientStatus;
8
+ //# sourceMappingURL=resolve-vault-client-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-vault-client-status.d.ts","sourceRoot":"","sources":["../../../src/react/status/resolve-vault-client-status.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,QAAQ,GACR,UAAU,GACV,iBAAiB,GACjB,OAAO,CAAC;AAEZ,0EAA0E;AAC1E,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,yBAAyB,GAAG,IAAI,EACxC,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,OAAO,GACpB,iBAAiB,CAWnB"}
@@ -0,0 +1,13 @@
1
+ export function resolveVaultClientStatus(status, unlocked, prfSupported) {
2
+ if (!status?.configured) {
3
+ return "not_setup";
4
+ }
5
+ if (unlocked) {
6
+ return "unlocked";
7
+ }
8
+ if (!prfSupported && status.hasPasskeyPrfEnvelope) {
9
+ return "unsupported_prf";
10
+ }
11
+ return "locked";
12
+ }
13
+ //# sourceMappingURL=resolve-vault-client-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-vault-client-status.js","sourceRoot":"","sources":["../../../src/react/status/resolve-vault-client-status.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,wBAAwB,CACtC,MAAwC,EACxC,QAAiB,EACjB,YAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAClD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type VaultClientStatus, type VaultServerStatusSnapshot } from "./resolve-vault-client-status.js";
2
+ export declare function useVaultClientStatus(serverStatus: VaultServerStatusSnapshot | null, prfSupported: boolean): VaultClientStatus;
3
+ //# sourceMappingURL=use-vault-client-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-vault-client-status.d.ts","sourceRoot":"","sources":["../../../src/react/status/use-vault-client-status.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAG1C,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,yBAAyB,GAAG,IAAI,EAC9C,YAAY,EAAE,OAAO,GACpB,iBAAiB,CAMnB"}
@@ -0,0 +1,8 @@
1
+ import { useMemo } from "react";
2
+ import { resolveVaultClientStatus, } from "./resolve-vault-client-status.js";
3
+ import { useVaultUnlocked } from "../session/use-vault-unlocked.js";
4
+ export function useVaultClientStatus(serverStatus, prfSupported) {
5
+ const unlocked = useVaultUnlocked();
6
+ return useMemo(() => resolveVaultClientStatus(serverStatus, unlocked, prfSupported), [serverStatus, unlocked, prfSupported]);
7
+ }
8
+ //# sourceMappingURL=use-vault-client-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-vault-client-status.js","sourceRoot":"","sources":["../../../src/react/status/use-vault-client-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EACL,wBAAwB,GAGzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,UAAU,oBAAoB,CAClC,YAA8C,EAC9C,YAAqB;IAErB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,wBAAwB,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,EACpE,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { RecoveryPhraseWordCount } from "../profile.js";
2
+ export declare function createRecoveryKitText(input: {
3
+ recoveryPhrase: string;
4
+ wordCount: RecoveryPhraseWordCount;
5
+ productName: string;
6
+ createdAt?: Date;
7
+ warnings?: string[];
8
+ }): string;
9
+ /** @deprecated Use createRecoveryKitText */
10
+ export declare function buildRecoveryKitContent(recoveryPhrase: string, options: {
11
+ wordCount: RecoveryPhraseWordCount;
12
+ productName: string;
13
+ createdAt?: Date;
14
+ warnings?: string[];
15
+ }): string;
16
+ //# sourceMappingURL=kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../../src/recovery/kit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE7D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,uBAAuB,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,MAAM,CAsBT;AAED,4CAA4C;AAC5C,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,SAAS,EAAE,uBAAuB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1G,MAAM,CAQR"}
@@ -0,0 +1,33 @@
1
+ export function createRecoveryKitText(input) {
2
+ const createdAt = input.createdAt ?? new Date();
3
+ const defaultWarnings = [
4
+ "Store this offline in a safe place.",
5
+ `Anyone with this phrase may be able to unlock your ${input.productName} vault.`,
6
+ `${input.productName} cannot recover your vault if you lose both your vault password and this phrase.`,
7
+ "This recovery phrase was generated in your browser and should never be shared.",
8
+ ];
9
+ const warnings = input.warnings ?? defaultWarnings;
10
+ return `${input.productName} Vault Recovery Kit
11
+
12
+ Recovery phrase type: ${input.wordCount}-word recovery phrase
13
+ Created: ${createdAt.toISOString()}
14
+ Product: ${input.productName}
15
+
16
+ Recovery phrase:
17
+ ${input.recoveryPhrase}
18
+
19
+ Important:
20
+ ${warnings.map((line) => `- ${line}`).join("\n")}
21
+ `;
22
+ }
23
+ /** @deprecated Use createRecoveryKitText */
24
+ export function buildRecoveryKitContent(recoveryPhrase, options) {
25
+ return createRecoveryKitText({
26
+ recoveryPhrase,
27
+ wordCount: options.wordCount,
28
+ productName: options.productName,
29
+ createdAt: options.createdAt,
30
+ warnings: options.warnings,
31
+ });
32
+ }
33
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/recovery/kit.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,KAMrC;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC;IAChD,MAAM,eAAe,GAAG;QACtB,qCAAqC;QACrC,sDAAsD,KAAK,CAAC,WAAW,SAAS;QAChF,GAAG,KAAK,CAAC,WAAW,kFAAkF;QACtG,gFAAgF;KACjF,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC;IAEnD,OAAO,GAAG,KAAK,CAAC,WAAW;;wBAEL,KAAK,CAAC,SAAS;WAC5B,SAAS,CAAC,WAAW,EAAE;WACvB,KAAK,CAAC,WAAW;;;EAG1B,KAAK,CAAC,cAAc;;;EAGpB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAC/C,CAAC;AACF,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,uBAAuB,CACrC,cAAsB,EACtB,OAA2G;IAE3G,OAAO,qBAAqB,CAAC;QAC3B,cAAc;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type VaultSessionConfig = {
2
+ autoLockMinutes?: number;
3
+ resolveAutoLockMinutes?: () => number | undefined;
4
+ };
5
+ export declare function configureVaultSession(config: VaultSessionConfig): void;
6
+ export declare function subscribeVaultSession(listener: () => void): () => void;
7
+ export declare function isVaultManuallyLocked(): boolean;
8
+ export declare function clearVaultAutoLockTimer(): void;
9
+ export declare function scheduleVaultAutoLock(): void;
10
+ export declare function touchVaultSession(): void;
11
+ export declare function unlockVaultSession(vaultKey: CryptoKey): void;
12
+ export declare function lockVaultSession(): void;
13
+ export declare function lockVaultSessionManually(): void;
14
+ export declare function resetVaultSessionLockState(): void;
15
+ export declare function registerVaultUnloadGuard(): () => void;
16
+ export declare function getVaultAutoLockRemainingMs(): number | null;
17
+ export { getSessionVaultKey, setSessionVaultKey, lockVault, isVaultUnlocked, clearVaultClientState, } from "./memory-session.js";
18
+ //# sourceMappingURL=auto-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-lock.d.ts","sourceRoot":"","sources":["../../src/session/auto-lock.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACnD,CAAC;AAQF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEtE;AAmBD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGtE;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAO5C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAK5D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAKjD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,IAAI,CAMrD;AAED,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,IAAI,CAG3D;AAED,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { DEFAULT_VAULT_AUTO_LOCK_MINUTES } from "../constants.js";
2
+ import { isVaultUnlocked, lockVault, setSessionVaultKey } from "./memory-session.js";
3
+ let sessionConfig = {};
4
+ let inactivityTimer = null;
5
+ let manuallyLocked = false;
6
+ let lastActivityAt = 0;
7
+ const listeners = new Set();
8
+ export function configureVaultSession(config) {
9
+ sessionConfig = config;
10
+ }
11
+ function getAutoLockTimeoutMs() {
12
+ const resolved = sessionConfig.resolveAutoLockMinutes?.();
13
+ const minutes = resolved ??
14
+ sessionConfig.autoLockMinutes ??
15
+ DEFAULT_VAULT_AUTO_LOCK_MINUTES;
16
+ const safeMinutes = Number.isFinite(minutes) && minutes > 0 ? minutes : DEFAULT_VAULT_AUTO_LOCK_MINUTES;
17
+ return safeMinutes * 60 * 1000;
18
+ }
19
+ function notifyVaultSessionChange() {
20
+ for (const listener of listeners) {
21
+ listener();
22
+ }
23
+ }
24
+ export function subscribeVaultSession(listener) {
25
+ listeners.add(listener);
26
+ return () => listeners.delete(listener);
27
+ }
28
+ export function isVaultManuallyLocked() {
29
+ return manuallyLocked;
30
+ }
31
+ export function clearVaultAutoLockTimer() {
32
+ if (inactivityTimer) {
33
+ clearTimeout(inactivityTimer);
34
+ inactivityTimer = null;
35
+ }
36
+ }
37
+ export function scheduleVaultAutoLock() {
38
+ if (!isVaultUnlocked() || manuallyLocked)
39
+ return;
40
+ clearVaultAutoLockTimer();
41
+ lastActivityAt = Date.now();
42
+ inactivityTimer = setTimeout(() => {
43
+ lockVaultSession();
44
+ }, getAutoLockTimeoutMs());
45
+ }
46
+ export function touchVaultSession() {
47
+ if (isVaultUnlocked() && !manuallyLocked) {
48
+ scheduleVaultAutoLock();
49
+ }
50
+ }
51
+ export function unlockVaultSession(vaultKey) {
52
+ manuallyLocked = false;
53
+ setSessionVaultKey(vaultKey);
54
+ scheduleVaultAutoLock();
55
+ notifyVaultSessionChange();
56
+ }
57
+ export function lockVaultSession() {
58
+ clearVaultAutoLockTimer();
59
+ lastActivityAt = 0;
60
+ lockVault();
61
+ manuallyLocked = true;
62
+ notifyVaultSessionChange();
63
+ }
64
+ export function lockVaultSessionManually() {
65
+ lockVaultSession();
66
+ }
67
+ export function resetVaultSessionLockState() {
68
+ manuallyLocked = false;
69
+ clearVaultAutoLockTimer();
70
+ lastActivityAt = 0;
71
+ notifyVaultSessionChange();
72
+ }
73
+ export function registerVaultUnloadGuard() {
74
+ if (typeof window === "undefined")
75
+ return () => undefined;
76
+ const handler = () => lockVaultSession();
77
+ window.addEventListener("pagehide", handler);
78
+ return () => window.removeEventListener("pagehide", handler);
79
+ }
80
+ export function getVaultAutoLockRemainingMs() {
81
+ if (!isVaultUnlocked() || manuallyLocked || lastActivityAt === 0)
82
+ return null;
83
+ return Math.max(0, getAutoLockTimeoutMs() - (Date.now() - lastActivityAt));
84
+ }
85
+ export { getSessionVaultKey, setSessionVaultKey, lockVault, isVaultUnlocked, clearVaultClientState, } from "./memory-session.js";
86
+ //# sourceMappingURL=auto-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-lock.js","sourceRoot":"","sources":["../../src/session/auto-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAOrF,IAAI,aAAa,GAAuB,EAAE,CAAC;AAC3C,IAAI,eAAe,GAAyC,IAAI,CAAC;AACjE,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC9D,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,sBAAsB,EAAE,EAAE,CAAC;IAC1D,MAAM,OAAO,GACX,QAAQ;QACR,aAAa,CAAC,eAAe;QAC7B,+BAA+B,CAAC;IAClC,MAAM,WAAW,GACf,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;IACtF,OAAO,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,wBAAwB;IAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,QAAQ,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAoB;IACxD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,eAAe,EAAE,CAAC;QACpB,YAAY,CAAC,eAAe,CAAC,CAAC;QAC9B,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC,eAAe,EAAE,IAAI,cAAc;QAAE,OAAO;IACjD,uBAAuB,EAAE,CAAC;IAC1B,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;QAChC,gBAAgB,EAAE,CAAC;IACrB,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,eAAe,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,qBAAqB,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAmB;IACpD,cAAc,GAAG,KAAK,CAAC;IACvB,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7B,qBAAqB,EAAE,CAAC;IACxB,wBAAwB,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,uBAAuB,EAAE,CAAC;IAC1B,cAAc,GAAG,CAAC,CAAC;IACnB,SAAS,EAAE,CAAC;IACZ,cAAc,GAAG,IAAI,CAAC;IACtB,wBAAwB,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,gBAAgB,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,cAAc,GAAG,KAAK,CAAC;IACvB,uBAAuB,EAAE,CAAC;IAC1B,cAAc,GAAG,CAAC,CAAC;IACnB,wBAAwB,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IAE1D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACzC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,IAAI,CAAC,eAAe,EAAE,IAAI,cAAc,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function getSessionVaultKey(): CryptoKey | null;
2
+ export declare function setSessionVaultKey(key: CryptoKey | null): void;
3
+ export declare function lockVault(): void;
4
+ export declare function isVaultUnlocked(): boolean;
5
+ export declare function clearVaultClientState(): void;
6
+ export type VaultLockState = ReturnType<typeof isVaultUnlocked> extends true ? "unlocked" : "locked";
7
+ export declare function getVaultLockState(): "locked" | "unlocked";
8
+ //# sourceMappingURL=memory-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-session.d.ts","sourceRoot":"","sources":["../../src/session/memory-session.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,IAAI,SAAS,GAAG,IAAI,CAErD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAE9D;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,IAAI,GAAG,UAAU,GAAG,QAAQ,CAAC;AAErG,wBAAgB,iBAAiB,IAAI,QAAQ,GAAG,UAAU,CAEzD"}
@@ -0,0 +1,20 @@
1
+ let sessionVaultKey = null;
2
+ export function getSessionVaultKey() {
3
+ return sessionVaultKey;
4
+ }
5
+ export function setSessionVaultKey(key) {
6
+ sessionVaultKey = key;
7
+ }
8
+ export function lockVault() {
9
+ sessionVaultKey = null;
10
+ }
11
+ export function isVaultUnlocked() {
12
+ return sessionVaultKey !== null;
13
+ }
14
+ export function clearVaultClientState() {
15
+ setSessionVaultKey(null);
16
+ }
17
+ export function getVaultLockState() {
18
+ return isVaultUnlocked() ? "unlocked" : "locked";
19
+ }
20
+ //# sourceMappingURL=memory-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-session.js","sourceRoot":"","sources":["../../src/session/memory-session.ts"],"names":[],"mappings":"AAAA,IAAI,eAAe,GAAqB,IAAI,CAAC;AAE7C,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,eAAe,GAAG,GAAG,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,eAAe,KAAK,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAID,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { VaultCryptoProfile } from "../../profile.js";
2
+ /** Frozen LiqSense compatibility profile — must not change. */
3
+ export declare const LIQSENSE_COMPAT_PROFILE: VaultCryptoProfile;
4
+ export declare const LIQSENSE_COMPAT_USER_ID = "00000000-0000-4000-8000-000000000001";
5
+ export declare const LIQSENSE_COMPAT_SCOPE: {
6
+ userId: string;
7
+ resourceId: string;
8
+ };
9
+ /** Fixed 32-byte UVK for fixture generation (not a production key). */
10
+ export declare const FIXTURE_UVK_BYTES: Uint8Array<ArrayBuffer>;
11
+ /** Fixed 16-byte Argon2 salt for deterministic envelope fixtures. */
12
+ export declare const FIXTURE_ARGON2_SALT: Uint8Array<ArrayBuffer>;
13
+ export declare const FIXTURE_VAULT_PASSWORD = "SENTINEL_VAULT_PASSWORD_DO_NOT_STORE";
14
+ export declare const FIXTURE_12_WORD_PHRASE = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
15
+ export declare const FIXTURE_24_WORD_PHRASE = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art";
16
+ /** 32-byte PRF output for passkey envelope fixtures. */
17
+ export declare const FIXTURE_PRF_OUTPUT: Uint8Array<ArrayBuffer>;
18
+ export declare const FIXTURE_PAYLOAD_V1: {
19
+ version: number;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ profile: {
23
+ displayName: string;
24
+ };
25
+ subscriptions: never[];
26
+ walletLabels: never[];
27
+ strategyNotes: never[];
28
+ privatePreferences: {
29
+ privateModeDefault: boolean;
30
+ };
31
+ };
32
+ //# sourceMappingURL=liqsense-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liqsense-compat.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/liqsense-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,+DAA+D;AAC/D,eAAO,MAAM,uBAAuB,EAAE,kBAIrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,yCAAyC,CAAC;AAE9E,eAAO,MAAM,qBAAqB;;;CAGjC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,yBAAmD,CAAC;AAElF,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,yBAAsD,CAAC;AAEvF,eAAO,MAAM,sBAAsB,yCAAyC,CAAC;AAE7E,eAAO,MAAM,sBAAsB,kGAC8D,CAAC;AAElG,eAAO,MAAM,sBAAsB,gMAC4J,CAAC;AAEhM,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,yBAAsD,CAAC;AAEtF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;CAS9B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /** Frozen LiqSense compatibility profile — must not change. */
2
+ export const LIQSENSE_COMPAT_PROFILE = {
3
+ cryptoVersion: "vault-v1",
4
+ aadContextVault: "liqsense:vault:v1",
5
+ aadContextEnvelope: "liqsense:vault-envelope:v1",
6
+ };
7
+ export const LIQSENSE_COMPAT_USER_ID = "00000000-0000-4000-8000-000000000001";
8
+ export const LIQSENSE_COMPAT_SCOPE = {
9
+ userId: LIQSENSE_COMPAT_USER_ID,
10
+ resourceId: LIQSENSE_COMPAT_USER_ID,
11
+ };
12
+ /** Fixed 32-byte UVK for fixture generation (not a production key). */
13
+ export const FIXTURE_UVK_BYTES = Uint8Array.from({ length: 32 }, (_, i) => i + 1);
14
+ /** Fixed 16-byte Argon2 salt for deterministic envelope fixtures. */
15
+ export const FIXTURE_ARGON2_SALT = Uint8Array.from({ length: 16 }, (_, i) => 0x10 + i);
16
+ export const FIXTURE_VAULT_PASSWORD = "SENTINEL_VAULT_PASSWORD_DO_NOT_STORE";
17
+ export const FIXTURE_12_WORD_PHRASE = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
18
+ export const FIXTURE_24_WORD_PHRASE = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art";
19
+ /** 32-byte PRF output for passkey envelope fixtures. */
20
+ export const FIXTURE_PRF_OUTPUT = Uint8Array.from({ length: 32 }, (_, i) => 0x20 + i);
21
+ export const FIXTURE_PAYLOAD_V1 = {
22
+ version: 1,
23
+ createdAt: "2026-01-01T00:00:00.000Z",
24
+ updatedAt: "2026-01-01T00:00:00.000Z",
25
+ profile: { displayName: "fixture-user" },
26
+ subscriptions: [],
27
+ walletLabels: [],
28
+ strategyNotes: [],
29
+ privatePreferences: { privateModeDefault: true },
30
+ };
31
+ //# sourceMappingURL=liqsense-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liqsense-compat.js","sourceRoot":"","sources":["../../../src/testing/fixtures/liqsense-compat.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAuB;IACzD,aAAa,EAAE,UAAU;IACzB,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,4BAA4B;CACjD,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,sCAAsC,CAAC;AAE9E,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,MAAM,EAAE,uBAAuB;IAC/B,UAAU,EAAE,uBAAuB;CACpC,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAElF,qEAAqE;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AAE7E,MAAM,CAAC,MAAM,sBAAsB,GACjC,+FAA+F,CAAC;AAElG,MAAM,CAAC,MAAM,sBAAsB,GACjC,6LAA6L,CAAC;AAEhM,wDAAwD;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAEtF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,0BAA0B;IACrC,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IACxC,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,kBAAkB,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;CACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "../validation/plaintext-reject.js";
2
+ //# sourceMappingURL=no-plaintext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-plaintext.d.ts","sourceRoot":"","sources":["../../src/testing/no-plaintext.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC"}