context_store: Refactor state management (#29910)

Because we instantiated `ContextServerManager` both in `agent` and
`assistant-context-editor`, and these two entities track the running MCP
servers separately, we were effectively running every MCP server twice.

This PR moves the `ContextServerManager` into the project crate (now
called `ContextServerStore`). The store can be accessed via a project
instance. This ensures that we only instantiate one `ContextServerStore`
per project.

Also, this PR adds a bunch of tests to ensure that the
`ContextServerStore` behaves correctly (Previously there were none).

Closes #28714
Closes #29530

Release Notes:

- N/A
This commit is contained in:
Bennet Bo Fenner
2025-05-05 21:36:12 +02:00
committed by GitHub
parent 8199664a5a
commit 9cb5ffac25
43 changed files with 1568 additions and 1047 deletions
-1
View File
@@ -106,7 +106,6 @@ pub fn init(
assistant_slash_command::init(cx);
assistant_tool::init(cx);
assistant_panel::init(cx);
context_server::init(cx);
register_slash_commands(cx);
inline_assistant::init(
+10 -12
View File
@@ -1192,21 +1192,19 @@ impl AssistantPanel {
fn restart_context_servers(
workspace: &mut Workspace,
_action: &context_server::Restart,
_action: &project::context_server_store::Restart,
_: &mut Window,
cx: &mut Context<Workspace>,
) {
let Some(assistant_panel) = workspace.panel::<AssistantPanel>(cx) else {
return;
};
assistant_panel.update(cx, |assistant_panel, cx| {
assistant_panel
.context_store
.update(cx, |context_store, cx| {
context_store.restart_context_servers(cx);
});
});
workspace
.project()
.read(cx)
.context_server_store()
.update(cx, |store, cx| {
for server in store.running_servers() {
store.restart_server(&server.id(), cx).log_err();
}
});
}
}