// electron.vite.config.ts import { defineConfig } from "electron-vite"; import { sentryVitePlugin } from "@sentry/vite-plugin"; import react from "@vitejs/plugin-react"; import { readFileSync } from "fs"; import { resolve } from "path"; var __electron_vite_injected_dirname = "/Users/belief/dev/projects/claude/claude_team"; var pkg = JSON.parse(readFileSync(resolve(__electron_vite_injected_dirname, "package.json"), "utf-8")); var prodDeps = Object.keys(pkg.dependencies || {}); var runtimeExternalDeps = /* @__PURE__ */ new Set([ "node-pty", "agent-teams-controller", "fastify", "@fastify/cors", "@fastify/static" ]); var bundledDeps = prodDeps.filter((d) => !runtimeExternalDeps.has(d)); function nativeModuleStub() { const STUB_ID = "\0native-stub"; const NODE_MODULE_RE = /\.node(?:\?.*)?$/; return { name: "native-module-stub", enforce: "pre", resolveId(source) { if (NODE_MODULE_RE.test(source)) return `${STUB_ID}:${source}`; return null; }, load(id) { if (id.startsWith(STUB_ID) || NODE_MODULE_RE.test(id)) return "export default {}"; return null; } }; } var sentrySourceMapTargets = { main: { assets: ["./dist-electron/main/**/*.{js,cjs,mjs,map}"], filesToDeleteAfterUpload: ["./dist-electron/main/**/*.map"] }, renderer: { assets: ["./out/renderer/**/*.{js,cjs,mjs,map}"], filesToDeleteAfterUpload: ["./out/renderer/**/*.map"] } }; function createSentryPlugins(target) { if (!process.env.SENTRY_AUTH_TOKEN) return []; return [ sentryVitePlugin({ org: process.env.SENTRY_ORG ?? "quant-jump-pro", project: process.env.SENTRY_PROJECT ?? "electron", authToken: process.env.SENTRY_AUTH_TOKEN, telemetry: false, release: { name: `agent-teams-ai@${pkg.version}` }, sourcemaps: sentrySourceMapTargets[target] }) ]; } var electron_vite_config_default = defineConfig({ main: { plugins: [ nativeModuleStub(), ...createSentryPlugins("main") ], define: { __APP_VERSION__: JSON.stringify(pkg.version), // Inject DSN at compile time - process.env.SENTRY_DSN is NOT available // at runtime in packaged Electron apps (only during CI build). "process.env.SENTRY_DSN": JSON.stringify(process.env.SENTRY_DSN ?? "") }, resolve: { alias: { "@features": resolve(__electron_vite_injected_dirname, "src/features"), "@main": resolve(__electron_vite_injected_dirname, "src/main"), "@shared": resolve(__electron_vite_injected_dirname, "src/shared"), "@preload": resolve(__electron_vite_injected_dirname, "src/preload") } }, build: { externalizeDeps: { exclude: bundledDeps }, commonjsOptions: { strictRequires: [/node_modules\/.*ssh2\//] }, sourcemap: "hidden", outDir: "dist-electron/main", rollupOptions: { input: { index: resolve(__electron_vite_injected_dirname, "src/main/index.ts"), "team-fs-worker": resolve(__electron_vite_injected_dirname, "src/main/workers/team-fs-worker.ts"), "task-change-worker": resolve(__electron_vite_injected_dirname, "src/main/workers/task-change-worker.ts"), "team-data-worker": resolve(__electron_vite_injected_dirname, "src/main/workers/team-data-worker.ts") }, output: { // CJS format so bundled deps can use __dirname/require. // Use .cjs extension since package.json has "type": "module". format: "cjs", entryFileNames: "[name].cjs", // Set UV_THREADPOOL_SIZE before any module code runs. // Must be in the banner because ESM→CJS hoists imports above top-level code. // On Windows, fs.watch({recursive:true}) occupies a UV pool thread per watcher; // with 3+ watchers + concurrent fs/DNS/spawn, the default 4 threads deadlock. banner: `if(!process.env.UV_THREADPOOL_SIZE){process.env.UV_THREADPOOL_SIZE='24'}` } } } }, preload: { resolve: { alias: { "@features": resolve(__electron_vite_injected_dirname, "src/features"), "@preload": resolve(__electron_vite_injected_dirname, "src/preload"), "@shared": resolve(__electron_vite_injected_dirname, "src/shared"), "@main": resolve(__electron_vite_injected_dirname, "src/main") } }, build: { outDir: "dist-electron/preload", rollupOptions: { input: { index: resolve(__electron_vite_injected_dirname, "src/preload/index.ts") }, output: { format: "cjs", entryFileNames: "[name].js" } } } }, renderer: { cacheDir: resolve(__electron_vite_injected_dirname, "node_modules/.vite/electron-renderer"), optimizeDeps: { include: ["@codemirror/language-data"], exclude: ["@claude-teams/agent-graph"] }, define: { __APP_VERSION__: JSON.stringify(pkg.version), // Pass SENTRY_DSN to renderer as VITE_SENTRY_DSN (Vite replaces at compile time) "import.meta.env.VITE_SENTRY_DSN": JSON.stringify(process.env.SENTRY_DSN ?? "") }, resolve: { alias: { "@features": resolve(__electron_vite_injected_dirname, "src/features"), "@renderer": resolve(__electron_vite_injected_dirname, "src/renderer"), "@shared": resolve(__electron_vite_injected_dirname, "src/shared"), "@main": resolve(__electron_vite_injected_dirname, "src/main"), "@radix-ui/react-compose-refs": resolve( __electron_vite_injected_dirname, "src/renderer/vendor/radixComposeRefs.ts" ), "@claude-teams/agent-graph": resolve(__electron_vite_injected_dirname, "packages/agent-graph/src/index.ts") } }, plugins: [react(), ...createSentryPlugins("renderer")], build: { sourcemap: "hidden", rollupOptions: { input: { index: resolve(__electron_vite_injected_dirname, "src/renderer/index.html") } } } } }); export { electron_vite_config_default as default };