diff --git a/apps/cli/src/application/lib/agent.ts b/apps/cli/src/application/lib/agent.ts index d03936e6..996e0b8e 100644 --- a/apps/cli/src/application/lib/agent.ts +++ b/apps/cli/src/application/lib/agent.ts @@ -48,6 +48,8 @@ function mapAgentTool(t: z.infer): Tool { switch (t.name) { case "bash": return BashTool; + case "ask-human": + return AskHumanTool; default: throw new Error(`Unknown builtin tool: ${t.name}`); } @@ -154,7 +156,7 @@ export class AgentNode implements Step { const { fullStream } = streamText({ model: openai("gpt-4.1"), - // model: google("gemini-2.5-pro"), + // model: google("gemini-2.5-flash"), messages: convertFromMessages(input), system: this.agent.instructions, stopWhen: stepCountIs(1), diff --git a/apps/cli/src/application/lib/exec-tool.ts b/apps/cli/src/application/lib/exec-tool.ts index e703fd41..1da589ad 100644 --- a/apps/cli/src/application/lib/exec-tool.ts +++ b/apps/cli/src/application/lib/exec-tool.ts @@ -12,6 +12,7 @@ import { executeCommand } from "./command-executor.js"; import { loadWorkflow } from "./utils.js"; import { AssistantMessage } from "../entities/message.js"; import { executeWorkflow } from "./exec-workflow.js"; +import readline from "readline"; async function execMcpTool(agentTool: z.infer & { type: "mcp" }, input: any): Promise { // load mcp configuration from the tool @@ -65,6 +66,22 @@ async function execBashTool(agentTool: z.infer, input: any): P }; } +async function execAskHumanTool(agentTool: z.infer, input: any): Promise { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + let p = new Promise((resolve, reject) => { + rl.question(`>> Provide answer to: ${input.question}:\n\n`, (answer) => { + resolve(answer); + rl.close(); + }); + }); + const answer = await p; + return answer; +} + async function execWorkflowTool(agentTool: z.infer & { type: "workflow" }, input: any): Promise { let lastMsg: z.infer | null = null; for await (const event of executeWorkflow(agentTool.name, input.message)) { @@ -97,6 +114,13 @@ export async function execTool(agentTool: z.infer, input: any) case "workflow": return execWorkflowTool(agentTool, input); case "builtin": - return execBashTool(agentTool, input); + switch (agentTool.name) { + case "bash": + return execBashTool(agentTool, input); + case "ask-human": + return execAskHumanTool(agentTool, input); + default: + throw new Error(`Unknown builtin tool: ${agentTool.name}`); + } } } \ No newline at end of file