diff --git a/apps/server/src/agent/agent/gemini-agent.ts b/apps/server/src/agent/gemini-agent.ts similarity index 95% rename from apps/server/src/agent/agent/gemini-agent.ts rename to apps/server/src/agent/gemini-agent.ts index 63b079c2a..ca649a2c6 100644 --- a/apps/server/src/agent/agent/gemini-agent.ts +++ b/apps/server/src/agent/gemini-agent.ts @@ -15,14 +15,14 @@ import { type ToolCallRequestInfo, } from '@google/gemini-cli-core' import type { Content, Part } from '@google/genai' -import { logger } from '../../common/logger' -import { Sentry } from '../../common/sentry/instrument' -import type { BrowserContext } from '../../http/types' -import { AgentExecutionError } from '../errors' -import { buildSystemPrompt } from './gemini-agent.prompt' -import { VercelAIContentGenerator } from './gemini-vercel-sdk-adapter/index' -import type { HonoSSEStream } from './gemini-vercel-sdk-adapter/types' -import { UIMessageStreamWriter } from './gemini-vercel-sdk-adapter/ui-message-stream' +import type { BrowserContext } from '../api/types' +import { logger } from '../lib/logger' +import { Sentry } from '../lib/sentry' +import { AgentExecutionError } from './errors' +import { buildSystemPrompt } from './prompt' +import { VercelAIContentGenerator } from './provider-adapter/index' +import type { HonoSSEStream } from './provider-adapter/types' +import { UIMessageStreamWriter } from './provider-adapter/ui-message-stream' import type { ResolvedAgentConfig } from './types' interface ToolExecutionResult { diff --git a/apps/server/src/agent/agent/gemini-agent.prompt.ts b/apps/server/src/agent/prompt.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-agent.prompt.ts rename to apps/server/src/agent/prompt.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/base.ts b/apps/server/src/agent/provider-adapter/adapters/base.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/base.ts rename to apps/server/src/agent/provider-adapter/adapters/base.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/factory.ts b/apps/server/src/agent/provider-adapter/adapters/factory.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/factory.ts rename to apps/server/src/agent/provider-adapter/adapters/factory.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/google.ts b/apps/server/src/agent/provider-adapter/adapters/google.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/google.ts rename to apps/server/src/agent/provider-adapter/adapters/google.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/openrouter.ts b/apps/server/src/agent/provider-adapter/adapters/openrouter.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/openrouter.ts rename to apps/server/src/agent/provider-adapter/adapters/openrouter.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/types.ts b/apps/server/src/agent/provider-adapter/adapters/types.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/adapters/types.ts rename to apps/server/src/agent/provider-adapter/adapters/types.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/errors.ts b/apps/server/src/agent/provider-adapter/errors.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/errors.ts rename to apps/server/src/agent/provider-adapter/errors.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/index.ts b/apps/server/src/agent/provider-adapter/index.ts similarity index 99% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/index.ts rename to apps/server/src/agent/provider-adapter/index.ts index 2344db0d6..1285eff76 100644 --- a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/index.ts +++ b/apps/server/src/agent/provider-adapter/index.ts @@ -26,7 +26,7 @@ import type { } from '@google/genai' import { createOpenRouter } from '@openrouter/ai-sdk-provider' import { generateText, streamText } from 'ai' -import { logger } from '../../../common/logger' +import { logger } from '../../lib/logger' import type { ProviderAdapter } from './adapters/base' import { createProviderAdapter } from './adapters/factory' import { MessageConversionStrategy } from './strategies/message' diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/message.test.ts b/apps/server/src/agent/provider-adapter/strategies/message.test.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/message.test.ts rename to apps/server/src/agent/provider-adapter/strategies/message.test.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/message.ts b/apps/server/src/agent/provider-adapter/strategies/message.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/message.ts rename to apps/server/src/agent/provider-adapter/strategies/message.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/response.test.ts b/apps/server/src/agent/provider-adapter/strategies/response.test.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/response.test.ts rename to apps/server/src/agent/provider-adapter/strategies/response.test.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/response.ts b/apps/server/src/agent/provider-adapter/strategies/response.ts similarity index 99% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/response.ts rename to apps/server/src/agent/provider-adapter/strategies/response.ts index 64fcb938f..8b4443d3a 100644 --- a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/response.ts +++ b/apps/server/src/agent/provider-adapter/strategies/response.ts @@ -16,7 +16,7 @@ import { type GenerateContentResponse, type Part, } from '@google/genai' -import { Sentry } from '../../../../common/sentry/instrument' +import { Sentry } from '../../../lib/sentry' import type { ProviderAdapter } from '../adapters/base' import type { ProviderMetadata } from '../adapters/types' diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/tool.test.ts b/apps/server/src/agent/provider-adapter/strategies/tool.test.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/tool.test.ts rename to apps/server/src/agent/provider-adapter/strategies/tool.test.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/tool.ts b/apps/server/src/agent/provider-adapter/strategies/tool.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/strategies/tool.ts rename to apps/server/src/agent/provider-adapter/strategies/tool.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/test-provider.ts b/apps/server/src/agent/provider-adapter/test-provider.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/test-provider.ts rename to apps/server/src/agent/provider-adapter/test-provider.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/types.ts b/apps/server/src/agent/provider-adapter/types.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/types.ts rename to apps/server/src/agent/provider-adapter/types.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/ui-message-stream.ts b/apps/server/src/agent/provider-adapter/ui-message-stream.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/ui-message-stream.ts rename to apps/server/src/agent/provider-adapter/ui-message-stream.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/utils/fetch.ts b/apps/server/src/agent/provider-adapter/utils/fetch.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/utils/fetch.ts rename to apps/server/src/agent/provider-adapter/utils/fetch.ts diff --git a/apps/server/src/agent/agent/gemini-vercel-sdk-adapter/utils/type-guards.ts b/apps/server/src/agent/provider-adapter/utils/type-guards.ts similarity index 100% rename from apps/server/src/agent/agent/gemini-vercel-sdk-adapter/utils/type-guards.ts rename to apps/server/src/agent/provider-adapter/utils/type-guards.ts diff --git a/apps/server/src/agent/session/session-manager.ts b/apps/server/src/agent/session.ts similarity index 89% rename from apps/server/src/agent/session/session-manager.ts rename to apps/server/src/agent/session.ts index 9616a8c60..e372aa8c9 100644 --- a/apps/server/src/agent/session/session-manager.ts +++ b/apps/server/src/agent/session.ts @@ -4,10 +4,10 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ import type { MCPServerConfig } from '@google/gemini-cli-core' -import { logger } from '../../common/logger' +import { logger } from '../lib/logger' -import { GeminiAgent } from '../agent/gemini-agent' -import type { ResolvedAgentConfig } from '../agent/types' +import { GeminiAgent } from './gemini-agent' +import type { ResolvedAgentConfig } from './types' export class SessionManager { private sessions = new Map() diff --git a/apps/server/src/agent/agent/types.ts b/apps/server/src/agent/types.ts similarity index 90% rename from apps/server/src/agent/agent/types.ts rename to apps/server/src/agent/types.ts index 7cf141ab2..c2411d16b 100644 --- a/apps/server/src/agent/agent/types.ts +++ b/apps/server/src/agent/types.ts @@ -6,9 +6,9 @@ import type { LLMProvider } from '@browseros/shared/schemas/llm' import { z } from 'zod' -import { CustomMcpServerSchema } from '../../http/types' +import { CustomMcpServerSchema } from '../api/types' -import { VercelAIConfigSchema } from './gemini-vercel-sdk-adapter/types' +import { VercelAIConfigSchema } from './provider-adapter/types' export interface ProviderConfig { provider: LLMProvider diff --git a/apps/server/src/http/middleware/browseros-rate-limit.ts b/apps/server/src/api/middleware/rate-limit.ts similarity index 93% rename from apps/server/src/http/middleware/browseros-rate-limit.ts rename to apps/server/src/api/middleware/rate-limit.ts index 0fc3397f0..a8481037b 100644 --- a/apps/server/src/http/middleware/browseros-rate-limit.ts +++ b/apps/server/src/api/middleware/rate-limit.ts @@ -6,7 +6,7 @@ import { LLM_PROVIDERS } from '@browseros/shared/schemas/llm' import { createMiddleware } from 'hono/factory' -import type { RateLimiter } from '../../agent/rate-limiter/rate-limiter' +import type { RateLimiter } from '../../lib/rate-limiter/rate-limiter' import type { ChatRequest } from '../types' interface RateLimitMiddlewareDeps { diff --git a/apps/server/src/http/routes/chat.ts b/apps/server/src/api/routes/chat.ts similarity index 90% rename from apps/server/src/http/routes/chat.ts rename to apps/server/src/api/routes/chat.ts index 9cc9d67d7..f41364812 100644 --- a/apps/server/src/http/routes/chat.ts +++ b/apps/server/src/api/routes/chat.ts @@ -8,13 +8,13 @@ import { PATHS } from '@browseros/shared/constants/paths' import { zValidator } from '@hono/zod-validator' import { Hono } from 'hono' import { stream } from 'hono/streaming' -import { KlavisClient } from '../../agent/klavis/klavis-client' -import type { RateLimiter } from '../../agent/rate-limiter/rate-limiter' -import { SessionManager } from '../../agent/session/session-manager' -import { logger } from '../../common/logger' -import { metrics } from '../../common/metrics' -import { Sentry } from '../../common/sentry/instrument' -import { createBrowserosRateLimitMiddleware } from '../middleware/browseros-rate-limit' +import { SessionManager } from '../../agent/session' +import { KlavisClient } from '../../lib/clients/klavis/klavis-client' +import { logger } from '../../lib/logger' +import { metrics } from '../../lib/metrics' +import type { RateLimiter } from '../../lib/rate-limiter/rate-limiter' +import { Sentry } from '../../lib/sentry' +import { createBrowserosRateLimitMiddleware } from '../middleware/rate-limit' import { ChatService } from '../services/chat-service' import { ChatRequestSchema } from '../types' import { ConversationIdParamSchema } from '../utils/validation' diff --git a/apps/server/src/http/routes/extension-status.ts b/apps/server/src/api/routes/extension-status.ts similarity index 84% rename from apps/server/src/http/routes/extension-status.ts rename to apps/server/src/api/routes/extension-status.ts index 1168a6c64..01a8a89cd 100644 --- a/apps/server/src/http/routes/extension-status.ts +++ b/apps/server/src/api/routes/extension-status.ts @@ -5,7 +5,7 @@ */ import { Hono } from 'hono' -import type { ControllerContext } from '../../controller-server/controller-context' +import type { ControllerContext } from '../../browser/extension/context' interface ExtensionStatusDeps { controllerContext: ControllerContext diff --git a/apps/server/src/http/routes/graph.ts b/apps/server/src/api/routes/graph.ts similarity index 98% rename from apps/server/src/http/routes/graph.ts rename to apps/server/src/api/routes/graph.ts index 201e1a25c..642909162 100644 --- a/apps/server/src/http/routes/graph.ts +++ b/apps/server/src/api/routes/graph.ts @@ -13,8 +13,8 @@ import { formatUIMessageStreamDone, formatUIMessageStreamEvent, UIMessageStreamWriter, -} from '../../agent/agent/gemini-vercel-sdk-adapter/ui-message-stream' -import { logger } from '../../common/logger' +} from '../../agent/provider-adapter/ui-message-stream' +import { logger } from '../../lib/logger' import { GraphService } from '../services/graph-service' import { CreateGraphRequestSchema, diff --git a/apps/server/src/http/routes/health.ts b/apps/server/src/api/routes/health.ts similarity index 100% rename from apps/server/src/http/routes/health.ts rename to apps/server/src/api/routes/health.ts diff --git a/apps/server/src/http/routes/klavis.ts b/apps/server/src/api/routes/klavis.ts similarity index 95% rename from apps/server/src/http/routes/klavis.ts rename to apps/server/src/api/routes/klavis.ts index 61d3913e1..a0385ce39 100644 --- a/apps/server/src/http/routes/klavis.ts +++ b/apps/server/src/api/routes/klavis.ts @@ -7,9 +7,9 @@ import { zValidator } from '@hono/zod-validator' import { Hono } from 'hono' import { z } from 'zod' -import { KlavisClient } from '../../agent/klavis/klavis-client' -import { OAUTH_MCP_SERVERS } from '../../agent/klavis/oauth-mcp-servers' -import { logger } from '../../common/logger' +import { KlavisClient } from '../../lib/clients/klavis/klavis-client' +import { OAUTH_MCP_SERVERS } from '../../lib/clients/klavis/oauth-mcp-servers' +import { logger } from '../../lib/logger' const ServerNameSchema = z.object({ serverName: z.string().min(1), diff --git a/apps/server/src/http/routes/mcp.ts b/apps/server/src/api/routes/mcp.ts similarity index 94% rename from apps/server/src/http/routes/mcp.ts rename to apps/server/src/api/routes/mcp.ts index 5df73278a..5c58055f4 100644 --- a/apps/server/src/http/routes/mcp.ts +++ b/apps/server/src/api/routes/mcp.ts @@ -10,12 +10,12 @@ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js' import { SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js' import { Hono } from 'hono' import type { z } from 'zod' -import { logger } from '../../common/logger' -import type { McpContext } from '../../common/mcp-context' -import { metrics } from '../../common/metrics' -import type { Mutex } from '../../common/mutex' -import { Sentry } from '../../common/sentry/instrument' -import type { ControllerContext } from '../../controller-server/controller-context' +import type { McpContext } from '../../browser/cdp/context' +import type { ControllerContext } from '../../browser/extension/context' +import { logger } from '../../lib/logger' +import { metrics } from '../../lib/metrics' +import type { Mutex } from '../../lib/mutex' +import { Sentry } from '../../lib/sentry' import { McpResponse } from '../../tools/response/mcp-response' import type { ToolDefinition } from '../../tools/types/tool-definition' import type { Env } from '../types' diff --git a/apps/server/src/http/routes/provider.ts b/apps/server/src/api/routes/provider.ts similarity index 77% rename from apps/server/src/http/routes/provider.ts rename to apps/server/src/api/routes/provider.ts index 1698a87bb..362c77c3e 100644 --- a/apps/server/src/http/routes/provider.ts +++ b/apps/server/src/api/routes/provider.ts @@ -6,9 +6,9 @@ import { zValidator } from '@hono/zod-validator' import { Hono } from 'hono' -import { testProviderConnection } from '../../agent/agent/gemini-vercel-sdk-adapter/test-provider' -import { VercelAIConfigSchema } from '../../agent/agent/gemini-vercel-sdk-adapter/types' -import { logger } from '../../common/logger' +import { testProviderConnection } from '../../agent/provider-adapter/test-provider' +import { VercelAIConfigSchema } from '../../agent/provider-adapter/types' +import { logger } from '../../lib/logger' export function createProviderRoutes() { return new Hono().post( diff --git a/apps/server/src/http/routes/sdk.ts b/apps/server/src/api/routes/sdk.ts similarity index 98% rename from apps/server/src/http/routes/sdk.ts rename to apps/server/src/api/routes/sdk.ts index 3a98e4b85..1eb76eaf5 100644 --- a/apps/server/src/http/routes/sdk.ts +++ b/apps/server/src/api/routes/sdk.ts @@ -14,8 +14,8 @@ import { formatUIMessageStreamDone, formatUIMessageStreamEvent, UIMessageStreamWriter, -} from '../../agent/agent/gemini-vercel-sdk-adapter/ui-message-stream' -import { logger } from '../../common/logger' +} from '../../agent/provider-adapter/ui-message-stream' +import { logger } from '../../lib/logger' import { BrowserService } from '../services/sdk/browser' import { ChatService } from '../services/sdk/chat' import { ExtractService } from '../services/sdk/extract' diff --git a/apps/server/src/http/server.ts b/apps/server/src/api/server.ts similarity index 97% rename from apps/server/src/http/server.ts rename to apps/server/src/api/server.ts index 4963604f6..801befe64 100644 --- a/apps/server/src/http/server.ts +++ b/apps/server/src/api/server.ts @@ -14,8 +14,8 @@ import { Hono } from 'hono' import { cors } from 'hono/cors' import type { ContentfulStatusCode } from 'hono/utils/http-status' import { HttpAgentError } from '../agent/errors' -import { logger } from '../common/logger' -import { bindPortWithRetry } from '../common/port-binding' +import { logger } from '../lib/logger' +import { bindPortWithRetry } from '../lib/port-binding' import { createChatRoutes } from './routes/chat' import { createExtensionStatusRoute } from './routes/extension-status' import { createGraphRoutes } from './routes/graph' diff --git a/apps/server/src/http/services/chat-service.ts b/apps/server/src/api/services/chat-service.ts similarity index 93% rename from apps/server/src/http/services/chat-service.ts rename to apps/server/src/api/services/chat-service.ts index 8d5f20234..2de4f995f 100644 --- a/apps/server/src/http/services/chat-service.ts +++ b/apps/server/src/api/services/chat-service.ts @@ -6,18 +6,15 @@ import { LLM_PROVIDERS } from '@browseros/shared/schemas/llm' import { MCPServerConfig } from '@google/gemini-cli-core' -import type { HonoSSEStream } from '../../agent/agent/gemini-vercel-sdk-adapter/types' -import type { - ProviderConfig, - ResolvedAgentConfig, -} from '../../agent/agent/types' -import type { KlavisClient } from '../../agent/klavis/klavis-client' -import type { SessionManager } from '../../agent/session/session-manager' +import type { HonoSSEStream } from '../../agent/provider-adapter/types' +import type { SessionManager } from '../../agent/session' +import type { ProviderConfig, ResolvedAgentConfig } from '../../agent/types' import { fetchBrowserOSConfig, getLLMConfigFromProvider, -} from '../../common/gateway' -import { logger } from '../../common/logger' +} from '../../lib/clients/gateway' +import type { KlavisClient } from '../../lib/clients/klavis/klavis-client' +import { logger } from '../../lib/logger' import type { BrowserContext, ChatRequest } from '../types' interface McpHttpServerOptions { diff --git a/apps/server/src/http/services/graph-service.ts b/apps/server/src/api/services/graph-service.ts similarity index 99% rename from apps/server/src/http/services/graph-service.ts rename to apps/server/src/api/services/graph-service.ts index 2103d16de..9e6365d61 100644 --- a/apps/server/src/http/services/graph-service.ts +++ b/apps/server/src/api/services/graph-service.ts @@ -6,8 +6,8 @@ import type { LLMConfig, UIMessageStreamEvent } from '@browseros-ai/agent-sdk' import { createParser, type EventSourceMessage } from 'eventsource-parser' -import { logger } from '../../common/logger' import { cleanupExecution, executeGraph } from '../../graph/executor' +import { logger } from '../../lib/logger' import { CodegenGetResponseSchema, type CodegenSSEEvent, diff --git a/apps/server/src/http/services/sdk/browser.ts b/apps/server/src/api/services/sdk/browser.ts similarity index 100% rename from apps/server/src/http/services/sdk/browser.ts rename to apps/server/src/api/services/sdk/browser.ts diff --git a/apps/server/src/http/services/sdk/chat.ts b/apps/server/src/api/services/sdk/chat.ts similarity index 97% rename from apps/server/src/http/services/sdk/chat.ts rename to apps/server/src/api/services/sdk/chat.ts index 5f9be225b..df4f7c170 100644 --- a/apps/server/src/http/services/sdk/chat.ts +++ b/apps/server/src/api/services/sdk/chat.ts @@ -8,7 +8,7 @@ import type { LLMConfig } from '@browseros/shared/schemas/llm' import { createParser, type EventSourceMessage } from 'eventsource-parser' -import type { UIMessageStreamEvent } from '../../../agent/agent/gemini-vercel-sdk-adapter/ui-message-stream' +import type { UIMessageStreamEvent } from '../../../agent/provider-adapter/ui-message-stream' import { SdkError } from './types' export interface ExecuteActionOptions { diff --git a/apps/server/src/http/services/sdk/extract.ts b/apps/server/src/api/services/sdk/extract.ts similarity index 100% rename from apps/server/src/http/services/sdk/extract.ts rename to apps/server/src/api/services/sdk/extract.ts diff --git a/apps/server/src/http/services/sdk/types.ts b/apps/server/src/api/services/sdk/types.ts similarity index 100% rename from apps/server/src/http/services/sdk/types.ts rename to apps/server/src/api/services/sdk/types.ts diff --git a/apps/server/src/http/services/sdk/verify.ts b/apps/server/src/api/services/sdk/verify.ts similarity index 96% rename from apps/server/src/http/services/sdk/verify.ts rename to apps/server/src/api/services/sdk/verify.ts index d7c0aae04..f4a2dfbf6 100644 --- a/apps/server/src/http/services/sdk/verify.ts +++ b/apps/server/src/api/services/sdk/verify.ts @@ -8,7 +8,7 @@ import type { LLMConfig } from '@browseros/shared/schemas/llm' import type { ModelMessage } from 'ai' -import { LLMClient } from '../../../agent/llm/client' +import { LLMClient } from '../../../lib/clients/llm/client' import type { Screenshot } from './types' export interface VerifyOptions { diff --git a/apps/server/src/http/types.ts b/apps/server/src/api/types.ts similarity index 94% rename from apps/server/src/http/types.ts rename to apps/server/src/api/types.ts index e95fc0427..0d808c36f 100644 --- a/apps/server/src/http/types.ts +++ b/apps/server/src/api/types.ts @@ -6,11 +6,11 @@ import { LLM_PROVIDERS } from '@browseros/shared/schemas/llm' import { z } from 'zod' -import { VercelAIConfigSchema } from '../agent/agent/gemini-vercel-sdk-adapter/types' -import type { RateLimiter } from '../agent/rate-limiter/rate-limiter' -import type { McpContext } from '../common/mcp-context' -import type { Mutex } from '../common/mutex' -import type { ControllerContext } from '../controller-server/controller-context' +import { VercelAIConfigSchema } from '../agent/provider-adapter/types' +import type { McpContext } from '../browser/cdp/context' +import type { ControllerContext } from '../browser/extension/context' +import type { Mutex } from '../lib/mutex' +import type { RateLimiter } from '../lib/rate-limiter/rate-limiter' import type { ToolDefinition } from '../tools/types/tool-definition' // Chat request schemas (moved from agent/http/types.ts) diff --git a/apps/server/src/http/utils/cors.ts b/apps/server/src/api/utils/cors.ts similarity index 100% rename from apps/server/src/http/utils/cors.ts rename to apps/server/src/api/utils/cors.ts diff --git a/apps/server/src/http/utils/mcp-client.ts b/apps/server/src/api/utils/mcp-client.ts similarity index 100% rename from apps/server/src/http/utils/mcp-client.ts rename to apps/server/src/api/utils/mcp-client.ts diff --git a/apps/server/src/http/utils/security.ts b/apps/server/src/api/utils/security.ts similarity index 100% rename from apps/server/src/http/utils/security.ts rename to apps/server/src/api/utils/security.ts diff --git a/apps/server/src/http/utils/validation.ts b/apps/server/src/api/utils/validation.ts similarity index 100% rename from apps/server/src/http/utils/validation.ts rename to apps/server/src/api/utils/validation.ts diff --git a/apps/server/src/common/browser.ts b/apps/server/src/browser/cdp/connection.ts similarity index 100% rename from apps/server/src/common/browser.ts rename to apps/server/src/browser/cdp/connection.ts diff --git a/apps/server/src/common/mcp-context.ts b/apps/server/src/browser/cdp/context.ts similarity index 99% rename from apps/server/src/common/mcp-context.ts rename to apps/server/src/browser/cdp/context.ts index 905b16400..aa8f73b95 100644 --- a/apps/server/src/common/mcp-context.ts +++ b/apps/server/src/browser/cdp/context.ts @@ -17,11 +17,11 @@ import type { SerializedAXNode, } from 'puppeteer-core' -import type { Logger } from './logger' +import type { Logger } from '../../lib/logger' +import { WaitForHelper } from '../../lib/wait-for-helper' import { NetworkCollector, PageCollector } from './page-collector' // These will be injected from tools package import type { TraceResult } from './types' -import { WaitForHelper } from './wait-for-helper' export interface TextSnapshotNode extends SerializedAXNode { id: string diff --git a/apps/server/src/common/page-collector.ts b/apps/server/src/browser/cdp/page-collector.ts similarity index 100% rename from apps/server/src/common/page-collector.ts rename to apps/server/src/browser/cdp/page-collector.ts diff --git a/apps/server/src/common/types.ts b/apps/server/src/browser/cdp/types.ts similarity index 100% rename from apps/server/src/common/types.ts rename to apps/server/src/browser/cdp/types.ts diff --git a/apps/server/src/controller-server/controller-bridge.ts b/apps/server/src/browser/extension/bridge.ts similarity index 99% rename from apps/server/src/controller-server/controller-bridge.ts rename to apps/server/src/browser/extension/bridge.ts index 6b5c0d88e..2034c7ee7 100644 --- a/apps/server/src/controller-server/controller-bridge.ts +++ b/apps/server/src/browser/extension/bridge.ts @@ -6,7 +6,7 @@ import { TIMEOUTS } from '@browseros/shared/constants/timeouts' import type { WebSocket } from 'ws' import { WebSocketServer } from 'ws' -import type { Logger } from '../common/logger' +import type { Logger } from '../../lib/logger' interface ControllerRequest { id: string diff --git a/apps/server/src/controller-server/controller-context.ts b/apps/server/src/browser/extension/context.ts similarity index 79% rename from apps/server/src/controller-server/controller-context.ts rename to apps/server/src/browser/extension/context.ts index 5bfa85d00..b05a8de14 100644 --- a/apps/server/src/controller-server/controller-context.ts +++ b/apps/server/src/browser/extension/context.ts @@ -4,9 +4,9 @@ */ import { TIMEOUTS } from '@browseros/shared/constants/timeouts' -import type { Context } from '../tools/controller-based/types/context' +import type { Context } from '../../tools/controller-based/types/context' -import type { ControllerBridge } from './controller-bridge' +import type { ControllerBridge } from './bridge' export class ControllerContext implements Context { constructor(private controllerBridge: ControllerBridge) {} diff --git a/apps/server/src/graph/executor.ts b/apps/server/src/graph/executor.ts index da5302007..e6b887788 100644 --- a/apps/server/src/graph/executor.ts +++ b/apps/server/src/graph/executor.ts @@ -8,7 +8,7 @@ import { mkdir, rm } from 'node:fs/promises' import path from 'node:path' import type { LLMConfig, UIMessageStreamEvent } from '@browseros-ai/agent-sdk' import { Agent } from '@browseros-ai/agent-sdk' -import { logger } from '../common/logger' +import { logger } from '../lib/logger' export interface ExecutorOptions { serverUrl: string diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index e934d5ee9..9986cd2cd 100755 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -16,10 +16,10 @@ if (typeof Bun === 'undefined') { } // Import polyfills first -import './common/polyfill' +import './lib/polyfill' import { CommanderError } from 'commander' -import { Sentry } from './common/sentry/instrument' import { loadServerConfig } from './config' +import { Sentry } from './lib/sentry' import { Application } from './main' const configResult = loadServerConfig() diff --git a/apps/server/src/common/gateway.ts b/apps/server/src/lib/clients/gateway.ts similarity index 98% rename from apps/server/src/common/gateway.ts rename to apps/server/src/lib/clients/gateway.ts index 6d069dafd..b7e0d85d5 100644 --- a/apps/server/src/common/gateway.ts +++ b/apps/server/src/lib/clients/gateway.ts @@ -3,7 +3,7 @@ * Copyright 2025 BrowserOS */ -import { logger } from './logger' +import { logger } from '../logger' export interface Provider { name: string diff --git a/apps/server/src/agent/klavis/klavis-client.ts b/apps/server/src/lib/clients/klavis/klavis-client.ts similarity index 100% rename from apps/server/src/agent/klavis/klavis-client.ts rename to apps/server/src/lib/clients/klavis/klavis-client.ts diff --git a/apps/server/src/agent/klavis/oauth-mcp-servers.ts b/apps/server/src/lib/clients/klavis/oauth-mcp-servers.ts similarity index 100% rename from apps/server/src/agent/klavis/oauth-mcp-servers.ts rename to apps/server/src/lib/clients/klavis/oauth-mcp-servers.ts diff --git a/apps/server/src/agent/llm/client.ts b/apps/server/src/lib/clients/llm/client.ts similarity index 100% rename from apps/server/src/agent/llm/client.ts rename to apps/server/src/lib/clients/llm/client.ts diff --git a/apps/server/src/agent/llm/config.ts b/apps/server/src/lib/clients/llm/config.ts similarity index 89% rename from apps/server/src/agent/llm/config.ts rename to apps/server/src/lib/clients/llm/config.ts index f1b2b7047..18263fd41 100644 --- a/apps/server/src/agent/llm/config.ts +++ b/apps/server/src/lib/clients/llm/config.ts @@ -7,11 +7,8 @@ */ import { LLM_PROVIDERS, type LLMConfig } from '@browseros/shared/schemas/llm' -import { - fetchBrowserOSConfig, - getLLMConfigFromProvider, -} from '../../common/gateway' -import { logger } from '../../common/logger' +import { logger } from '../../logger' +import { fetchBrowserOSConfig, getLLMConfigFromProvider } from '../gateway' import type { ResolvedLLMConfig } from './types' export async function resolveLLMConfig( diff --git a/apps/server/src/agent/llm/provider.ts b/apps/server/src/lib/clients/llm/provider.ts similarity index 97% rename from apps/server/src/agent/llm/provider.ts rename to apps/server/src/lib/clients/llm/provider.ts index fa55a6e83..20c76cc35 100644 --- a/apps/server/src/agent/llm/provider.ts +++ b/apps/server/src/lib/clients/llm/provider.ts @@ -15,8 +15,8 @@ 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 '../../common/logger' -import { createOpenRouterCompatibleFetch } from '../agent/gemini-vercel-sdk-adapter/utils/fetch' +import { createOpenRouterCompatibleFetch } from '../../../agent/provider-adapter/utils/fetch' +import { logger } from '../../logger' import type { ResolvedLLMConfig } from './types' type ProviderFactory = (config: ResolvedLLMConfig) => LanguageModel diff --git a/apps/server/src/agent/llm/types.ts b/apps/server/src/lib/clients/llm/types.ts similarity index 100% rename from apps/server/src/agent/llm/types.ts rename to apps/server/src/lib/clients/llm/types.ts diff --git a/apps/server/src/common/db/index.ts b/apps/server/src/lib/db/index.ts similarity index 100% rename from apps/server/src/common/db/index.ts rename to apps/server/src/lib/db/index.ts diff --git a/apps/server/src/common/db/schema.ts b/apps/server/src/lib/db/schema.ts similarity index 100% rename from apps/server/src/common/db/schema.ts rename to apps/server/src/lib/db/schema.ts diff --git a/apps/server/src/common/identity.ts b/apps/server/src/lib/identity.ts similarity index 100% rename from apps/server/src/common/identity.ts rename to apps/server/src/lib/identity.ts diff --git a/apps/server/src/common/logger.ts b/apps/server/src/lib/logger.ts similarity index 100% rename from apps/server/src/common/logger.ts rename to apps/server/src/lib/logger.ts diff --git a/apps/server/src/common/metrics.ts b/apps/server/src/lib/metrics.ts similarity index 100% rename from apps/server/src/common/metrics.ts rename to apps/server/src/lib/metrics.ts diff --git a/apps/server/src/common/mutex.ts b/apps/server/src/lib/mutex.ts similarity index 100% rename from apps/server/src/common/mutex.ts rename to apps/server/src/lib/mutex.ts diff --git a/apps/server/src/common/polyfill.ts b/apps/server/src/lib/polyfill.ts similarity index 100% rename from apps/server/src/common/polyfill.ts rename to apps/server/src/lib/polyfill.ts diff --git a/apps/server/src/common/port-binding.ts b/apps/server/src/lib/port-binding.ts similarity index 100% rename from apps/server/src/common/port-binding.ts rename to apps/server/src/lib/port-binding.ts diff --git a/apps/server/src/agent/rate-limiter/errors.ts b/apps/server/src/lib/rate-limiter/errors.ts similarity index 92% rename from apps/server/src/agent/rate-limiter/errors.ts rename to apps/server/src/lib/rate-limiter/errors.ts index 36f54ab7e..dff25752b 100644 --- a/apps/server/src/agent/rate-limiter/errors.ts +++ b/apps/server/src/lib/rate-limiter/errors.ts @@ -3,7 +3,7 @@ * Copyright 2025 BrowserOS * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { HttpAgentError } from '../errors' +import { HttpAgentError } from '../../agent/errors' export class RateLimitError extends HttpAgentError { constructor( diff --git a/apps/server/src/agent/rate-limiter/fetch-config.ts b/apps/server/src/lib/rate-limiter/fetch-config.ts similarity index 93% rename from apps/server/src/agent/rate-limiter/fetch-config.ts rename to apps/server/src/lib/rate-limiter/fetch-config.ts index a996b5754..383acd03d 100644 --- a/apps/server/src/agent/rate-limiter/fetch-config.ts +++ b/apps/server/src/lib/rate-limiter/fetch-config.ts @@ -8,8 +8,8 @@ import { RATE_LIMITS } from '@browseros/shared/constants/limits' -import { fetchBrowserOSConfig } from '../../common/gateway' -import { logger } from '../../common/logger' +import { fetchBrowserOSConfig } from '../clients/gateway' +import { logger } from '../logger' export async function fetchDailyRateLimit( browserosId: string, diff --git a/apps/server/src/agent/rate-limiter/rate-limiter.ts b/apps/server/src/lib/rate-limiter/rate-limiter.ts similarity index 95% rename from apps/server/src/agent/rate-limiter/rate-limiter.ts rename to apps/server/src/lib/rate-limiter/rate-limiter.ts index 494699220..bcd10f77d 100644 --- a/apps/server/src/agent/rate-limiter/rate-limiter.ts +++ b/apps/server/src/lib/rate-limiter/rate-limiter.ts @@ -7,8 +7,8 @@ import type { Database } from 'bun:sqlite' import { RATE_LIMITS } from '@browseros/shared/constants/limits' -import { logger } from '../../common/logger' -import { metrics } from '../../common/metrics' +import { logger } from '../logger' +import { metrics } from '../metrics' import { RateLimitError } from './errors' diff --git a/apps/server/src/common/sentry/instrument.ts b/apps/server/src/lib/sentry.ts similarity index 92% rename from apps/server/src/common/sentry/instrument.ts rename to apps/server/src/lib/sentry.ts index b12625137..1dc5db882 100644 --- a/apps/server/src/common/sentry/instrument.ts +++ b/apps/server/src/lib/sentry.ts @@ -4,7 +4,7 @@ */ import * as Sentry from '@sentry/bun' -import { VERSION } from '../../version' +import { VERSION } from '../version' const SENTRY_ENVIRONMENT = process.env.NODE_ENV || 'development' diff --git a/apps/server/src/common/wait-for-helper.ts b/apps/server/src/lib/wait-for-helper.ts similarity index 100% rename from apps/server/src/common/wait-for-helper.ts rename to apps/server/src/lib/wait-for-helper.ts diff --git a/apps/server/src/main.ts b/apps/server/src/main.ts index 70005e78f..dae8ad9b1 100644 --- a/apps/server/src/main.ts +++ b/apps/server/src/main.ts @@ -12,21 +12,21 @@ import type { Database } from 'bun:sqlite' import fs from 'node:fs' import path from 'node:path' import { EXIT_CODES } from '@browseros/shared/constants/exit-codes' -import { fetchDailyRateLimit } from './agent/rate-limiter/fetch-config' -import { RateLimiter } from './agent/rate-limiter/rate-limiter' -import { ensureBrowserConnected } from './common/browser' -import { initializeDb } from './common/db' -import { identity } from './common/identity' -import { logger } from './common/logger' -import { McpContext } from './common/mcp-context' -import { metrics } from './common/metrics' -import { Mutex } from './common/mutex' -import { bindPortWithRetry, PortBindError } from './common/port-binding' -import { Sentry } from './common/sentry/instrument' +import { createHttpServer } from './api/server' +import { ensureBrowserConnected } from './browser/cdp/connection' +import { McpContext } from './browser/cdp/context' +import { ControllerBridge } from './browser/extension/bridge' +import { ControllerContext } from './browser/extension/context' import type { ServerConfig } from './config' -import { ControllerBridge } from './controller-server/controller-bridge' -import { ControllerContext } from './controller-server/controller-context' -import { createHttpServer } from './http/server' +import { initializeDb } from './lib/db' +import { identity } from './lib/identity' +import { logger } from './lib/logger' +import { metrics } from './lib/metrics' +import { Mutex } from './lib/mutex' +import { bindPortWithRetry, PortBindError } from './lib/port-binding' +import { fetchDailyRateLimit } from './lib/rate-limiter/fetch-config' +import { RateLimiter } from './lib/rate-limiter/rate-limiter' +import { Sentry } from './lib/sentry' import { createToolRegistry } from './tools/registry' import { VERSION } from './version' diff --git a/apps/server/src/tools/cdp-based/pages.ts b/apps/server/src/tools/cdp-based/pages.ts index faa238a0c..466ec0a7c 100644 --- a/apps/server/src/tools/cdp-based/pages.ts +++ b/apps/server/src/tools/cdp-based/pages.ts @@ -4,7 +4,7 @@ */ import z from 'zod' -import { logger } from '../../common/logger' +import { logger } from '../../lib/logger' import { ToolCategories } from '../types/tool-categories' import { commonSchemas, defineTool, ERRORS } from '../types/tool-definition' diff --git a/apps/server/src/tools/cdp-based/performance.ts b/apps/server/src/tools/cdp-based/performance.ts index cb28d03ef..caf3626a1 100644 --- a/apps/server/src/tools/cdp-based/performance.ts +++ b/apps/server/src/tools/cdp-based/performance.ts @@ -5,8 +5,8 @@ import type { Page } from 'puppeteer-core' import z from 'zod' -import { logger } from '../../common/logger' -import type { McpContext } from '../../common/mcp-context' +import type { McpContext } from '../../browser/cdp/context' +import { logger } from '../../lib/logger' import type { InsightName } from '../trace-processing/parse' import { diff --git a/apps/server/src/tools/formatters/snapshot-formatter.ts b/apps/server/src/tools/formatters/snapshot-formatter.ts index fabae0e9e..929574b5d 100644 --- a/apps/server/src/tools/formatters/snapshot-formatter.ts +++ b/apps/server/src/tools/formatters/snapshot-formatter.ts @@ -2,7 +2,7 @@ * @license * Copyright 2025 BrowserOS */ -import type { TextSnapshotNode } from '../../common/mcp-context' +import type { TextSnapshotNode } from '../../browser/cdp/context' export function formatA11ySnapshot( serializedAXNodeRoot: TextSnapshotNode, diff --git a/apps/server/src/tools/registry.ts b/apps/server/src/tools/registry.ts index 60fb4b9bf..dd7152cfb 100644 --- a/apps/server/src/tools/registry.ts +++ b/apps/server/src/tools/registry.ts @@ -6,9 +6,9 @@ * Tool Registry - Combines CDP and controller tools into a unified registry. */ -import { logger } from '../common/logger' -import type { McpContext } from '../common/mcp-context' -import type { ControllerContext } from '../controller-server/controller-context' +import type { McpContext } from '../browser/cdp/context' +import type { ControllerContext } from '../browser/extension/context' +import { logger } from '../lib/logger' import { allCdpTools } from './cdp-based/registry' import { allControllerTools } from './controller-based/registry' diff --git a/apps/server/src/tools/response/mcp-response.ts b/apps/server/src/tools/response/mcp-response.ts index cb73622a1..ec4a856f4 100644 --- a/apps/server/src/tools/response/mcp-response.ts +++ b/apps/server/src/tools/response/mcp-response.ts @@ -8,7 +8,7 @@ import type { TextContent, } from '@modelcontextprotocol/sdk/types.js' import type { ResourceType } from 'puppeteer-core' -import type { McpContext } from '../../common/mcp-context' +import type { McpContext } from '../../browser/cdp/context' import { formatConsoleEvent } from '../formatters/console-formatter' import { diff --git a/apps/server/tests/__helpers__/utils.ts b/apps/server/tests/__helpers__/utils.ts index ca491f07d..8cae2542a 100644 --- a/apps/server/tests/__helpers__/utils.ts +++ b/apps/server/tests/__helpers__/utils.ts @@ -12,9 +12,8 @@ import { Mutex } from 'async-mutex' import type { Browser } from 'puppeteer' import puppeteer from 'puppeteer' import type { HTTPRequest, HTTPResponse } from 'puppeteer-core' - -import { logger } from '../../src/common/logger' -import { McpContext } from '../../src/common/mcp-context' +import { McpContext } from '../../src/browser/cdp/context' +import { logger } from '../../src/lib/logger' import { McpResponse } from '../../src/tools/response/mcp-response' import { ensureBrowserOS } from './setup' diff --git a/apps/server/tests/common/mcp-context.test.ts b/apps/server/tests/common/mcp-context.test.ts index 742e0e685..85e0ef694 100644 --- a/apps/server/tests/common/mcp-context.test.ts +++ b/apps/server/tests/common/mcp-context.test.ts @@ -7,7 +7,7 @@ import { describe, it } from 'bun:test' import assert from 'node:assert' import sinon from 'sinon' -import type { TraceResult } from '../../src/common/types' +import type { TraceResult } from '../../src/browser/cdp/types' import { withBrowser } from '../__helpers__/utils' diff --git a/apps/server/tests/common/page-collector.test.ts b/apps/server/tests/common/page-collector.test.ts index dae8910e8..a7d6abdc1 100644 --- a/apps/server/tests/common/page-collector.test.ts +++ b/apps/server/tests/common/page-collector.test.ts @@ -7,7 +7,7 @@ import { describe, it } from 'bun:test' import assert from 'node:assert' import type { Browser, Frame, Page, Target } from 'puppeteer-core' -import { PageCollector } from '../../src/common/page-collector' +import { PageCollector } from '../../src/browser/cdp/page-collector' import { getMockRequest } from '../__helpers__/utils' diff --git a/apps/server/tests/tools/formatters/snapshot-formatter.test.ts b/apps/server/tests/tools/formatters/snapshot-formatter.test.ts index e2c6b3928..d441a5adc 100644 --- a/apps/server/tests/tools/formatters/snapshot-formatter.test.ts +++ b/apps/server/tests/tools/formatters/snapshot-formatter.test.ts @@ -7,7 +7,7 @@ import { describe, it } from 'bun:test' import assert from 'node:assert' import type { ElementHandle } from 'puppeteer-core' -import type { TextSnapshotNode } from '../../../src/common/mcp-context' +import type { TextSnapshotNode } from '../../../src/browser/cdp/context' import { formatA11ySnapshot } from '../../../src/tools/formatters/snapshot-formatter' describe('snapshotFormatter', () => {