123456789101112export interface ManualSummonRecord {13 firstSummonedAt: number;14 summonCount: number;15 lastSummonedAt: number;16}1718export interface Canary {19 webhookUrl: string;20 label?: string;21 lastPinged?: number;22 pingCount?: number;23}2425export type CardNetwork = "visa" | "mastercard" | "amex" | "discover" | "unknown";26272829303132333435363738export interface PasskeyData {39 rpId: string;40 rpName: string;41 credentialId: string;42 publicKeyCose: string;43 privateKeyJwk?: JsonWebKey;44 userHandle: string;45 userName: string;46 userDisplayName: string;47 algorithm: -7 | -8;48 signCount: number;49 aaguid: string;50 backupEligible: boolean;51 backupState: boolean;52 lastUsedAt?: number;53 browser?: "chrome" | "firefox";54 transports?: string[];55 56 createdAt: number;57}5859{@link VaultEntry.passwordHistory}60export interface PasswordHistoryItem {61 62 password: string;63 64656667 changedAt: number;68}6970export interface VaultEntry {71 id: string; 72 7374757677 type?: "login" | "note" | "passkey" | "card";78 title: string;79 username?: string; 80 email?: string; 81 password?: string; 82 url?: string; 83 848586878889 additionalUrls?: string[];90 totp?: string; 91 929394959697 totpAlgorithm?: "SHA1" | "SHA256" | "SHA512";98 totpDigits?: number;99 totpPeriod?: number;100 notes?: string;101 breach?: number; 102 103104105106107 passwordChangedAt?: number;108 109110111112113114115 passwordHistory?: PasswordHistoryItem[];116 canary?: Canary;117 createdAt: number; 118 modifiedAt: number;119 deletedAt?: number;120 tags?: string[];121 122 passkey?: PasskeyData;123 124 125 126 127 rpId?: string;128 rpName?: string;129 credentialId?: string;130 publicKeyCose?: string;131 privateKeyJwk?: JsonWebKey;132 userHandle?: string;133 userName?: string;134 userDisplayName?: string;135 algorithm?: -7 | -8;136 signCount?: number;137 aaguid?: string;138 backupEligible?: boolean;139 backupState?: boolean;140 lastUsedAt?: number;141 browser?: "chrome" | "firefox";142 transports?: string[];143 144 cardholderName?: string;145 cardNumber?: string; 146 expMonth?: string;147 expYear?: string;148 cvc?: string;149 cardNickname?: string;150 network?: CardNetwork;151 last4?: string;152}153154155156157158159160export function hasPasskey(entry: VaultEntry): boolean {161 return entry.passkey !== undefined && entry.passkey.credentialId.length > 0;162}163164165166167168169170171172export function isPasskeyOnly(entry: VaultEntry): boolean {173 174 175 176 177 178 return hasPasskey(entry) && !entry.password && !entry.totp && !entry.email;179}180181export interface LegacyVaultEntry {182 id: string;183 title: string;184 username: string;185 password: string;186 url: string;187 totp?: string;188 totpAlgorithm?: "SHA1" | "SHA256" | "SHA512";189 totpDigits?: number;190 totpPeriod?: number;191 notes?: string;192 breach?: number;193 created: number;194 updated: number;195 deletedAt?: number;196}197198export interface CardEntry extends VaultEntry {199 type: "card";200 cardholderName: string;201 cardNumber: string;202 expMonth: string;203 expYear: string;204 cvc: string;205}206207208export interface PendingPasskeyRequest {209 requestId: number;210 type: "create" | "get";211 rpId: string;212 rpName: string;213 userName: string;214 userDisplayName?: string;215 216217218219220 browser?: "chrome" | "firefox";221 222 challenge?: string;223 224 userHandle?: string;225}226227export interface PasskeyProviderState {228 supported: boolean;229 enabled: boolean;230 attached: boolean;231 browserLabel: string;232 statusLabel: string;233 conflict?: string;234}235236export interface StoredVault {237 version: 1; 238 salt: string; 239 nonce: string; 240 ciphertext: string; 241 tag: string; 242 243 244 recovery_salt?: string; 245 recovery_wrapped_root_key?: string; 246 recovery_nonce?: string; 247 recovery_tag?: string; 248 249 250 251 252 pw_root_ciphertext?: string; 253 pw_root_nonce?: string; 254 pw_root_tag?: string; 255}256257258259260export type MessageType =261 | "GET_SYNC_ALERTS"262 | "CLEAR_CLIPBOARD"263 | "GET_PENDING_VOUCHED_DEVICES"264 | "CONFIRM_VOUCHED_DEVICE"265 | "REJECT_VOUCHED_DEVICE"266 | "VOUCHED_DEVICE_PENDING"267 | "ROTATE_SYNC_IDENTITY"268 | "DEVICE_KEY_ROTATED"269 | "UNLOCK"270 | "LOCK"271 | "IS_UNLOCKED"272 | "HAS_VAULT"273 | "GET_ENTRIES"274 | "ADD_ENTRY"275 | "BATCH_ADD_ENTRIES"276 | "RESTORE_ENTRIES"277 | "CLEAR_VAULT_ENTRIES"278 | "UPDATE_ENTRY"279 | "ADD_ADDITIONAL_URL"280 | "DELETE_ENTRY"281 | "AUTOFILL_QUERY"282 | "COPY"283 | "CREATE_VAULT"284 | "CREATE_VAULT_FROM_ROOT_KEY"285 | "GET_ENTRY_FOR_FILL"286 | "GET_ENTRY_FOR_EDIT"287 | "CHECK_ALL_BREACHES"288 | "GET_SETTINGS"289 | "UPDATE_SETTINGS"290 | "FIRE_CANARY_PING"291 | "ACTIVATE_LICENSE"292 | "GET_LICENSE"293 | "GET_LICENSE_KEY"294 | "IS_DURESS_ENABLED"295 | "SETUP_DURESS"296 | "DISABLE_DURESS"297 | "VERIFY_MAIN_PASSWORD"298 | "CHANGE_PASSWORD"299 | "GET_SITE_PASSWORD_POLICY"300 | "GET_LOCAL_IDENTITY"301 | "GET_ADOPTION_MATERIAL"302 | "COMPLETE_PAIRING"303 | "LIST_PAIRED_DEVICES"304 | "UNPAIR_DEVICE"305 | "RENAME_LOCAL_DEVICE"306 307 308 | "PAIR_WITH_CODE"309 | "CODE_PAIR_CONFIRM"310 | "CODE_PAIR_SAS"311 | "CODE_PAIR_RESULT"312 | "START_ADOPTION_SOURCE"313 | "ADOPTION_SOURCE_CONFIRM"314 | "CANCEL_ADOPTION_SOURCE"315 | "ADOPTION_SOURCE_SAS"316 | "ADOPTION_SOURCE_RESULT"317 | "TRIGGER_SYNC"318 | "GET_SYNC_STATE"319 | "GET_RELAY_SETTINGS"320 | "SET_RELAY_SETTINGS"321 | "GET_PENDING_PASSKEY"322 | "APPROVE_PASSKEY"323 | "DENY_PASSKEY"324 | "GET_PASSKEY_PROVIDER_STATE"325 | "SET_PASSKEY_PROVIDER_ENABLED"326 | "GET_DELETED_ENTRIES"327 | "RESTORE_ENTRY"328 | "PURGE_ENTRY"329 | "PURGE_EXPIRED_TRASH"330 | "GET_VAULT_HISTORY"331 | "RESTORE_VAULT_SNAPSHOT"332 | "COUNT_DUPLICATES"333 | "DEDUPLICATE_ENTRIES"334 | "RECORD_MANUAL_SUMMON"335 | "DECLINE_CARD_SAVE"336 | "IS_CARD_DECLINED"337 | "SUBMIT_FEEDBACK"338 | "GET_VAULT_STATUS"339 | "GET_ADVANCED_HEALTH_REPORT"340 | "DEACTIVATE_LICENSE"341 | "GET_IDENTITIES"342 | "DESTROY_VAULT"343 | "INITIATE_FIREFOX_PASSKEY_CREATE"344 | "COMPLETE_FIREFOX_PASSKEY_CREATE"345 | "PASSKEY_OFFER_DECLINE"346 | "GET_PASSKEY_OFFER_DECLINED"347 | "GET_PASSKEY_FOR_DOMAIN"348 349 350 351 | "PASSKEY_HAS_CREDENTIALS"352 | "PASSKEY_CREATE"353 | "PASSKEY_GET"354 355 | "UNLOCK_WITH_KEY"356 | "GET_DERIVED_KEY"357 358 | "VALIDATE_RECOVERY_WORDS"359 | "RECOVER_WITH_WORDS"360 | "GET_RECOVERY_WORDS"361 | "GET_IDENTITY_SUGGESTIONS"362 | "TOUCH_AUTO_LOCK"363 | "POPULATE_INLINE_VAULT"364 | "SAVE_NOTE"365 | "DELETE_NOTE"366 | "GET_NOTES"367 | "SEARCH_VAULT"368 | "ML_INIT"369 | "ML_PREDICT_BATCH"370 371 372 373 374 | "PING" 375 | "SUMMON_AUTOFILL" 376 | "VAULT_LOCKED" 377 | "VAULT_UNLOCKED" 378 | "PRO_GATE_TRIGGERED" 379 | "PASSKEY_PRO_GATE" 380 | "OPEN_PRO_GATE" 381 | "OPEN_POPUP" 382 | "SHOW_PASSKEY_TOAST" 383 | "DISMISS_PASSKEY_TOAST" 384 | "PASSKEY_AUTH_RESPONSE" 385 | "SHOULD_PLAY_CELEBRATION"386 | "MARK_CELEBRATION_PLAYED"387 388 389 | "GET_CODEX_VAULT_DATA"390 | "ESTIMATE_CODEX_PAGES"391 | "GENERATE_CODEX"392 | "RESTORE_FROM_CODEX";393394export type ProFeature =395 | "sync"396 | "passkeys"397 | "advanced_health"398 | "ios_app"399 | "codex"400 | "canary_entry"401 | "duress_vault";402403404405406407export interface PeachLicenseExport {408 key: string;409 activatedAt?: number;410}411412export interface AdvancedHealthEntryReport {413 id: string;414 title: string;415 domain: string;416 url?: string;417 score: number;418 ageDays: number;419 reasons: string[];420 factors: {421 breached: boolean;422 breachCount: number;423 reused: boolean;424 aged: boolean;425 weak: boolean;426 missingTotpOnSensitive: boolean;427 };428}429430export interface AdvancedHealthReport {431 vaultScore: number;432 generatedAt: number;433 entryCount: number;434 reusedGroups: number;435 agedCount: number;436 remediation: AdvancedHealthEntryReport[];437}438439export const ACCENT_COLORS = [440 { name: "peach", hex: "#F49C70" },441 { name: "rose", hex: "#FF8AA6" },442 { name: "plum", hex: "#D597F2" },443 { name: "lavender", hex: "#A6A8FF" },444 { name: "sky", hex: "#5BC8EE" },445 { name: "mint", hex: "#5EE0B0" },446 { name: "sage", hex: "#B5D870" },447 { name: "butter", hex: "#FFD45A" },448 { name: "sand", hex: "#EDBC85" },449 { name: "clay", hex: "#F08660" },450 { name: "slate", hex: "#80BEDE" },451 { name: "stone", hex: "#C8B8A8" },452] as const;453454export type AccentColorName = typeof ACCENT_COLORS[number]["name"];455456export interface SavedIdentity {457 value: string;458 type: "email" | "username";459 lastUsed: number;460 useCount: number;461 exampleDomain?: string;462}463464export interface PasswordPolicy {465 minLength?: number;466 maxLength?: number;467 requiresUppercase?: boolean;468 requiresLowercase?: boolean;469 requiresNumbers?: boolean;470 requiresSymbols?: boolean;471 forbidsSymbols?: boolean;472 allowedSymbols?: string;473 474 forbiddenChars?: string;475}476477478479480481482483484485486487488export interface VaultSnapshot {489 id: string;490 savedAt: number;491 reason: "local_save" | "sync_received" | "import" | "restore";492 vault_a: string;493 vault_b: string;494 495496497498499500 entryCount: number | null;501}502503export interface VaultHistory {504 505 snapshots: VaultSnapshot[];506}507508export interface Message {509 type: MessageType;510 payload?: unknown;511}512513514515516517518export type ErrorCode =519 | "vault_locked"520 | "vault_corrupted"521 | "no_vault"522 | "entry_not_found"523 | "invalid_payload"524 | "invalid_message"525 | "invalid_sender"526 | "wrong_passphrase"527 | "incorrect_current_password"528 | "recovery_not_setup"529 | "android_only"530 | "not_available"531 | "pro_required"532 | "pairing_not_verified"533 | "sync_rejected_unpaired_initiator"534 | "vault_not_applied"535 | "url_required"536 | "domain_required"537 | "rpid_required"538 | "rpid_and_username_required"539 | "publickeyhex_required"540 | "missing_payload"541 | "login_entries_only"542 | "passkey_not_fillable"543 | "invalid_webhook_url"544 | "invalid_feedback_endpoint"545 | "message_empty"546 | "network_error"547 | "operation_failed"548 | "adopt_invalid_root_key"549 | "adopt_vault_id_mismatch"550 | "unknown_message_type";551552export interface MessageResponse {553 ok: boolean;554 data?: unknown;555 error?: string;556 vaultId?: string;557 unlocked?: boolean;558 559 560 canRestoreFromHistory?: boolean;561 562 563 clearSeconds?: number;564}