@@ -4,45 +4,33 @@ package app
44import (
55 "context"
66 "net/http"
7- "time"
87
98 "github.com/co-browser/agent-browser/internal/backend"
109 "github.com/co-browser/agent-browser/internal/backend/database"
11- "github.com/co-browser/agent-browser/internal/config"
1210 "github.com/co-browser/agent-browser/internal/events"
1311 "github.com/co-browser/agent-browser/internal/log"
1412 "github.com/co-browser/agent-browser/internal/mcp"
1513 "github.com/co-browser/agent-browser/internal/web"
14+ "github.com/co-browser/agent-browser/internal/web/client"
1615 "github.com/co-browser/agent-browser/internal/web/handlers"
1716
1817 "go.uber.org/fx"
1918)
2019
21- // CoreModules bundles the main application components for fx.
22- var CoreModules = fx .Options (
23- LogModule ,
24- DatabaseModule ,
25- ConfigModule ,
26- EventsModule ,
27- BackendModule ,
28- MCPClientModule ,
29- UpdaterModule ,
30- WebModule ,
31- // TODO: Add MCP Server Frontend module
32- // TODO: Add Sync Daemon module
33- )
20+ // --- Core Application Modules ---
3421
35- // LogModule provides common dependencies like logging.
22+ // LogModule provides common logging components .
3623var LogModule = fx .Module ("logger" ,
3724 fx .Provide (
3825 log .NewLogger ,
3926 ),
4027)
4128
42- // DatabaseModule provides the database dependency.
29+ // DatabaseModule provides the database dependency and manages its lifecycle .
4330var DatabaseModule = fx .Module ("database" ,
4431 fx .Provide (
4532 func (lc fx.Lifecycle , logger log.Logger ) (database.DBInterface , error ) {
33+ // TODO: Make dbPath configurable
4634 dbPath := "agent-browser.db"
4735 db , err := database .New (dbPath )
4836 if err != nil {
@@ -63,77 +51,149 @@ var DatabaseModule = fx.Module("database",
6351)
6452
6553// ConfigModule provides configuration loading services.
54+ // Currently loads MCP configuration.
6655var ConfigModule = fx .Module ("config" ,
6756 fx .Provide (
6857 mcp .NewMCPConfig ,
6958 ),
7059)
7160
72- // EventsModule provides the event bus.
61+ // EventsModule provides the application-wide event bus.
7362var EventsModule = fx .Module ("events" ,
7463 fx .Provide (events .NewBus ),
7564)
7665
77- // BackendModule provides the backend service.
66+ // BackendModule provides the core backend service logic, abstracting database interactions .
7867var BackendModule = fx .Module ("backend" ,
7968 fx .Provide (
69+ // Provide the backend service implementation, satisfying the backend.Service interface.
8070 func (db database.DBInterface , bus events.Bus , logger log.Logger ) backend.Service {
8171 return backend .NewService (db , bus , logger )
8272 },
8373 ),
8474)
8575
86- // MCPClientModule provides the MCP client (distinct from server frontend).
76+ // MCPClientModule provides the components responsible for connecting *to* remote MCP servers.
77+ // This includes the ConnectionManager and the API client used by the ConnectionManager
78+ // to update this agent's status and sync tools via its own web API.
8779var MCPClientModule = fx .Module ("mcp_client" ,
8880 fx .Provide (
81+ // Provide the web API client used by MCP components
82+ func (logger log.Logger ) * client.Client {
83+ // TODO: Make API client base URL configurable
84+ config := client .DefaultConfig ()
85+ // DefaultConfig likely points to localhost, which is correct for the agent
86+ // calling its own API.
87+ return client .NewClient (config , logger )
88+ },
89+ // Provide MCP components (like ConnectionManager)
8990 mcp .NewMCPComponents ,
9091 ),
92+ // Register lifecycle hooks for starting/stopping the MCP ConnectionManager
9193 fx .Invoke (mcp .RegisterMCPServerHooks ),
9294)
9395
94- // UpdaterModule provides the tool and server updater service.
95- var UpdaterModule = fx .Module ("updater" ,
96- fx .Provide (
97- func (bs backend.Service , mc client.Client , bus events.Bus , logger log.Logger ) updater.Service {
98- pollInterval := 5 * time .Minute
99- logger .Info ().Dur ("pollInterval" , pollInterval ).Msg ("Creating Updater Service" )
100- return updater .NewService (bs , mc , bus , logger , pollInterval )
101- },
102- ),
103- fx .Invoke (func (lc fx.Lifecycle , us updater.Service , logger log.Logger ) {
104- lc .Append (fx.Hook {
105- OnStart : func (_ctx context.Context ) error {
106- logger .Info ().Msg ("Registering Updater Service start hook" )
107- us .Start (_ctx )
108- return nil
109- },
110- OnStop : func (_ctx context.Context ) error {
111- logger .Info ().Msg ("Registering Updater Service stop hook" )
112- us .Stop ()
113- return nil
114- },
115- })
116- }),
117- )
118-
119- // WebModule provides the web server components
96+ // WebModule provides the HTTP server, API handlers, and UI handlers (if any).
97+ // It serves the API used internally by the MCPClient and potentially by external UIs.
12098var WebModule = fx .Module ("web" ,
12199 fx .Provide (
122- // Provide UI handler
100+ // Provide UI handler (if applicable)
123101 handlers .NewUIHandler ,
124102 // Provide API handlers
125- func (bs backend.Service , us updater. Service , ce * config. Exporter , logger log.Logger ) * handlers.APIHandlers {
126- return handlers .NewAPIHandlers (bs , us , ce , logger )
103+ func (bs backend.Service , logger log.Logger ) * handlers.APIHandlers {
104+ return handlers .NewAPIHandlers (bs , logger )
127105 },
128- // Provide HTTP mux using web package
106+ // Provide the HTTP request router (ServeMux)
129107 web .NewMux ,
130- // Provide HTTP server using web package
108+ // Provide the HTTP server itself
131109 web .NewServer ,
132110 ),
133- // Register API handlers with the router
111+ // Register API handler routes with the router
134112 fx .Invoke (func (router * http.ServeMux , apiHandlers * handlers.APIHandlers ) {
135113 apiHandlers .RegisterRoutes (router )
136114 }),
137- // Register web server lifecycle hooks
115+ // Register web server lifecycle hooks for starting/stopping the server
138116 fx .Invoke (web .RegisterWebServerHooks ),
139117)
118+
119+ // InitModule performs initial setup tasks, like seeding the database with default servers.
120+ // It runs once during application startup if needed.
121+ var InitModule = fx .Module ("init" ,
122+ fx .Invoke (func (bs backend.Service , logger log.Logger ) {
123+ // Check if any servers already exist in the database.
124+ servers , err := bs .ListMCPServers ()
125+ if err != nil {
126+ logger .Error ().Err (err ).Msg ("Failed to check existing servers during initialization" )
127+ // Decide if this should be fatal. For now, we continue, but defaults won't be added.
128+ return
129+ }
130+
131+ // Only add default servers if the database is empty.
132+ if len (servers ) == 0 {
133+ logger .Info ().Msg ("No MCP servers found in the database. Adding default servers..." )
134+
135+ // Define the default servers to add.
136+ // TODO: Consider moving these defaults to configuration.
137+ defaultServers := []struct {
138+ name string
139+ url string
140+ description string
141+ }{
142+ {
143+ name : "Local Test Server" ,
144+ url : "http://0.0.0.0:8001/sse" , // Assumes local test server runs on 8001
145+ description : "Local MCP test server" ,
146+ },
147+ {
148+ name : "API Gateway" ,
149+ url : "https://api-gateway.cobrowser.xyz/mcp/api/sse?api_key=REDACTED_API_KEY" ,
150+ description : "API Gateway MCP server" ,
151+ },
152+ }
153+
154+ // Add each default server via the backend service.
155+ for _ , server := range defaultServers {
156+ _ , err := bs .AddMCPServer (server .name , server .url ) // Description is not stored via AddMCPServer currently
157+ if err != nil {
158+ // Log error but continue trying to add others.
159+ logger .Error ().
160+ Err (err ).
161+ Str ("name" , server .name ).
162+ Str ("url" , server .url ).
163+ // Str("description", server.description). // Not used by AddMCPServer
164+ Msg ("Failed to add default server" )
165+ continue // Skip logging success for this server
166+ }
167+ logger .Info ().
168+ Str ("name" , server .name ).
169+ Str ("url" , server .url ).
170+ // Str("description", server.description). // Not stored
171+ Msg ("Added default server" )
172+ }
173+ } else {
174+ logger .Info ().Int ("count" , len (servers )).Msg ("Servers already exist, skipping default server initialization" )
175+ }
176+ }),
177+ )
178+
179+ // --- Application Bootstrap ---
180+
181+ // CoreModules bundles the main application components for fx.
182+ // The order generally doesn't matter for Fx, but grouping can improve readability.
183+ var CoreModules = fx .Options (
184+ // Foundational Modules
185+ LogModule ,
186+ ConfigModule , // Provides config values needed by others
187+ EventsModule ,
188+ DatabaseModule ,
189+
190+ // Core Service Logic
191+ BackendModule , // Depends on DB, Events, Log
192+
193+ // Interface Layers & Clients
194+ WebModule , // Provides the API/UI server (depends on Backend)
195+ MCPClientModule , // Connects *out* to other MCPs (depends on Backend, WebClient, Log, Config)
196+
197+ // Initialization Logic (runs after dependencies are ready)
198+ InitModule ,
199+ )
0 commit comments