Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Jay V <air@live.ca> Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Ben Guthrie <benjee.012@gmail.com> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> Co-authored-by: Max Anderson <max.a.anderson95@gmail.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Aiden Cline <aidenpcline@gmail.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com>
122 lines
6.3 KiB
TypeScript
122 lines
6.3 KiB
TypeScript
import { contextBridge, ipcRenderer, webUtils } from "electron"
|
|
import type { ElectronAPI, WslServersEvent } from "./types"
|
|
import type { UpdaterState } from "@opencode-ai/app/updater"
|
|
|
|
const updaterCallbacks = new Set<(state: UpdaterState) => void>()
|
|
let updaterState: UpdaterState | undefined
|
|
let updaterSubscription: Promise<void> | undefined
|
|
const updaterHandler = (_: unknown, state: UpdaterState) => {
|
|
updaterState = state
|
|
updaterCallbacks.forEach((callback) => callback(state))
|
|
}
|
|
|
|
const api: ElectronAPI = {
|
|
killSidecar: () => ipcRenderer.invoke("kill-sidecar"),
|
|
installCli: () => ipcRenderer.invoke("install-cli"),
|
|
awaitInitialization: () => ipcRenderer.invoke("await-initialization"),
|
|
wslServers: {
|
|
getState: () => ipcRenderer.invoke("wsl-servers-get-state"),
|
|
subscribe: (cb) => {
|
|
const handler = (_: unknown, event: WslServersEvent) => cb(event)
|
|
ipcRenderer.on("wsl-servers-event", handler)
|
|
void ipcRenderer.invoke("wsl-servers-subscribe")
|
|
return () => {
|
|
ipcRenderer.removeListener("wsl-servers-event", handler)
|
|
void ipcRenderer.invoke("wsl-servers-unsubscribe")
|
|
}
|
|
},
|
|
probeRuntime: () => ipcRenderer.invoke("wsl-servers-probe-runtime"),
|
|
refreshDistros: () => ipcRenderer.invoke("wsl-servers-refresh-distros"),
|
|
installWsl: () => ipcRenderer.invoke("wsl-servers-install-wsl"),
|
|
installDistro: (name) => ipcRenderer.invoke("wsl-servers-install-distro", name),
|
|
probeAddable: (distros) => ipcRenderer.invoke("wsl-servers-probe-addable", distros),
|
|
installOpencode: (name) => ipcRenderer.invoke("wsl-servers-install-opencode", name),
|
|
openTerminal: (name) => ipcRenderer.invoke("wsl-servers-open-terminal", name),
|
|
addServer: (distro) => ipcRenderer.invoke("wsl-servers-add", distro),
|
|
removeServer: (id) => ipcRenderer.invoke("wsl-servers-remove", id),
|
|
startServer: (id) => ipcRenderer.invoke("wsl-servers-start", id),
|
|
},
|
|
updater: {
|
|
subscribe: async (cb) => {
|
|
updaterCallbacks.add(cb)
|
|
if (updaterState) cb(updaterState)
|
|
if (!updaterSubscription) {
|
|
ipcRenderer.on("updater-state", updaterHandler)
|
|
updaterSubscription = ipcRenderer.invoke("updater-subscribe")
|
|
}
|
|
await updaterSubscription
|
|
return () => {
|
|
updaterCallbacks.delete(cb)
|
|
if (updaterCallbacks.size > 0) return
|
|
ipcRenderer.removeListener("updater-state", updaterHandler)
|
|
updaterSubscription = undefined
|
|
void ipcRenderer.invoke("updater-unsubscribe")
|
|
}
|
|
},
|
|
check: () => ipcRenderer.invoke("updater-check"),
|
|
install: () => ipcRenderer.invoke("updater-install"),
|
|
},
|
|
consumeInitialDeepLinks: () => ipcRenderer.invoke("consume-initial-deep-links"),
|
|
getDefaultServerUrl: () => ipcRenderer.invoke("get-default-server-url"),
|
|
setDefaultServerUrl: (url) => ipcRenderer.invoke("set-default-server-url", url),
|
|
getDisplayBackend: () => ipcRenderer.invoke("get-display-backend"),
|
|
setDisplayBackend: (backend) => ipcRenderer.invoke("set-display-backend", backend),
|
|
parseMarkdownCommand: (markdown) => ipcRenderer.invoke("parse-markdown", markdown),
|
|
checkAppExists: (appName) => ipcRenderer.invoke("check-app-exists", appName),
|
|
resolveAppPath: (appName) => ipcRenderer.invoke("resolve-app-path", appName),
|
|
storeGet: (name, key) => ipcRenderer.invoke("store-get", name, key),
|
|
storeSet: (name, key, value) => ipcRenderer.invoke("store-set", name, key, value),
|
|
storeDelete: (name, key) => ipcRenderer.invoke("store-delete", name, key),
|
|
storeClear: (name) => ipcRenderer.invoke("store-clear", name),
|
|
storeKeys: (name) => ipcRenderer.invoke("store-keys", name),
|
|
storeLength: (name) => ipcRenderer.invoke("store-length", name),
|
|
|
|
getWindowCount: () => ipcRenderer.invoke("get-window-count"),
|
|
getWindowID: () => ipcRenderer.invoke("get-window-id"),
|
|
onMenuCommand: (cb) => {
|
|
const handler = (_: unknown, id: string) => cb(id)
|
|
ipcRenderer.on("menu-command", handler)
|
|
return () => ipcRenderer.removeListener("menu-command", handler)
|
|
},
|
|
onDeepLink: (cb) => {
|
|
const handler = (_: unknown, urls: string[]) => cb(urls)
|
|
ipcRenderer.on("deep-link", handler)
|
|
return () => ipcRenderer.removeListener("deep-link", handler)
|
|
},
|
|
|
|
openDirectoryPicker: (opts) => ipcRenderer.invoke("open-directory-picker", opts),
|
|
openFilePicker: (opts) => ipcRenderer.invoke("open-file-picker", opts),
|
|
readPickedFile: (token, path) => ipcRenderer.invoke("read-picked-file", token, path),
|
|
releasePickedFiles: (token) => ipcRenderer.invoke("release-picked-files", token),
|
|
getPathForFile: (file) => webUtils.getPathForFile(file),
|
|
saveFilePicker: (opts) => ipcRenderer.invoke("save-file-picker", opts),
|
|
openLink: (url) => ipcRenderer.send("open-link", url),
|
|
openPath: (path, app) => ipcRenderer.invoke("open-path", path, app),
|
|
readClipboardImage: () => ipcRenderer.invoke("read-clipboard-image"),
|
|
showNotification: (title, body) => ipcRenderer.send("show-notification", title, body),
|
|
getWindowFocused: () => ipcRenderer.invoke("get-window-focused"),
|
|
setWindowFocus: () => ipcRenderer.invoke("set-window-focus"),
|
|
showWindow: () => ipcRenderer.invoke("show-window"),
|
|
relaunch: () => ipcRenderer.send("relaunch"),
|
|
getZoomFactor: () => ipcRenderer.invoke("get-zoom-factor"),
|
|
setZoomFactor: (factor) => ipcRenderer.invoke("set-zoom-factor", factor),
|
|
getPinchZoomEnabled: () => ipcRenderer.invoke("get-pinch-zoom-enabled"),
|
|
setPinchZoomEnabled: (enabled) => ipcRenderer.invoke("set-pinch-zoom-enabled", enabled),
|
|
onPinchZoomEnabledChanged: (cb) => {
|
|
const handler = (_: unknown, enabled: boolean) => cb(enabled)
|
|
ipcRenderer.on("pinch-zoom-enabled-changed", handler)
|
|
return () => ipcRenderer.removeListener("pinch-zoom-enabled-changed", handler)
|
|
},
|
|
onZoomFactorChanged: (cb) => {
|
|
const handler = (_: unknown, factor: number) => cb(factor)
|
|
ipcRenderer.on("zoom-factor-changed", handler)
|
|
return () => ipcRenderer.removeListener("zoom-factor-changed", handler)
|
|
},
|
|
setTitlebar: (theme) => ipcRenderer.invoke("set-titlebar", theme),
|
|
runDesktopMenuAction: (action) => ipcRenderer.invoke("run-desktop-menu-action", action),
|
|
setBackgroundColor: (color: string) => ipcRenderer.invoke("set-background-color", color),
|
|
exportDebugLogs: () => ipcRenderer.invoke("export-debug-logs"),
|
|
recordFatalRendererError: (error) => ipcRenderer.invoke("record-fatal-renderer-error", error),
|
|
}
|
|
|
|
contextBridge.exposeInMainWorld("api", api)
|