import { setupMessageHandler } from "./messages"; import { setupAutoLock } from "./alarms"; import { setupPasskeyProxy } from "./passkey"; import { setupCommands } from "./commands"; import { restoreFromSession, isUnlocked, lock } from "./vault"; import { ensureSettingsLoaded } from "./vault"; import { isRecoveryConfirmPending } from "./recovery-pending"; import { denyAllPendingPasskeyRequests } from "./passkey"; // Keep alive for MV3 service worker chrome.runtime.onInstalled.addListener(() => {}); // The chrome.idle.onStateChanged listener lives in ./alarms (the architectural // home for auto-lock timing). Keeping it in only one place avoids drift. // Lock-on-close via port disconnect. The popup opens a "popup" named port; // when that port disconnects (popup closed), lock if lockOnClose is enabled. // Previously declared in index.ts which was never bundled — moved here. chrome.runtime.onConnect.addListener((port) => { if (port.name !== "popup") return; port.onDisconnect.addListener(async () => { await denyAllPendingPasskeyRequests(); const s = await ensureSettingsLoaded(); if (!isUnlocked() || s.lockOnClose === false) return; if (await isRecoveryConfirmPending()) return; lock(); }); }); export function start() { // Restore vault unlock state from chrome.storage.session if the MV3 service // worker was restarted mid-session. Runs before message handlers are active // so the first incoming message from the popup sees the correct unlock state. void restoreFromSession(); setupMessageHandler(); void setupAutoLock(); setupCommands(); void setupPasskeyProxy(); } start();