aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/run-tool.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/run-tool.js')
-rwxr-xr-xscripts/run-tool.js101
1 files changed, 65 insertions, 36 deletions
diff --git a/scripts/run-tool.js b/scripts/run-tool.js
index 559b161..4a721bc 100755
--- a/scripts/run-tool.js
+++ b/scripts/run-tool.js
@@ -2,12 +2,24 @@
const path = require("path");
const fs = require("fs");
+const os = require("os");
-function parseArgv() {
+async function main() {
+ const [toolName, rawData] = parseArgv("run-tool.js");
+ const toolData = parseRawData(rawData);
+
+ const rootDir = path.resolve(__dirname, "..");
+ setupEnv(rootDir, toolName);
+
+ const toolPath = path.resolve(rootDir, `tools/${toolName}.js`);
+ await run(toolPath, "run", toolData);
+}
+
+function parseArgv(thisFileName) {
let toolName = process.argv[1];
let toolData = null;
- if (toolName.endsWith("run-tool.js")) {
+ if (toolName.endsWith(thisFileName)) {
toolName = process.argv[2];
toolData = process.argv[3];
} else {
@@ -22,20 +34,24 @@ function parseArgv() {
return [toolName, toolData];
}
-function loadModule(toolName) {
- const toolFileName = `${toolName}.js`;
- const toolPath = path.resolve(
- process.env["LLM_ROOT_DIR"],
- `tools/${toolFileName}`,
- );
+function parseRawData(data) {
+ if (!data) {
+ throw new Error("No JSON data");
+ }
try {
- return require(toolPath);
+ return JSON.parse(data);
} catch {
- console.log(`Invalid tooltion: ${toolFileName}`);
- process.exit(1);
+ throw new Error("Invalid JSON data");
}
}
+function setupEnv(rootDir, toolName) {
+ process.env["LLM_ROOT_DIR"] = rootDir;
+ loadEnv(path.resolve(rootDir, ".env"));
+ process.env["LLM_TOOL_NAME"] = toolName;
+ process.env["LLM_TOOL_CACHE_DIR"] = path.resolve(rootDir, "cache", toolName);
+}
+
function loadEnv(filePath) {
try {
const data = fs.readFileSync(filePath, "utf-8");
@@ -50,32 +66,45 @@ function loadEnv(filePath) {
} catch {}
}
-const LLM_ROOT_DIR = path.resolve(__dirname, "..");
-process.env["LLM_ROOT_DIR"] = LLM_ROOT_DIR;
-
-loadEnv(path.resolve(LLM_ROOT_DIR, ".env"));
-
-const [toolName, toolData] = parseArgv();
-
-process.env["LLM_TOOL_NAME"] = toolName;
-process.env["LLM_TOOL_CACHE_DIR"] = path.resolve(
- LLM_ROOT_DIR,
- "cache",
- toolName,
-);
-
-if (!toolData) {
- console.log("No json data");
- process.exit(1);
+async function run(toolPath, toolFunc, toolData) {
+ let mod;
+ if (os.platform() === "win32") {
+ toolPath = `file://${toolPath}`;
+ }
+ try {
+ mod = await import(toolPath);
+ } catch {
+ throw new Error(`Unable to load tool at '${toolPath}'`);
+ }
+ if (!mod || !mod[toolFunc]) {
+ throw new Error(`Not module function '${toolFunc}' at '${toolPath}'`);
+ }
+ const value = await mod[toolFunc](toolData);
+ dumpValue(value);
}
-let data = null;
-try {
- data = JSON.parse(toolData);
-} catch {
- console.log("Invalid json data");
- process.exit(1);
+function dumpValue(value) {
+ if (value === null || value === undefined) {
+ return;
+ }
+ const type = typeof value;
+ if (type === "string" || type === "number" || type === "boolean") {
+ console.log(value);
+ } else if (type === "object") {
+ const proto = Object.prototype.toString.call(value);
+ if (proto === "[object Object]" || proto === "[object Array]") {
+ const valueStr = JSON.stringify(value, null, 2);
+ require("assert").deepStrictEqual(value, JSON.parse(valueStr));
+ console.log(valueStr);
+ }
+ }
}
-const { run } = loadModule(toolName);
-run(data);
+(async () => {
+ try {
+ await main();
+ } catch (err) {
+ console.error(err?.message || err);
+ process.exit(1);
+ }
+})();