(
token_usage_service: Arc<token_usage::TokenUsageService>,
)
| 89 | |
| 90 | impl AppState { |
| 91 | pub async fn new_async( |
| 92 | token_usage_service: Arc<token_usage::TokenUsageService>, |
| 93 | ) -> BitFunResult<Self> { |
| 94 | let start_time = std::time::Instant::now(); |
| 95 | |
| 96 | let config_service = config::get_global_config_service().await.map_err(|e| { |
| 97 | BitFunError::config(format!("Failed to get global config service: {}", e)) |
| 98 | })?; |
| 99 | |
| 100 | let ai_client = Arc::new(RwLock::new(None)); |
| 101 | let ai_client_factory = AIClientFactory::get_global().await.map_err(|e| { |
| 102 | BitFunError::service(format!("Failed to get global AIClientFactory: {}", e)) |
| 103 | })?; |
| 104 | let side_question_runtime = Arc::new(SideQuestionRuntime::new()); |
| 105 | |
| 106 | let tool_registry = { |
| 107 | let registry = tools::registry::get_global_tool_registry(); |
| 108 | let lock = registry.read().await; |
| 109 | Arc::new(lock.get_all_tools()) |
| 110 | }; |
| 111 | |
| 112 | let workspace_service = Arc::new(workspace::WorkspaceService::new().await?); |
| 113 | let workspace_identity_watch_service = Arc::new( |
| 114 | workspace::WorkspaceIdentityWatchService::new(workspace_service.clone()), |
| 115 | ); |
| 116 | workspace::set_global_workspace_service(workspace_service.clone()); |
| 117 | let filesystem_service = Arc::new(filesystem::FileSystemServiceFactory::create_default()); |
| 118 | let workspace_search_service = Arc::new(search::WorkspaceSearchService::new()); |
| 119 | search::set_global_workspace_search_service(workspace_search_service.clone()); |
| 120 | |
| 121 | let agent_registry = agents::get_agent_registry(); |
| 122 | |
| 123 | let mcp_service = match mcp::MCPService::new(config_service.clone()) { |
| 124 | Ok(service) => { |
| 125 | log::info!("MCP service initialized successfully"); |
| 126 | let service = Arc::new(service); |
| 127 | mcp::set_global_mcp_service(service.clone()); |
| 128 | Some(service) |
| 129 | } |
| 130 | Err(e) => { |
| 131 | log::warn!("Failed to initialize MCP service: {}", e); |
| 132 | None |
| 133 | } |
| 134 | }; |
| 135 | let path_manager = workspace_service.path_manager().clone(); |
| 136 | let acp_client_service = Some( |
| 137 | bitfun_acp::AcpClientService::new(config_service.clone(), path_manager.clone()) |
| 138 | .map_err(|e| { |
| 139 | BitFunError::service(format!("Failed to initialize ACP client service: {}", e)) |
| 140 | })?, |
| 141 | ); |
| 142 | |
| 143 | let announcement_scheduler = Arc::new( |
| 144 | announcement::AnnouncementScheduler::new(&path_manager) |
| 145 | .await |
| 146 | .map_err(|e| { |
| 147 | BitFunError::service(format!( |
| 148 | "Failed to initialize announcement scheduler: {}", |
nothing calls this directly
no test coverage detected