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 notes?: string;92 breach?: number; 93 9495969798 passwordChangedAt?: number;99 100101102103104105106 passwordHistory?: PasswordHistoryItem[];107 canary?: Canary;108 createdAt: number; 109 modifiedAt: number;110 deletedAt?: number;111 tags?: string[];112 113 passkey?: PasskeyData;114 115 116 117 118 rpId?: string;119 rpName?: string;120 credentialId?: string;121 publicKeyCose?: string;122 privateKeyJwk?: JsonWebKey;123 userHandle?: string;124 userName?: string;125 userDisplayName?: string;126 algorithm?: -7 | -8;127 signCount?: number;128 aaguid?: string;129 backupEligible?: boolean;130 backupState?: boolean;131 lastUsedAt?: number;132 browser?: "chrome" | "firefox";133 transports?: string[];134 135 cardholderName?: string;136 cardNumber?: string; 137 expMonth?: string;138 expYear?: string;139 cvc?: string;140 cardNickname?: string;141 network?: CardNetwork;142 last4?: string;143}144145146147148149150151export function hasPasskey(entry: VaultEntry): boolean {152 return entry.passkey !== undefined && entry.passkey.credentialId.length > 0;153}154155156157158159160161162163export function isPasskeyOnly(entry: VaultEntry): boolean {164 165 166 167 168 169 return hasPasskey(entry) && !entry.password && !entry.totp && !entry.email;170}171172export interface LegacyVaultEntry {173 id: string;174 title: string;175 username: string;176 password: string;177 url: string;178 totp?: string;179 notes?: string;180 breach?: number;181 created: number;182 updated: number;183 deletedAt?: number;184}185186export interface CardEntry extends VaultEntry {187 type: "card";188 cardholderName: string;189 cardNumber: string;190 expMonth: string;191 expYear: string;192 cvc: string;193}194195196export interface PendingPasskeyRequest {197 requestId: number;198 type: "create" | "get";199 rpId: string;200 rpName: string;201 userName: string;202 userDisplayName?: string;203 204205206207208 browser?: "chrome" | "firefox";209 210 challenge?: string;211 212 userHandle?: string;213}214215export interface PasskeyProviderState {216 supported: boolean;217 enabled: boolean;218 attached: boolean;219 browserLabel: string;220 statusLabel: string;221 conflict?: string;222}223224export interface StoredVault {225 version: 1; 226 salt: string; 227 nonce: string; 228 ciphertext: string; 229 tag: string; 230 231 232 recovery_salt?: string; 233 recovery_wrapped_root_key?: string; 234 recovery_nonce?: string; 235 recovery_tag?: string; 236 237 238 239 240 pw_root_ciphertext?: string; 241 pw_root_nonce?: string; 242 pw_root_tag?: string; 243}244245246247248export type MessageType =249 | "GET_SYNC_ALERTS"250 | "CLEAR_CLIPBOARD"251 | "GET_PENDING_VOUCHED_DEVICES"252 | "CONFIRM_VOUCHED_DEVICE"253 | "REJECT_VOUCHED_DEVICE"254 | "VOUCHED_DEVICE_PENDING"255 | "ROTATE_SYNC_IDENTITY"256 | "DEVICE_KEY_ROTATED"257 | "UNLOCK"258 | "LOCK"259 | "IS_UNLOCKED"260 | "HAS_VAULT"261 | "GET_ENTRIES"262 | "ADD_ENTRY"263 | "BATCH_ADD_ENTRIES"264 | "RESTORE_ENTRIES"265 | "CLEAR_VAULT_ENTRIES"266 | "UPDATE_ENTRY"267 | "ADD_ADDITIONAL_URL"268 | "DELETE_ENTRY"269 | "AUTOFILL_QUERY"270 | "COPY"271 | "CREATE_VAULT"272 | "GET_ENTRY_FOR_FILL"273 | "GET_ENTRY_FOR_EDIT"274 | "CHECK_ALL_BREACHES"275 | "GET_SETTINGS"276 | "UPDATE_SETTINGS"277 | "FIRE_CANARY_PING"278 | "ACTIVATE_LICENSE"279 | "GET_LICENSE"280 | "GET_LICENSE_KEY"281 | "IS_DURESS_ENABLED"282 | "SETUP_DURESS"283 | "DISABLE_DURESS"284 | "VERIFY_MAIN_PASSWORD"285 | "CHANGE_PASSWORD"286 | "GET_SITE_PASSWORD_POLICY"287 | "CHIRP_GET_LOCAL_IDENTITY"288 | "CHIRP_COMPLETE_PAIRING"289 | "CHIRP_LIST_PAIRED_DEVICES"290 | "CHIRP_UNPAIR_DEVICE"291 | "CHIRP_RENAME_LOCAL_DEVICE"292 | "TRIGGER_SYNC"293 | "GET_SYNC_STATE"294 | "GET_PENDING_PASSKEY"295 | "APPROVE_PASSKEY"296 | "DENY_PASSKEY"297 | "GET_PASSKEY_PROVIDER_STATE"298 | "SET_PASSKEY_PROVIDER_ENABLED"299 | "GET_DELETED_ENTRIES"300 | "RESTORE_ENTRY"301 | "PURGE_ENTRY"302 | "PURGE_EXPIRED_TRASH"303 | "GET_VAULT_HISTORY"304 | "RESTORE_VAULT_SNAPSHOT"305 | "COUNT_DUPLICATES"306 | "DEDUPLICATE_ENTRIES"307 | "RECORD_MANUAL_SUMMON"308 | "DECLINE_CARD_SAVE"309 | "IS_CARD_DECLINED"310 | "SUBMIT_FEEDBACK"311 | "GET_VAULT_STATUS"312 | "GET_ADVANCED_HEALTH_REPORT"313 | "DEACTIVATE_LICENSE"314 | "GET_IDENTITIES"315 | "DESTROY_VAULT"316 | "INITIATE_FIREFOX_PASSKEY_CREATE"317 | "COMPLETE_FIREFOX_PASSKEY_CREATE"318 | "PASSKEY_OFFER_DECLINE"319 | "GET_PASSKEY_OFFER_DECLINED"320 | "GET_PASSKEY_FOR_DOMAIN"321 322 323 324 | "PASSKEY_HAS_CREDENTIALS"325 | "PASSKEY_CREATE"326 | "PASSKEY_GET"327 328 | "UNLOCK_WITH_KEY"329 | "GET_DERIVED_KEY"330 331 | "VALIDATE_RECOVERY_WORDS"332 | "RECOVER_WITH_WORDS"333 | "GET_RECOVERY_WORDS"334 | "GET_IDENTITY_SUGGESTIONS"335 | "TOUCH_AUTO_LOCK"336 | "POPULATE_INLINE_VAULT"337 | "SAVE_NOTE"338 | "DELETE_NOTE"339 | "GET_NOTES"340 | "SEARCH_VAULT"341 | "ML_INIT"342 | "ML_PREDICT_BATCH"343 344 345 346 347 | "PING" 348 | "SUMMON_AUTOFILL" 349 | "VAULT_LOCKED" 350 | "VAULT_UNLOCKED" 351 | "PRO_GATE_TRIGGERED" 352 | "PASSKEY_PRO_GATE" 353 | "OPEN_PRO_GATE" 354 | "OPEN_POPUP" 355 | "SHOW_PASSKEY_TOAST" 356 | "DISMISS_PASSKEY_TOAST" 357 | "PASSKEY_AUTH_RESPONSE" 358 | "SHOULD_PLAY_CELEBRATION"359 | "MARK_CELEBRATION_PLAYED"360 361 362 | "GET_CODEX_VAULT_DATA"363 | "ESTIMATE_CODEX_PAGES"364 | "GENERATE_CODEX"365 | "RESTORE_FROM_CODEX";366367export type ProFeature =368 | "sync"369 | "passkeys"370 | "advanced_health"371 | "ios_app"372 | "codex"373 | "canary_entry"374 | "duress_vault";375376377378379380export interface PeachLicenseExport {381 key: string;382 activatedAt?: number;383}384385export interface AdvancedHealthEntryReport {386 id: string;387 title: string;388 domain: string;389 url?: string;390 score: number;391 ageDays: number;392 reasons: string[];393 factors: {394 breached: boolean;395 breachCount: number;396 reused: boolean;397 aged: boolean;398 weak: boolean;399 missingTotpOnSensitive: boolean;400 };401}402403export interface AdvancedHealthReport {404 vaultScore: number;405 generatedAt: number;406 entryCount: number;407 reusedGroups: number;408 agedCount: number;409 remediation: AdvancedHealthEntryReport[];410}411412export const ACCENT_COLORS = [413 { name: "peach", hex: "#F49C70" },414 { name: "rose", hex: "#FF8AA6" },415 { name: "plum", hex: "#D597F2" },416 { name: "lavender", hex: "#A6A8FF" },417 { name: "sky", hex: "#5BC8EE" },418 { name: "mint", hex: "#5EE0B0" },419 { name: "sage", hex: "#B5D870" },420 { name: "butter", hex: "#FFD45A" },421 { name: "sand", hex: "#EDBC85" },422 { name: "clay", hex: "#F08660" },423 { name: "slate", hex: "#80BEDE" },424 { name: "stone", hex: "#C8B8A8" },425] as const;426427export type AccentColorName = typeof ACCENT_COLORS[number]["name"];428429export interface SavedIdentity {430 value: string;431 type: "email" | "username";432 lastUsed: number;433 useCount: number;434 exampleDomain?: string;435}436437export interface PasswordPolicy {438 minLength?: number;439 maxLength?: number;440 requiresUppercase?: boolean;441 requiresLowercase?: boolean;442 requiresNumbers?: boolean;443 requiresSymbols?: boolean;444 forbidsSymbols?: boolean;445 allowedSymbols?: string;446 447 forbiddenChars?: string;448}449450451452453454455456457458459460461export interface VaultSnapshot {462 id: string;463 savedAt: number;464 reason: "local_save" | "sync_received" | "import" | "restore";465 vault_a: string;466 vault_b: string;467 468 entryCount: number | null;469}470471export interface VaultHistory {472 473 snapshots: VaultSnapshot[];474}475476export interface Message {477 type: MessageType;478 payload?: unknown;479}480481482483484485486export type ErrorCode =487 | "vault_locked"488 | "vault_corrupted"489 | "no_vault"490 | "entry_not_found"491 | "invalid_payload"492 | "invalid_message"493 | "invalid_sender"494 | "wrong_passphrase"495 | "incorrect_current_password"496 | "recovery_not_setup"497 | "android_only"498 | "not_available"499 | "pro_required"500 | "pairing_not_verified"501 | "sync_rejected_unpaired_initiator"502 | "vault_not_applied"503 | "url_required"504 | "domain_required"505 | "rpid_required"506 | "rpid_and_username_required"507 | "publickeyhex_required"508 | "missing_payload"509 | "login_entries_only"510 | "passkey_not_fillable"511 | "invalid_webhook_url"512 | "invalid_feedback_endpoint"513 | "message_empty"514 | "network_error"515 | "operation_failed"516 | "unknown_message_type";517518export interface MessageResponse {519 ok: boolean;520 data?: unknown;521 error?: string;522 unlocked?: boolean;523 524 525 canRestoreFromHistory?: boolean;526}