(
&self,
handshake: &DaemonHandshake,
)
| 1428 | } |
| 1429 | |
| 1430 | async fn project_server( |
| 1431 | &self, |
| 1432 | handshake: &DaemonHandshake, |
| 1433 | ) -> Result<Arc<crate::mcp::McpServer>> { |
| 1434 | let Some(project_path) = handshake.project_path.as_ref() else { |
| 1435 | return Err(TraceDecayError::Config { |
| 1436 | message: "project server requested without project_path".to_string(), |
| 1437 | }); |
| 1438 | }; |
| 1439 | let canonical_project_path = project_path |
| 1440 | .canonicalize() |
| 1441 | .unwrap_or_else(|_| project_path.clone()); |
| 1442 | let key = ProjectServerKey::from_handshake(canonical_project_path.clone(), handshake); |
| 1443 | |
| 1444 | let mut servers = self.project_servers.lock().await; |
| 1445 | if let Some(server) = servers.get(&key) { |
| 1446 | let server = Arc::clone(server); |
| 1447 | drop(servers); |
| 1448 | // A freshly-handshaken project should be watched even on a cache |
| 1449 | // hit (the watcher may have started after this server was cached). |
| 1450 | self.git_watcher |
| 1451 | .ensure_watching(&canonical_project_path) |
| 1452 | .await; |
| 1453 | Box::pin(self.ensure_automation_scheduler( |
| 1454 | key, |
| 1455 | canonical_project_path, |
| 1456 | handshake.clone(), |
| 1457 | )) |
| 1458 | .await; |
| 1459 | return Ok(server); |
| 1460 | } |
| 1461 | |
| 1462 | let cg = Box::pin(open_project_for_handshake( |
| 1463 | &canonical_project_path, |
| 1464 | handshake, |
| 1465 | )) |
| 1466 | .await?; |
| 1467 | let accounting_db = accounting_db_for_handshake(handshake).await; |
| 1468 | let registry_db = registry_db_for_handshake(handshake).await; |
| 1469 | let server = crate::mcp::McpServer::new_with_dbs( |
| 1470 | cg, |
| 1471 | handshake.scope_prefix.clone(), |
| 1472 | accounting_db, |
| 1473 | registry_db, |
| 1474 | false, |
| 1475 | ) |
| 1476 | .await; |
| 1477 | servers.insert(key.clone(), Arc::clone(&server)); |
| 1478 | drop(servers); |
| 1479 | self.git_watcher |
| 1480 | .ensure_watching(&canonical_project_path) |
| 1481 | .await; |
| 1482 | Box::pin(self.ensure_automation_scheduler(key, canonical_project_path, handshake.clone())) |
| 1483 | .await; |
| 1484 | Ok(server) |
| 1485 | } |
| 1486 | |
| 1487 | async fn ensure_automation_scheduler( |
no test coverage detected