|
|
|
|
@@ -1,9 +1,15 @@
|
|
|
|
|
import * as cheerio from 'cheerio';
|
|
|
|
|
import {$, $Sync} from '@ztimson/node-utils';
|
|
|
|
|
import {$Sync} from '@ztimson/node-utils';
|
|
|
|
|
import {ASet, consoleInterceptor, Http, fn as Fn} from '@ztimson/utils';
|
|
|
|
|
import * as os from 'node:os';
|
|
|
|
|
import {Ai} from './ai.ts';
|
|
|
|
|
import {LLMRequest} from './llm.ts';
|
|
|
|
|
|
|
|
|
|
const getShell = () => {
|
|
|
|
|
if(os.platform() == 'win32') return 'cmd';
|
|
|
|
|
return $Sync`echo $SHELL`?.split('/').pop() || 'bash';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type AiToolArg = {[key: string]: {
|
|
|
|
|
/** Argument type */
|
|
|
|
|
type: 'array' | 'boolean' | 'number' | 'object' | 'string',
|
|
|
|
|
@@ -40,7 +46,7 @@ export const CliTool: AiTool = {
|
|
|
|
|
name: 'cli',
|
|
|
|
|
description: 'Use the command line interface, returns any output',
|
|
|
|
|
args: {command: {type: 'string', description: 'Command to run', required: true}},
|
|
|
|
|
fn: (args: {command: string}) => $`${args.command}`
|
|
|
|
|
fn: (args: {command: string}) => $Sync`${args.command}`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const DateTimeTool: AiTool = {
|
|
|
|
|
@@ -54,19 +60,20 @@ export const ExecTool: AiTool = {
|
|
|
|
|
name: 'exec',
|
|
|
|
|
description: 'Run code/scripts',
|
|
|
|
|
args: {
|
|
|
|
|
language: {type: 'string', description: 'Execution language', enum: ['cli', 'node', 'python'], required: true},
|
|
|
|
|
language: {type: 'string', description: `Execution language (CLI: ${getShell()})`, enum: ['cli', 'node', 'python'], required: true},
|
|
|
|
|
code: {type: 'string', description: 'Code to execute', required: true}
|
|
|
|
|
},
|
|
|
|
|
fn: async (args, stream, ai) => {
|
|
|
|
|
try {
|
|
|
|
|
switch(args.type) {
|
|
|
|
|
case 'bash':
|
|
|
|
|
switch(args.language) {
|
|
|
|
|
case 'cli':
|
|
|
|
|
return await CliTool.fn({command: args.code}, stream, ai);
|
|
|
|
|
case 'node':
|
|
|
|
|
return await JSTool.fn({code: args.code}, stream, ai);
|
|
|
|
|
case 'python': {
|
|
|
|
|
case 'python':
|
|
|
|
|
return await PythonTool.fn({code: args.code}, stream, ai);
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
throw new Error(`Unsupported language: ${args.language}`);
|
|
|
|
|
}
|
|
|
|
|
} catch(err: any) {
|
|
|
|
|
return {error: err?.message || err.toString()};
|
|
|
|
|
@@ -98,9 +105,10 @@ export const JSTool: AiTool = {
|
|
|
|
|
code: {type: 'string', description: 'CommonJS javascript', required: true}
|
|
|
|
|
},
|
|
|
|
|
fn: async (args: {code: string}) => {
|
|
|
|
|
const console = consoleInterceptor(null);
|
|
|
|
|
const resp = await Fn<any>({console}, args.code, true).catch((err: any) => console.output.error.push(err));
|
|
|
|
|
return {...console.output, return: resp, stdout: undefined, stderr: undefined};
|
|
|
|
|
console.log('executing js')
|
|
|
|
|
const c = consoleInterceptor(null);
|
|
|
|
|
const resp = await Fn<any>({console: c}, args.code, true).catch((err: any) => c.output.error.push(err));
|
|
|
|
|
return {...c.output, return: resp, stdout: undefined, stderr: undefined};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|