fix(desktop): correct electron-updater import for commonjs

This commit is contained in:
zhayujie
2026-06-24 11:01:45 +08:00
parent 02517e4a01
commit ab6f49a822
4 changed files with 42 additions and 9 deletions

View File

@@ -55,6 +55,15 @@
{ {
"from": "build/dist/cowagent-backend", "from": "build/dist/cowagent-backend",
"to": "backend/cowagent-backend" "to": "backend/cowagent-backend"
},
{
"from": "resources",
"to": ".",
"filter": [
"icon.png",
"trayTemplate.png",
"trayTemplate@2x.png"
]
} }
], ],
"mac": { "mac": {

View File

@@ -43,6 +43,16 @@ function getIconPath(ext: string = 'png'): string | undefined {
return undefined return undefined
} }
// Resolve the optional monochrome macOS menu-bar template icon. Returns
// undefined when the asset isn't present, so the tray falls back gracefully.
function getTrayTemplatePath(): string | undefined {
const file = 'trayTemplate.png'
const p = isDev
? path.resolve(__dirname, '../../resources', file)
: path.join(process.resourcesPath, file)
return fs.existsSync(p) ? p : undefined
}
const isMac = process.platform === 'darwin' const isMac = process.platform === 'darwin'
const isWin = process.platform === 'win32' const isWin = process.platform === 'win32'
@@ -258,6 +268,9 @@ app.whenReady().then(async () => {
createTray({ createTray({
getWindow: () => mainWindow, getWindow: () => mainWindow,
iconPath: getIconPath('png'), iconPath: getIconPath('png'),
// Monochrome menu-bar icon for macOS; falls back to the colored icon when
// the template asset is absent (see createTray).
templateIconPath: getTrayTemplatePath(),
onQuit: () => { onQuit: () => {
isQuitting = true isQuitting = true
app.quit() app.quit()

View File

@@ -4,23 +4,33 @@ let tray: Tray | null = null
interface TrayDeps { interface TrayDeps {
getWindow: () => BrowserWindow | null getWindow: () => BrowserWindow | null
// Colored icon used on Windows/Linux trays.
iconPath?: string iconPath?: string
// Monochrome (black + alpha) template icon for the macOS menu bar; renders
// correctly in both light and dark menu bars when set as a template image.
templateIconPath?: string
// Called when the user picks "Quit" so the app can fully exit. // Called when the user picks "Quit" so the app can fully exit.
onQuit: () => void onQuit: () => void
} }
// Build a system tray icon with a minimal menu. The tray lets users restore the // Build a system tray icon with a minimal menu. The tray lets users restore the
// window after closing it to the background and start a new chat quickly. // window after closing it to the background and start a new chat quickly.
export function createTray({ getWindow, iconPath, onQuit }: TrayDeps): Tray | null { export function createTray({ getWindow, iconPath, templateIconPath, onQuit }: TrayDeps): Tray | null {
if (tray) return tray if (tray) return tray
if (!iconPath) return null
let image = nativeImage.createFromPath(iconPath) const isMac = process.platform === 'darwin'
// Prefer the monochrome template icon on macOS (menu-bar convention).
const sourcePath = isMac && templateIconPath ? templateIconPath : iconPath
if (!sourcePath) return null
let image = nativeImage.createFromPath(sourcePath)
if (image.isEmpty()) return null if (image.isEmpty()) return null
// Tray icons render small; resize to avoid an oversized image on some platforms. // Tray icons render small; resize to avoid an oversized image on some platforms.
image = image.resize({ width: 18, height: 18 }) image = image.resize({ width: 18, height: 18 })
// macOS renders template images correctly in both light/dark menubars. // A template image must be pure black + alpha; macOS then auto-inverts it for
if (process.platform === 'darwin') image.setTemplateImage(false) // light/dark menu bars. Only mark it as such when we actually loaded the
// dedicated template asset (a colored icon as template would render as a blob).
if (isMac && templateIconPath) image.setTemplateImage(true)
tray = new Tray(image) tray = new Tray(image)
tray.setToolTip(app.name) tray.setToolTip(app.name)

View File

@@ -1,8 +1,9 @@
import { app, BrowserWindow } from 'electron' import { app, BrowserWindow } from 'electron'
import pkg from 'electron-updater' // electron-updater is CommonJS: its members live on module.exports, with no
// meaningful default export. Under module=commonjs + esModuleInterop, a named
// electron-updater ships as CommonJS; grab autoUpdater from the default export. // import compiles to `electron_updater_1.autoUpdater` and resolves correctly,
const { autoUpdater } = pkg // whereas `import pkg from 'electron-updater'` yields undefined.
import { autoUpdater } from 'electron-updater'
// Status payloads pushed to the renderer over the 'update-status' channel. // Status payloads pushed to the renderer over the 'update-status' channel.
// The renderer drives the NavRail badge + update panel from these. // The renderer drives the NavRail badge + update panel from these.