UNPKG

@nomyx/assistant-cli

Version:

A javascript-based assistant that can help you with your daily tasks

202 lines (194 loc) 6.51 kB
const shell = require('shelljs'); const path = require('path'); const fs = require('fs'); const { exec } = require('child_process'); const execute_bash = async ({ command }) => { return new Promise((resolve, reject) => { shell.exec(command, { silent: true }, (code, stdout, stderr) => { if (code === 0) { resolve(stdout); } else { resolve(`${stdout}\n${stderr}`) } }); }); } const execute_nodejs_code = async ({ js }) => { return new Promise((resolve, reject) => { try { const fileName = path.join(__dirname, new Date().getTime() + ".js"); fs.writeFileSync(fileName, js); exec(`node ${fileName}`, ((error, stdout, stderr) => { fs.unlinkSync(fileName); if (error) { resolve(error.message); } else if (stderr) { resolve(stderr); } else { resolve(JSON.stringify(stdout)); } } )); } catch (err) { resolve(err.message); } }); } const execute_tsnodejs_code = async ({ js }) => { return new Promise((resolve, reject) => { try { const fileName = path.join(__dirname, new Date().getTime() + ".js"); fs.writeFileSync(fileName, js); exec(`ts-node ${fileName}`, ((error, stdout, stderr) => { fs.unlinkSync(fileName); if (error) { resolve(error.message); } else if (stderr) { resolve(stderr); } else { resolve(JSON.stringify(stdout)); } } )); } catch (err) { resolve(err.message); } }); } const execute_python_code = async ({ python }) => { return new Promise((resolve, _reject) => { try { const fileName = path.join(__dirname, new Date().getTime() + ".py"); fs.writeFileSync(fileName, python); exec(`python ${fileName}`, (error, stdout, stderr) => { fs.unlinkSync(fileName); if (error) { resolve(error.message); } else if (stderr) { resolve(JSON.stringify(stderr)); } else { resolve(JSON.stringify(stdout)); } }); } catch (err) { resolve(err.message); } }); } const execute_nodejs_file = async ({ file }) => { return new Promise((resolve, reject) => { try { const fileName = path.join(__dirname, file); exec(`node ${fileName}`, ((error, stdout, stderr) => { if (error) { resolve(error.message); } else if (stderr) { resolve(stderr); } else { resolve(stdout); } } )); } catch (err) { resolve(err.message); } }); } const execute_python_file = async ({ file }) => { return new Promise((resolve, _reject) => { try { const fileName = path.join(__dirname, file); exec(`python ${fileName}`, (error, stdout, stderr) => { if (error) { resolve(error.message); } else if (stderr) { resolve(stderr); } else { resolve(stdout); } }); } catch (err) { resolve(err.message); } }); } module.exports = { schemas: [{ type: 'function', function: { name: 'execute_bash', description: 'execute an arbitrary Bash command', parameters: { type: 'object', properties: { command: { type: 'string', description: 'Bash command to run' } }, required: ['command'] } } },{ type: "function", function: { name: "execute_file", description: "execute a file containing Typescript, Javascript, or Python code and return the result", parameters: { type: "object", properties: { file: { type: "string", description: "Source code file to execute" } }, required: ["file"] } } }, { type: "function", function: { name: "execute_code", description: "execute a code snippet in a specific language and return the result", parameters: { type: "object", properties: { code: { type: "string", description: "Code snippet to execute" }, language: { type: "string", description: "Language of the code snippet. Can be bash, python, javascript or typescript" } }, required: ["code", "language"] } } }], tools: { execute_bash, execute_file: async ({ file }) => { const ext = file.split('.').pop(); if (ext === 'js') { return execute_nodejs_file({ file }); } else if (ext === 'ts') { return execute_tsnodejs_file({ file }); } else if (ext === 'py') { return execute_python_file({ file }); } else { return 'Unsupported file type'; } }, execute_code: async ({ code, language }) => { if (language === 'bash') { return execute_bash({ command: code }); } else if (language === 'python') { return execute_python_code({ python: code }); } else if (language === 'javascript') { return execute_nodejs_code({ js: code }); } else if (language === 'typescript') { return execute_tsnodejs_code({ js: code }); } else { return 'Unsupported language'; } } } }