const { contextBridge, ipcRenderer } = require("electron"); contextBridge.exposeInMainWorld("cfg", { get: () => ipcRenderer.invoke("settings-get"), set: (key, value) => ipcRenderer.invoke("settings-set", key, value), engines: () => ipcRenderer.invoke("search-engines"), addEngine: (eng) => ipcRenderer.invoke("add-engine", eng), removeEngine: (id) => ipcRenderer.invoke("remove-engine", id), setEngineEnabled: (id, on) => ipcRenderer.invoke("set-engine-enabled", id, on), setEngineOrder: (ids) => ipcRenderer.invoke("set-engine-order", ids), removeFromList: (id) => ipcRenderer.invoke("remove-from-list", id), // Storage: wipe browsing data on demand. Pass any subset of // { cookies, cache, storage, history }. clearBrowsingData: (opts) => ipcRenderer.invoke("clear-browsing-data", opts), // Password vault. All calls return { ok, ... } | { ok: false, err }. // Renderers never see the seed / vault key / master password past setup/ // unlock; get() returns plaintext only in explicit response to a user click. pwStatus: () => ipcRenderer.invoke("password-status"), pwSetup: (masterPassword, seedSource) => ipcRenderer.invoke("password-setup", { masterPassword, seedSource }), pwUnlock: (masterPassword) => ipcRenderer.invoke("password-unlock", masterPassword), pwLock: () => ipcRenderer.invoke("password-lock"), pwList: () => ipcRenderer.invoke("password-list"), pwGet: (id) => ipcRenderer.invoke("password-get", id), pwAdd: (entry) => ipcRenderer.invoke("password-add", entry), pwUpdate: (id, patch) => ipcRenderer.invoke("password-update", id, patch), pwRemove: (id) => ipcRenderer.invoke("password-remove", id), pwGenerate: (spec) => ipcRenderer.invoke("password-generate", spec), // Main asks settings to jump to a specific sidebar section (e.g. from the // engine picker's "Search settings…" click). Emits the section id string. onFocusSection: (cb) => ipcRenderer.on("focus-section", (_e, section) => cb(section)), // Collision-mode: BCNR/ICANN policy + per-name/per-TLD overrides collisionState: () => ipcRenderer.invoke("collision-state"), setCollisionPolicy: (p) => ipcRenderer.invoke("collision-set-policy", p), resetCollisions: () => ipcRenderer.invoke("collision-reset"), ariadneState: () => ipcRenderer.invoke("ariadne-state"), ariadneToggle: (on) => ipcRenderer.invoke("ariadne-toggle", !!on), ariadneInstall: () => ipcRenderer.invoke("ariadne-install"), ariadneUpdate: () => ipcRenderer.invoke("ariadne-update"), ariadneUninstall: () => ipcRenderer.invoke("ariadne-uninstall"), // Manual "Check for updates" — un-dismisses any existing chip and re- // fetches the release manifest. Returns { updateAvailable, currentVersion }. recheckUpdate: () => ipcRenderer.invoke("recheck-update"), appVersion: () => ipcRenderer.invoke("app-version"), restartApp: () => ipcRenderer.invoke("app-restart"), // Add-ons management (Settings > Add-ons tab). listAddons: () => ipcRenderer.invoke("addons-list"), setAddonEnabled: (id, enabled) => ipcRenderer.invoke("addons-set-enabled", id, !!enabled), revealAddon: (folder) => ipcRenderer.invoke("addons-reveal", folder), openAddonsDir: () => ipcRenderer.invoke("addons-open-dir"), reloadAddons: () => ipcRenderer.invoke("addons-reload"), // Community extensions from theseus.x/extensions: the catalog (with what // is installed already) and a verified install/update of one entry. communityCatalog: () => ipcRenderer.invoke("addons-community-catalog"), installCommunity: (id) => ipcRenderer.invoke("addons-install-community", id), checkAddonUpdates: () => ipcRenderer.invoke("addons-check-updates"), listStagedAddonUpdates: () => ipcRenderer.invoke("addons-list-staged"), });