diff --git a/apps/browser/package.json b/apps/browser/package.json index f72dc417..b86e2baf 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -9,11 +9,13 @@ }, "dependencies": { "@evo-ninja/core": "0.1.0", + "@polywrap/client-js": "~0.12.0", "@fortawesome/fontawesome-svg-core": "^6.4.2", "@fortawesome/free-brands-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", "@fortawesome/react-fontawesome": "^0.2.0", "gpt-tokenizer": "~2.1.1", + "buffer": "6.0.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", diff --git a/apps/browser/src/index.tsx b/apps/browser/src/index.tsx index 1fd12b70..61fe2e1c 100644 --- a/apps/browser/src/index.tsx +++ b/apps/browser/src/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; +window.Buffer = window.Buffer || require("buffer").Buffer; import App from './App'; const root = ReactDOM.createRoot( diff --git a/apps/browser/src/pages/Dojo.tsx b/apps/browser/src/pages/Dojo.tsx index b4e42227..c1cad133 100644 --- a/apps/browser/src/pages/Dojo.tsx +++ b/apps/browser/src/pages/Dojo.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; import * as EvoCore from "@evo-ninja/core"; import cl100k_base from "gpt-tokenizer/esm/encoding/cl100k_base"; +import { PluginPackage } from "@polywrap/plugin-js"; import './Dojo.css'; @@ -127,13 +128,28 @@ function Dojo() { cl100k_base, logger ); + const agentPackage = PluginPackage.from(module => ({ + "onGoalAchieved": async (args: any) => { + logger.success("Goal has been achieved!!!!!"); + }, + "speak": async (args: any) => { + logger.success("Agent: " + args.message); + return "User has been informed! If you think you've achieved the goal, execute onGoalAchieved."; + }, + "ask": async (args: any) => { + logger.error("Agent: " + args.message); + const response = await prompt(""); + return "User: " + response; + }, + })); setEvo(new EvoCore.Evo( userWorkspace, scripts, llm, chat, - logger + logger, + agentPackage )); } catch (err) { setDojoError(err); diff --git a/apps/browser/yarn.lock b/apps/browser/yarn.lock index 86686b6e..fa54c5c4 100644 --- a/apps/browser/yarn.lock +++ b/apps/browser/yarn.lock @@ -4328,6 +4328,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -6716,7 +6724,7 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== diff --git a/apps/cli/package.json b/apps/cli/package.json index 0390d9f5..63e7b883 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@evo-ninja/core": "0.1.0", + "@polywrap/client-js": "~0.12.0", "chalk": "^4.1.2", "clui": "~0.3.6", "dotenv": "~16.3.1", diff --git a/apps/cli/src/cli.ts b/apps/cli/src/cli.ts index 6e2bb983..d8caf410 100644 --- a/apps/cli/src/cli.ts +++ b/apps/cli/src/cli.ts @@ -13,6 +13,7 @@ import dotenv from "dotenv"; import readline from "readline"; import path from "path"; import cl100k_base from "gpt-tokenizer/cjs/encoding/cl100k_base"; +import { PluginPackage } from "@polywrap/plugin-js"; dotenv.config({ path: path.join(__dirname, "../../../.env") @@ -78,13 +79,30 @@ export async function cli(): Promise { logger ); + const agentPackage = PluginPackage.from(module => ({ + "onGoalAchieved": async (args: any) => { + logger.success("Goal has been achieved!"); + process.exit(0); + }, + "speak": async (args: any) => { + logger.success("Agent: " + args.message); + return "User has been informed! If you think you've achieved the goal, execute onGoalAchieved."; + }, + "ask": async (args: any) => { + logger.error("Agent: " + args.message); + const response = await prompt(""); + return "User: " + response; + }, + })); + // Create Evo const evo = new Evo( userWorkspace, scripts, llm, chat, - logger + logger, + agentPackage ); await logger.logHeader(); diff --git a/packages/core/src/agents/evo/Evo.ts b/packages/core/src/agents/evo/Evo.ts index 8b0ab804..a784f0b7 100644 --- a/packages/core/src/agents/evo/Evo.ts +++ b/packages/core/src/agents/evo/Evo.ts @@ -7,6 +7,7 @@ import { LlmApi, Chat } from "../../llm"; import { WrapClient } from "../../wrap"; import { Scripts } from "../../Scripts"; import { InMemoryWorkspace, Workspace, Logger } from "../../sys"; +import { IWrapPackage } from "@polywrap/client-js"; export class Evo implements Agent { private client: WrapClient; @@ -17,11 +18,13 @@ export class Evo implements Agent { private readonly scripts: Scripts, private readonly llm: LlmApi, private readonly chat: Chat, - private readonly logger: Logger + private readonly logger: Logger, + private readonly agentPackage: IWrapPackage ) { this.client = new WrapClient( this.workspace, - this.logger + this.logger, + this.agentPackage ); this.globals = {}; diff --git a/packages/core/src/agents/script-writer/ScriptWriter.ts b/packages/core/src/agents/script-writer/ScriptWriter.ts index 08430eae..75883a8b 100644 --- a/packages/core/src/agents/script-writer/ScriptWriter.ts +++ b/packages/core/src/agents/script-writer/ScriptWriter.ts @@ -20,7 +20,7 @@ export class ScriptWriter implements Agent { ) { this.client = new WrapClient( this.workspace, - this.logger + this.logger, ); this.globals = {}; diff --git a/packages/core/src/wrap/WrapClient.ts b/packages/core/src/wrap/WrapClient.ts index 7984c642..31b8af4b 100644 --- a/packages/core/src/wrap/WrapClient.ts +++ b/packages/core/src/wrap/WrapClient.ts @@ -2,7 +2,8 @@ import { PolywrapClient, PolywrapClientConfigBuilder, Uri, - InvokeResult + InvokeResult, + IWrapPackage } from "@polywrap/client-js"; import { PluginPackage } from "@polywrap/plugin-js"; import axios from "axios"; @@ -16,7 +17,8 @@ export class WrapClient extends PolywrapClient { constructor( workspace: Workspace, - logger: Logger + logger: Logger, + agentPlugin: IWrapPackage | undefined = undefined, ) { const jsPromiseOutput = { result: undefined }; @@ -104,23 +106,13 @@ export class WrapClient extends PolywrapClient { logger.notice(`AXIOS.HEAD = ${args.url}`); return await axios.head(args.url, args.config); }, - }))) - .setPackage("plugin/agent", PluginPackage.from(module => ({ - "onGoalAchieved": async (args: any) => { - logger.success("Goal has been achieved!"); - process.exit(0); - }, - "speak": async (args: any) => { - logger.success("Agent: " + args.message); - return "User has been informed! If you think you've achieved the goal, execute onGoalAchieved."; - }, - "ask": async (args: any) => { - logger.error("Agent: " + args.message); - const response = await prompt(""); - return "User: " + response; - }, }))); + if (agentPlugin) { + builder + .setPackage("plugin/agent", agentPlugin); + } + super(builder.build()); this.jsPromiseOutput = jsPromiseOutput;