feat: refactor better structure for apps/server (#213)

This commit is contained in:
Nikhil
2026-01-12 15:47:16 -08:00
committed by GitHub
parent 7cfe55a360
commit 752f4319b6
82 changed files with 102 additions and 109 deletions

View File

@@ -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 {

View File

@@ -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'

View File

@@ -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'

View File

@@ -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<string, GeminiAgent>()

View File

@@ -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

View File

@@ -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 {

View File

@@ -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'

View File

@@ -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

View File

@@ -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,

View File

@@ -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),

View File

@@ -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'

View File

@@ -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(

View File

@@ -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'

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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) {}

View File

@@ -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

View File

@@ -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()

View File

@@ -3,7 +3,7 @@
* Copyright 2025 BrowserOS
*/
import { logger } from './logger'
import { logger } from '../logger'
export interface Provider {
name: string

View File

@@ -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(

View File

@@ -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

View File

@@ -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(

View File

@@ -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,

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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', () => {