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 password?: string; 70 url?: string; 71 727374757677 additionalUrls?: string[];78 totp?: string; 79 notes?: string;80 breach?: number; 81 8283848586 passwordChangedAt?: number;87 canary?: Canary;88 createdAt: number; 89 modifiedAt: number;90 deletedAt?: number;91 tags?: string[];92 93 passkey?: PasskeyData;94 95 96 97 98 rpId?: string;99 rpName?: string;100 credentialId?: string;101 publicKeyCose?: string;102 privateKeyJwk?: JsonWebKey;103 userHandle?: string;104 userName?: string;105 userDisplayName?: string;106 algorithm?: -7 | -8;107 signCount?: number;108 aaguid?: string;109 backupEligible?: boolean;110 backupState?: boolean;111 lastUsedAt?: number;112 browser?: "chrome" | "firefox";113 transports?: string[];114 115 cardholderName?: string;116 cardNumber?: string; 117 expMonth?: string;118 expYear?: string;119 cvc?: string;120 cardNickname?: string;121 network?: CardNetwork;122 last4?: string;123}124125126127128129130131export function hasPasskey(entry: VaultEntry): boolean {132 return entry.passkey !== undefined && entry.passkey.credentialId.length > 0;133}134135136137138139140141142143export function isPasskeyOnly(entry: VaultEntry): boolean {144 return hasPasskey(entry) && !entry.password;145}146147export interface LegacyVaultEntry {148 id: string;149 title: string;150 username: string;151 password: string;152 url: string;153 totp?: string;154 notes?: string;155 breach?: number;156 created: number;157 updated: number;158 deletedAt?: number;159}160161export interface CardEntry extends VaultEntry {162 type: "card";163 cardholderName: string;164 cardNumber: string;165 expMonth: string;166 expYear: string;167 cvc: string;168}169170171export interface PendingPasskeyRequest {172 requestId: number;173 type: "create" | "get";174 rpId: string;175 rpName: string;176 userName: string;177 userDisplayName?: string;178 179180181182183 browser?: "chrome" | "firefox";184 185 challenge?: string;186 187 userHandle?: string;188}189190export interface PasskeyProviderState {191 supported: boolean;192 enabled: boolean;193 attached: boolean;194 browserLabel: string;195 statusLabel: string;196 conflict?: string;197}198199export interface StoredVault {200 version: 1; 201 salt: string; 202 nonce: string; 203 ciphertext: string; 204 tag: string; 205 206 207 recovery_salt?: string; 208 recovery_wrapped_root_key?: string; 209 recovery_nonce?: string; 210 recovery_tag?: string; 211}212213214215216export type MessageType =217 | "UNLOCK"218 | "LOCK"219 | "IS_UNLOCKED"220 | "HAS_VAULT"221 | "GET_ENTRIES"222 | "ADD_ENTRY"223 | "BATCH_ADD_ENTRIES"224 | "RESTORE_ENTRIES"225 | "CLEAR_VAULT_ENTRIES"226 | "UPDATE_ENTRY"227 | "ADD_ADDITIONAL_URL"228 | "DELETE_ENTRY"229 | "AUTOFILL_QUERY"230 | "COPY"231 | "CREATE_VAULT"232 | "GET_ENTRY_FOR_FILL"233 | "CHECK_BREACH"234 | "CHECK_ALL_BREACHES"235 | "GET_SETTINGS"236 | "UPDATE_SETTINGS"237 | "FIRE_CANARY_PING"238 | "ACTIVATE_LICENSE"239 | "GET_LICENSE"240 | "GET_LICENSE_KEY"241 | "IS_DURESS_ENABLED"242 | "SETUP_DURESS"243 | "DISABLE_DURESS"244 | "VERIFY_MAIN_PASSWORD"245 | "CHANGE_PASSWORD"246 | "GET_SITE_PASSWORD_POLICY"247 | "GET_SYNC_STATE"248 | "TRIGGER_SYNC"249 | "START_PAIRING"250 | "CANCEL_PAIRING"251 | "ACCEPT_PAIRING"252 | "REMOVE_PAIRED_DEVICE"253 | "REMOVE_TRUSTED_NETWORK"254 | "MARK_NETWORK_TRUSTED"255 | "RESET_SYNC_IDENTITY"256 | "GET_INCOMING_PAIRING_REQUEST"257 | "RESPOND_INCOMING_PAIRING"258 | "DEBUG_INJECT_INCOMING_PAIRING"259 | "START_PEER_DISCOVERY"260 | "STOP_PEER_DISCOVERY"261 | "INITIATE_PAIR_WITH_PEER"262 | "START_PAIRING_SERVER"263 | "STOP_PAIRING_SERVER"264 | "CONNECT_WITH_CODE"265 | "GET_RECENT_PAIRING"266 | "GET_PENDING_PASSKEY"267 | "APPROVE_PASSKEY"268 | "DENY_PASSKEY"269 | "DELETE_PASSKEY"270 | "GET_PASSKEYS"271 | "GET_PASSKEY_PROVIDER_STATE"272 | "SET_PASSKEY_PROVIDER_ENABLED"273 | "GET_DELETED_ENTRIES"274 | "RESTORE_ENTRY"275 | "PURGE_ENTRY"276 | "PURGE_EXPIRED_TRASH"277 | "GET_VAULT_HISTORY"278 | "RESTORE_VAULT_SNAPSHOT"279 | "COUNT_DUPLICATES"280 | "DEDUPLICATE_ENTRIES"281 | "RECORD_MANUAL_SUMMON"282 | "DECLINE_CARD_SAVE"283 | "IS_CARD_DECLINED"284 | "SUBMIT_FEEDBACK"285 | "GET_VAULT_STATUS"286 | "GET_ADVANCED_HEALTH_REPORT"287 | "INITIATE_PASSWORD_CHANGE"288 | "DEACTIVATE_LICENSE"289 | "GET_IDENTITIES"290 | "DESTROY_VAULT"291 | "INITIATE_FIREFOX_PASSKEY_CREATE"292 | "COMPLETE_FIREFOX_PASSKEY_CREATE"293 | "PASSKEY_OFFER_DECLINE"294 | "GET_PASSKEY_OFFER_DECLINED"295 | "GET_PASSKEY_FOR_DOMAIN"296 297 298 299 | "PASSKEY_HAS_CREDENTIALS"300 | "PASSKEY_CREATE"301 | "PASSKEY_GET"302 303 | "UNLOCK_WITH_KEY"304 | "GET_DERIVED_KEY"305 306 | "VALIDATE_RECOVERY_WORDS"307 | "RECOVER_WITH_WORDS"308 | "GET_RECOVERY_WORDS"309 | "SCAN_PAIRING_QR"310 | "GET_LOCAL_IP"311 | "GET_IDENTITY_SUGGESTIONS"312 | "POPULATE_INLINE_VAULT"313 314 315 316 317 | "PING" 318 | "SUMMON_AUTOFILL" 319 | "VAULT_LOCKED" 320 | "VAULT_UNLOCKED" 321 | "PRO_GATE_TRIGGERED" 322 | "PASSKEY_PRO_GATE" 323 | "OPEN_PRO_GATE" 324 | "SHOULD_PLAY_CELEBRATION"325 | "MARK_CELEBRATION_PLAYED";326327export type ProFeature =328 | "sync"329 | "passkeys"330 | "advanced_health"331 | "smart_password_change"332 | "ios_app";333334335336337338export interface PeachLicenseExport {339 key: string;340 activatedAt?: number;341}342343export interface AdvancedHealthEntryReport {344 id: string;345 title: string;346 domain: string;347 url?: string;348 score: number;349 ageDays: number;350 reasons: string[];351 factors: {352 breached: boolean;353 breachCount: number;354 reused: boolean;355 aged: boolean;356 weak: boolean;357 missingTotpOnSensitive: boolean;358 };359}360361export interface AdvancedHealthReport {362 vaultScore: number;363 generatedAt: number;364 entryCount: number;365 reusedGroups: number;366 agedCount: number;367 remediation: AdvancedHealthEntryReport[];368}369370export const ACCENT_COLORS = [371 { name: "peach", hex: "#F49C70" },372 { name: "rose", hex: "#FF8AA6" },373 { name: "plum", hex: "#D597F2" },374 { name: "lavender", hex: "#A6A8FF" },375 { name: "sky", hex: "#5BC8EE" },376 { name: "mint", hex: "#5EE0B0" },377 { name: "sage", hex: "#B5D870" },378 { name: "butter", hex: "#FFD45A" },379 { name: "sand", hex: "#EDBC85" },380 { name: "clay", hex: "#F08660" },381 { name: "slate", hex: "#80BEDE" },382 { name: "stone", hex: "#C8B8A8" },383] as const;384385export type AccentColorName = typeof ACCENT_COLORS[number]["name"];386387export interface SavedIdentity {388 value: string;389 type: "email" | "username";390 lastUsed: number;391 useCount: number;392 exampleDomain?: string;393}394395export interface PasswordPolicy {396 minLength?: number;397 maxLength?: number;398 requiresUppercase?: boolean;399 requiresLowercase?: boolean;400 requiresNumbers?: boolean;401 requiresSymbols?: boolean;402 forbidsSymbols?: boolean;403 allowedSymbols?: string;404 405 forbiddenChars?: string;406}407408409410411412413414415416417418419export interface VaultSnapshot {420 id: string;421 savedAt: number;422 reason: "local_save" | "sync_received" | "import" | "restore";423 vault_a: string;424 vault_b: string;425 426 entryCount: number | null;427}428429export interface VaultHistory {430 431 snapshots: VaultSnapshot[];432}433434export interface Message {435 type: MessageType;436 payload?: unknown;437}438439export interface MessageResponse {440 ok: boolean;441 data?: unknown;442 error?: string;443 unlocked?: boolean;444}