diff --git a/.gitignore b/.gitignore index 0c82f0b..b417d04 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ node_modules/ package-lock.json temp.js -scratch.js \ No newline at end of file +scratch.js +# ignore eveything in agent_code except for 0.js +agent_code/** +!agent_code/0.js \ No newline at end of file diff --git a/utils/coder.js b/utils/coder.js index e5046fa..2962b5f 100644 --- a/utils/coder.js +++ b/utils/coder.js @@ -1,11 +1,11 @@ -import { writeFile } from 'fs'; +import { writeFile, unlink } from 'fs'; export class Coder { constructor(agent) { this.agent = agent; this.current_code = ''; - this.filename = './temp.js'; - this.execution_file = import('.'+this.filename); + this.file_counter = 0; + this.fp = './agent_code/'; } queueCode(code) { @@ -16,39 +16,59 @@ export class Coder { return this.current_code.length > 0; } + writeFilePromise(filename, src) { + // makes it so we can await this function + return new Promise((resolve, reject) => { + writeFile(filename, src, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + async execute() { if (!this.current_code) return {success: false, message: "No code to execute."}; - let src = "import * as skills from './utils/skills.js';"; - src += "\nimport * as world from './utils/world.js';" + let src = "import * as skills from '../utils/skills.js';"; + src += "\nimport * as world from '../utils/world.js';" src += `\n\nexport async function main(bot) {\n`; for (let line of this.current_code.split('\n')) { src += ` ${line}\n`; } - src += ` return true;\n}\n`; // potentially redundant return statement, agent doesn't need to write a return statement - + src += ` return true;\n}\n`; // potentially redundant return statement, in case agent doesn't return anything console.log("writing to file...", src) - - writeFile(this.filename, src, async (err) => { - console.log('done writing file') - if (err) throw err; - try { - console.log('beginning execution...') - delete this.execution_file; - this.execution_file = await import('.'+this.filename); - - let success = await this.execution_file.main(this.agent.bot); - this.current_code = ''; - // return {success, message: ""}; - } catch (err) { - console.log(err); - this.current_code = ''; - // return {success: false, message: err}; - } - }); - return {success: true, message: "yay"}; - + let filename = this.fp + this.file_counter + '.js'; + if (this.file_counter > 0) { + let prev_filename = this.fp + (this.file_counter-1) + '.js'; + unlink(prev_filename, (err) => { + console.log("deleted file " + prev_filename); + if (err) console.error(err); + }); + } + this.file_counter++; + + let result = await this.writeFilePromise(filename, src); + if (result) { + console.error('Error writing code execution file: ' + result); + return {success: false, message: result}; + } + + try { + console.log('executing code...\n'); + let execution_file = await import('.'+filename); + + let success = await execution_file.main(this.agent.bot); + this.current_code = ''; + return {success, message: ""}; + } catch (err) { + console.error("Problem executing code:" + err); + this.current_code = ''; + return {success: false, message: err}; + } } } \ No newline at end of file