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}5859export interface VaultEntry {60 id: string; 61 6263646566 type?: "login" | "note" | "passkey" | "card";67 title: string;68 username?: string; 69 email?: string; 70 password?: string; 71 url?: string; 72 737475767778 additionalUrls?: string[];79 totp?: string; 80 notes?: string;81 breach?: number; 82 8384858687 passwordChangedAt?: number;88 canary?: Canary;89 createdAt: number; 90 modifiedAt: number;91 deletedAt?: number;92 tags?: string[];93 94 passkey?: PasskeyData;95 96 97 98 99 rpId?: string;100 rpName?: string;101 credentialId?: string;102 publicKeyCose?: string;103 privateKeyJwk?: JsonWebKey;104 userHandle?: string;105 userName?: string;106 userDisplayName?: string;107 algorithm?: -7 | -8;108 signCount?: number;109 aaguid?: string;110 backupEligible?: boolean;111 backupState?: boolean;112 lastUsedAt?: number;113 browser?: "chrome" | "firefox";114 transports?: string[];115 116 cardholderName?: string;117 cardNumber?: string; 118 expMonth?: string;119 expYear?: string;120 cvc?: string;121 cardNickname?: string;122 network?: CardNetwork;123 last4?: string;124}125126127128129130131132export function hasPasskey(entry: VaultEntry): boolean {133 return entry.passkey !== undefined && entry.passkey.credentialId.length > 0;134}135136137138139140141142143144export function isPasskeyOnly(entry: VaultEntry): boolean {145 146 147 148 149 150 return hasPasskey(entry) && !entry.password && !entry.totp && !entry.email;151}152153export interface LegacyVaultEntry {154 id: string;155 title: string;156 username: string;157 password: string;158 url: string;159 totp?: string;160 notes?: string;161 breach?: number;162 created: number;163 updated: number;164 deletedAt?: number;165}166167export interface CardEntry extends VaultEntry {168 type: "card";169 cardholderName: string;170 cardNumber: string;171 expMonth: string;172 expYear: string;173 cvc: string;174}175176177export interface PendingPasskeyRequest {178 requestId: number;179 type: "create" | "get";180 rpId: string;181 rpName: string;182 userName: string;183 userDisplayName?: string;184 185186187188189 browser?: "chrome" | "firefox";190 191 challenge?: string;192 193 userHandle?: string;194}195196export interface PasskeyProviderState {197 supported: boolean;198 enabled: boolean;199 attached: boolean;200 browserLabel: string;201 statusLabel: string;202 conflict?: string;203}204205export interface StoredVault {206 version: 1; 207 salt: string; 208 nonce: string; 209 ciphertext: string; 210 tag: string; 211 212 213 recovery_salt?: string; 214 recovery_wrapped_root_key?: string; 215 recovery_nonce?: string; 216 recovery_tag?: string; 217 218 219 220 221 pw_root_ciphertext?: string; 222 pw_root_nonce?: string; 223 pw_root_tag?: string; 224}225226227228229export type MessageType =230 | "UNLOCK"231 | "LOCK"232 | "IS_UNLOCKED"233 | "HAS_VAULT"234 | "GET_ENTRIES"235 | "ADD_ENTRY"236 | "BATCH_ADD_ENTRIES"237 | "RESTORE_ENTRIES"238 | "CLEAR_VAULT_ENTRIES"239 | "UPDATE_ENTRY"240 | "ADD_ADDITIONAL_URL"241 | "DELETE_ENTRY"242 | "AUTOFILL_QUERY"243 | "COPY"244 | "CREATE_VAULT"245 | "GET_ENTRY_FOR_FILL"246 | "GET_ENTRY_FOR_EDIT"247 | "CHECK_ALL_BREACHES"248 | "GET_SETTINGS"249 | "UPDATE_SETTINGS"250 | "FIRE_CANARY_PING"251 | "ACTIVATE_LICENSE"252 | "GET_LICENSE"253 | "GET_LICENSE_KEY"254 | "IS_DURESS_ENABLED"255 | "SETUP_DURESS"256 | "DISABLE_DURESS"257 | "VERIFY_MAIN_PASSWORD"258 | "CHANGE_PASSWORD"259 | "GET_SITE_PASSWORD_POLICY"260 | "CHIRP_GET_LOCAL_IDENTITY"261 | "CHIRP_COMPLETE_PAIRING"262 | "CHIRP_LIST_PAIRED_DEVICES"263 | "CHIRP_UNPAIR_DEVICE"264 | "CHIRP_RENAME_LOCAL_DEVICE"265 | "TRIGGER_SYNC"266 | "GET_SYNC_STATE"267 | "GET_PENDING_PASSKEY"268 | "APPROVE_PASSKEY"269 | "DENY_PASSKEY"270 | "GET_PASSKEY_PROVIDER_STATE"271 | "SET_PASSKEY_PROVIDER_ENABLED"272 | "GET_DELETED_ENTRIES"273 | "RESTORE_ENTRY"274 | "PURGE_ENTRY"275 | "PURGE_EXPIRED_TRASH"276 | "GET_VAULT_HISTORY"277 | "RESTORE_VAULT_SNAPSHOT"278 | "COUNT_DUPLICATES"279 | "DEDUPLICATE_ENTRIES"280 | "RECORD_MANUAL_SUMMON"281 | "DECLINE_CARD_SAVE"282 | "IS_CARD_DECLINED"283 | "SUBMIT_FEEDBACK"284 | "GET_VAULT_STATUS"285 | "GET_ADVANCED_HEALTH_REPORT"286 | "DEACTIVATE_LICENSE"287 | "GET_IDENTITIES"288 | "DESTROY_VAULT"289 | "INITIATE_FIREFOX_PASSKEY_CREATE"290 | "COMPLETE_FIREFOX_PASSKEY_CREATE"291 | "PASSKEY_OFFER_DECLINE"292 | "GET_PASSKEY_OFFER_DECLINED"293 | "GET_PASSKEY_FOR_DOMAIN"294 295 296 297 | "PASSKEY_HAS_CREDENTIALS"298 | "PASSKEY_CREATE"299 | "PASSKEY_GET"300 301 | "UNLOCK_WITH_KEY"302 | "GET_DERIVED_KEY"303 304 | "VALIDATE_RECOVERY_WORDS"305 | "RECOVER_WITH_WORDS"306 | "GET_RECOVERY_WORDS"307 | "GET_IDENTITY_SUGGESTIONS"308 | "TOUCH_AUTO_LOCK"309 | "POPULATE_INLINE_VAULT"310 | "SAVE_NOTE"311 | "DELETE_NOTE"312 | "GET_NOTES"313 | "SEARCH_VAULT"314 | "ML_INIT"315 | "ML_PREDICT_BATCH"316 317 318 319 320 | "PING" 321 | "SUMMON_AUTOFILL" 322 | "VAULT_LOCKED" 323 | "VAULT_UNLOCKED" 324 | "PRO_GATE_TRIGGERED" 325 | "PASSKEY_PRO_GATE" 326 | "OPEN_PRO_GATE" 327 | "OPEN_POPUP" 328 | "SHOW_PASSKEY_TOAST" 329 | "DISMISS_PASSKEY_TOAST" 330 | "PASSKEY_AUTH_RESPONSE" 331 | "SHOULD_PLAY_CELEBRATION"332 | "MARK_CELEBRATION_PLAYED"333 334 335 | "GET_CODEX_VAULT_DATA"336 | "ESTIMATE_CODEX_PAGES"337 | "GENERATE_CODEX"338 | "RESTORE_FROM_CODEX";339340export type ProFeature =341 | "sync"342 | "passkeys"343 | "advanced_health"344 | "ios_app"345 | "codex"346 | "canary_entry"347 | "duress_vault";348349350351352353export interface PeachLicenseExport {354 key: string;355 activatedAt?: number;356}357358export interface AdvancedHealthEntryReport {359 id: string;360 title: string;361 domain: string;362 url?: string;363 score: number;364 ageDays: number;365 reasons: string[];366 factors: {367 breached: boolean;368 breachCount: number;369 reused: boolean;370 aged: boolean;371 weak: boolean;372 missingTotpOnSensitive: boolean;373 };374}375376export interface AdvancedHealthReport {377 vaultScore: number;378 generatedAt: number;379 entryCount: number;380 reusedGroups: number;381 agedCount: number;382 remediation: AdvancedHealthEntryReport[];383}384385export const ACCENT_COLORS = [386 { name: "peach", hex: "#F49C70" },387 { name: "rose", hex: "#FF8AA6" },388 { name: "plum", hex: "#D597F2" },389 { name: "lavender", hex: "#A6A8FF" },390 { name: "sky", hex: "#5BC8EE" },391 { name: "mint", hex: "#5EE0B0" },392 { name: "sage", hex: "#B5D870" },393 { name: "butter", hex: "#FFD45A" },394 { name: "sand", hex: "#EDBC85" },395 { name: "clay", hex: "#F08660" },396 { name: "slate", hex: "#80BEDE" },397 { name: "stone", hex: "#C8B8A8" },398] as const;399400export type AccentColorName = typeof ACCENT_COLORS[number]["name"];401402export interface SavedIdentity {403 value: string;404 type: "email" | "username";405 lastUsed: number;406 useCount: number;407 exampleDomain?: string;408}409410export interface PasswordPolicy {411 minLength?: number;412 maxLength?: number;413 requiresUppercase?: boolean;414 requiresLowercase?: boolean;415 requiresNumbers?: boolean;416 requiresSymbols?: boolean;417 forbidsSymbols?: boolean;418 allowedSymbols?: string;419 420 forbiddenChars?: string;421}422423424425426427428429430431432433434export interface VaultSnapshot {435 id: string;436 savedAt: number;437 reason: "local_save" | "sync_received" | "import" | "restore";438 vault_a: string;439 vault_b: string;440 441 entryCount: number | null;442}443444export interface VaultHistory {445 446 snapshots: VaultSnapshot[];447}448449export interface Message {450 type: MessageType;451 payload?: unknown;452}453454455456457458459export type ErrorCode =460 | "vault_locked"461 | "vault_corrupted"462 | "no_vault"463 | "entry_not_found"464 | "invalid_payload"465 | "invalid_message"466 | "invalid_sender"467 | "wrong_passphrase"468 | "incorrect_current_password"469 | "recovery_not_setup"470 | "android_only"471 | "not_available"472 | "pro_required"473 | "pairing_not_verified"474 | "sync_rejected_unpaired_initiator"475 | "vault_not_applied"476 | "url_required"477 | "domain_required"478 | "rpid_required"479 | "rpid_and_username_required"480 | "publickeyhex_required"481 | "missing_payload"482 | "login_entries_only"483 | "passkey_not_fillable"484 | "invalid_webhook_url"485 | "invalid_feedback_endpoint"486 | "message_empty"487 | "network_error"488 | "operation_failed"489 | "unknown_message_type";490491export interface MessageResponse {492 ok: boolean;493 data?: unknown;494 error?: string;495 unlocked?: boolean;496 497 498 canRestoreFromHistory?: boolean;499}