From 2e79933cae969fc61062adb0ed540a3bd56b2279 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Fri, 6 Mar 2026 16:07:14 -0800 Subject: [PATCH] refactor: flatten server agent directory (#435) --- apps/server/package.json | 4 ++-- .../src/agent/{tool-loop => }/ai-sdk-agent.ts | 20 +++++++++---------- .../{tool-loop => }/compaction-prompt.ts | 0 .../src/agent/{tool-loop => }/compaction.ts | 2 +- .../agent/{tool-loop => }/format-message.ts | 0 .../src/agent/{tool-loop => }/mcp-builder.ts | 6 +++--- .../agent/{tool-loop => }/provider-factory.ts | 6 +++--- .../agent/{tool-loop => }/session-store.ts | 2 +- .../src/agent/{tool-loop => }/tool-adapter.ts | 12 +++++------ apps/server/src/api/routes/chat.ts | 2 +- apps/server/src/api/services/chat-service.ts | 6 +++--- .../server/tests/agent/compaction-e2e.test.ts | 2 +- apps/server/tests/agent/compaction.test.ts | 4 ++-- 13 files changed, 33 insertions(+), 33 deletions(-) rename apps/server/src/agent/{tool-loop => }/ai-sdk-agent.ts (88%) rename apps/server/src/agent/{tool-loop => }/compaction-prompt.ts (100%) rename apps/server/src/agent/{tool-loop => }/compaction.ts (99%) rename apps/server/src/agent/{tool-loop => }/format-message.ts (100%) rename apps/server/src/agent/{tool-loop => }/mcp-builder.ts (94%) rename apps/server/src/agent/{tool-loop => }/provider-factory.ts (96%) rename apps/server/src/agent/{tool-loop => }/session-store.ts (96%) rename apps/server/src/agent/{tool-loop => }/tool-adapter.ts (90%) diff --git a/apps/server/package.json b/apps/server/package.json index b82eb154e..aea1bb753 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -22,8 +22,8 @@ "import": "./src/rpc.ts" }, "./agent": { - "types": "./src/agent/tool-loop/ai-sdk-agent.ts", - "default": "./src/agent/tool-loop/ai-sdk-agent.ts" + "types": "./src/agent/ai-sdk-agent.ts", + "default": "./src/agent/ai-sdk-agent.ts" }, "./agent/types": { "types": "./src/agent/types.ts", diff --git a/apps/server/src/agent/tool-loop/ai-sdk-agent.ts b/apps/server/src/agent/ai-sdk-agent.ts similarity index 88% rename from apps/server/src/agent/tool-loop/ai-sdk-agent.ts rename to apps/server/src/agent/ai-sdk-agent.ts index 0fcda41f4..4d83ea7d2 100644 --- a/apps/server/src/agent/tool-loop/ai-sdk-agent.ts +++ b/apps/server/src/agent/ai-sdk-agent.ts @@ -1,20 +1,20 @@ import { AGENT_LIMITS } from '@browseros/shared/constants/limits' import type { BrowserContext } from '@browseros/shared/schemas/browser-context' import { stepCountIs, ToolLoopAgent, type UIMessage } from 'ai' -import type { Browser } from '../../browser/browser' -import type { KlavisClient } from '../../lib/clients/klavis/klavis-client' -import { logger } from '../../lib/logger' -import { isSoulBootstrap, readSoul } from '../../lib/soul' -import { buildFilesystemToolSet } from '../../tools/filesystem/build-toolset' -import { buildMemoryToolSet } from '../../tools/memory/build-toolset' -import type { ToolRegistry } from '../../tools/tool-registry' -import { CHAT_MODE_ALLOWED_TOOLS } from '../chat-mode' -import { buildSystemPrompt } from '../prompt' -import type { ResolvedAgentConfig } from '../types' +import type { Browser } from '../browser/browser' +import type { KlavisClient } from '../lib/clients/klavis/klavis-client' +import { logger } from '../lib/logger' +import { isSoulBootstrap, readSoul } from '../lib/soul' +import { buildFilesystemToolSet } from '../tools/filesystem/build-toolset' +import { buildMemoryToolSet } from '../tools/memory/build-toolset' +import type { ToolRegistry } from '../tools/tool-registry' +import { CHAT_MODE_ALLOWED_TOOLS } from './chat-mode' import { createCompactionPrepareStep } from './compaction' import { buildMcpServerSpecs, createMcpClients } from './mcp-builder' +import { buildSystemPrompt } from './prompt' import { createLanguageModel } from './provider-factory' import { buildBrowserToolSet } from './tool-adapter' +import type { ResolvedAgentConfig } from './types' export interface AiSdkAgentConfig { resolvedConfig: ResolvedAgentConfig diff --git a/apps/server/src/agent/tool-loop/compaction-prompt.ts b/apps/server/src/agent/compaction-prompt.ts similarity index 100% rename from apps/server/src/agent/tool-loop/compaction-prompt.ts rename to apps/server/src/agent/compaction-prompt.ts diff --git a/apps/server/src/agent/tool-loop/compaction.ts b/apps/server/src/agent/compaction.ts similarity index 99% rename from apps/server/src/agent/tool-loop/compaction.ts rename to apps/server/src/agent/compaction.ts index f52a9662a..effdee499 100644 --- a/apps/server/src/agent/tool-loop/compaction.ts +++ b/apps/server/src/agent/compaction.ts @@ -1,6 +1,6 @@ import { AGENT_LIMITS } from '@browseros/shared/constants/limits' import { type LanguageModel, type ModelMessage, streamText } from 'ai' -import { logger } from '../../lib/logger' +import { logger } from '../lib/logger' import { buildSummarizationPrompt, buildSummarizationSystemPrompt, diff --git a/apps/server/src/agent/tool-loop/format-message.ts b/apps/server/src/agent/format-message.ts similarity index 100% rename from apps/server/src/agent/tool-loop/format-message.ts rename to apps/server/src/agent/format-message.ts diff --git a/apps/server/src/agent/tool-loop/mcp-builder.ts b/apps/server/src/agent/mcp-builder.ts similarity index 94% rename from apps/server/src/agent/tool-loop/mcp-builder.ts rename to apps/server/src/agent/mcp-builder.ts index d8eec2831..3c4c25783 100644 --- a/apps/server/src/agent/tool-loop/mcp-builder.ts +++ b/apps/server/src/agent/mcp-builder.ts @@ -1,12 +1,12 @@ import { createMCPClient } from '@ai-sdk/mcp' import type { BrowserContext } from '@browseros/shared/schemas/browser-context' import type { ToolSet } from 'ai' -import type { KlavisClient } from '../../lib/clients/klavis/klavis-client' -import { logger } from '../../lib/logger' +import type { KlavisClient } from '../lib/clients/klavis/klavis-client' +import { logger } from '../lib/logger' import { detectMcpTransport, type McpTransportType, -} from '../../lib/mcp-transport-detect' +} from '../lib/mcp-transport-detect' export interface McpServerSpec { name: string diff --git a/apps/server/src/agent/tool-loop/provider-factory.ts b/apps/server/src/agent/provider-factory.ts similarity index 96% rename from apps/server/src/agent/tool-loop/provider-factory.ts rename to apps/server/src/agent/provider-factory.ts index 1fdbc8b09..7b78a903b 100644 --- a/apps/server/src/agent/tool-loop/provider-factory.ts +++ b/apps/server/src/agent/provider-factory.ts @@ -7,9 +7,9 @@ import { createOpenAICompatible } from '@ai-sdk/openai-compatible' import { LLM_PROVIDERS } from '@browseros/shared/schemas/llm' import { createOpenRouter } from '@openrouter/ai-sdk-provider' import type { LanguageModel } from 'ai' -import { logger } from '../../lib/logger' -import { createOpenRouterCompatibleFetch } from '../../lib/openrouter-fetch' -import type { ResolvedAgentConfig } from '../types' +import { logger } from '../lib/logger' +import { createOpenRouterCompatibleFetch } from '../lib/openrouter-fetch' +import type { ResolvedAgentConfig } from './types' type ProviderFactory = ( config: ResolvedAgentConfig, diff --git a/apps/server/src/agent/tool-loop/session-store.ts b/apps/server/src/agent/session-store.ts similarity index 96% rename from apps/server/src/agent/tool-loop/session-store.ts rename to apps/server/src/agent/session-store.ts index e3000da69..2e826f99f 100644 --- a/apps/server/src/agent/tool-loop/session-store.ts +++ b/apps/server/src/agent/session-store.ts @@ -1,5 +1,5 @@ import type { BrowserContext } from '@browseros/shared/schemas/browser-context' -import { logger } from '../../lib/logger' +import { logger } from '../lib/logger' import type { AiSdkAgent } from './ai-sdk-agent' export interface AgentSession { diff --git a/apps/server/src/agent/tool-loop/tool-adapter.ts b/apps/server/src/agent/tool-adapter.ts similarity index 90% rename from apps/server/src/agent/tool-loop/tool-adapter.ts rename to apps/server/src/agent/tool-adapter.ts index 82567c06f..45d04f4f8 100644 --- a/apps/server/src/agent/tool-loop/tool-adapter.ts +++ b/apps/server/src/agent/tool-adapter.ts @@ -1,11 +1,11 @@ import type { LanguageModelV2ToolResultOutput } from '@ai-sdk/provider' import { type ToolSet, tool } from 'ai' -import type { Browser } from '../../browser/browser' -import { logger } from '../../lib/logger' -import { metrics } from '../../lib/metrics' -import { executeTool } from '../../tools/framework' -import type { ContentItem } from '../../tools/response' -import type { ToolRegistry } from '../../tools/tool-registry' +import type { Browser } from '../browser/browser' +import { logger } from '../lib/logger' +import { metrics } from '../lib/metrics' +import { executeTool } from '../tools/framework' +import type { ContentItem } from '../tools/response' +import type { ToolRegistry } from '../tools/tool-registry' function contentToModelOutput( content: ContentItem[], diff --git a/apps/server/src/api/routes/chat.ts b/apps/server/src/api/routes/chat.ts index 4ae5bd005..64dc98b2e 100644 --- a/apps/server/src/api/routes/chat.ts +++ b/apps/server/src/api/routes/chat.ts @@ -1,7 +1,7 @@ import { PATHS } from '@browseros/shared/constants/paths' import { zValidator } from '@hono/zod-validator' import { Hono } from 'hono' -import { SessionStore } from '../../agent/tool-loop/session-store' +import { SessionStore } from '../../agent/session-store' import type { Browser } from '../../browser/browser' import { KlavisClient } from '../../lib/clients/klavis/klavis-client' import { logger } from '../../lib/logger' diff --git a/apps/server/src/api/services/chat-service.ts b/apps/server/src/api/services/chat-service.ts index 2cf07a1d0..bfefa3f52 100644 --- a/apps/server/src/api/services/chat-service.ts +++ b/apps/server/src/api/services/chat-service.ts @@ -7,9 +7,9 @@ import { mkdir } from 'node:fs/promises' import path from 'node:path' import { createAgentUIStreamResponse, type UIMessage } from 'ai' -import { AiSdkAgent } from '../../agent/tool-loop/ai-sdk-agent' -import { formatUserMessage } from '../../agent/tool-loop/format-message' -import type { SessionStore } from '../../agent/tool-loop/session-store' +import { AiSdkAgent } from '../../agent/ai-sdk-agent' +import { formatUserMessage } from '../../agent/format-message' +import type { SessionStore } from '../../agent/session-store' import type { ResolvedAgentConfig } from '../../agent/types' import type { Browser } from '../../browser/browser' import type { KlavisClient } from '../../lib/clients/klavis/klavis-client' diff --git a/apps/server/tests/agent/compaction-e2e.test.ts b/apps/server/tests/agent/compaction-e2e.test.ts index f13729648..e124d0457 100644 --- a/apps/server/tests/agent/compaction-e2e.test.ts +++ b/apps/server/tests/agent/compaction-e2e.test.ts @@ -12,7 +12,7 @@ import { type CompactionState, computeConfig, createCompactionPrepareStep, -} from '../../src/agent/tool-loop/compaction' +} from '../../src/agent/compaction' // --------------------------------------------------------------------------- // Test infrastructure diff --git a/apps/server/tests/agent/compaction.test.ts b/apps/server/tests/agent/compaction.test.ts index f1a16c335..d5d2126d5 100644 --- a/apps/server/tests/agent/compaction.test.ts +++ b/apps/server/tests/agent/compaction.test.ts @@ -6,12 +6,12 @@ import { findSafeSplitPoint, slidingWindow, truncateToolOutputs, -} from '../../src/agent/tool-loop/compaction' +} from '../../src/agent/compaction' import { buildSummarizationPrompt, buildTurnPrefixPrompt, messagesToTranscript, -} from '../../src/agent/tool-loop/compaction-prompt' +} from '../../src/agent/compaction-prompt' // --------------------------------------------------------------------------- // Helpers