12345export interface TrustedNetwork {6 ssid?: string;7 bssid?: string;8 isTailscale: boolean;9 addedAt: number;10}1112export interface PairedDevice {13 deviceId: string;14 displayName: string;15 x25519PublicKey: string;16 pairedAt: number;17 lastSeenAt?: number;18 lastSyncAt?: number;19}2021export type SyncMessage =22 | { type: "SYNC_HELLO"; deviceId: string; clockMs: number; vaultVersion: number }23 | { type: "SYNC_MANIFEST"; entries: Array<{ id: string; modifiedAt: number; deletedAt?: number; hash: string }> }24 | { type: "SYNC_REQUEST"; ids: string[] }25 | { type: "SYNC_ENTRIES"; entries: EncryptedSyncEntry[] }26 | { type: "SYNC_DONE" }27 | { type: "SYNC_ERROR"; code: string; message: string }28 | { type: "PAIR_REQUEST"; edPublicKey: string; name: string; code: string }29 | { type: "PAIR_ACCEPT"; edPublicKey: string; name: string }30 | { type: "PAIR_REJECT"; reason: string };3132export interface EncryptedSyncEntry {33 id: string;34 modifiedAt: number;35 deletedAt?: number;36 ciphertext: string;37 nonce: string;38 tag: string;39}4041export type SyncStatus = "synced" | "syncing" | "no_peers" | "not_trusted" | "offline";4243export interface SyncState {44 status: SyncStatus;45 lastSyncAt?: number;46 pairedDevices: PairedDevice[];47 trustedNetworks: TrustedNetwork[];48 isPro: boolean;49}5051export type PairingStep =52 | { stage: "idle" }53 | { stage: "generating_code"; code: string; expiresAt: number }54 | { stage: "waiting_for_peer" }55 | { stage: "entering_code" }56 | { stage: "connecting"; peerName: string }57 | { stage: "verifying" }58 | { stage: "done"; device: PairedDevice }59 | { stage: "error"; message: string };6061export interface NoiseHandshakeResult {62 sessionKey: Uint8Array;63 sendNonce: number;64 receiveNonce: number;65 isInitiator: boolean;66}