1234567891011121314export interface SyncAlert {15 type: "REMOTE_PASSWORD_CHANGE" | "REMOTE_DELETE";16 1718 entryId: string;19 entryTitle: string;20 2122 deviceName: string;23 timestamp: number;24}2526const SYNC_ALERTS_KEY = "peach_pending_sync_alerts_v1";2728const MAX_PENDING_ALERTS = 200;2930export async function recordSyncAlerts(alerts: SyncAlert[]): Promise<void> {31 if (alerts.length === 0) return;32 const existing = await readAlerts();33 const merged = [...existing, ...alerts].slice(-MAX_PENDING_ALERTS);34 try {35 await chrome.storage.local.set({ [SYNC_ALERTS_KEY]: merged });36 } catch {37 38 }39}4041export async function getPendingSyncAlerts(): Promise<SyncAlert[]> {42 return readAlerts();43}4445export async function clearPendingSyncAlerts(): Promise<void> {46 try {47 await chrome.storage.local.remove(SYNC_ALERTS_KEY);48 } catch {49 50 }51}5253async function readAlerts(): Promise<SyncAlert[]> {54 try {55 const result = await chrome.storage.local.get(SYNC_ALERTS_KEY);56 const value = (result as Record<string, unknown>)[SYNC_ALERTS_KEY];57 if (!Array.isArray(value)) return [];58 return value.filter(isSyncAlert);59 } catch {60 return [];61 }62}6364function isSyncAlert(x: unknown): x is SyncAlert {65 if (typeof x !== "object" || x === null) return false;66 const r = x as Record<string, unknown>;67 return (68 (r.type === "REMOTE_PASSWORD_CHANGE" || r.type === "REMOTE_DELETE") &&69 typeof r.entryId === "string" &&70 typeof r.entryTitle === "string" &&71 typeof r.deviceName === "string" &&72 typeof r.timestamp === "number"73 );74}