UNPKG

mcp-extended-tools

Version:
74 lines (61 loc) 2.54 kB
const { exec } = require('child_process'); const fs = require('fs'); const path = require('path'); const terminals = new Map(); function executeCommand(command, terminalName) { const allowedCommands = [ 'npm', 'yarn', 'pnpm', 'git', 'node', 'jest', 'vitest', 'vite', 'webpack', 'python', 'pip', 'virtualenv', 'powershell', 'pwsh', 'gsudo' ]; const firstArg = command.trim().split(' ')[0]; if (!allowedCommands.includes(firstArg)) { return Promise.reject({ error: 'Command not allowed' }); } const terminal = terminals.get(terminalName); if (!terminal) { const terminalLogFile = path.join(__dirname, `${terminalName}.log`); const logStream = fs.createWriteStream(terminalLogFile, { flags: 'a' }); const process = exec(command); terminals.set(terminalName, { process, logStream }); process.stdout.on('data', (data) => { logStream.write(data); }); process.stderr.on('data', (data) => { logStream.write(data); }); process.on('close', (code) => { logStream.write(`\nProcess exited with code ${code}`); logStream.end(); terminals.delete(terminalName); }); return Promise.resolve({ message: `Command execution started in terminal "${terminalName}"` }); } else { return Promise.reject({ error: `Terminal "${terminalName}" is already running a command` }); } } function stopProcess(terminalName) { const terminal = terminals.get(terminalName); if (terminal) { terminal.process.kill(); terminal.logStream.end(); terminals.delete(terminalName); return Promise.resolve({ message: `Process in terminal "${terminalName}" has been stopped` }); } else { return Promise.reject({ error: `No running process found in terminal "${terminalName}"` }); } } function getTerminalOutput(terminalName) { const terminalLogFile = path.join(__dirname, `${terminalName}.log`); if (fs.existsSync(terminalLogFile)) { const output = fs.readFileSync(terminalLogFile, 'utf8'); return Promise.resolve({ output }); } else { return Promise.reject({ error: `No output found for terminal "${terminalName}"` }); } } function listTerminals() { const terminalNames = Array.from(terminals.keys()); return Promise.resolve({ terminals: terminalNames }); } module.exports = { executeCommand, stopProcess, getTerminalOutput, listTerminals };