Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions jest.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,32 @@ module.exports = {
// For example:
// testTimeout: 15000,
// setupFiles: ['./src/cobolt-backend/test-setup.js'],
},
// Specific configuration for main process tests
{
preset: 'ts-jest',
displayName: 'main',
testMatch: ['<rootDir>/tests/__tests__/main/**/*.test.{js,jsx,ts,tsx}'],
testEnvironment: 'node',
moduleDirectories: [
'node_modules',
'release/app/node_modules',
'src'
],
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
moduleNameMapper: {
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/tests/mocks/fileMock.js',
'\\.(css|less|sass|scss)$': 'identity-obj-proxy',
'^electron$': '<rootDir>/tests/mocks/electronMock.js',
'^sqlite3$': '<rootDir>/tests/mocks/sqlite3Mock.js'
},
setupFiles: [
'./scripts/check-build-exists.ts'
],
testPathIgnorePatterns: ['./release/app/dist', './dll'],
transform: {
'^.+\\.[tj]s$': 'ts-jest',
},
}
]
};
Expand Down
20 changes: 20 additions & 0 deletions src/main/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ import {
} from '../cobolt-backend/utils/error_manager';
import { loadConfig } from '../cobolt-backend/connectors/mcp_tools';
import { stopOllama, setProgressWindow } from '../cobolt-backend/ollama_client';
import AppUpdater from './updater';

let mainWindow: BrowserWindow | null = null;
let loadingWindow: BrowserWindow | null = null;
let initializationComplete: Promise<void> | null = null;
let appUpdater: AppUpdater | null = null;

log.initialize();

Expand Down Expand Up @@ -188,6 +190,12 @@ const createWindow = async (): Promise<void> => {
// Set progress window for ollama client
setProgressWindow(mainWindow);

// Initialize app updater after window is created
log.info('[Main] Initializing app updater');
appUpdater = new AppUpdater();
appUpdater.setMainWindow(mainWindow);
log.info('[Main] App updater initialized');

mainWindow.loadURL(resolveHtmlPath('index.html'));

mainWindow.on('ready-to-show', async () => {
Expand Down Expand Up @@ -252,6 +260,14 @@ const createWindow = async (): Promise<void> => {
});
}
}, 1000); // Delay showing dialog to ensure UI is fully loaded

// Check for updates on startup
if (app.isPackaged) {
log.info('[Main] App is packaged, will check for updates on startup');
appUpdater?.checkForUpdatesOnStartup();
} else {
log.info('[Main] App is not packaged, skipping auto-update check');
}
});

mainWindow.on('closed', () => {
Expand Down Expand Up @@ -657,6 +673,10 @@ ipcMain.handle('refresh-mcp-connections', async () => {
}
});

ipcMain.handle('get-app-version', () => {
return app.getVersion();
});

// Global error handlers
process.on('uncaughtException', (error) => {
showErrorDialog('Unexpected Error', error);
Expand Down
42 changes: 35 additions & 7 deletions src/main/menu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
BrowserWindow,
MenuItemConstructorOptions,
} from 'electron';
import log from 'electron-log/main';

interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions {
selector?: string;
Expand Down Expand Up @@ -54,17 +55,17 @@ export default class MenuBuilder {

buildDarwinTemplate(): MenuItemConstructorOptions[] {
const subMenuAbout: DarwinMenuItemConstructorOptions = {
label: 'Electron',
label: 'Cobolt',
submenu: [
{
label: 'About ElectronReact',
label: 'About Cobolt',
selector: 'orderFrontStandardAboutPanel:',
},
{ type: 'separator' },
{ label: 'Services', submenu: [] },
{ type: 'separator' },
{
label: 'Hide ElectronReact',
label: 'Hide Cobolt',
accelerator: 'Command+H',
selector: 'hide:',
},
Expand Down Expand Up @@ -180,6 +181,15 @@ export default class MenuBuilder {
shell.openExternal('https://github.com/electron/electron/issues');
},
},
{ type: 'separator' },
{
label: 'Check for Updates...',
click: () => {
log.info('[Menu] Check for Updates clicked');
this.mainWindow.webContents.send('check-for-updates-menu');
log.info('[Menu] Sent check-for-updates-menu event to renderer');
},
},
],
};

Expand All @@ -189,11 +199,18 @@ export default class MenuBuilder {
? subMenuViewDev
: subMenuViewProd;

return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp];
// Cast to MenuItemConstructorOptions[] for compatibility with Menu.buildFromTemplate
return [
subMenuAbout,
subMenuEdit,
subMenuView,
subMenuWindow,
subMenuHelp,
] as MenuItemConstructorOptions[];
}

buildDefaultTemplate() {
const templateDefault = [
buildDefaultTemplate(): MenuItemConstructorOptions[] {
const templateDefault: MenuItemConstructorOptions[] = [
{
label: '&File',
submenu: [
Expand Down Expand Up @@ -272,7 +289,18 @@ export default class MenuBuilder {
{
label: 'Search Issues',
click() {
shell.openExternal('https://github.com/platinum-hill/cobolt/issues');
shell.openExternal(
'https://github.com/platinum-hill/cobolt/issues',
);
},
},
{ type: 'separator' },
{
label: 'Check for Updates...',
click: () => {
log.info('[Menu] Check for Updates clicked');
this.mainWindow.webContents.send('check-for-updates-menu');
log.info('[Menu] Sent check-for-updates-menu event to renderer');
},
},
],
Expand Down
10 changes: 10 additions & 0 deletions src/main/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ const validChannels = {
'update-core-models',
'report-error',
'refresh-mcp-connections',
'check-for-updates',
'check-for-updates-menu',
'download-update',
'download-and-install',
'install-update',
'enable-auto-install',
'get-update-status',
'get-app-version',
],
on: [
'message-response',
Expand All @@ -35,6 +43,8 @@ const validChannels = {
'setup-progress',
'show-error-dialog',
'refresh-models-list',
'update-status',
'check-for-updates-menu',
],
};

Expand Down
Loading