diff --git a/apps/browser/src/components/Chat/Chat.tsx b/apps/browser/src/components/Chat/Chat.tsx index b50fc2d8..b1dd5ac5 100644 --- a/apps/browser/src/components/Chat/Chat.tsx +++ b/apps/browser/src/components/Chat/Chat.tsx @@ -18,6 +18,7 @@ export interface ChatProps { const Chat: React.FC = ({ evo, onMessage, messages }: ChatProps) => { const [message, setMessage] = useState(""); const [evoRunning, setEvoRunning] = useState(false); + const [paused, setPaused] = useState(false); const [sending, setSending] = useState(false); const [evoItr, setEvoItr] = useState | undefined>( undefined @@ -38,6 +39,11 @@ const Chat: React.FC = ({ evo, onMessage, messages }: ChatProps) => { let messageLog = messages; while (evoRunning) { + if (paused) { + return Promise.resolve(); + } + + console.log("evoooo", paused); const response = await evoItr.next(); if (response.value && response.value.message) { @@ -62,15 +68,24 @@ const Chat: React.FC = ({ evo, onMessage, messages }: ChatProps) => { }, [evoRunning, evoItr]); const handleSend = async () => { - setSending(true); // Set the sending state when starting to send - setMessage(""); - onMessage({ + setMessages(messages => [...messages, { + type: "info", text: message, user: 'user' - }); + }]); + setSending(true); + setMessage(""); setEvoRunning(true); }; + const handlePause = async () => { + setPaused(true); + }; + + const handleContinue = async () => { + setPaused(false); + }; + const handleChange = (event: ChangeEvent) => { setMessage(event.target.value); }; @@ -103,11 +118,30 @@ const Chat: React.FC = ({ evo, onMessage, messages }: ChatProps) => { className="Chat__Input" disabled={sending} // Disable input while sending /> - {sending ? ( + {evoRunning && ( + <> + { + !paused && ( + + ) + } + { + paused && ( + + ) + } + + )} + + {evoRunning ? (
) : ( )}
diff --git a/apps/browser/src/pages/Dojo.tsx b/apps/browser/src/pages/Dojo.tsx index f7c48e25..886ce1de 100644 --- a/apps/browser/src/pages/Dojo.tsx +++ b/apps/browser/src/pages/Dojo.tsx @@ -13,6 +13,13 @@ import Chat, { ChatMessage } from "../components/Chat/Chat"; import { InMemoryFile } from '../sys/file'; import { MarkdownLogger } from '../sys/logger'; import { updateWorkspaceFiles } from '../updateWorkspaceFiles'; +import { Workspace } from '@evo-ninja/core'; +import { onGoalAchievedScript, speakScript } from '../scripts'; + +function addScript(script: {name: string, definition: string, code: string}, scriptsWorkspace: Workspace) { + scriptsWorkspace.writeFileSync(`${script.name}.json`, script.definition); + scriptsWorkspace.writeFileSync(`${script.name}.js`, script.code); +} function Dojo() { const [apiKey, setApiKey] = useState( @@ -113,9 +120,13 @@ function Dojo() { }); const scriptsWorkspace = new EvoCore.InMemoryWorkspace(); + addScript(onGoalAchievedScript, scriptsWorkspace); + addScript(speakScript, scriptsWorkspace); + const scripts = new EvoCore.Scripts( scriptsWorkspace ); + setScriptsWorkspace(scriptsWorkspace); const env = new EvoCore.Env( @@ -145,16 +156,14 @@ function Dojo() { ); const agentPackage = PluginPackage.from(module => ({ "onGoalAchieved": async (args: any) => { - logger.success("Goal has been achieved!!!!!"); + logger.success("Goal has been achieved!"); }, "speak": async (args: any) => { - logger.success("Agent: " + args.message); + logger.success("Evo: " + 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; + throw new Error("Not implemented"); }, })); diff --git a/apps/browser/src/scripts.ts b/apps/browser/src/scripts.ts new file mode 100644 index 00000000..5e0fe61a --- /dev/null +++ b/apps/browser/src/scripts.ts @@ -0,0 +1,31 @@ +export const onGoalAchievedScript = { + name: "agent.onGoalAchieved", + definition: `{ + "name":"agent.onGoalAchieved", + "description":"Informs the user that the goal has been achieved.", + "arguments":"None", + "code":"./agent.onGoalAchieved.js" +}`, + code: `return __wrap_subinvoke( + 'plugin/agent', + 'onGoalAchieved', + { } +).value +` +}; + +export const speakScript = { + name: "agent.speak", + definition: `{ + "name":"agent.speak", + "description":"Informs the user by sending a message.", + "arguments":"{ message: string }", + "code":"./agent.speak.js" +}`, + code: `return __wrap_subinvoke( + 'plugin/agent', + 'speak', + { message: message } +).value +` +}; diff --git a/packages/core/src/agents/evo/agent-functions/executeScript.ts b/packages/core/src/agents/evo/agent-functions/executeScript.ts index 100ac1a3..73f249f1 100644 --- a/packages/core/src/agents/evo/agent-functions/executeScript.ts +++ b/packages/core/src/agents/evo/agent-functions/executeScript.ts @@ -92,6 +92,10 @@ export const executeScript: AgentFunction = { JSON.stringify(context.client.jsPromiseOutput.result); } + if (result.ok && !context.client.jsPromiseOutput.result) { + console.log("No result returned from script.", context.client.jsPromiseOutput, result.value); + } + return result.ok ? result.value.error == null ? context.client.jsPromiseOutput.result