chore: 清除所有 console.log,主进程日志接入执行日志面板
This commit is contained in:
+9
-4
@@ -7,6 +7,11 @@ import * as fs from 'fs';
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { mainWindow } from './main.js';
|
import { mainWindow } from './main.js';
|
||||||
import { showNotification } from './utils.js';
|
import { showNotification } from './utils.js';
|
||||||
|
|
||||||
|
/** 发送日志到渲染进程日志面板 */
|
||||||
|
function sendLog(level: 'info' | 'success' | 'warn' | 'error' | 'debug', message: string, detail?: string): void {
|
||||||
|
mainWindow?.webContents.send('main:log', { level, message, detail });
|
||||||
|
}
|
||||||
import {
|
import {
|
||||||
handleReadFile,
|
handleReadFile,
|
||||||
handleWriteFile,
|
handleWriteFile,
|
||||||
@@ -84,7 +89,7 @@ export function setupIPC(): void {
|
|||||||
// ── Tool Calling IPC ──
|
// ── Tool Calling IPC ──
|
||||||
ipcMain.handle('tool:execute', async (_, toolName: string, args: Record<string, unknown>) => {
|
ipcMain.handle('tool:execute', async (_, toolName: string, args: Record<string, unknown>) => {
|
||||||
try {
|
try {
|
||||||
console.log('[IPC] tool:execute', toolName, JSON.stringify(args || {}).slice(0, 200));
|
sendLog('debug', `🔧 tool:execute ${toolName}`, JSON.stringify(args || {}).slice(0, 200));
|
||||||
switch (toolName) {
|
switch (toolName) {
|
||||||
case 'read_file': return await handleReadFile(args as { path: string; encoding?: string; start_line?: number; end_line?: number });
|
case 'read_file': return await handleReadFile(args as { path: string; encoding?: string; start_line?: number; end_line?: number });
|
||||||
case 'write_file': return await handleWriteFile(args as { path: string; content: string; encoding?: string });
|
case 'write_file': return await handleWriteFile(args as { path: string; content: string; encoding?: string });
|
||||||
@@ -96,7 +101,7 @@ export function setupIPC(): void {
|
|||||||
default: return { success: false, error: `未知工具: ${toolName}` };
|
default: return { success: false, error: `未知工具: ${toolName}` };
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[IPC] tool:execute 异常:', toolName, err);
|
sendLog('error', `❌ tool:execute 异常: ${toolName}`, String(err));
|
||||||
return { success: false, error: (err as Error).message || '工具执行异常' };
|
return { success: false, error: (err as Error).message || '工具执行异常' };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -139,7 +144,7 @@ export function setupIPC(): void {
|
|||||||
|
|
||||||
// 启动命令(流式输出,通过 workspace:output 事件推送)
|
// 启动命令(流式输出,通过 workspace:output 事件推送)
|
||||||
ipcMain.on('workspace:exec', (event, { id, command, cwd }: { id: string; command: string; cwd?: string }) => {
|
ipcMain.on('workspace:exec', (event, { id, command, cwd }: { id: string; command: string; cwd?: string }) => {
|
||||||
console.log('[IPC] workspace:exec', id, command.slice(0, 200));
|
sendLog('info', `🖥️ workspace:exec`, `ID: ${id} | ${command.slice(0, 200)}`);
|
||||||
|
|
||||||
const result = startProcess(
|
const result = startProcess(
|
||||||
id,
|
id,
|
||||||
@@ -163,7 +168,7 @@ export function setupIPC(): void {
|
|||||||
|
|
||||||
// 停止命令
|
// 停止命令
|
||||||
ipcMain.on('workspace:kill', (_, id: string) => {
|
ipcMain.on('workspace:kill', (_, id: string) => {
|
||||||
console.log('[IPC] workspace:kill', id);
|
sendLog('info', `🖥️ workspace:kill`, `ID: ${id}`);
|
||||||
killProcess(id);
|
killProcess(id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ contextBridge.exposeInMainWorld('metonaDesktop', {
|
|||||||
removeAllListeners: (channel: string) => {
|
removeAllListeners: (channel: string) => {
|
||||||
ipcRenderer.removeAllListeners(channel);
|
ipcRenderer.removeAllListeners(channel);
|
||||||
},
|
},
|
||||||
|
onMainLog: (callback: (data: { level: string; message: string; detail?: string }) => void) => {
|
||||||
|
ipcRenderer.on('main:log', (_: unknown, data: { level: string; message: string; detail?: string }) => callback(data));
|
||||||
|
},
|
||||||
workspace: {
|
workspace: {
|
||||||
getDir: () => ipcRenderer.invoke('workspace:getDir'),
|
getDir: () => ipcRenderer.invoke('workspace:getDir'),
|
||||||
setDir: (dir: string) => ipcRenderer.invoke('workspace:setDir', dir),
|
setDir: (dir: string) => ipcRenderer.invoke('workspace:setDir', dir),
|
||||||
|
|||||||
@@ -7,8 +7,14 @@ import { spawn, ChildProcess } from 'child_process';
|
|||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { app } from 'electron';
|
import { app } from 'electron';
|
||||||
|
import { mainWindow } from './main.js';
|
||||||
import { checkPathAllowed, checkCommandAllowed } from './tool-security.js';
|
import { checkPathAllowed, checkCommandAllowed } from './tool-security.js';
|
||||||
|
|
||||||
|
/** 发送日志到渲染进程日志面板 */
|
||||||
|
function sendLog(level: 'info' | 'success' | 'warn' | 'error' | 'debug', message: string, detail?: string): void {
|
||||||
|
mainWindow?.webContents.send('main:log', { level, message, detail });
|
||||||
|
}
|
||||||
|
|
||||||
export const DEFAULT_WORKSPACE_DIR = path.join(app.getPath('userData'), 'workspace');
|
export const DEFAULT_WORKSPACE_DIR = path.join(app.getPath('userData'), 'workspace');
|
||||||
|
|
||||||
/** 活跃进程 Map */
|
/** 活跃进程 Map */
|
||||||
@@ -18,7 +24,7 @@ const activeProcesses = new Map<string, ChildProcess>();
|
|||||||
export function ensureWorkspaceDir(): void {
|
export function ensureWorkspaceDir(): void {
|
||||||
if (!fs.existsSync(DEFAULT_WORKSPACE_DIR)) {
|
if (!fs.existsSync(DEFAULT_WORKSPACE_DIR)) {
|
||||||
fs.mkdirSync(DEFAULT_WORKSPACE_DIR, { recursive: true });
|
fs.mkdirSync(DEFAULT_WORKSPACE_DIR, { recursive: true });
|
||||||
console.log('[Workspace] 创建默认工作空间目录:', DEFAULT_WORKSPACE_DIR);
|
sendLog('info', `📁 创建默认工作空间目录`, DEFAULT_WORKSPACE_DIR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import { setToolEnabled } from './services/tool-registry.js';
|
|||||||
import { initToolConfirmModal } from './components/tool-confirm-modal.js';
|
import { initToolConfirmModal } from './components/tool-confirm-modal.js';
|
||||||
import { initMemoryPanel } from './components/memory-panel.js';
|
import { initMemoryPanel } from './components/memory-panel.js';
|
||||||
import { initWorkspacePanel } from './components/workspace-panel.js';
|
import { initWorkspacePanel } from './components/workspace-panel.js';
|
||||||
import { initLogPanel } from './services/log-service.js';
|
import { initLogPanel, addLog } from './services/log-service.js';
|
||||||
import { logInfo, logSuccess, logError, logDebug, logInit, logWarn } from './services/log-service.js';
|
import { logInfo, logSuccess, logError, logDebug, logInit, logWarn } from './services/log-service.js';
|
||||||
import type { ChatSession } from './types.js';
|
import type { ChatSession } from './types.js';
|
||||||
|
|
||||||
@@ -78,6 +78,11 @@ function setupDesktopIntegration(): void {
|
|||||||
}
|
}
|
||||||
}) as EventListener);
|
}) as EventListener);
|
||||||
|
|
||||||
|
// 主进程日志转发到日志面板
|
||||||
|
bridge.onMainLog((data: { level: string; message: string; detail?: string }) => {
|
||||||
|
addLog(data.level as any, data.message, data.detail);
|
||||||
|
});
|
||||||
|
|
||||||
// 退出时释放显存
|
// 退出时释放显存
|
||||||
bridge.onAppQuit(() => {
|
bridge.onAppQuit(() => {
|
||||||
const api = state.get<OllamaAPI | null>(KEYS.API);
|
const api = state.get<OllamaAPI | null>(KEYS.API);
|
||||||
|
|||||||
Vendored
+1
@@ -229,6 +229,7 @@ export interface MetonaDesktopAPI {
|
|||||||
onTrayAction: (callback: (action: string) => void) => void;
|
onTrayAction: (callback: (action: string) => void) => void;
|
||||||
onAppQuit: (callback: () => void) => void;
|
onAppQuit: (callback: () => void) => void;
|
||||||
removeAllListeners: (channel: string) => void;
|
removeAllListeners: (channel: string) => void;
|
||||||
|
onMainLog: (callback: (data: { level: string; message: string; detail?: string }) => void) => void;
|
||||||
workspace: {
|
workspace: {
|
||||||
getDir: () => Promise<{ dir: string; defaultDir: string }>;
|
getDir: () => Promise<{ dir: string; defaultDir: string }>;
|
||||||
setDir: (dir: string) => Promise<{ success: boolean; dir?: string; error?: string }>;
|
setDir: (dir: string) => Promise<{ success: boolean; dir?: string; error?: string }>;
|
||||||
|
|||||||
Reference in New Issue
Block a user