Put context servers behind a trait (#20432)

This PR puts context servers behind the `ContextServer` trait to allow
us to provide context servers from an extension.

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers
2024-11-08 13:36:41 -05:00
committed by GitHub
parent 01503511ad
commit 09c599385a
6 changed files with 102 additions and 61 deletions
+3 -3
View File
@@ -819,7 +819,7 @@ impl ContextStore {
|context_server_manager, cx| {
for server in context_server_manager.servers() {
context_server_manager
.restart_server(&server.id, cx)
.restart_server(&server.id(), cx)
.detach_and_log_err(cx);
}
},
@@ -850,7 +850,7 @@ impl ContextStore {
let server = server.clone();
let server_id = server_id.clone();
|this, mut cx| async move {
let Some(protocol) = server.client.read().clone() else {
let Some(protocol) = server.client() else {
return;
};
@@ -889,7 +889,7 @@ impl ContextStore {
tool_working_set.insert(
Arc::new(tools::context_server_tool::ContextServerTool::new(
context_server_manager.clone(),
server.id.clone(),
server.id(),
tool,
)),
)
@@ -20,18 +20,18 @@ use crate::slash_command::create_label_for_command;
pub struct ContextServerSlashCommand {
server_manager: Model<ContextServerManager>,
server_id: String,
server_id: Arc<str>,
prompt: Prompt,
}
impl ContextServerSlashCommand {
pub fn new(
server_manager: Model<ContextServerManager>,
server: &Arc<ContextServer>,
server: &Arc<dyn ContextServer>,
prompt: Prompt,
) -> Self {
Self {
server_id: server.id.clone(),
server_id: server.id(),
prompt,
server_manager,
}
@@ -89,7 +89,7 @@ impl SlashCommand for ContextServerSlashCommand {
if let Some(server) = self.server_manager.read(cx).get_server(&server_id) {
cx.foreground_executor().spawn(async move {
let Some(protocol) = server.client.read().clone() else {
let Some(protocol) = server.client() else {
return Err(anyhow!("Context server not initialized"));
};
@@ -143,7 +143,7 @@ impl SlashCommand for ContextServerSlashCommand {
let manager = self.server_manager.read(cx);
if let Some(server) = manager.get_server(&server_id) {
cx.foreground_executor().spawn(async move {
let Some(protocol) = server.client.read().clone() else {
let Some(protocol) = server.client() else {
return Err(anyhow!("Context server not initialized"));
};
let result = protocol.run_prompt(&prompt_name, prompt_args).await?;
@@ -1,3 +1,5 @@
use std::sync::Arc;
use anyhow::{anyhow, bail};
use assistant_tool::Tool;
use context_servers::manager::ContextServerManager;
@@ -6,14 +8,14 @@ use gpui::{Model, Task};
pub struct ContextServerTool {
server_manager: Model<ContextServerManager>,
server_id: String,
server_id: Arc<str>,
tool: types::Tool,
}
impl ContextServerTool {
pub fn new(
server_manager: Model<ContextServerManager>,
server_id: impl Into<String>,
server_id: impl Into<Arc<str>>,
tool: types::Tool,
) -> Self {
Self {
@@ -55,7 +57,7 @@ impl Tool for ContextServerTool {
cx.foreground_executor().spawn({
let tool_name = self.tool.name.clone();
async move {
let Some(protocol) = server.client.read().clone() else {
let Some(protocol) = server.client() else {
bail!("Context server not initialized");
};