diff --git a/docs/tools/agent-tools.md b/docs/tools/agent-tools.md index fab1cca..6201906 100644 --- a/docs/tools/agent-tools.md +++ b/docs/tools/agent-tools.md @@ -2,15 +2,15 @@ The agent tools provide ways to create and interact with sub-agents. There are two approaches available: -1. The original `subAgent` tool (synchronous, blocking) +1. The original `agentExecute` tool (synchronous, blocking) 2. The new `agentStart` and `agentMessage` tools (asynchronous, non-blocking) -## subAgent Tool +## agentExecute Tool -The `subAgent` tool creates a sub-agent that runs synchronously until completion. The parent agent waits for the sub-agent to complete before continuing. +The `agentExecute` tool creates a sub-agent that runs synchronously until completion. The parent agent waits for the sub-agent to complete before continuing. ```typescript -subAgent({ +agentExecute({ description: "A brief description of the sub-agent's purpose", goal: 'The main objective that the sub-agent needs to achieve', projectContext: 'Context about the problem or environment', @@ -123,7 +123,7 @@ while (!agent1Completed || !agent2Completed) { ## Choosing Between Approaches -- Use `subAgent` for simpler tasks where blocking execution is acceptable +- Use `agentExecute` for simpler tasks where blocking execution is acceptable - Use `agentStart` and `agentMessage` for: - Parallel execution of multiple sub-agents - Tasks where you need to monitor progress diff --git a/packages/agent/src/core/toolAgent/config.ts b/packages/agent/src/core/toolAgent/config.ts index 010ae90..fd4037e 100644 --- a/packages/agent/src/core/toolAgent/config.ts +++ b/packages/agent/src/core/toolAgent/config.ts @@ -146,7 +146,7 @@ export function getDefaultSystemPrompt(toolContext: ToolContext): string { githubModeInstructions, '', 'You prefer to call tools in parallel when possible because it leads to faster execution and less resource usage.', - 'When done, call the sequenceComplete tool with your results to indicate that the sequence has completed.', + 'When done, call the agentDone tool with your results to indicate that the sequence has completed.', '', 'For coding tasks:', '0. Try to break large tasks into smaller sub-tasks that can be completed and verified sequentially.', diff --git a/packages/agent/src/core/toolAgent/toolAgentCore.test.ts b/packages/agent/src/core/toolAgent/toolAgentCore.test.ts index dc77d1e..9a17384 100644 --- a/packages/agent/src/core/toolAgent/toolAgentCore.test.ts +++ b/packages/agent/src/core/toolAgent/toolAgentCore.test.ts @@ -13,7 +13,7 @@ describe('toolAgentCore empty response detection', () => { content: [ { type: 'text', - text: 'I notice you sent an empty response. If you are done with your tasks, please call the sequenceComplete tool with your results. If you are waiting for other tools to complete, you can use the sleep tool to wait before checking again.', + text: 'I notice you sent an empty response. If you are done with your tasks, please call the agentDone tool with your results. If you are waiting for other tools to complete, you can use the sleep tool to wait before checking again.', }, ], }); diff --git a/packages/agent/src/core/toolAgent/toolAgentCore.ts b/packages/agent/src/core/toolAgent/toolAgentCore.ts index e0773dc..f61c73b 100644 --- a/packages/agent/src/core/toolAgent/toolAgentCore.ts +++ b/packages/agent/src/core/toolAgent/toolAgentCore.ts @@ -100,7 +100,7 @@ export const toolAgent = async ( messages.push({ role: 'user', content: - 'I notice you sent an empty response. If you are done with your tasks, please call the sequenceComplete tool with your results. If you are waiting for other tools to complete, you can use the sleep tool to wait before checking again.', + 'I notice you sent an empty response. If you are done with your tasks, please call the agentDone tool with your results. If you are waiting for other tools to complete, you can use the sleep tool to wait before checking again.', }); continue; } @@ -129,8 +129,12 @@ export const toolAgent = async ( ); // Execute the tools and get results - const { sequenceCompleted, completionResult, respawn } = - await executeTools(toolCalls, tools, messages, localContext); + const { agentDoned, completionResult, respawn } = await executeTools( + toolCalls, + tools, + messages, + localContext, + ); if (respawn) { logger.info('Respawning agent with new context'); @@ -143,7 +147,7 @@ export const toolAgent = async ( continue; } - if (sequenceCompleted) { + if (agentDoned) { const result: ToolAgentResult = { result: completionResult ?? 'Sequence explicitly completed', interactions, diff --git a/packages/agent/src/core/toolAgent/toolExecutor.ts b/packages/agent/src/core/toolAgent/toolExecutor.ts index 63baed1..9e21243 100644 --- a/packages/agent/src/core/toolAgent/toolExecutor.ts +++ b/packages/agent/src/core/toolAgent/toolExecutor.ts @@ -32,7 +32,7 @@ export async function executeTools( context: ToolContext, ): Promise { if (toolCalls.length === 0) { - return { sequenceCompleted: false, toolResults: [] }; + return { agentDoned: false, toolResults: [] }; } const { logger } = context; @@ -46,7 +46,7 @@ export async function executeTools( addToolResultToMessages(messages, respawnCall.id, { success: true }, false); return { - sequenceCompleted: false, + agentDoned: false, toolResults: [ { toolCallId: respawnCall.id, @@ -97,19 +97,17 @@ export async function executeTools( }), ); - const sequenceCompletedTool = toolResults.find( - (r) => r.toolName === 'sequenceComplete', - ); - const completionResult = sequenceCompletedTool - ? (sequenceCompletedTool.result as { result: string }).result + const agentDonedTool = toolResults.find((r) => r.toolName === 'agentDone'); + const completionResult = agentDonedTool + ? (agentDonedTool.result as { result: string }).result : undefined; - if (sequenceCompletedTool) { + if (agentDonedTool) { logger.verbose('Sequence completed', { completionResult }); } return { - sequenceCompleted: sequenceCompletedTool !== undefined, + agentDoned: agentDonedTool !== undefined, completionResult, toolResults, }; diff --git a/packages/agent/src/core/toolAgent/types.ts b/packages/agent/src/core/toolAgent/types.ts index 62588f4..5b31c7b 100644 --- a/packages/agent/src/core/toolAgent/types.ts +++ b/packages/agent/src/core/toolAgent/types.ts @@ -7,7 +7,7 @@ export interface ToolAgentResult { } export interface ToolCallResult { - sequenceCompleted: boolean; + agentDoned: boolean; completionResult?: string; toolResults: unknown[]; respawn?: { context: string }; diff --git a/packages/agent/src/core/types.ts b/packages/agent/src/core/types.ts index 2b92963..dd26a71 100644 --- a/packages/agent/src/core/types.ts +++ b/packages/agent/src/core/types.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; import { JsonSchema7Type } from 'zod-to-json-schema'; -import { BrowserTracker } from '../tools/browser/browserTracker.js'; -import { AgentTracker } from '../tools/interaction/agentTracker.js'; -import { ShellTracker } from '../tools/system/shellTracker.js'; +import { AgentTracker } from '../tools/agent/AgentTracker.js'; +import { SessionTracker } from '../tools/session/SessionTracker.js'; +import { ShellTracker } from '../tools/shell/ShellTracker.js'; import { Logger } from '../utils/logger.js'; import { TokenTracker } from './tokens.js'; @@ -34,7 +34,7 @@ export type ToolContext = { temperature: number; agentTracker: AgentTracker; shellTracker: ShellTracker; - browserTracker: BrowserTracker; + browserTracker: SessionTracker; }; export type Tool, TReturn = any> = { diff --git a/packages/agent/src/index.ts b/packages/agent/src/index.ts index 5295e44..4a8c5e5 100644 --- a/packages/agent/src/index.ts +++ b/packages/agent/src/index.ts @@ -3,28 +3,28 @@ export * from './tools/io/fetch.js'; // Tools - System -export * from './tools/system/shellStart.js'; +export * from './tools/shell/shellStart.js'; export * from './tools/system/sleep.js'; export * from './tools/system/respawn.js'; -export * from './tools/system/sequenceComplete.js'; -export * from './tools/system/shellMessage.js'; -export * from './tools/system/shellExecute.js'; -export * from './tools/system/listShells.js'; -export * from './tools/system/shellTracker.js'; +export * from './tools/agent/agentDone.js'; +export * from './tools/shell/shellMessage.js'; +export * from './tools/shell/shellExecute.js'; +export * from './tools/shell/listShells.js'; +export * from './tools/shell/ShellTracker.js'; // Tools - Browser -export * from './tools/browser/BrowserManager.js'; -export * from './tools/browser/types.js'; -export * from './tools/browser/browseMessage.js'; -export * from './tools/browser/browseStart.js'; -export * from './tools/browser/PageController.js'; -export * from './tools/browser/BrowserAutomation.js'; -export * from './tools/browser/listBrowsers.js'; -export * from './tools/browser/browserTracker.js'; +export * from './tools/session/lib/SessionManager.js'; +export * from './tools/session/lib/types.js'; +export * from './tools/session/sessionMessage.js'; +export * from './tools/session/sessionStart.js'; +export * from './tools/session/lib/PageController.js'; +export * from './tools/session/lib/BrowserAutomation.js'; +export * from './tools/session/listSessions.js'; +export * from './tools/session/SessionTracker.js'; -export * from './tools/interaction/agentTracker.js'; +export * from './tools/agent/AgentTracker.js'; // Tools - Interaction -export * from './tools/interaction/subAgent.js'; +export * from './tools/agent/agentExecute.js'; export * from './tools/interaction/userPrompt.js'; // Core diff --git a/packages/agent/src/tools/interaction/agentTracker.ts b/packages/agent/src/tools/agent/AgentTracker.ts similarity index 100% rename from packages/agent/src/tools/interaction/agentTracker.ts rename to packages/agent/src/tools/agent/AgentTracker.ts diff --git a/packages/agent/src/tools/system/sequenceComplete.ts b/packages/agent/src/tools/agent/agentDone.ts similarity index 90% rename from packages/agent/src/tools/system/sequenceComplete.ts rename to packages/agent/src/tools/agent/agentDone.ts index cb3bf1f..4561371 100644 --- a/packages/agent/src/tools/system/sequenceComplete.ts +++ b/packages/agent/src/tools/agent/agentDone.ts @@ -16,8 +16,8 @@ const returnSchema = z.object({ type Parameters = z.infer; type ReturnType = z.infer; -export const sequenceCompleteTool: Tool = { - name: 'sequenceComplete', +export const agentDoneTool: Tool = { + name: 'agentDone', description: 'Completes the tool use sequence and returns the final result', logPrefix: '✅', parameters: parameterSchema, diff --git a/packages/agent/src/tools/interaction/subAgent.test.ts b/packages/agent/src/tools/agent/agentExecute.test.ts similarity index 86% rename from packages/agent/src/tools/interaction/subAgent.test.ts rename to packages/agent/src/tools/agent/agentExecute.test.ts index ac8fdac..c9cecd0 100644 --- a/packages/agent/src/tools/interaction/subAgent.test.ts +++ b/packages/agent/src/tools/agent/agentExecute.test.ts @@ -3,11 +3,11 @@ import { describe, expect, it, vi } from 'vitest'; import { TokenTracker } from '../../core/tokens.js'; import { ToolContext } from '../../core/types.js'; import { MockLogger } from '../../utils/mockLogger.js'; -import { BrowserTracker } from '../browser/browserTracker.js'; -import { ShellTracker } from '../system/shellTracker.js'; +import { SessionTracker } from '../session/SessionTracker.js'; +import { ShellTracker } from '../shell/ShellTracker.js'; -import { AgentTracker } from './agentTracker.js'; -import { subAgentTool } from './subAgent.js'; +import { agentExecuteTool } from './agentExecute.js'; +import { AgentTracker } from './AgentTracker.js'; // Mock the toolAgent function vi.mock('../../core/toolAgent/toolAgentCore.js', () => ({ @@ -37,12 +37,12 @@ const mockContext: ToolContext = { temperature: 0.7, agentTracker: new AgentTracker('test'), shellTracker: new ShellTracker('test'), - browserTracker: new BrowserTracker('test'), + browserTracker: new SessionTracker('test'), }; -describe('subAgentTool', () => { +describe('agentExecuteTool', () => { it('should create a sub-agent and return its response', async () => { - const result = await subAgentTool.execute( + const result = await agentExecuteTool.execute( { description: 'Test sub-agent', goal: 'Test the sub-agent tool', @@ -58,7 +58,7 @@ describe('subAgentTool', () => { it('should use custom working directory when provided', async () => { const { toolAgent } = await import('../../core/toolAgent/toolAgentCore.js'); - await subAgentTool.execute( + await agentExecuteTool.execute( { description: 'Test sub-agent with custom directory', goal: 'Test the sub-agent tool', @@ -82,7 +82,7 @@ describe('subAgentTool', () => { it('should include relevant files in the prompt when provided', async () => { const { toolAgent } = await import('../../core/toolAgent/toolAgentCore.js'); - await subAgentTool.execute( + await agentExecuteTool.execute( { description: 'Test sub-agent with relevant files', goal: 'Test the sub-agent tool', diff --git a/packages/agent/src/tools/interaction/subAgent.ts b/packages/agent/src/tools/agent/agentExecute.ts similarity index 88% rename from packages/agent/src/tools/interaction/subAgent.ts rename to packages/agent/src/tools/agent/agentExecute.ts index 8b52057..048f702 100644 --- a/packages/agent/src/tools/interaction/subAgent.ts +++ b/packages/agent/src/tools/agent/agentExecute.ts @@ -7,11 +7,11 @@ import { } from '../../core/toolAgent/config.js'; import { toolAgent } from '../../core/toolAgent/toolAgentCore.js'; import { Tool, ToolContext } from '../../core/types.js'; -import { BrowserTracker } from '../browser/browserTracker.js'; import { getTools } from '../getTools.js'; -import { ShellTracker } from '../system/shellTracker.js'; +import { SessionTracker } from '../session/SessionTracker.js'; +import { ShellTracker } from '../shell/ShellTracker.js'; -import { AgentTracker } from './agentTracker.js'; +import { AgentTracker } from './AgentTracker.js'; const parameterSchema = z.object({ description: z @@ -45,22 +45,22 @@ type Parameters = z.infer; type ReturnType = z.infer; // Sub-agent specific configuration -const subAgentConfig: AgentConfig = { +const agentConfig: AgentConfig = { maxIterations: 200, getSystemPrompt: (context: ToolContext) => { return [ getDefaultSystemPrompt(context), 'You are a focused AI sub-agent handling a specific task.', 'You have access to the same tools as the main agent but should focus only on your assigned task.', - 'When complete, call the sequenceComplete tool with your results.', + 'When complete, call the agentDone tool with your results.', 'Follow any specific conventions or requirements provided in the task context.', 'Ask the main agent for clarification if critical information is missing.', ].join('\n'); }, }; -export const subAgentTool: Tool = { - name: 'subAgent', +export const agentExecuteTool: Tool = { + name: 'agentExecute', description: 'Creates a sub-agent that has access to all tools to solve a specific task', logPrefix: '🤖', @@ -89,7 +89,7 @@ export const subAgentTool: Tool = { workingDirectory: workingDirectory ?? context.workingDirectory, agentTracker: new AgentTracker(subAgentId), shellTracker: new ShellTracker(subAgentId), - browserTracker: new BrowserTracker(subAgentId), + browserTracker: new SessionTracker(subAgentId), }; // Construct a well-structured prompt @@ -107,9 +107,9 @@ export const subAgentTool: Tool = { const tools = getTools({ userPrompt: false }); - // Use the subAgentConfig + // Use the agentConfig const config: AgentConfig = { - ...subAgentConfig, + ...agentConfig, }; try { diff --git a/packages/agent/src/tools/interaction/agentMessage.ts b/packages/agent/src/tools/agent/agentMessage.ts similarity index 100% rename from packages/agent/src/tools/interaction/agentMessage.ts rename to packages/agent/src/tools/agent/agentMessage.ts diff --git a/packages/agent/src/tools/interaction/agentStart.ts b/packages/agent/src/tools/agent/agentStart.ts similarity index 95% rename from packages/agent/src/tools/interaction/agentStart.ts rename to packages/agent/src/tools/agent/agentStart.ts index 0a10651..04f9232 100644 --- a/packages/agent/src/tools/interaction/agentStart.ts +++ b/packages/agent/src/tools/agent/agentStart.ts @@ -9,7 +9,7 @@ import { toolAgent } from '../../core/toolAgent/toolAgentCore.js'; import { Tool, ToolContext } from '../../core/types.js'; import { getTools } from '../getTools.js'; -import { AgentStatus, AgentState } from './agentTracker.js'; +import { AgentStatus, AgentState } from './AgentTracker.js'; // For backward compatibility export const agentStates = new Map(); @@ -49,14 +49,14 @@ type Parameters = z.infer; type ReturnType = z.infer; // Sub-agent specific configuration -const subAgentConfig: AgentConfig = { +const agentConfig: AgentConfig = { maxIterations: 200, getSystemPrompt: (context: ToolContext) => { return [ getDefaultSystemPrompt(context), 'You are a focused AI sub-agent handling a specific task.', 'You have access to the same tools as the main agent but should focus only on your assigned task.', - 'When complete, call the sequenceComplete tool with your results.', + 'When complete, call the agentDone tool with your results.', 'Follow any specific conventions or requirements provided in the task context.', 'Ask the main agent for clarification if critical information is missing.', ].join('\n'); @@ -128,7 +128,7 @@ export const agentStartTool: Tool = { // eslint-disable-next-line promise/catch-or-return Promise.resolve().then(async () => { try { - const result = await toolAgent(prompt, tools, subAgentConfig, { + const result = await toolAgent(prompt, tools, agentConfig, { ...context, workingDirectory: workingDirectory ?? context.workingDirectory, }); diff --git a/packages/agent/src/tools/interaction/agentTools.test.ts b/packages/agent/src/tools/agent/agentTools.test.ts similarity index 94% rename from packages/agent/src/tools/interaction/agentTools.test.ts rename to packages/agent/src/tools/agent/agentTools.test.ts index 90522cd..ac12fcb 100644 --- a/packages/agent/src/tools/interaction/agentTools.test.ts +++ b/packages/agent/src/tools/agent/agentTools.test.ts @@ -3,12 +3,12 @@ import { describe, expect, it, vi } from 'vitest'; import { TokenTracker } from '../../core/tokens.js'; import { ToolContext } from '../../core/types.js'; import { MockLogger } from '../../utils/mockLogger.js'; -import { BrowserTracker } from '../browser/browserTracker.js'; -import { ShellTracker } from '../system/shellTracker.js'; +import { SessionTracker } from '../session/SessionTracker.js'; +import { ShellTracker } from '../shell/ShellTracker.js'; import { agentMessageTool } from './agentMessage.js'; import { agentStartTool, agentStates } from './agentStart.js'; -import { AgentTracker } from './agentTracker.js'; +import { AgentTracker } from './AgentTracker.js'; // Mock the toolAgent function vi.mock('../../core/toolAgent/toolAgentCore.js', () => ({ @@ -33,7 +33,7 @@ const mockContext: ToolContext = { temperature: 0.7, agentTracker: new AgentTracker('test'), shellTracker: new ShellTracker('test'), - browserTracker: new BrowserTracker('test'), + browserTracker: new SessionTracker('test'), }; describe('Agent Tools', () => { diff --git a/packages/agent/src/tools/system/listAgents.ts b/packages/agent/src/tools/agent/listAgents.ts similarity index 98% rename from packages/agent/src/tools/system/listAgents.ts rename to packages/agent/src/tools/agent/listAgents.ts index ea028fe..0696004 100644 --- a/packages/agent/src/tools/system/listAgents.ts +++ b/packages/agent/src/tools/agent/listAgents.ts @@ -2,7 +2,8 @@ import { z } from 'zod'; import { zodToJsonSchema } from 'zod-to-json-schema'; import { Tool } from '../../core/types.js'; -import { AgentStatus } from '../interaction/agentTracker.js'; + +import { AgentStatus } from './AgentTracker.js'; const parameterSchema = z.object({ status: z diff --git a/packages/agent/src/tools/getTools.test.ts b/packages/agent/src/tools/getTools.test.ts index 4bceb72..5de25cb 100644 --- a/packages/agent/src/tools/getTools.test.ts +++ b/packages/agent/src/tools/getTools.test.ts @@ -4,10 +4,10 @@ import { TokenTracker } from '../core/tokens.js'; import { ToolContext } from '../core/types.js'; import { MockLogger } from '../utils/mockLogger.js'; -import { BrowserTracker } from './browser/browserTracker.js'; +import { AgentTracker } from './agent/AgentTracker.js'; import { getTools } from './getTools.js'; -import { AgentTracker } from './interaction/agentTracker.js'; -import { ShellTracker } from './system/shellTracker.js'; +import { SessionTracker } from './session/SessionTracker.js'; +import { ShellTracker } from './shell/ShellTracker.js'; // Mock context export const getMockToolContext = (): ToolContext => ({ @@ -24,7 +24,7 @@ export const getMockToolContext = (): ToolContext => ({ temperature: 0.7, agentTracker: new AgentTracker('test'), shellTracker: new ShellTracker('test'), - browserTracker: new BrowserTracker('test'), + browserTracker: new SessionTracker('test'), }); describe('getTools', () => { diff --git a/packages/agent/src/tools/getTools.ts b/packages/agent/src/tools/getTools.ts index 598744c..1087f17 100644 --- a/packages/agent/src/tools/getTools.ts +++ b/packages/agent/src/tools/getTools.ts @@ -2,19 +2,19 @@ import { McpConfig } from '../core/mcp/index.js'; import { Tool } from '../core/types.js'; // Import tools -import { browseMessageTool } from './browser/browseMessage.js'; -import { browseStartTool } from './browser/browseStart.js'; -import { listBrowsersTool } from './browser/listBrowsers.js'; -import { subAgentTool } from './interaction/subAgent.js'; +import { agentDoneTool } from './agent/agentDone.js'; +import { agentExecuteTool } from './agent/agentExecute.js'; +import { listAgentsTool } from './agent/listAgents.js'; import { userPromptTool } from './interaction/userPrompt.js'; import { fetchTool } from './io/fetch.js'; import { textEditorTool } from './io/textEditor.js'; import { createMcpTool } from './mcp.js'; -import { listAgentsTool } from './system/listAgents.js'; -import { listShellsTool } from './system/listShells.js'; -import { sequenceCompleteTool } from './system/sequenceComplete.js'; -import { shellMessageTool } from './system/shellMessage.js'; -import { shellStartTool } from './system/shellStart.js'; +import { listSessionsTool } from './session/listSessions.js'; +import { sessionMessageTool } from './session/sessionMessage.js'; +import { sessionStartTool } from './session/sessionStart.js'; +import { listShellsTool } from './shell/listShells.js'; +import { shellMessageTool } from './shell/shellMessage.js'; +import { shellStartTool } from './shell/shellStart.js'; import { sleepTool } from './system/sleep.js'; // Import these separately to avoid circular dependencies @@ -31,16 +31,16 @@ export function getTools(options?: GetToolsOptions): Tool[] { // Force cast to Tool type to avoid TypeScript issues const tools: Tool[] = [ textEditorTool as unknown as Tool, - subAgentTool as unknown as Tool, - listBrowsersTool as unknown as Tool, + agentExecuteTool as unknown as Tool, + listSessionsTool as unknown as Tool, /*agentStartTool as unknown as Tool, agentMessageTool as unknown as Tool,*/ - sequenceCompleteTool as unknown as Tool, + agentDoneTool as unknown as Tool, fetchTool as unknown as Tool, shellStartTool as unknown as Tool, shellMessageTool as unknown as Tool, - browseStartTool as unknown as Tool, - browseMessageTool as unknown as Tool, + sessionStartTool as unknown as Tool, + sessionMessageTool as unknown as Tool, //respawnTool as unknown as Tool, this is a confusing tool for now. sleepTool as unknown as Tool, listShellsTool as unknown as Tool, diff --git a/packages/agent/src/tools/io/textEditor.test.ts b/packages/agent/src/tools/io/textEditor.test.ts index 0bae64d..a35ab52 100644 --- a/packages/agent/src/tools/io/textEditor.test.ts +++ b/packages/agent/src/tools/io/textEditor.test.ts @@ -8,7 +8,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { ToolContext } from '../../core/types.js'; import { MockLogger } from '../../utils/mockLogger.js'; import { getMockToolContext } from '../getTools.test.js'; -import { shellExecuteTool } from '../system/shellExecute.js'; +import { shellExecuteTool } from '../shell/shellExecute.js'; import { textEditorTool } from './textEditor.js'; diff --git a/packages/agent/src/tools/browser/browserTracker.ts b/packages/agent/src/tools/session/SessionTracker.ts similarity index 66% rename from packages/agent/src/tools/browser/browserTracker.ts rename to packages/agent/src/tools/session/SessionTracker.ts index 31c2bc1..2b4fa92 100644 --- a/packages/agent/src/tools/browser/browserTracker.ts +++ b/packages/agent/src/tools/session/SessionTracker.ts @@ -1,10 +1,10 @@ import { v4 as uuidv4 } from 'uuid'; -import { BrowserManager } from './BrowserManager.js'; -import { browserSessions } from './types.js'; +import { SessionManager } from './lib/SessionManager.js'; +import { browserSessions } from './lib/types.js'; // Status of a browser session -export enum BrowserSessionStatus { +export enum SessionStatus { RUNNING = 'running', COMPLETED = 'completed', ERROR = 'error', @@ -12,9 +12,9 @@ export enum BrowserSessionStatus { } // Browser session tracking data -export interface BrowserSessionInfo { +export interface SessionInfo { id: string; - status: BrowserSessionStatus; + status: SessionStatus; startTime: Date; endTime?: Date; metadata: { @@ -29,17 +29,17 @@ export interface BrowserSessionInfo { /** * Registry to keep track of browser sessions */ -export class BrowserTracker { - private sessions: Map = new Map(); +export class SessionTracker { + private sessions: Map = new Map(); constructor(public ownerAgentId: string | undefined) {} // Register a new browser session public registerBrowser(url?: string): string { const id = uuidv4(); - const session: BrowserSessionInfo = { + const session: SessionInfo = { id, - status: BrowserSessionStatus.RUNNING, + status: SessionStatus.RUNNING, startTime: new Date(), metadata: { url, @@ -52,7 +52,7 @@ export class BrowserTracker { // Update the status of a browser session public updateSessionStatus( id: string, - status: BrowserSessionStatus, + status: SessionStatus, metadata?: Record, ): boolean { const session = this.sessions.get(id); @@ -63,9 +63,9 @@ export class BrowserTracker { session.status = status; if ( - status === BrowserSessionStatus.COMPLETED || - status === BrowserSessionStatus.ERROR || - status === BrowserSessionStatus.TERMINATED + status === SessionStatus.COMPLETED || + status === SessionStatus.ERROR || + status === SessionStatus.TERMINATED ) { session.endTime = new Date(); } @@ -78,19 +78,17 @@ export class BrowserTracker { } // Get all browser sessions - public getSessions(): BrowserSessionInfo[] { + public getSessions(): SessionInfo[] { return Array.from(this.sessions.values()); } // Get a specific browser session by ID - public getSessionById(id: string): BrowserSessionInfo | undefined { + public getSessionById(id: string): SessionInfo | undefined { return this.sessions.get(id); } // Filter sessions by status - public getSessionsByStatus( - status: BrowserSessionStatus, - ): BrowserSessionInfo[] { + public getSessionsByStatus(status: SessionStatus): SessionInfo[] { return this.getSessions().filter((session) => session.status === status); } @@ -99,11 +97,11 @@ export class BrowserTracker { * @returns A promise that resolves when cleanup is complete */ public async cleanup(): Promise { - const sessions = this.getSessionsByStatus(BrowserSessionStatus.RUNNING); + const sessions = this.getSessionsByStatus(SessionStatus.RUNNING); // Create cleanup promises for each session const cleanupPromises = sessions.map((session) => - this.cleanupBrowserSession(session), + this.cleanupSession(session), ); // Wait for all cleanup operations to complete in parallel @@ -114,18 +112,16 @@ export class BrowserTracker { * Cleans up a browser session * @param session The browser session to clean up */ - private async cleanupBrowserSession( - session: BrowserSessionInfo, - ): Promise { + private async cleanupSession(session: SessionInfo): Promise { try { const browserManager = ( - globalThis as unknown as { __BROWSER_MANAGER__?: BrowserManager } + globalThis as unknown as { __BROWSER_MANAGER__?: SessionManager } ).__BROWSER_MANAGER__; if (browserManager) { await browserManager.closeSession(session.id); } else { - // Fallback to closing via browserSessions if BrowserManager is not available + // Fallback to closing via browserSessions if SessionManager is not available const browserSession = browserSessions.get(session.id); if (browserSession) { await browserSession.page.context().close(); @@ -134,9 +130,9 @@ export class BrowserTracker { } } - this.updateSessionStatus(session.id, BrowserSessionStatus.COMPLETED); + this.updateSessionStatus(session.id, SessionStatus.COMPLETED); } catch (error) { - this.updateSessionStatus(session.id, BrowserSessionStatus.ERROR, { + this.updateSessionStatus(session.id, SessionStatus.ERROR, { error: error instanceof Error ? error.message : String(error), }); } diff --git a/packages/agent/src/tools/browser/BrowserAutomation.ts b/packages/agent/src/tools/session/lib/BrowserAutomation.ts similarity index 85% rename from packages/agent/src/tools/browser/BrowserAutomation.ts rename to packages/agent/src/tools/session/lib/BrowserAutomation.ts index 52f3b83..f3794aa 100644 --- a/packages/agent/src/tools/browser/BrowserAutomation.ts +++ b/packages/agent/src/tools/session/lib/BrowserAutomation.ts @@ -1,12 +1,12 @@ -import { BrowserManager } from './BrowserManager.js'; import { PageController } from './PageController.js'; +import { SessionManager } from './SessionManager.js'; export class BrowserAutomation { private static instance: BrowserAutomation; - private browserManager: BrowserManager; + private browserManager: SessionManager; private constructor() { - this.browserManager = new BrowserManager(); + this.browserManager = new SessionManager(); } static getInstance(): BrowserAutomation { diff --git a/packages/agent/src/tools/browser/PageController.ts b/packages/agent/src/tools/session/lib/PageController.ts similarity index 97% rename from packages/agent/src/tools/browser/PageController.ts rename to packages/agent/src/tools/session/lib/PageController.ts index 2912711..65f5ce3 100644 --- a/packages/agent/src/tools/browser/PageController.ts +++ b/packages/agent/src/tools/session/lib/PageController.ts @@ -1,6 +1,6 @@ import { Page } from '@playwright/test'; -import { errorToString } from '../../utils/errorToString.js'; +import { errorToString } from '../../../utils/errorToString.js'; import { SelectorType, diff --git a/packages/agent/src/tools/browser/BrowserManager.ts b/packages/agent/src/tools/session/lib/SessionManager.ts similarity index 92% rename from packages/agent/src/tools/browser/BrowserManager.ts rename to packages/agent/src/tools/session/lib/SessionManager.ts index 269597a..cd747ed 100644 --- a/packages/agent/src/tools/browser/BrowserManager.ts +++ b/packages/agent/src/tools/session/lib/SessionManager.ts @@ -3,13 +3,13 @@ import { v4 as uuidv4 } from 'uuid'; import { BrowserConfig, - BrowserSession, + Session, BrowserError, BrowserErrorCode, } from './types.js'; -export class BrowserManager { - private sessions: Map = new Map(); +export class SessionManager { + private sessions: Map = new Map(); private readonly defaultConfig: BrowserConfig = { headless: true, defaultTimeout: 30000, @@ -24,7 +24,7 @@ export class BrowserManager { this.setupGlobalCleanup(); } - async createSession(config?: BrowserConfig): Promise { + async createSession(config?: BrowserConfig): Promise { try { const sessionConfig = { ...this.defaultConfig, ...config }; const browser = await chromium.launch({ @@ -41,7 +41,7 @@ export class BrowserManager { const page = await context.newPage(); page.setDefaultTimeout(sessionConfig.defaultTimeout ?? 1000); - const session: BrowserSession = { + const session: Session = { browser, page, id: uuidv4(), @@ -83,7 +83,7 @@ export class BrowserManager { } } - private setupCleanup(session: BrowserSession): void { + private setupCleanup(session: Session): void { // Handle browser disconnection session.browser.on('disconnected', () => { this.sessions.delete(session.id); @@ -139,7 +139,7 @@ export class BrowserManager { await Promise.all(closePromises); } - getSession(sessionId: string): BrowserSession { + getSession(sessionId: string): Session { const session = this.sessions.get(sessionId); if (!session) { throw new BrowserError( diff --git a/packages/agent/src/tools/browser/browser-manager.test.ts b/packages/agent/src/tools/session/lib/browser-manager.test.ts similarity index 93% rename from packages/agent/src/tools/browser/browser-manager.test.ts rename to packages/agent/src/tools/session/lib/browser-manager.test.ts index dd27635..f89de0b 100644 --- a/packages/agent/src/tools/browser/browser-manager.test.ts +++ b/packages/agent/src/tools/session/lib/browser-manager.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; -import { BrowserManager } from './BrowserManager.js'; +import { SessionManager } from './SessionManager.js'; import { BrowserError, BrowserErrorCode } from './types.js'; -describe('BrowserManager', () => { - let browserManager: BrowserManager; +describe('SessionManager', () => { + let browserManager: SessionManager; beforeEach(() => { - browserManager = new BrowserManager(); + browserManager = new SessionManager(); }); afterEach(async () => { diff --git a/packages/agent/src/tools/browser/element-state.test.ts b/packages/agent/src/tools/session/lib/element-state.test.ts similarity index 94% rename from packages/agent/src/tools/browser/element-state.test.ts rename to packages/agent/src/tools/session/lib/element-state.test.ts index aac9c22..d2078b2 100644 --- a/packages/agent/src/tools/browser/element-state.test.ts +++ b/packages/agent/src/tools/session/lib/element-state.test.ts @@ -8,19 +8,19 @@ import { vi, } from 'vitest'; -import { BrowserManager } from './BrowserManager.js'; -import { BrowserSession } from './types.js'; +import { SessionManager } from './SessionManager.js'; +import { Session } from './types.js'; // Set global timeout for all tests in this file vi.setConfig({ testTimeout: 15000 }); describe('Element State Tests', () => { - let browserManager: BrowserManager; - let session: BrowserSession; + let browserManager: SessionManager; + let session: Session; const baseUrl = 'https://the-internet.herokuapp.com'; beforeAll(async () => { - browserManager = new BrowserManager(); + browserManager = new SessionManager(); session = await browserManager.createSession({ headless: true }); }); diff --git a/packages/agent/src/tools/browser/filterPageContent.ts b/packages/agent/src/tools/session/lib/filterPageContent.ts similarity index 100% rename from packages/agent/src/tools/browser/filterPageContent.ts rename to packages/agent/src/tools/session/lib/filterPageContent.ts diff --git a/packages/agent/src/tools/browser/form-interaction.test.ts b/packages/agent/src/tools/session/lib/form-interaction.test.ts similarity index 92% rename from packages/agent/src/tools/browser/form-interaction.test.ts rename to packages/agent/src/tools/session/lib/form-interaction.test.ts index f331856..5a7a7de 100644 --- a/packages/agent/src/tools/browser/form-interaction.test.ts +++ b/packages/agent/src/tools/session/lib/form-interaction.test.ts @@ -8,19 +8,19 @@ import { vi, } from 'vitest'; -import { BrowserManager } from './BrowserManager.js'; -import { BrowserSession } from './types.js'; +import { SessionManager } from './SessionManager.js'; +import { Session } from './types.js'; // Set global timeout for all tests in this file vi.setConfig({ testTimeout: 15000 }); describe('Form Interaction Tests', () => { - let browserManager: BrowserManager; - let session: BrowserSession; + let browserManager: SessionManager; + let session: Session; const baseUrl = 'https://the-internet.herokuapp.com'; beforeAll(async () => { - browserManager = new BrowserManager(); + browserManager = new SessionManager(); session = await browserManager.createSession({ headless: true }); }); diff --git a/packages/agent/src/tools/browser/navigation.test.ts b/packages/agent/src/tools/session/lib/navigation.test.ts similarity index 90% rename from packages/agent/src/tools/browser/navigation.test.ts rename to packages/agent/src/tools/session/lib/navigation.test.ts index 93c41c5..7cf887c 100644 --- a/packages/agent/src/tools/browser/navigation.test.ts +++ b/packages/agent/src/tools/session/lib/navigation.test.ts @@ -1,18 +1,18 @@ import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'; -import { BrowserManager } from './BrowserManager.js'; -import { BrowserSession } from './types.js'; +import { SessionManager } from './SessionManager.js'; +import { Session } from './types.js'; // Set global timeout for all tests in this file vi.setConfig({ testTimeout: 15000 }); describe('Browser Navigation Tests', () => { - let browserManager: BrowserManager; - let session: BrowserSession; + let browserManager: SessionManager; + let session: Session; const baseUrl = 'https://the-internet.herokuapp.com'; beforeAll(async () => { - browserManager = new BrowserManager(); + browserManager = new SessionManager(); session = await browserManager.createSession({ headless: true }); }); diff --git a/packages/agent/src/tools/browser/types.ts b/packages/agent/src/tools/session/lib/types.ts similarity index 93% rename from packages/agent/src/tools/browser/types.ts rename to packages/agent/src/tools/session/lib/types.ts index b57470f..4e208e8 100644 --- a/packages/agent/src/tools/browser/types.ts +++ b/packages/agent/src/tools/session/lib/types.ts @@ -7,7 +7,7 @@ export interface BrowserConfig { } // Browser session -export interface BrowserSession { +export interface Session { browser: Browser; page: Page; id: string; @@ -54,7 +54,7 @@ export interface SelectorOptions { } // Global map to store browser sessions -export const browserSessions: Map = new Map(); +export const browserSessions: Map = new Map(); // Browser action types export type BrowserAction = diff --git a/packages/agent/src/tools/browser/wait-behavior.test.ts b/packages/agent/src/tools/session/lib/wait-behavior.test.ts similarity index 92% rename from packages/agent/src/tools/browser/wait-behavior.test.ts rename to packages/agent/src/tools/session/lib/wait-behavior.test.ts index 0d807ad..a456c39 100644 --- a/packages/agent/src/tools/browser/wait-behavior.test.ts +++ b/packages/agent/src/tools/session/lib/wait-behavior.test.ts @@ -8,19 +8,19 @@ import { vi, } from 'vitest'; -import { BrowserManager } from './BrowserManager.js'; -import { BrowserSession } from './types.js'; +import { SessionManager } from './SessionManager.js'; +import { Session } from './types.js'; // Set global timeout for all tests in this file vi.setConfig({ testTimeout: 15000 }); describe('Wait Behavior Tests', () => { - let browserManager: BrowserManager; - let session: BrowserSession; + let browserManager: SessionManager; + let session: Session; const baseUrl = 'https://the-internet.herokuapp.com'; beforeAll(async () => { - browserManager = new BrowserManager(); + browserManager = new SessionManager(); session = await browserManager.createSession({ headless: true }); }); diff --git a/packages/agent/src/tools/browser/listBrowsers.ts b/packages/agent/src/tools/session/listSessions.ts similarity index 90% rename from packages/agent/src/tools/browser/listBrowsers.ts rename to packages/agent/src/tools/session/listSessions.ts index a370af7..bb4154e 100644 --- a/packages/agent/src/tools/browser/listBrowsers.ts +++ b/packages/agent/src/tools/session/listSessions.ts @@ -3,7 +3,7 @@ import { zodToJsonSchema } from 'zod-to-json-schema'; import { Tool } from '../../core/types.js'; -import { BrowserSessionStatus } from './browserTracker.js'; +import { SessionStatus } from './SessionTracker.js'; const parameterSchema = z.object({ status: z @@ -36,8 +36,8 @@ const returnSchema = z.object({ type Parameters = z.infer; type ReturnType = z.infer; -export const listBrowsersTool: Tool = { - name: 'listBrowsers', +export const listSessionsTool: Tool = { + name: 'listSessions', description: 'Lists all browser sessions and their status', logPrefix: '🔍', parameters: parameterSchema, @@ -62,8 +62,8 @@ export const listBrowsersTool: Tool = { ? sessions : sessions.filter((session) => { const statusEnum = - status.toUpperCase() as keyof typeof BrowserSessionStatus; - return session.status === BrowserSessionStatus[statusEnum]; + status.toUpperCase() as keyof typeof SessionStatus; + return session.status === SessionStatus[statusEnum]; }); // Format the response diff --git a/packages/agent/src/tools/browser/browseMessage.ts b/packages/agent/src/tools/session/sessionMessage.ts similarity index 92% rename from packages/agent/src/tools/browser/browseMessage.ts rename to packages/agent/src/tools/session/sessionMessage.ts index 7ed3704..7a8ad80 100644 --- a/packages/agent/src/tools/browser/browseMessage.ts +++ b/packages/agent/src/tools/session/sessionMessage.ts @@ -5,13 +5,13 @@ import { Tool } from '../../core/types.js'; import { errorToString } from '../../utils/errorToString.js'; import { sleep } from '../../utils/sleep.js'; -import { BrowserSessionStatus } from './browserTracker.js'; -import { filterPageContent } from './filterPageContent.js'; -import { browserSessions, SelectorType } from './types.js'; +import { filterPageContent } from './lib/filterPageContent.js'; +import { browserSessions, SelectorType } from './lib/types.js'; +import { SessionStatus } from './SessionTracker.js'; // Main parameter schema const parameterSchema = z.object({ - instanceId: z.string().describe('The ID returned by browseStart'), + instanceId: z.string().describe('The ID returned by sessionStart'), actionType: z .enum(['goto', 'click', 'type', 'wait', 'content', 'close']) .describe('Browser action to perform'), @@ -61,8 +61,8 @@ const getSelector = (selector: string, type?: SelectorType): string => { } }; -export const browseMessageTool: Tool = { - name: 'browseMessage', +export const sessionMessageTool: Tool = { + name: 'sessionMessage', logPrefix: '🏄', description: 'Performs actions in an active browser session', parameters: parameterSchema, @@ -189,7 +189,7 @@ export const browseMessageTool: Tool = { // Update browser tracker when browser is explicitly closed browserTracker.updateSessionStatus( instanceId, - BrowserSessionStatus.COMPLETED, + SessionStatus.COMPLETED, { closedExplicitly: true, }, @@ -207,14 +207,10 @@ export const browseMessageTool: Tool = { logger.error('Browser action failed:', { error }); // Update browser tracker with error status if action fails - browserTracker.updateSessionStatus( - instanceId, - BrowserSessionStatus.ERROR, - { - error: errorToString(error), - actionType, - }, - ); + browserTracker.updateSessionStatus(instanceId, SessionStatus.ERROR, { + error: errorToString(error), + actionType, + }); return { status: 'error', diff --git a/packages/agent/src/tools/browser/browseStart.ts b/packages/agent/src/tools/session/sessionStart.ts similarity index 91% rename from packages/agent/src/tools/browser/browseStart.ts rename to packages/agent/src/tools/session/sessionStart.ts index 738b5bf..346454e 100644 --- a/packages/agent/src/tools/browser/browseStart.ts +++ b/packages/agent/src/tools/session/sessionStart.ts @@ -6,9 +6,9 @@ import { Tool } from '../../core/types.js'; import { errorToString } from '../../utils/errorToString.js'; import { sleep } from '../../utils/sleep.js'; -import { BrowserSessionStatus } from './browserTracker.js'; -import { filterPageContent } from './filterPageContent.js'; -import { browserSessions } from './types.js'; +import { filterPageContent } from './lib/filterPageContent.js'; +import { browserSessions } from './lib/types.js'; +import { SessionStatus } from './SessionTracker.js'; const parameterSchema = z.object({ url: z.string().url().optional().describe('Initial URL to navigate to'), @@ -31,8 +31,8 @@ const returnSchema = z.object({ type Parameters = z.infer; type ReturnType = z.infer; -export const browseStartTool: Tool = { - name: 'browseStart', +export const sessionStartTool: Tool = { + name: 'sessionStart', logPrefix: '🏄', description: 'Starts a new browser session with optional initial URL', parameters: parameterSchema, @@ -102,7 +102,7 @@ export const browseStartTool: Tool = { // Update browser tracker when browser disconnects browserTracker.updateSessionStatus( instanceId, - BrowserSessionStatus.TERMINATED, + SessionStatus.TERMINATED, ); }); @@ -147,14 +147,10 @@ export const browseStartTool: Tool = { logger.verbose(`Content length: ${content.length} characters`); // Update browser tracker with running status - browserTracker.updateSessionStatus( - instanceId, - BrowserSessionStatus.RUNNING, - { - url: url || 'about:blank', - contentLength: content.length, - }, - ); + browserTracker.updateSessionStatus(instanceId, SessionStatus.RUNNING, { + url: url || 'about:blank', + contentLength: content.length, + }); return { instanceId, diff --git a/packages/agent/src/tools/system/shellTracker.test.ts b/packages/agent/src/tools/shell/ShellTracker.test.ts similarity index 98% rename from packages/agent/src/tools/system/shellTracker.test.ts rename to packages/agent/src/tools/shell/ShellTracker.test.ts index 9e54e25..2f22be9 100644 --- a/packages/agent/src/tools/system/shellTracker.test.ts +++ b/packages/agent/src/tools/shell/ShellTracker.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { ShellStatus, ShellTracker } from './shellTracker.js'; +import { ShellStatus, ShellTracker } from './ShellTracker.js'; // Mock uuid to return predictable IDs for testing vi.mock('uuid', () => ({ diff --git a/packages/agent/src/tools/system/shellTracker.ts b/packages/agent/src/tools/shell/ShellTracker.ts similarity index 100% rename from packages/agent/src/tools/system/shellTracker.ts rename to packages/agent/src/tools/shell/ShellTracker.ts diff --git a/packages/agent/src/tools/system/listShells.test.ts b/packages/agent/src/tools/shell/listShells.test.ts similarity index 98% rename from packages/agent/src/tools/system/listShells.test.ts rename to packages/agent/src/tools/shell/listShells.test.ts index eeced41..0c7f6b3 100644 --- a/packages/agent/src/tools/system/listShells.test.ts +++ b/packages/agent/src/tools/shell/listShells.test.ts @@ -4,7 +4,7 @@ import { ToolContext } from '../../core/types.js'; import { getMockToolContext } from '../getTools.test.js'; import { listShellsTool } from './listShells.js'; -import { ShellStatus } from './shellTracker.js'; +import { ShellStatus } from './ShellTracker.js'; const toolContext: ToolContext = getMockToolContext(); @@ -110,4 +110,4 @@ describe('listShellsTool', () => { expect(result.shells[0]!.metadata).toBeDefined(); expect(result.shells[0]!.metadata?.error).toBe('Command not found'); }); -}); \ No newline at end of file +}); diff --git a/packages/agent/src/tools/system/listShells.ts b/packages/agent/src/tools/shell/listShells.ts similarity index 98% rename from packages/agent/src/tools/system/listShells.ts rename to packages/agent/src/tools/shell/listShells.ts index d3bb80f..7222dbd 100644 --- a/packages/agent/src/tools/system/listShells.ts +++ b/packages/agent/src/tools/shell/listShells.ts @@ -3,7 +3,7 @@ import { zodToJsonSchema } from 'zod-to-json-schema'; import { Tool } from '../../core/types.js'; -import { ShellStatus } from './shellTracker.js'; +import { ShellStatus } from './ShellTracker.js'; const parameterSchema = z.object({ status: z diff --git a/packages/agent/src/tools/system/shellExecute.test.ts b/packages/agent/src/tools/shell/shellExecute.test.ts similarity index 100% rename from packages/agent/src/tools/system/shellExecute.test.ts rename to packages/agent/src/tools/shell/shellExecute.test.ts diff --git a/packages/agent/src/tools/system/shellExecute.ts b/packages/agent/src/tools/shell/shellExecute.ts similarity index 100% rename from packages/agent/src/tools/system/shellExecute.ts rename to packages/agent/src/tools/shell/shellExecute.ts diff --git a/packages/agent/src/tools/system/shellMessage.test.ts b/packages/agent/src/tools/shell/shellMessage.test.ts similarity index 99% rename from packages/agent/src/tools/system/shellMessage.test.ts rename to packages/agent/src/tools/shell/shellMessage.test.ts index 89c6b7a..8b05219 100644 --- a/packages/agent/src/tools/system/shellMessage.test.ts +++ b/packages/agent/src/tools/shell/shellMessage.test.ts @@ -62,7 +62,9 @@ describe('shellMessageTool', () => { expect(result.completed).toBe(false); // Verify the instance ID is valid - expect(toolContext.shellTracker.processStates.has(testInstanceId)).toBe(true); + expect(toolContext.shellTracker.processStates.has(testInstanceId)).toBe( + true, + ); }); it('should handle nonexistent process', async () => { @@ -277,4 +279,4 @@ describe('shellMessageTool', () => { // Verify process state still exists expect(toolContext.shellTracker.processStates.has(instanceId)).toBe(true); }); -}); \ No newline at end of file +}); diff --git a/packages/agent/src/tools/system/shellMessage.ts b/packages/agent/src/tools/shell/shellMessage.ts similarity index 99% rename from packages/agent/src/tools/system/shellMessage.ts rename to packages/agent/src/tools/shell/shellMessage.ts index df3bcc4..3cf4265 100644 --- a/packages/agent/src/tools/system/shellMessage.ts +++ b/packages/agent/src/tools/shell/shellMessage.ts @@ -4,7 +4,7 @@ import { zodToJsonSchema } from 'zod-to-json-schema'; import { Tool } from '../../core/types.js'; import { sleep } from '../../utils/sleep.js'; -import { ShellStatus } from './shellTracker.js'; +import { ShellStatus } from './ShellTracker.js'; // Define NodeJS signals as an enum export enum NodeSignals { diff --git a/packages/agent/src/tools/system/shellStart.test.ts b/packages/agent/src/tools/shell/shellStart.test.ts similarity index 97% rename from packages/agent/src/tools/system/shellStart.test.ts rename to packages/agent/src/tools/shell/shellStart.test.ts index d12cbe5..49d8c64 100644 --- a/packages/agent/src/tools/system/shellStart.test.ts +++ b/packages/agent/src/tools/shell/shellStart.test.ts @@ -101,7 +101,9 @@ describe('shellStartTool', () => { ); if (asyncResult.mode === 'async') { - expect(toolContext.shellTracker.processStates.has(asyncResult.instanceId)).toBe(true); + expect( + toolContext.shellTracker.processStates.has(asyncResult.instanceId), + ).toBe(true); } }); @@ -120,7 +122,9 @@ describe('shellStartTool', () => { expect(result.instanceId).toBeDefined(); expect(result.error).toBeUndefined(); - const processState = toolContext.shellTracker.processStates.get(result.instanceId); + const processState = toolContext.shellTracker.processStates.get( + result.instanceId, + ); expect(processState).toBeDefined(); if (processState?.process.stdin) { @@ -186,4 +190,4 @@ describe('shellStartTool', () => { expect(processState?.showStdout).toBe(true); } }); -}); \ No newline at end of file +}); diff --git a/packages/agent/src/tools/system/shellStart.ts b/packages/agent/src/tools/shell/shellStart.ts similarity index 98% rename from packages/agent/src/tools/system/shellStart.ts rename to packages/agent/src/tools/shell/shellStart.ts index 37b004a..20ee1cc 100644 --- a/packages/agent/src/tools/system/shellStart.ts +++ b/packages/agent/src/tools/shell/shellStart.ts @@ -7,9 +7,9 @@ import { zodToJsonSchema } from 'zod-to-json-schema'; import { Tool } from '../../core/types.js'; import { errorToString } from '../../utils/errorToString.js'; -import { ShellStatus } from './shellTracker.js'; +import { ShellStatus } from './ShellTracker.js'; -import type { ProcessState } from './shellTracker.js'; +import type { ProcessState } from './ShellTracker.js'; const parameterSchema = z.object({ command: z.string().describe('The shell command to execute'), diff --git a/packages/cli/src/commands/$default.ts b/packages/cli/src/commands/$default.ts index e95647e..760bb06 100644 --- a/packages/cli/src/commands/$default.ts +++ b/packages/cli/src/commands/$default.ts @@ -9,12 +9,12 @@ import { providerConfig, userPrompt, LogLevel, - subAgentTool, + agentExecuteTool, errorToString, DEFAULT_CONFIG, AgentConfig, ModelProvider, - BrowserTracker, + SessionTracker, ShellTracker, AgentTracker, } from 'mycoder-agent'; @@ -47,7 +47,7 @@ export async function executePrompt( const logger = new Logger({ name: 'Default', logLevel: nameToLogIndex(config.logLevel), - customPrefix: subAgentTool.logPrefix, + customPrefix: agentExecuteTool.logPrefix, }); logger.info(`MyCoder v${packageInfo.version} - AI-powered coding assistant`); @@ -185,7 +185,7 @@ export async function executePrompt( temperature: config.temperature, shellTracker: new ShellTracker('mainAgent'), agentTracker: new AgentTracker('mainAgent'), - browserTracker: new BrowserTracker('mainAgent'), + browserTracker: new SessionTracker('mainAgent'), apiKey, }); @@ -246,7 +246,7 @@ export const command: CommandModule = { const logger = new Logger({ name: 'Default', logLevel: nameToLogIndex(config.logLevel), - customPrefix: subAgentTool.logPrefix, + customPrefix: agentExecuteTool.logPrefix, }); logger.error( diff --git a/packages/docs/docs/usage/index.mdx b/packages/docs/docs/usage/index.mdx index 0abc2e7..62adbd1 100644 --- a/packages/docs/docs/usage/index.mdx +++ b/packages/docs/docs/usage/index.mdx @@ -137,16 +137,16 @@ This requires the GitHub CLI (`gh`) to be installed and authenticated. For more MyCoder has access to a variety of tools that enable it to perform complex tasks: -| Tool | Description | Use Case | -| ----------------- | ------------------------------------------------ | ---------------------------------------------------------------- | -| **textEditor** | Views, creates, and edits files with persistence | Reading and modifying project files with advanced capabilities | -| **shellStart** | Executes shell commands | Running builds, tests, installations, git operations | -| **shellMessage** | Interacts with running shell processes | Working with interactive CLIs, monitoring long-running processes | -| **fetch** | Makes HTTP requests | Accessing APIs, downloading resources | -| **browseStart** | Starts a browser session | Researching documentation, exploring solutions | -| **browseMessage** | Performs actions in an active browser | Navigating websites, extracting information | -| **agentStart** | Starts a sub-agent and returns immediately | Creating asynchronous specialized agents for parallel tasks | -| **agentMessage** | Interacts with a running sub-agent | Checking status, providing guidance, or terminating sub-agents | +| Tool | Description | Use Case | +| ------------------ | ------------------------------------------------ | ---------------------------------------------------------------- | +| **textEditor** | Views, creates, and edits files with persistence | Reading and modifying project files with advanced capabilities | +| **shellStart** | Executes shell commands | Running builds, tests, installations, git operations | +| **shellMessage** | Interacts with running shell processes | Working with interactive CLIs, monitoring long-running processes | +| **fetch** | Makes HTTP requests | Accessing APIs, downloading resources | +| **sessionStart** | Starts a browser session | Researching documentation, exploring solutions | +| **sessionMessage** | Performs actions in an active browser | Navigating websites, extracting information | +| **agentStart** | Starts a sub-agent and returns immediately | Creating asynchronous specialized agents for parallel tasks | +| **agentMessage** | Interacts with a running sub-agent | Checking status, providing guidance, or terminating sub-agents | For more detailed information about specific features, check the following pages: