import { sentryVitePlugin } from "@sentry/vite-plugin" import { defineConfig } from "electron-vite" import appPlugin from "@opencode-ai/app/vite" import { serverVite } from "@opencode-ai/sdk-next/vite" import { getServerTarget } from "./scripts/target" const channel = (() => { const raw = process.env.OPENCODE_CHANNEL if (raw === "dev" || raw === "beta" || raw === "prod") return raw if (process.env.OPENCODE_CHANNEL === "latest") return "prod" return "dev" })() const server = serverVite() const target = getServerTarget() const sentry = process.env.SENTRY_AUTH_TOKEN && process.env.SENTRY_ORG && process.env.SENTRY_PROJECT ? sentryVitePlugin({ authToken: process.env.SENTRY_AUTH_TOKEN, org: process.env.SENTRY_ORG, project: process.env.SENTRY_PROJECT, telemetry: false, release: { name: process.env.SENTRY_RELEASE ?? process.env.VITE_SENTRY_RELEASE, }, sourcemaps: { assets: "./out/renderer/**", filesToDeleteAfterUpload: "./out/renderer/**/*.map", }, }) : false export default defineConfig({ main: { resolve: server.resolve, define: { "import.meta.env.OPENCODE_CHANNEL": JSON.stringify(channel), OPENCODE_LIBC: target.platform === "linux" ? JSON.stringify("glibc") : "undefined", FFF_LIBC: target.platform === "linux" ? JSON.stringify("gnu") : "undefined", }, build: { target: "node24", externalizeDeps: { exclude: ["@opencode-ai/client"] }, rollupOptions: { input: { index: "src/main/index.ts", sidecar: "src/main/sidecar.ts" }, external: [/^@opencode-ai\/simulation(?:\/|$)/], // Keep this identical to electron-vite's Node 20.11+ shim. Its regex insertion can // corrupt bundled TypeScript, while a Rollup banner places the shim safely. output: { banner: ` // -- CommonJS Shims -- import __cjs_mod__ from 'node:module'; const __filename = import.meta.filename; const __dirname = import.meta.dirname; const require = __cjs_mod__.createRequire(import.meta.url); `, }, }, }, plugins: server.plugins, }, preload: { build: { rollupOptions: { input: { index: "src/preload/index.ts" }, output: { format: "cjs", entryFileNames: "[name].js", }, }, }, }, renderer: { plugins: [appPlugin, sentry], publicDir: "../../../app/public", root: "src/renderer", build: { sourcemap: true, rollupOptions: { input: { main: "src/renderer/index.html", }, }, }, }, })