refactor(home): 将首页改造成opencode服务入口页面
- 移除ChatGPT风格对话界面相关代码 - 添加在首页自动启动/停止opencode serve的IPC调用 - 首页使用webview加载opencode服务器界面
This commit is contained in:
@@ -6,6 +6,7 @@ import log from 'electron-log';
|
||||
import { generatePdf } from './services/pdfGenerator';
|
||||
import { selectHtmlFile } from './services/htmlImport';
|
||||
import { electronState } from './state';
|
||||
import { spawn, ChildProcess } from 'child_process';
|
||||
|
||||
log.initialize();
|
||||
|
||||
@@ -24,6 +25,9 @@ if (!fs.existsSync(process.env.NOTEBOOK_ROOT)) {
|
||||
|
||||
electronState.setDevelopment(!app.isPackaged);
|
||||
|
||||
let opencodeProcess: ChildProcess | null = null;
|
||||
const OPENCODE_PORT = 4096;
|
||||
|
||||
let lastClipboardText = '';
|
||||
|
||||
function startClipboardWatcher() {
|
||||
@@ -358,6 +362,62 @@ ipcMain.handle('remote-download-file', async (_event, id: string, serverHost: st
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('opencode-start-server', async () => {
|
||||
if (opencodeProcess) {
|
||||
log.info('Opencode server already running');
|
||||
return { success: true, port: OPENCODE_PORT };
|
||||
}
|
||||
|
||||
try {
|
||||
log.info('Starting opencode server...');
|
||||
opencodeProcess = spawn('opencode', ['serve'], {
|
||||
stdio: 'pipe',
|
||||
shell: true,
|
||||
detached: false,
|
||||
});
|
||||
|
||||
opencodeProcess.stdout?.on('data', (data) => {
|
||||
log.info(`[opencode] ${data}`);
|
||||
});
|
||||
|
||||
opencodeProcess.stderr?.on('data', (data) => {
|
||||
log.error(`[opencode error] ${data}`);
|
||||
});
|
||||
|
||||
opencodeProcess.on('error', (err) => {
|
||||
log.error('Opencode process error:', err);
|
||||
opencodeProcess = null;
|
||||
});
|
||||
|
||||
opencodeProcess.on('exit', (code) => {
|
||||
log.info(`Opencode process exited with code ${code}`);
|
||||
opencodeProcess = null;
|
||||
});
|
||||
|
||||
return { success: true, port: OPENCODE_PORT };
|
||||
} catch (error: any) {
|
||||
log.error('Failed to start opencode server:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('opencode-stop-server', async () => {
|
||||
if (!opencodeProcess) {
|
||||
log.info('Opencode server not running');
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
try {
|
||||
log.info('Stopping opencode server...');
|
||||
opencodeProcess.kill('SIGTERM');
|
||||
opencodeProcess = null;
|
||||
return { success: true };
|
||||
} catch (error: any) {
|
||||
log.error('Failed to stop opencode server:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
});
|
||||
|
||||
async function startServer() {
|
||||
if (electronState.isDevelopment()) {
|
||||
log.info('In dev mode, assuming external servers are running.');
|
||||
|
||||
@@ -39,4 +39,6 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
ipcRenderer.invoke('remote-upload-file', id, serverHost, port, filePath, remotePath, password),
|
||||
remoteDownloadFile: (id: string, serverHost: string, port: number, fileName: string, remotePath: string, localPath: string, password?: string) =>
|
||||
ipcRenderer.invoke('remote-download-file', id, serverHost, port, fileName, remotePath, localPath, password),
|
||||
opencodeStartServer: () => ipcRenderer.invoke('opencode-start-server'),
|
||||
opencodeStopServer: () => ipcRenderer.invoke('opencode-stop-server'),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user