From 71392cef9cbb59cc3289935b9da85c89c7d358ba Mon Sep 17 00:00:00 2001 From: Sienna Meridian Satterwhite Date: Mon, 23 Mar 2026 13:01:36 +0000 Subject: [PATCH] feat(code): wire gRPC server into Sol startup spawns gRPC server alongside Matrix sync loop when [grpc] config is present. shares ToolRegistry, Store, MistralClient, and Matrix client with the gRPC CodeSession handler. --- src/brain/responder.rs | 5 +++++ src/main.rs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/brain/responder.rs b/src/brain/responder.rs index 93d0f23..422d23b 100644 --- a/src/brain/responder.rs +++ b/src/brain/responder.rs @@ -65,6 +65,11 @@ impl Responder { } } + /// Get a reference to the tool registry (for sharing with gRPC server). + pub fn tools(&self) -> Arc { + self.tools.clone() + } + pub async fn generate_response( &self, context: &[ContextMessage], diff --git a/src/main.rs b/src/main.rs index c6046c6..822f5e0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -293,6 +293,22 @@ async fn main() -> anyhow::Result<()> { error!("Reaction backfill failed (non-fatal): {e}"); } + // Start gRPC server if configured + if config.grpc.is_some() { + let grpc_state = std::sync::Arc::new(grpc::GrpcState { + config: config.clone(), + tools: state.responder.tools(), + store: store.clone(), + mistral: state.mistral.clone(), + matrix: matrix_client.clone(), + }); + tokio::spawn(async move { + if let Err(e) = grpc::start_server(grpc_state).await { + error!("gRPC server error: {e}"); + } + }); + } + // Start sync loop in background let sync_client = matrix_client.clone(); let sync_state = state.clone();