From 32b97f74580b1e1a8bc8092d51922073379d782c Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 20 Mar 2026 21:38:10 +0800 Subject: [PATCH] electron sentry integration --- bun.lock | 2 ++ .../desktop-electron/electron.vite.config.ts | 21 ++++++++++++++++++- packages/desktop-electron/package.json | 2 ++ .../desktop-electron/src/renderer/index.tsx | 14 +++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/bun.lock b/bun.lock index eb1d32351c..bcffe9338e 100644 --- a/bun.lock +++ b/bun.lock @@ -244,6 +244,8 @@ "@lydell/node-pty": "catalog:", "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", + "@sentry/solid": "catalog:", + "@sentry/vite-plugin": "catalog:", "@solid-primitives/i18n": "2.2.1", "@solid-primitives/storage": "catalog:", "@solidjs/meta": "catalog:", diff --git a/packages/desktop-electron/electron.vite.config.ts b/packages/desktop-electron/electron.vite.config.ts index d0e6c42b6c..33b9d066b6 100644 --- a/packages/desktop-electron/electron.vite.config.ts +++ b/packages/desktop-electron/electron.vite.config.ts @@ -1,3 +1,4 @@ +import { sentryVitePlugin } from "@sentry/vite-plugin" import { defineConfig } from "electron-vite" import appPlugin from "@opencode-ai/app/vite" import * as fs from "node:fs/promises" @@ -12,6 +13,23 @@ const OPENCODE_SERVER_DIST = "../opencode/dist/node" const nodePtyPkg = `@lydell/node-pty-${process.platform}-${process.arch}` +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: { define: { @@ -57,13 +75,14 @@ export default defineConfig({ }, }, renderer: { - plugins: [appPlugin], + plugins: [appPlugin, sentry], publicDir: "../../../app/public", root: "src/renderer", define: { "import.meta.env.VITE_OPENCODE_CHANNEL": JSON.stringify(channel), }, build: { + sourcemap: true, rollupOptions: { input: { main: "src/renderer/index.html", diff --git a/packages/desktop-electron/package.json b/packages/desktop-electron/package.json index e1f69b5b20..96e03e2ea4 100644 --- a/packages/desktop-electron/package.json +++ b/packages/desktop-electron/package.json @@ -37,6 +37,8 @@ "@lydell/node-pty": "catalog:", "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", + "@sentry/solid": "catalog:", + "@sentry/vite-plugin": "catalog:", "@solid-primitives/i18n": "2.2.1", "@solid-primitives/storage": "catalog:", "@solidjs/meta": "catalog:", diff --git a/packages/desktop-electron/src/renderer/index.tsx b/packages/desktop-electron/src/renderer/index.tsx index 44f2e6360c..45f8eb22e4 100644 --- a/packages/desktop-electron/src/renderer/index.tsx +++ b/packages/desktop-electron/src/renderer/index.tsx @@ -14,6 +14,7 @@ import { ServerConnection, useCommand, } from "@opencode-ai/app" +import * as Sentry from "@sentry/solid" import type { AsyncStorage } from "@solid-primitives/storage" import { MemoryRouter } from "@solidjs/router" import { createEffect, createResource, onCleanup, onMount, Show } from "solid-js" @@ -30,6 +31,19 @@ if (import.meta.env.DEV && !(root instanceof HTMLElement)) { throw new Error(t("error.dev.rootNotFound")) } +if (!import.meta.env.DEV && import.meta.env.VITE_SENTRY_DSN) { + Sentry.init({ + dsn: import.meta.env.VITE_SENTRY_DSN, + environment: import.meta.env.VITE_SENTRY_ENVIRONMENT ?? import.meta.env.MODE, + release: import.meta.env.VITE_SENTRY_RELEASE ?? `desktop-electron@${pkg.version}`, + initialScope: { + tags: { + platform: "desktop-electron", + }, + }, + }) +} + void initI18n() const deepLinkEvent = "opencode:deep-link"