import { ipcMain, shell } from 'electron'; import { exec, execSync } from 'child_process'; import * as fs from 'fs'; import * as os from 'os'; export function registerShellHandlers() { ipcMain.handle('native:open-folder', async (event, folderPath: string) => { const error = await shell.openPath(folderPath); return { success: !error, error }; }); ipcMain.handle('native:run-cmd', async (event, { cmd, timeout = 30000 }) => { return new Promise((resolve) => { exec(cmd, { timeout }, (error, stdout, stderr) => { resolve({ success: !error, stdout: stdout.trim(), stderr: stderr.trim(), error: error ? error.message : null }); }); }); }); ipcMain.handle('native:run-cmd-sync', async (event, { cmd }) => { try { const stdout = execSync(cmd).toString(); return { success: true, stdout: stdout.trim() }; } catch (error: any) { return { success: false, error: error.message, stderr: error.stderr?.toString() }; } }); ipcMain.handle('native:run-osascript', async (event, script: string) => { if (os.platform() !== 'darwin') return { success: false, error: 'AppleScript is only available on macOS' }; const escapedScript = script.replace(/"/g, '\"'); const cmd = `osascript -e "${escapedScript}"`; return new Promise((resolve) => { exec(cmd, (error, stdout, stderr) => { resolve({ success: !error, stdout: stdout.trim(), stderr: stderr.trim(), error: error ? error.message : null }); }); }); }); ipcMain.handle('native:kill-processes', async (event, { process_name_li = [] }) => { console.log(`Native: Killing processes -> `, process_name_li); const results = []; for (const name of process_name_li) { const cmd = os.platform() === 'win32' ? `taskkill /F /IM ${name} /T` : `pkill -f ${name}`; try { execSync(cmd); results.push({ name, success: true }); } catch (e: any) { results.push({ name, success: false, error: e.message }); } } return { success: true, results }; }); ipcMain.handle('native:open-local-file-v2', async (event, filePath: string) => { const error = await shell.openPath(filePath); return { success: !error, error }; }); }